appearance box drawing

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15508 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2002-05-11 06:55:38 +00:00
parent 5a9819026e
commit 32907dbd80
2 changed files with 194 additions and 70 deletions

View File

@@ -1383,6 +1383,9 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
return; return;
} }
if ( str.Length() == 0 )
return ;
wxMacPortSetter helper(this) ; wxMacPortSetter helper(this) ;
MacInstallFont() ; MacInstallFont() ;
@@ -1428,11 +1431,14 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
&chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" ); wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" );
if ( abs(angle) > 0 )
{
Fixed atsuAngle = IntToFixed( angle ) ; Fixed atsuAngle = IntToFixed( angle ) ;
ByteCount angleSize = sizeof(Fixed) ; ByteCount angleSize = sizeof(Fixed) ;
ATSUAttributeTag rotationTag = kATSULineRotationTag ; ATSUAttributeTag rotationTag = kATSULineRotationTag ;
ATSUAttributeValuePtr angleValue = &atsuAngle ; ATSUAttributeValuePtr angleValue = &atsuAngle ;
status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ; status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ;
}
status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) ); IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) );
@@ -1457,6 +1463,8 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
long xx = XLOG2DEVMAC(x); long xx = XLOG2DEVMAC(x);
long yy = YLOG2DEVMAC(y); long yy = YLOG2DEVMAC(y);
bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
MacInstallFont() ; MacInstallFont() ;
if ( 0 ) if ( 0 )
{ {
@@ -1468,7 +1476,9 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
FontInfo fi ; FontInfo fi ;
::GetFontInfo( &fi ) ; ::GetFontInfo( &fi ) ;
if ( !useDrawThemeText )
yy += fi.ascent ; yy += fi.ascent ;
::MoveTo( xx , yy ); ::MoveTo( xx , yy );
if ( m_backgroundMode == wxTRANSPARENT ) if ( m_backgroundMode == wxTRANSPARENT )
{ {
@@ -1499,19 +1509,54 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
int i = 0 ; int i = 0 ;
int line = 0 ; int line = 0 ;
{
while( i < length ) while( i < length )
{ {
if( text[i] == 13 || text[i] == 10) if( text[i] == 13 || text[i] == 10)
{
if ( useDrawThemeText )
{
Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading) ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 1000 } ;
CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
::DrawThemeTextBox( mString,
kThemeCurrentPortFont,
kThemeStateActive,
true,
&frame,
teJustLeft,
nil );
CFRelease( mString ) ;
line++ ;
}
else
{ {
::DrawText( text , laststop , i - laststop ) ; ::DrawText( text , laststop , i - laststop ) ;
line++ ; line++ ;
::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) ); ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
}
laststop = i+1 ; laststop = i+1 ;
} }
i++ ; i++ ;
} }
if ( useDrawThemeText )
{
Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading) ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 1000 } ;
CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ;
::DrawThemeTextBox( mString,
kThemeCurrentPortFont,
kThemeStateActive,
true,
&frame,
teJustLeft,
nil );
CFRelease( mString ) ;
}
else
{
::DrawText( text , laststop , i - laststop ) ; ::DrawText( text , laststop , i - laststop ) ;
}
}
::TextMode( srcOr ) ; ::TextMode( srcOr ) ;
} }
@@ -1635,7 +1680,7 @@ void wxDC::Clear(void)
{ {
wxCHECK_RET(Ok(), wxT("Invalid DC")); wxCHECK_RET(Ok(), wxT("Invalid DC"));
wxMacPortSetter helper(this) ; wxMacPortSetter helper(this) ;
Rect rect = { -32000 , -32000 , 32000 , 32000 } ; Rect rect = { -31000 , -31000 , 31000 , 31000 } ;
if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) if (m_backgroundBrush.GetStyle() != wxTRANSPARENT)
{ {
@@ -1653,6 +1698,8 @@ void wxDC::MacInstallFont() const
// return ; // return ;
Pattern blackColor ; Pattern blackColor ;
MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ; wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
if ( font ) if ( font )
@@ -1672,12 +1719,16 @@ void wxDC::MacInstallFont() const
} }
else else
{ {
short fontnum ; FontFamilyID fontId ;
Str255 fontName ;
SInt16 fontSize ;
Style fontStyle ;
GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
GetFNum( fontName, &fontId );
GetFNum( "\pGeneva" , &fontnum ) ; ::TextFont( fontId ) ;
::TextFont( fontnum ) ; ::TextSize( short(m_scaleY * fontSize) ) ;
::TextSize( short(m_scaleY * 10) ) ; ::TextFace( fontStyle ) ;
::TextFace( 0 ) ;
// todo reset after spacing changes - or store the current spacing somewhere // todo reset after spacing changes - or store the current spacing somewhere
@@ -1747,7 +1798,9 @@ void wxDC::MacInstallFont() const
{ {
kATSUFontTag , kATSUFontTag ,
kATSUSizeTag , kATSUSizeTag ,
kATSUColorTag , // kATSUColorTag ,
kATSUBaselineClassTag ,
kATSUVerticalCharacterTag,
kATSUQDBoldfaceTag , kATSUQDBoldfaceTag ,
kATSUQDItalicTag , kATSUQDItalicTag ,
@@ -1761,22 +1814,31 @@ void wxDC::MacInstallFont() const
{ {
sizeof( ATSUFontID ) , sizeof( ATSUFontID ) ,
sizeof( Fixed ) , sizeof( Fixed ) ,
sizeof( RGBColor ) , // sizeof( RGBColor ) ,
sizeof( BslnBaselineClass ) ,
sizeof( ATSUVerticalCharacterType),
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
} ; } ;
Boolean kTrue = true ; Boolean kTrue = true ;
Boolean kFalse = false ; Boolean kFalse = false ;
BslnBaselineClass kBaselineDefault = kBSLNHangingBaseline ;
ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
{ {
&atsuFont , &atsuFont ,
&atsuSize , &atsuSize ,
&MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) , // &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) ,
&kBaselineDefault ,
&kHorizontal,
(qdStyle & bold) ? &kTrue : &kFalse , (qdStyle & bold) ? &kTrue : &kFalse ,
(qdStyle & italic) ? &kTrue : &kFalse , (qdStyle & italic) ? &kTrue : &kFalse ,

View File

@@ -1383,6 +1383,9 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
return; return;
} }
if ( str.Length() == 0 )
return ;
wxMacPortSetter helper(this) ; wxMacPortSetter helper(this) ;
MacInstallFont() ; MacInstallFont() ;
@@ -1428,11 +1431,14 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
&chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" ); wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" );
if ( abs(angle) > 0 )
{
Fixed atsuAngle = IntToFixed( angle ) ; Fixed atsuAngle = IntToFixed( angle ) ;
ByteCount angleSize = sizeof(Fixed) ; ByteCount angleSize = sizeof(Fixed) ;
ATSUAttributeTag rotationTag = kATSULineRotationTag ; ATSUAttributeTag rotationTag = kATSULineRotationTag ;
ATSUAttributeValuePtr angleValue = &atsuAngle ; ATSUAttributeValuePtr angleValue = &atsuAngle ;
status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ; status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ;
}
status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) ); IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) );
@@ -1457,6 +1463,8 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
long xx = XLOG2DEVMAC(x); long xx = XLOG2DEVMAC(x);
long yy = YLOG2DEVMAC(y); long yy = YLOG2DEVMAC(y);
bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
MacInstallFont() ; MacInstallFont() ;
if ( 0 ) if ( 0 )
{ {
@@ -1468,7 +1476,9 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
FontInfo fi ; FontInfo fi ;
::GetFontInfo( &fi ) ; ::GetFontInfo( &fi ) ;
if ( !useDrawThemeText )
yy += fi.ascent ; yy += fi.ascent ;
::MoveTo( xx , yy ); ::MoveTo( xx , yy );
if ( m_backgroundMode == wxTRANSPARENT ) if ( m_backgroundMode == wxTRANSPARENT )
{ {
@@ -1499,19 +1509,54 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
int i = 0 ; int i = 0 ;
int line = 0 ; int line = 0 ;
{
while( i < length ) while( i < length )
{ {
if( text[i] == 13 || text[i] == 10) if( text[i] == 13 || text[i] == 10)
{
if ( useDrawThemeText )
{
Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading) ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 1000 } ;
CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
::DrawThemeTextBox( mString,
kThemeCurrentPortFont,
kThemeStateActive,
true,
&frame,
teJustLeft,
nil );
CFRelease( mString ) ;
line++ ;
}
else
{ {
::DrawText( text , laststop , i - laststop ) ; ::DrawText( text , laststop , i - laststop ) ;
line++ ; line++ ;
::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) ); ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
}
laststop = i+1 ; laststop = i+1 ;
} }
i++ ; i++ ;
} }
if ( useDrawThemeText )
{
Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading) ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 1000 } ;
CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ;
::DrawThemeTextBox( mString,
kThemeCurrentPortFont,
kThemeStateActive,
true,
&frame,
teJustLeft,
nil );
CFRelease( mString ) ;
}
else
{
::DrawText( text , laststop , i - laststop ) ; ::DrawText( text , laststop , i - laststop ) ;
}
}
::TextMode( srcOr ) ; ::TextMode( srcOr ) ;
} }
@@ -1635,7 +1680,7 @@ void wxDC::Clear(void)
{ {
wxCHECK_RET(Ok(), wxT("Invalid DC")); wxCHECK_RET(Ok(), wxT("Invalid DC"));
wxMacPortSetter helper(this) ; wxMacPortSetter helper(this) ;
Rect rect = { -32000 , -32000 , 32000 , 32000 } ; Rect rect = { -31000 , -31000 , 31000 , 31000 } ;
if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) if (m_backgroundBrush.GetStyle() != wxTRANSPARENT)
{ {
@@ -1653,6 +1698,8 @@ void wxDC::MacInstallFont() const
// return ; // return ;
Pattern blackColor ; Pattern blackColor ;
MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ; wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
if ( font ) if ( font )
@@ -1672,12 +1719,16 @@ void wxDC::MacInstallFont() const
} }
else else
{ {
short fontnum ; FontFamilyID fontId ;
Str255 fontName ;
SInt16 fontSize ;
Style fontStyle ;
GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
GetFNum( fontName, &fontId );
GetFNum( "\pGeneva" , &fontnum ) ; ::TextFont( fontId ) ;
::TextFont( fontnum ) ; ::TextSize( short(m_scaleY * fontSize) ) ;
::TextSize( short(m_scaleY * 10) ) ; ::TextFace( fontStyle ) ;
::TextFace( 0 ) ;
// todo reset after spacing changes - or store the current spacing somewhere // todo reset after spacing changes - or store the current spacing somewhere
@@ -1747,7 +1798,9 @@ void wxDC::MacInstallFont() const
{ {
kATSUFontTag , kATSUFontTag ,
kATSUSizeTag , kATSUSizeTag ,
kATSUColorTag , // kATSUColorTag ,
kATSUBaselineClassTag ,
kATSUVerticalCharacterTag,
kATSUQDBoldfaceTag , kATSUQDBoldfaceTag ,
kATSUQDItalicTag , kATSUQDItalicTag ,
@@ -1761,22 +1814,31 @@ void wxDC::MacInstallFont() const
{ {
sizeof( ATSUFontID ) , sizeof( ATSUFontID ) ,
sizeof( Fixed ) , sizeof( Fixed ) ,
sizeof( RGBColor ) , // sizeof( RGBColor ) ,
sizeof( BslnBaselineClass ) ,
sizeof( ATSUVerticalCharacterType),
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
sizeof( Boolean ) , sizeof( Boolean ) ,
} ; } ;
Boolean kTrue = true ; Boolean kTrue = true ;
Boolean kFalse = false ; Boolean kFalse = false ;
BslnBaselineClass kBaselineDefault = kBSLNHangingBaseline ;
ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
{ {
&atsuFont , &atsuFont ,
&atsuSize , &atsuSize ,
&MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) , // &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) ,
&kBaselineDefault ,
&kHorizontal,
(qdStyle & bold) ? &kTrue : &kFalse , (qdStyle & bold) ? &kTrue : &kFalse ,
(qdStyle & italic) ? &kTrue : &kFalse , (qdStyle & italic) ? &kTrue : &kFalse ,