revamping classic MLTE implementation

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32321 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2005-02-23 16:13:14 +00:00
parent 637013ebf4
commit 0f7817ab1f

View File

@@ -62,6 +62,13 @@
#define wxMAC_AWAYS_USE_MLTE 1
#endif
#ifndef __WXMAC_OSX__
enum
{
kTXNVisibilityTag = 'visb' /*set the visibility state of the object */
};
#endif
#include <MacTextEditor.h>
#include <ATSUnicode.h>
#include <TextCommon.h>
@@ -160,7 +167,7 @@ void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( con
class wxMacTextControl : public wxMacControl
{
public :
wxMacTextControl() ;
wxMacTextControl( wxTextCtrl *peer ) ;
~wxMacTextControl() ;
virtual wxString GetStringValue() const = 0 ;
@@ -207,6 +214,7 @@ public :
class wxMacMLTEControl : public wxMacTextControl
{
public :
wxMacMLTEControl( wxTextCtrl *peer ) : wxMacTextControl( peer ) {}
virtual wxString GetStringValue() const ;
virtual void SetStringValue( const wxString &str) ;
@@ -257,7 +265,7 @@ protected :
class wxMacMLTEHIViewControl : public wxMacMLTEControl
{
public :
wxMacMLTEHIViewControl( wxWindow *wxPeer,
wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style ) ;
@@ -274,7 +282,7 @@ protected :
class wxMacUnicodeTextControl : public wxMacTextControl
{
public :
wxMacUnicodeTextControl( wxWindow *wxPeer,
wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style ) ;
@@ -300,12 +308,10 @@ protected :
// 'classic' MLTE implementation
class STPTextPaneVars ;
class wxMacMLTEClassicControl : public wxMacMLTEControl
{
public :
wxMacMLTEClassicControl( wxWindow *wxPeer,
wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style ) ;
@@ -322,11 +328,26 @@ public :
virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) ;
virtual void MacControlUserPaneBackgroundProc(void* info) ;
virtual void SetRect( Rect *r ) ;
protected :
OSStatus DoCreate();
public :
// hack to make public until we have migrated all procs
STPTextPaneVars* m_macTXNvars ;
void MacUpdatePosition() ;
void MacActivatePaneText(Boolean setActive) ;
void MacFocusPaneText(Boolean setFocus) ;
void MacSetObjectVisibility(Boolean vis) ;
private :
TXNFrameID m_txnFrameID ;
GrafPtr m_txnPort ;
// bounds of the control as we last did set the txn frames
Rect m_txnControlBounds ;
bool m_txnIsFocused ;
bool m_txnIsActive ;
bool m_txnIsVisible ;
bool m_controlIsActive ;
} ;
#define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
@@ -409,12 +430,6 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
#endif
if ( !m_peer )
{
// this control draws the border itself
if ( !HasFlag(wxNO_BORDER) )
{
m_windowStyle &= ~wxSUNKEN_BORDER ;
bounds = wxMacGetBoundsForControl( this , pos , size ) ;
}
m_peer = new wxMacMLTEClassicControl( this , str , pos , size , style ) ;
}
@@ -1037,7 +1052,8 @@ void wxTextCtrl::MacControlUserPaneBackgroundProc(void* info)
// implementation base class
// ----------------------------------------------------------------------------
wxMacTextControl::wxMacTextControl()
wxMacTextControl::wxMacTextControl(wxTextCtrl* peer) :
wxMacControl( peer )
{
}
@@ -1187,10 +1203,10 @@ int wxMacTextControl::GetLineLength(long lineNo) const
#if TARGET_API_MAC_OSX
wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxWindow *wxPeer,
wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style )
const wxSize& size, long style ) : wxMacTextControl( wxPeer )
{
m_font = wxPeer->GetFont() ;
m_windowStyle = style ;
@@ -1317,11 +1333,6 @@ void wxMacUnicodeTextControl::WriteText(const wxString& str)
// MLTE control implementation (common part)
// ----------------------------------------------------------------------------
#if TARGET_API_MAC_OSX == 0
// declaration needed because of one line in the code...
static void TPUpdateVisibility(ControlRef theControl) ;
#endif
// if mlte is on read only , no changes at all are allowed, not even from
// procedural API, in order to allow changes via API all the same we must undo
// the readonly status while we are executing, this class helps to do so
@@ -1430,11 +1441,11 @@ void wxMacMLTEControl::SetStringValue( const wxString &str)
wxMacConvertNewlines10To13( &st ) ;
EditHelper help(m_txn) ;
// wxMacWindowClipper c( this ) ;
#if !TARGET_API_MAC_OSX
// otherwise scrolling might have problems ?
TPUpdateVisibility( m_controlRef ) ;
// MacUpdatePosition( m_controlRef ) ;
#endif
wxMacWindowClipper c( m_peer ) ;
SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ;
TXNSetSelection( m_txn, 0, 0);
TXNShowSelection( m_txn, kTXNShowStart);
@@ -1487,7 +1498,7 @@ void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, boo
else
iControlData[1].uValue = kTXNAutoWrap ;
}
verify_noerr( TXNSetTXNObjectControls( m_txn, false, toptag,
verify_noerr( TXNSetTXNObjectControls( m_txn, true, toptag,
iControlTags, iControlData )) ;
// setting the default font
@@ -1644,6 +1655,7 @@ void wxMacMLTEControl::Replace( long from , long to , const wxString str )
wxMacConvertNewlines10To13( &value ) ;
EditHelper help( m_txn ) ;
wxMacWindowClipper c( m_peer ) ;
TXNSetSelection(m_txn , from , to ) ;
TXNClear( m_txn ) ;
@@ -1652,8 +1664,8 @@ void wxMacMLTEControl::Replace( long from , long to , const wxString str )
void wxMacMLTEControl::Remove( long from , long to )
{
wxMacWindowClipper c( m_peer ) ;
EditHelper help( m_txn ) ;
TXNSetSelection(m_txn , from , to ) ;
TXNClear( m_txn ) ;
}
@@ -1665,6 +1677,7 @@ void wxMacMLTEControl::GetSelection( long* from, long* to) const
void wxMacMLTEControl::SetSelection( long from , long to )
{
wxMacWindowClipper c( m_peer ) ;
/* change the selection */
if ((from == -1) && (to == -1))
TXNSelectAll(m_txn);
@@ -1679,6 +1692,7 @@ void wxMacMLTEControl::WriteText(const wxString& str)
wxString st = str ;
wxMacConvertNewlines10To13( &st ) ;
wxMacWindowClipper c( m_peer ) ;
long start , end , dummy ;
GetSelection( &start , &dummy ) ;
SetTXNData( st , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
@@ -1689,6 +1703,7 @@ void wxMacMLTEControl::WriteText(const wxString& str)
void wxMacMLTEControl::Clear()
{
EditHelper st(m_txn) ;
wxMacWindowClipper c( m_peer ) ;
TXNSetSelection( m_txn , kTXNStartOffset , kTXNEndOffset ) ;
TXNClear(m_txn);
}
@@ -1957,33 +1972,6 @@ internal variables and state information. A handle to this record is
stored in the pane control's reference value field using the
SetControlReference routine. */
class STPTextPaneVars {
public :
/* OS records referenced */
TXNObject fTXNRec; /* the txn record */
TXNFrameID fTXNFrame; /* the txn frame ID */
ControlRef fUserPaneRec; /* handle to the user pane control */
WindowPtr fOwner; /* window containing control */
GrafPtr fDrawingEnvironment; /* grafport where control is drawn */
/* flags */
Boolean fInFocus; /* true while the focus rect is drawn around the control */
Boolean fIsActive; /* true while the control is drawn in the active state */
Boolean fTXNObjectActive; /* reflects the activation state of the text edit record */
Boolean fFocusDrawState; /* true if focus is drawn (default: true) */
/* calculated locations */
Rect fRBounds; /* control bounds */
Rect fRTextArea; /* area where the text is drawn */
Rect fRFocusOutline; /* rectangle used to draw the focus box */
Rect fRTextOutline; /* rectangle used to draw the border */
RgnHandle fRTextOutlineRegion; /* background region for the text, erased before calling TEUpdate */
/* our focus advance override routine */
EventHandlerUPP handlerUPP;
EventHandlerRef handlerRef;
bool fNoBorders ;
bool fMultiline ;
bool fVisible ;
} ;
/* Univerals Procedure Pointer variables used by the
mUP Control. These variables are set up
the first time that mUPOpenControl is called. */
@@ -1995,127 +1983,121 @@ ControlUserPaneKeyDownUPP gTPKeyProc = NULL;
ControlUserPaneActivateUPP gTPActivateProc = NULL;
ControlUserPaneFocusUPP gTPFocusProc = NULL;
// one place for calculating all
static void TPCalculateBounds(STPTextPaneVars *varsp, const Rect& bounds)
class wxMacMLTENoDraw
{
SetRect(&varsp->fRBounds, bounds.left, bounds.top, bounds.right, bounds.bottom);
SetRect(&varsp->fRFocusOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
// eventually make TextOutline inset 1,1
SetRect(&varsp->fRTextOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
if ( !varsp->fNoBorders )
public :
wxMacMLTENoDraw( TXNObject txn ) ;
~wxMacMLTENoDraw() ;
private :
bool m_formerDraw ;
TXNObject m_txn ;
} ;
wxMacMLTENoDraw::wxMacMLTENoDraw( TXNObject txn )
{
m_txn = txn ;
#ifdef __WXMAC_OSX__
TXNControlTag iControlTags[1] = { kTXNVisibilityTag };
TXNControlData iControlData[1] ;
TXNGetTXNObjectControls( m_txn , 1 , iControlTags , iControlData ) ;
m_formerDraw = iControlData[0].uValue ;
if ( m_formerDraw )
{
SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) ,
bounds.right - (varsp->fMultiline ? 0 : 2), bounds.bottom - (varsp->fMultiline ? 0 : 2));
}
else
{
SetRect(&varsp->fRTextArea, bounds.left , bounds.top ,
bounds.right, bounds.bottom);
iControlData[0].uValue = 0 ;
TXNSetTXNObjectControls( m_txn , 1 , true , iControlTags , iControlData ) ;
}
#endif
}
OSStatus MLTESetObjectVisibility( STPTextPaneVars *varsp, Boolean vis , long wxStyle)
wxMacMLTENoDraw::~wxMacMLTENoDraw()
{
OSStatus err = noErr ;
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(varsp->fUserPaneRec);
if ( textctrl )
#ifdef __WXMAC_OSX__
if ( m_formerDraw )
{
#if TARGET_API_MAC_OSX
TXNControlTag iControlTags[1] = { kTXNVisibilityTag };
TXNControlData iControlData[1] = {{ vis }};
err = ::TXNSetTXNObjectControls( varsp->fTXNRec, false, 1, iControlTags, iControlData );
#endif
Rect bounds ;
UMAGetControlBoundsInWindowCoords( varsp->fUserPaneRec, &bounds);
TPCalculateBounds( varsp , bounds ) ;
if ( vis )
{
wxMacWindowClipper cl(textctrl) ;
TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left,
varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame);
TXNShowSelection( varsp->fTXNRec, kTXNShowStart);
}
else
{
#if TARGET_API_MAC_OSX
// in 10.2 the scrollbars are still actively redrawn when using only the code above
if ( UMAGetSystemVersion() < 0x1030 )
{
TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top + 20000 , varsp->fRTextArea.left + 20000 ,
varsp->fRTextArea.bottom + 20000 , varsp->fRTextArea.right + 20000 , varsp->fTXNFrame);
}
#endif
}
TXNControlData iControlData[1] ;
iControlData[0].uValue = m_formerDraw ;
TXNSetTXNObjectControls( m_txn , 1 , true , iControlTags , iControlData ) ;
}
return err ;
#endif
}
// make sure we don't miss changes as carbon events are not available for these under classic
static void TPUpdateVisibility(ControlRef theControl)
{
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(theControl);
if ( textctrl == NULL )
return ;
STPTextPaneVars *varsp = (STPTextPaneVars *) ((wxMacMLTEClassicControl*)textctrl->GetPeer())->m_macTXNvars ;
Rect bounds ;
UMAGetControlBoundsInWindowCoords(theControl, &bounds);
if ( textctrl->MacIsReallyShown() != varsp->fVisible )
{
// invalidate old position
// InvalWindowRect( GetControlOwner( theControl ) , &varsp->fRBounds ) ;
varsp->fVisible = textctrl->MacIsReallyShown() ;
}
if ( !EqualRect( &bounds , &varsp->fRBounds ) )
{
// old position
Rect oldBounds = varsp->fRBounds ;
TPCalculateBounds( varsp , bounds ) ;
// we only recalculate when visible, otherwise scrollbars get drawn at incorrect places
if ( varsp->fVisible )
{
wxMacWindowClipper cl(textctrl) ;
TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left,
varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame);
}
InvalWindowRect( GetControlOwner( theControl ) , &oldBounds ) ;
InvalWindowRect( GetControlOwner( theControl ) , &varsp->fRBounds ) ;
}
}
// make correct activations
static void TPActivatePaneText(STPTextPaneVars *varsp, Boolean setActive) {
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(varsp->fUserPaneRec);
if (varsp->fTXNObjectActive != setActive && textctrl->MacIsReallyShown() )
void wxMacMLTEClassicControl::MacActivatePaneText(Boolean setActive)
{
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if (m_txnIsActive != setActive && textctrl->MacIsReallyShown() )
{
varsp->fTXNObjectActive = setActive;
TXNActivate(varsp->fTXNRec, varsp->fTXNFrame, varsp->fTXNObjectActive);
if (varsp->fInFocus)
TXNFocus( varsp->fTXNRec, varsp->fTXNObjectActive);
}
}
// update focus outlines
static void TPRedrawFocusOutline(STPTextPaneVars *varsp) {
/* state changed */
if (varsp->fFocusDrawState != (varsp->fIsActive && varsp->fInFocus))
{
varsp->fFocusDrawState = (varsp->fIsActive && varsp->fInFocus);
// DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fFocusDrawState);
m_txnIsActive = setActive;
// TXNSetScrollBarState
TXNActivate(m_txn, m_txnFrameID, m_txnIsActive);
if (m_txnIsFocused)
TXNFocus( m_txn, m_txnIsActive);
}
}
// update TXN focus state
static void TPFocusPaneText(STPTextPaneVars *varsp, Boolean setFocus) {
/* wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(varsp->fUserPaneRec); */
void wxMacMLTEClassicControl::MacFocusPaneText(Boolean setFocus) {
/* wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef); */
if (varsp->fInFocus != setFocus /*&& textctrl->MacIsReallyShown() */ ) {
varsp->fInFocus = setFocus;
TXNFocus( varsp->fTXNRec, varsp->fInFocus);
if (m_txnIsFocused != setFocus /*&& textctrl->MacIsReallyShown() */ ) {
m_txnIsFocused = setFocus;
TXNFocus( m_txn, m_txnIsFocused);
}
}
// makes sure that the TXNObject is either offscreen or on screen
void wxMacMLTEClassicControl::MacSetObjectVisibility(Boolean vis)
{
#ifdef __WXMAC_OSX__
OSStatus err = noErr ;
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if ( textctrl )
{
UMAGetControlBoundsInWindowCoords( m_controlRef, &m_txnControlBounds);
TXNControlTag iControlTags[1] = { kTXNVisibilityTag };
TXNControlData iControlData[1] = { { vis } };
TXNSetTXNObjectControls( m_txn , 1 , true , iControlTags , iControlData ) ;
}
#endif
}
// make sure that the TXNObject is at the right position
void wxMacMLTEClassicControl::MacUpdatePosition()
{
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if ( textctrl == NULL )
return ;
Rect bounds ;
UMAGetControlBoundsInWindowCoords(m_controlRef, &bounds);
if ( !EqualRect( &bounds , &m_txnControlBounds ) )
{
// old position
Rect oldBounds = m_txnControlBounds ;
m_txnControlBounds = bounds ;
wxMacWindowClipper cl(textctrl) ;
TXNSetFrameBounds( m_txn, m_txnControlBounds.top, m_txnControlBounds.left,
m_txnControlBounds.bottom, m_txnControlBounds.right, m_txnFrameID);
}
}
void wxMacMLTEClassicControl::SetRect( Rect *r )
{
wxMacControl::SetRect( r ) ;
MacUpdatePosition() ;
}
// draw the control
void wxMacMLTEClassicControl::MacControlUserPaneDrawProc(wxInt16 thePart)
{
@@ -2124,15 +2106,11 @@ void wxMacMLTEClassicControl::MacControlUserPaneDrawProc(wxInt16 thePart)
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if ( textctrl == NULL )
return ;
TPUpdateVisibility( m_controlRef ) ;
if ( textctrl->MacIsReallyShown() )
{
wxMacWindowClipper clipper( textctrl ) ;
TXNDraw(m_txn, NULL);
if ( !m_macTXNvars->fNoBorders )
DrawThemeEditTextFrame(&m_macTXNvars->fRTextOutline, m_macTXNvars->fIsActive ? kThemeStateActive: kThemeStateInactive);
TPRedrawFocusOutline( m_macTXNvars ) ;
TXNDraw( m_txn , NULL ) ;
}
}
@@ -2151,11 +2129,9 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt1
if ( textctrl == NULL )
return 0 ;
TPUpdateVisibility( m_controlRef ) ;
if (textctrl->MacIsReallyShown() )
{
if (PtInRect(where, &m_macTXNvars->fRBounds))
if (PtInRect(where, &m_txnControlBounds))
result = kmUPTextPart;
else
{
@@ -2167,7 +2143,7 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneHitTestProc(wxInt16 x, wxInt1
where.h += x ;
where.v += y ;
}
if (PtInRect(where, &m_macTXNvars->fRBounds))
if (PtInRect(where, &m_txnControlBounds))
result = kmUPTextPart;
else
result = 0;
@@ -2189,12 +2165,11 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneTrackingProc( wxInt16 x, wxIn
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if ( textctrl == NULL )
return 0;
TPUpdateVisibility( m_controlRef ) ;
if (textctrl->MacIsReallyShown() )
{
/* we don't do any of these functions unless we're in focus */
if ( ! m_macTXNvars->fInFocus) {
if ( ! m_txnIsFocused) {
WindowPtr owner;
owner = GetControlOwner(m_controlRef);
ClearKeyboardFocus(owner);
@@ -2238,12 +2213,11 @@ void wxMacMLTEClassicControl::MacControlUserPaneIdleProc()
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if ( textctrl == NULL )
return ;
TPUpdateVisibility( m_controlRef ) ;
if (textctrl->MacIsReallyShown())
{
/* if we're not active, then we have nothing to say about the cursor */
if (m_macTXNvars->fIsActive)
if (m_controlIsActive)
{
Rect bounds;
Point mousep;
@@ -2251,17 +2225,17 @@ void wxMacMLTEClassicControl::MacControlUserPaneIdleProc()
wxMacWindowClipper clipper( textctrl ) ;
GetMouse(&mousep);
/* there's a 'focus thing' and an 'unfocused thing' */
if (m_macTXNvars->fInFocus)
if (m_txnIsFocused)
{
/* flash the cursor */
SetPort(m_macTXNvars->fDrawingEnvironment);
TXNIdle(m_macTXNvars->fTXNRec);
SetPort(m_txnPort);
TXNIdle(m_txn);
/* set the cursor */
if (PtInRect(mousep, &m_macTXNvars->fRTextArea))
if (PtInRect(mousep, &m_txnControlBounds))
{
RgnHandle theRgn;
RectRgn((theRgn = NewRgn()), &m_macTXNvars->fRTextArea);
TXNAdjustCursor(m_macTXNvars->fTXNRec, theRgn);
RectRgn((theRgn = NewRgn()), &m_txnControlBounds);
TXNAdjustCursor(m_txn, theRgn);
DisposeRgn(theRgn);
}
else
@@ -2291,9 +2265,9 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneKeyDownProc (wxInt16 keyCode,
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if ( textctrl == NULL )
return 0;
TPUpdateVisibility( m_controlRef ) ;
// MacUpdatePosition() ;
if (m_macTXNvars->fInFocus)
if (m_txnIsFocused)
{
/* turn autoscrolling on and send the key event to text edit */
wxMacWindowClipper clipper( textctrl ) ;
@@ -2319,18 +2293,17 @@ void wxMacMLTEClassicControl::MacControlUserPaneActivateProc( bool activating)
if ( textctrl == NULL )
return ;
TPUpdateVisibility( m_controlRef ) ;
m_macTXNvars->fIsActive = activating;
wxMacWindowClipper clipper( textctrl ) ;
TPActivatePaneText(m_macTXNvars, m_macTXNvars->fIsActive && m_macTXNvars->fInFocus);
/* redraw the frame */
if ( textctrl->MacIsReallyShown() )
if ( m_controlIsActive != activating )
{
if ( !m_macTXNvars->fNoBorders )
DrawThemeEditTextFrame(&m_macTXNvars->fRTextOutline, m_macTXNvars->fIsActive ? kThemeStateActive: kThemeStateInactive);
TPRedrawFocusOutline( m_macTXNvars ) ;
wxLogDebug(wxString::Format( wxT("id %xd activating with %d") , (long) this , activating ) ) ;
// MacUpdatePosition() ;
m_controlIsActive = activating;
wxMacWindowClipper clipper( textctrl ) ;
MacActivatePaneText( activating );
}
}
@@ -2340,13 +2313,17 @@ according to the parameters and redraw the control as
necessary. */
wxInt16 wxMacMLTEClassicControl::MacControlUserPaneFocusProc(wxInt16 action)
{
wxLogDebug(wxString::Format( wxT("id %xd Focus Proc with action %d") , (long) this , action ) ) ;
ControlPartCode focusResult;
focusResult = kControlFocusNoPart;
wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(m_controlRef);
if ( textctrl == NULL )
return 0;
TPUpdateVisibility( m_controlRef ) ;
wxMacWindowClipper clipper( textctrl ) ;
// MacUpdatePosition() ;
/* if kControlFocusPrevPart and kControlFocusNextPart are received when the user is
tabbing forwards (or shift tabbing backwards) through the items in the dialog,
@@ -2370,29 +2347,20 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneFocusProc(wxInt16 action)
{
default:
case kControlFocusNoPart:
TPFocusPaneText(m_macTXNvars, false);
MacFocusPaneText( false);
focusResult = kControlFocusNoPart;
break;
case kUserClickedToFocusPart:
TPFocusPaneText(m_macTXNvars, true);
MacFocusPaneText(true);
focusResult = 1;
break;
case kControlFocusPrevPart:
case kControlFocusNextPart:
TPFocusPaneText(m_macTXNvars, ( ! m_macTXNvars->fInFocus));
focusResult = m_macTXNvars->fInFocus ? 1 : kControlFocusNoPart;
MacFocusPaneText( ( ! m_txnIsFocused));
focusResult = m_txnIsFocused ? 1 : kControlFocusNoPart;
break;
}
TPActivatePaneText(m_macTXNvars, m_macTXNvars->fIsActive && m_macTXNvars->fInFocus);
/* redraw the text fram and focus rectangle to indicate the
new focus state */
if ( textctrl->MacIsReallyShown() )
{
wxMacWindowClipper c( textctrl ) ;
if ( !m_macTXNvars->fNoBorders )
DrawThemeEditTextFrame(&m_macTXNvars->fRTextOutline, m_macTXNvars->fIsActive ? kThemeStateActive: kThemeStateInactive);
TPRedrawFocusOutline( m_macTXNvars ) ;
}
return focusResult;
}
@@ -2400,10 +2368,10 @@ void wxMacMLTEClassicControl::MacControlUserPaneBackgroundProc( void *info )
{
}
wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxWindow *wxPeer,
wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style )
const wxSize& size, long style ) : wxMacMLTEControl( wxPeer )
{
m_font = wxPeer->GetFont() ;
m_windowStyle = style ;
@@ -2414,46 +2382,36 @@ wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxWindow *wxPeer,
short featurSet;
featurSet = kControlSupportsEmbedding | kControlSupportsFocus | kControlWantsIdle
| kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
| kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
| kControlGetsFocusOnClick | kControlSupportsLiveFeedback;
/* create the control */
verify_noerr( ::CreateUserPaneControl( MAC_WXHWND(wxPeer->GetParent()->MacGetTopLevelWindowRef()), &bounds, featurSet, &m_controlRef ) );
{
// wxMacWindowClipper c(wxPeer) ;
DoCreate();
}
DoCreate();
if ( wxPeer->MacIsReallyShown() )
MLTESetObjectVisibility( (STPTextPaneVars*) m_macTXNvars, true , style ) ;
MacSetObjectVisibility( true ) ;
AdjustCreationAttributes( *wxWHITE , true ) ;
{
// wxMacWindowClipper clipper( wxPeer ) ;
TPUpdateVisibility( m_controlRef ) ;
wxMacWindowClipper clipper( m_peer ) ;
SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ;
TXNSetSelection( m_txn, 0, 0);
TXNShowSelection( m_txn, kTXNShowStart);
}
AdjustCreationAttributes( *wxWHITE , true ) ;
}
wxMacMLTEClassicControl::~wxMacMLTEClassicControl()
{
// SetControlReference(m_controlRef , 0) ;
TXNDeleteObject(m_txn);
free(m_macTXNvars);
}
void wxMacMLTEClassicControl::VisibilityChanged(bool shown)
{
MLTESetObjectVisibility((STPTextPaneVars*) m_macTXNvars , shown , m_windowStyle ) ;
if ( !shown )
InvalWindowRect( GetControlOwner( m_controlRef ) , &((STPTextPaneVars *)m_macTXNvars)->fRBounds ) ;
MacSetObjectVisibility( shown ) ;
}
bool wxMacMLTEClassicControl::NeedsFocusRect() const
@@ -2539,7 +2497,6 @@ static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, Contro
OSStatus wxMacMLTEClassicControl::DoCreate()
{
Rect bounds;
WindowRef theWindow;
OSStatus err = noErr ;
@@ -2554,22 +2511,15 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
if (gTPFocusProc == NULL) gTPFocusProc = NewControlUserPaneFocusUPP(wxMacControlUserPaneFocusProc);
#endif
/* allocate our private storage */
m_macTXNvars = (STPTextPaneVars *) malloc(sizeof(STPTextPaneVars));
/* set the initial settings for our private data */
m_macTXNvars->fMultiline = m_windowStyle & wxTE_MULTILINE ;
m_macTXNvars->fNoBorders = m_windowStyle & wxNO_BORDER ;
m_macTXNvars->fInFocus = false;
m_macTXNvars->fIsActive = true;
m_macTXNvars->fTXNObjectActive = false;
m_macTXNvars->fFocusDrawState = false ;
m_macTXNvars->fUserPaneRec = m_controlRef ;
m_macTXNvars->fVisible = true ;
theWindow = m_macTXNvars->fOwner = GetControlOwner(m_controlRef);
m_txnIsFocused = false;
m_controlIsActive = true;
m_txnIsActive = false;
m_txnIsVisible = true ;
m_macTXNvars->fDrawingEnvironment = (GrafPtr) GetWindowPort(theWindow);
WindowRef owningWindow = GetControlOwner(m_controlRef);
m_txnPort = (GrafPtr) GetWindowPort(owningWindow);
#ifdef __WXMAC_OSX__
/* set up the user pane procedures */
@@ -2583,28 +2533,30 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
#endif
/* calculate the rectangles used by the control */
UMAGetControlBoundsInWindowCoords(m_controlRef, &bounds);
m_macTXNvars->fRTextOutlineRegion = NewRgn() ;
TPCalculateBounds( m_macTXNvars , bounds ) ;
/* set up the drawing environment */
SetPort(m_macTXNvars->fDrawingEnvironment);
m_txnControlBounds = bounds ;
CGrafPtr origPort = NULL ;
GDHandle origDev = NULL ;
GetGWorld( &origPort , &origDev ) ;
SetPort(m_txnPort);
/* create the new edit field */
TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( m_windowStyle ) ;
verify_noerr(TXNNewObject(NULL, m_macTXNvars->fOwner, &m_macTXNvars->fRTextArea,
verify_noerr(TXNNewObject(NULL, owningWindow , &bounds,
frameOptions ,
kTXNTextEditStyleFrameType,
kTXNTextensionFile,
kTXNSystemDefaultEncoding,
&m_macTXNvars->fTXNRec, &m_macTXNvars->fTXNFrame, (TXNObjectRefcon) m_macTXNvars));
m_txn = m_macTXNvars->fTXNRec ;
&m_txn, &m_txnFrameID, NULL ) );
/* perform final activations and setup for our text field. Here,
we assume that the window is going to be the 'active' window. */
TPActivatePaneText(m_macTXNvars, m_macTXNvars->fIsActive && m_macTXNvars->fInFocus);
// MacActivatePaneText(m_controlIsActive && m_txnIsFocused);
/* all done */
SetGWorld( origPort , origDev ) ;
return err;
}
@@ -2616,10 +2568,10 @@ OSStatus wxMacMLTEClassicControl::DoCreate()
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxWindow *wxPeer,
wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
const wxSize& size, long style )
const wxSize& size, long style ) : wxMacMLTEControl( wxPeer )
{
m_font = wxPeer->GetFont() ;
m_windowStyle = style ;
@@ -2656,12 +2608,14 @@ wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxWindow *wxPeer,
m_controlRef = m_textView ;
}
AdjustCreationAttributes( *wxWHITE , true ) ;
wxMacWindowClipper c( m_peer ) ;
SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ;
TXNSetSelection( m_txn, 0, 0);
TXNShowSelection( m_txn, kTXNShowStart);
AdjustCreationAttributes( *wxWHITE , true ) ;
}
OSStatus wxMacMLTEHIViewControl::SetFocus( ControlFocusPart focusPart )