// Name: textctrl.cpp
// Purpose: wxTextCtrl
// Author: Stefan Csomor
-// Modified by:
+// Modified by: Ryan Norton (MLTE GetLineLength and GetLineText)
// Created: 1998-01-01
// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
virtual wxString GetStringValue() const ;
virtual void SetStringValue( const wxString &str) ;
- static int ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes attr[] ) ;
static TXNFrameOptions FrameOptionsFromWXStyle( long wxStyle ) ;
void AdjustCreationAttributes( const wxColour& background , bool visible ) ;
void SetTXNData( const wxString& st , TXNOffset start , TXNOffset end ) ;
protected :
+ void TXNSetAttribute( const wxTextAttr& style , long from , long to ) ;
TXNObject m_txn ;
} ;
const wxSize& size, long style ) ;
virtual OSStatus SetFocus( ControlFocusPart focusPart ) ;
virtual bool HasFocus() const ;
- virtual bool NeedsFocusRect() const ;
+ virtual bool NeedsFocusRect() const;
protected :
HIViewRef m_scrollView ;
HIViewRef m_textView ;
{
// 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 ) ;
}
// while this is true for MLTE under classic, the HITextView is somehow
// transparent but background erase is not working correctly, so intercept
// things while we can...
+ event.Skip() ;
}
void wxTextCtrl::OnChar(wxKeyEvent& event)
return ;
}
+ // Check if we have reached the max # of chars, but still allow navigation and deletion
+ if ( !IsMultiLine() && GetValue().Length() >= m_maxLength &&
+ key != WXK_LEFT && key != WXK_RIGHT && key != WXK_TAB &&
+ key != WXK_BACK && !( key == WXK_RETURN && (m_windowStyle & wxPROCESS_ENTER) )
+ )
+ {
+ // eat it, we don't want to add more than allowed # of characters
+ return;
+ }
+
// assume that any key not processed yet is going to modify the control
m_dirty = true;
m_windowStyle = style ;
Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
wxString st = str ;
- wxMacConvertNewlines13To10( &st ) ;
+ wxMacConvertNewlines10To13( &st ) ;
wxMacCFStringHolder cf(st , m_font.GetEncoding()) ;
CFStringRef cfr = cf ;
Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ;
wxMacCFStringHolder cf(value) ;
result = cf.AsString() ;
}
+#if '\n' == 10
+ wxMacConvertNewlines13To10( &result ) ;
+#else
wxMacConvertNewlines10To13( &result ) ;
+#endif
return result ;
}
void wxMacUnicodeTextControl::SetStringValue( const wxString &str)
{
wxString st = str ;
- wxMacConvertNewlines13To10( &st ) ;
+ wxMacConvertNewlines10To13( &st ) ;
wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
verify_noerr( SetData<CFStringRef>( 0, m_valueTag , cf ) ) ;
}
void wxMacUnicodeTextControl::WriteText(const wxString& str)
{
wxString st = str ;
- wxMacConvertNewlines13To10( &st ) ;
+ wxMacConvertNewlines10To13( &st ) ;
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
CFStringRef value = cf ;
}
#endif
}
+#if '\n' == 10
+ wxMacConvertNewlines13To10( &result ) ;
+#else
wxMacConvertNewlines10To13( &result ) ;
+#endif
return result ;
}
void wxMacMLTEControl::SetStringValue( const wxString &str)
{
wxString st = str ;
- wxMacConvertNewlines13To10( &st ) ;
+
+ wxMacConvertNewlines10To13( &st ) ;
EditHelper help(m_txn) ;
// wxMacWindowClipper c( this ) ;
TXNSetBackground( m_txn , &tback);
}
-int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes typeAttr[] )
+void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , long to)
{
+ TXNTypeAttributes typeAttr[4] ;
Str255 fontName = "\pMonaco" ;
SInt16 fontSize = 12 ;
Style fontStyle = normal ;
color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ;
attrCounter += 1 ;
}
- return attrCounter ;
+ if ( attrCounter > 0 )
+ {
+ verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, from , to) );
+ }
}
void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
{
EditHelper help(m_txn) ;
- wxTextAttr style(foreground,wxNullColour,font) ;
- TXNTypeAttributes typeAttr[4] ;
- int attrCounter = ConvertAttribute( style , typeAttr ) ;
- if ( attrCounter > 0 )
- {
- verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, kTXNStartOffset,kTXNEndOffset) );
- }
+ TXNSetAttribute( wxTextAttr(foreground,wxNullColour,font) , kTXNStartOffset,kTXNEndOffset ) ;
}
void wxMacMLTEControl::SetStyle(long start, long end, const wxTextAttr& style)
{
EditHelper help(m_txn) ;
- TXNTypeAttributes typeAttr[4] ;
- int attrCounter = ConvertAttribute( style , typeAttr ) ;
- if ( attrCounter > 0 )
- {
- verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, start,end) );
- }
+ TXNSetAttribute( style , start,end ) ;
}
void wxMacMLTEControl::Copy()
void wxMacMLTEControl::Replace( long from , long to , const wxString str )
{
wxString value = str ;
- wxMacConvertNewlines13To10( &value ) ;
+ wxMacConvertNewlines10To13( &value ) ;
EditHelper help( m_txn ) ;
TXNSetSelection(m_txn , from , to ) ;
TXNClear( m_txn ) ;
- SetTXNData( str , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
+ SetTXNData( value , kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;
}
void wxMacMLTEControl::Remove( long from , long to )
{
EditHelper helper( m_txn ) ;
wxString st = str ;
- wxMacConvertNewlines13To10( &st ) ;
+ wxMacConvertNewlines10To13( &st ) ;
long start , end , dummy ;
GetSelection( &start , &dummy ) ;
wxString wxMacMLTEControl::GetLineText(long lineNo) const
{
wxString line ;
- Point curpt ;
- wxString content = GetStringValue() ;
if ( lineNo < GetNumberOfLines() )
{
- // TODO find a better implementation : while we can get the
- // line metrics of a certain line, we don't get its starting
- // position, so it would probably be rather a binary search
- // for the start position
- long xpos = 0 ;
long ypos = 0 ;
- int lastHeight = 0 ;
- long lastpos = GetLastPosition() ;
-
- ItemCount n ;
- for ( n = 0 ; n <= (ItemCount)lastpos ; ++n )
+
+ Fixed lineWidth,
+ lineHeight,
+ currentHeight = 0;
+
+ // get the first possible position in the control
+ Point firstPoint;
+ TXNOffsetToPoint(m_txn, 0, &firstPoint);
+
+ // Iterate through the lines until we reach the one we want,
+ // adding to our current y pixel point position
+ while (ypos < lineNo)
{
- TXNOffsetToPoint( m_txn, n , &curpt);
-
- if ( curpt.v > lastHeight )
- {
- if ( ypos == lineNo )
- return line ;
+ TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);
+ currentHeight += lineHeight;
+ }
+
+ Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };
+ TXNOffset theOffset;
+ TXNPointToOffset(m_txn, thePoint, &theOffset);
- xpos = 0 ;
- if ( n > 0 )
- ++ypos ;
- lastHeight = curpt.v ;
- }
- else
- {
- if ( ypos == lineNo )
- line += content[n] ;
- ++xpos ;
- }
+ wxString content = GetStringValue() ;
+ Point currentPoint = thePoint;
+ while(thePoint.v == currentPoint.v && theOffset < content.length())
+ {
+ line += content[theOffset];
+ TXNOffsetToPoint(m_txn, ++theOffset, ¤tPoint);
}
}
return line ;
int wxMacMLTEControl::GetLineLength(long lineNo) const
{
- Point curpt ;
+ int theLength = 0;
+
if ( lineNo < GetNumberOfLines() )
{
- // TODO find a better implementation : while we can get the
- // line metrics of a certain line, we don't get its starting
- // position, so it would probably be rather a binary search
- // for the start position
- long xpos = 0 ;
long ypos = 0 ;
- int lastHeight = 0 ;
- long lastpos = GetLastPosition() ;
-
- ItemCount n ;
- for ( n = 0 ; n <= (ItemCount) lastpos ; ++n )
+
+ Fixed lineWidth,
+ lineHeight,
+ currentHeight = 0;
+
+ // get the first possible position in the control
+ Point firstPoint;
+ TXNOffsetToPoint(m_txn, 0, &firstPoint);
+
+ // Iterate through the lines until we reach the one we want,
+ // adding to our current y pixel point position
+ while (ypos < lineNo)
{
- TXNOffsetToPoint( m_txn , n , &curpt);
-
- if ( curpt.v > lastHeight )
- {
- if ( ypos == lineNo )
- return xpos ;
+ TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);
+ currentHeight += lineHeight;
+ }
+
+ Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };
+ TXNOffset theOffset;
+ TXNPointToOffset(m_txn, thePoint, &theOffset);
- xpos = 0 ;
- if ( n > 0 )
- ++ypos ;
- lastHeight = curpt.v ;
- }
- else
- ++xpos ;
+ wxString content = GetStringValue() ;
+ Point currentPoint = thePoint;
+ while(thePoint.v == currentPoint.v && theOffset < content.length())
+ {
+ ++theLength;
+ TXNOffsetToPoint(m_txn, ++theOffset, ¤tPoint);
}
}
- return 0 ;
+ return theLength ;
}
m_windowStyle = style ;
Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
wxString st = str ;
- wxMacConvertNewlines13To10( &st ) ;
-
- wxMacConvertNewlines13To10( &st ) ;
+ wxMacConvertNewlines10To13( &st ) ;
short featurSet;
m_windowStyle = style ;
Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
wxString st = str ;
- wxMacConvertNewlines13To10( &st ) ;
+ wxMacConvertNewlines10To13( &st ) ;
HIRect hr = { bounds.left , bounds.top , bounds.right - bounds.left , bounds.bottom- bounds.top } ;