| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #define Region QtXRegion |
| |
| #include <QColor> |
| #include <QStyle> |
| |
| #include <kconfig.h> |
| #include <kglobal.h> |
| #include <kmenubar.h> |
| #include <kconfiggroup.h> |
| #include <kmainwindow.h> |
| #include <kapplication.h> |
| #include <ktoolbar.h> |
| |
| #undef Region |
| |
| #include "KDESalFrame.hxx" |
| #include "KDEXLib.hxx" |
| #include "KDESalGraphics.hxx" |
| |
| #include <tools/color.hxx> |
| |
| #include <vcl/settings.hxx> |
| #include <vcl/font.hxx> |
| |
| #include <svdata.hxx> |
| |
| #include <unx/pspgraphics.h> |
| |
| #if OSL_DEBUG_LEVEL > 1 |
| #include <stdio.h> |
| #endif |
| |
| KDESalFrame::KDESalFrame( SalFrame* pParent, sal_uLong nState ) : |
| X11SalFrame( pParent, nState ) |
| { |
| } |
| |
| void KDESalFrame::Show( sal_Bool bVisible, sal_Bool bNoActivate ) |
| { |
| if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) ) |
| { |
| KDEXLib* pXLib = static_cast<KDEXLib*>(GetDisplay()->GetXLib()); |
| pXLib->doStartup(); |
| } |
| |
| X11SalFrame::Show( bVisible, bNoActivate ); |
| } |
| |
| /** Helper function to convert colors. |
| */ |
| static Color toColor( const QColor &rColor ) |
| { |
| return Color( rColor.red(), rColor.green(), rColor.blue() ); |
| } |
| |
| /** Helper function to read untranslated text entry from KConfig configuration repository. |
| */ |
| static OUString readEntryUntranslated( KConfigGroup *pGroup, const char *pKey ) |
| { |
| return OUString::createFromAscii( (const char *) pGroup->readEntryUntranslated( pKey ).toAscii() ); |
| } |
| |
| #if 0 |
| /** Helper function to read color from KConfig configuration repository. |
| */ |
| static Color readColor( KConfigGroup *pGroup, const char *pKey ) |
| { |
| return toColor( pGroup->readEntry( pKey, QColor(Qt::white) ) ); |
| } |
| #endif |
| |
| /** Helper function to add information to Font from QFont. |
| |
| Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx). |
| */ |
| static Font toFont( const QFont &rQFont, const ::com::sun::star::lang::Locale& rLocale ) |
| { |
| psp::FastPrintFontInfo aInfo; |
| QFontInfo qFontInfo( rQFont ); |
| |
| // set family name |
| aInfo.m_aFamilyName = String( (const char *) rQFont.family().toUtf8(), RTL_TEXTENCODING_UTF8 ); |
| |
| // set italic |
| aInfo.m_eItalic = ( qFontInfo.italic()? psp::italic::Italic: psp::italic::Upright ); |
| |
| // set weight |
| int nWeight = qFontInfo.weight(); |
| if ( nWeight <= QFont::Light ) |
| aInfo.m_eWeight = psp::weight::Light; |
| else if ( nWeight <= QFont::Normal ) |
| aInfo.m_eWeight = psp::weight::Normal; |
| else if ( nWeight <= QFont::DemiBold ) |
| aInfo.m_eWeight = psp::weight::SemiBold; |
| else if ( nWeight <= QFont::Bold ) |
| aInfo.m_eWeight = psp::weight::Bold; |
| else |
| aInfo.m_eWeight = psp::weight::UltraBold; |
| |
| // set width |
| int nStretch = rQFont.stretch(); |
| if ( nStretch <= QFont::UltraCondensed ) |
| aInfo.m_eWidth = psp::width::UltraCondensed; |
| else if ( nStretch <= QFont::ExtraCondensed ) |
| aInfo.m_eWidth = psp::width::ExtraCondensed; |
| else if ( nStretch <= QFont::Condensed ) |
| aInfo.m_eWidth = psp::width::Condensed; |
| else if ( nStretch <= QFont::SemiCondensed ) |
| aInfo.m_eWidth = psp::width::SemiCondensed; |
| else if ( nStretch <= QFont::Unstretched ) |
| aInfo.m_eWidth = psp::width::Normal; |
| else if ( nStretch <= QFont::SemiExpanded ) |
| aInfo.m_eWidth = psp::width::SemiExpanded; |
| else if ( nStretch <= QFont::Expanded ) |
| aInfo.m_eWidth = psp::width::Expanded; |
| else if ( nStretch <= QFont::ExtraExpanded ) |
| aInfo.m_eWidth = psp::width::ExtraExpanded; |
| else |
| aInfo.m_eWidth = psp::width::UltraExpanded; |
| |
| #if OSL_DEBUG_LEVEL > 1 |
| fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); |
| #endif |
| |
| // match font to e.g. resolve "Sans" |
| psp::PrintFontManager::get().matchFont( aInfo, rLocale ); |
| |
| #if OSL_DEBUG_LEVEL > 1 |
| fprintf( stderr, "font match %s, name AFTER: \"%s\"\n", |
| aInfo.m_nID != 0 ? "succeeded" : "failed", |
| OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); |
| #endif |
| |
| // font height |
| int nPointHeight = qFontInfo.pointSize(); |
| if ( nPointHeight <= 0 ) |
| nPointHeight = rQFont.pointSize(); |
| |
| // Create the font |
| Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) ); |
| if( aInfo.m_eWeight != psp::weight::Unknown ) |
| aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) ); |
| if( aInfo.m_eWidth != psp::width::Unknown ) |
| aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) ); |
| if( aInfo.m_eItalic != psp::italic::Unknown ) |
| aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) ); |
| if( aInfo.m_ePitch != psp::pitch::Unknown ) |
| aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) ); |
| |
| return aFont; |
| } |
| |
| /** Implementation of KDE integration's main method. |
| */ |
| void KDESalFrame::UpdateSettings( AllSettings& rSettings ) |
| { |
| StyleSettings style( rSettings.GetStyleSettings() ); |
| bool bSetTitleFont = false; |
| |
| // General settings |
| QPalette pal = kapp->palette(); |
| |
| style.SetActiveColor(toColor(pal.color(QPalette::Active, QPalette::Window))); |
| style.SetDeactiveColor(toColor(pal.color(QPalette::Inactive, QPalette::Window))); |
| |
| style.SetActiveColor2(toColor(pal.color(QPalette::Active, QPalette::Window))); |
| style.SetDeactiveColor2(toColor(pal.color(QPalette::Inactive, QPalette::Window))); |
| |
| style.SetActiveTextColor(toColor(pal.color(QPalette::Active, QPalette::WindowText))); |
| style.SetDeactiveTextColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText))); |
| |
| // WM settings |
| KConfig *pConfig = KGlobal::config().data(); |
| if ( pConfig ) |
| { |
| KConfigGroup aGroup = pConfig->group( "WM" ); |
| const char *pKey; |
| |
| pKey = "titleFont"; |
| if ( aGroup.hasKey( pKey ) ) |
| { |
| Font aFont = toFont( aGroup.readEntry( pKey, QFont() ), rSettings.GetUILocale() ); |
| style.SetTitleFont( aFont ); |
| bSetTitleFont = true; |
| } |
| |
| aGroup = pConfig->group( "Icons" ); |
| |
| pKey = "Theme"; |
| if ( aGroup.hasKey( pKey ) ) |
| style.SetPreferredSymbolsStyleName( readEntryUntranslated( &aGroup, pKey ) ); |
| |
| //toolbar |
| pKey = "toolbarFont"; |
| if ( aGroup.hasKey( pKey ) ) |
| { |
| Font aFont = toFont( aGroup.readEntry( pKey, QFont() ), rSettings.GetUILocale() ); |
| style.SetToolFont( aFont ); |
| } |
| } |
| |
| Color aFore = toColor( pal.color( QPalette::Active, QPalette::WindowText ) ); |
| Color aBack = toColor( pal.color( QPalette::Active, QPalette::Window ) ); |
| Color aText = toColor( pal.color( QPalette::Active, QPalette::Text ) ); |
| Color aBase = toColor( pal.color( QPalette::Active, QPalette::Base ) ); |
| Color aButn = toColor( pal.color( QPalette::Active, QPalette::ButtonText ) ); |
| Color aMid = toColor( pal.color( QPalette::Active, QPalette::Mid ) ); |
| Color aHigh = toColor( pal.color( QPalette::Active, QPalette::Highlight ) ); |
| |
| // Foreground |
| style.SetRadioCheckTextColor( aFore ); |
| style.SetLabelTextColor( aFore ); |
| style.SetInfoTextColor( aFore ); |
| style.SetDialogTextColor( aFore ); |
| style.SetGroupTextColor( aFore ); |
| |
| // Text |
| style.SetFieldTextColor( aText ); |
| style.SetFieldRolloverTextColor( aText ); |
| style.SetWindowTextColor( aText ); |
| style.SetHelpTextColor( aText ); |
| |
| // Base |
| style.SetFieldColor( aBase ); |
| style.SetHelpColor( aBase ); |
| style.SetWindowColor( aBase ); |
| style.SetActiveTabColor( aBase ); |
| |
| // Buttons |
| style.SetButtonTextColor( aButn ); |
| style.SetButtonRolloverTextColor( aButn ); |
| |
| // Disable color |
| style.SetDisableColor( aMid ); |
| |
| // Workspace |
| style.SetWorkspaceColor( aMid ); |
| |
| // Background |
| style.Set3DColors( aBack ); |
| style.SetFaceColor( aBack ); |
| style.SetInactiveTabColor( aBack ); |
| style.SetDialogColor( aBack ); |
| |
| if( aBack == COL_LIGHTGRAY ) |
| style.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) ); |
| else |
| { |
| Color aColor2 = style.GetLightColor(); |
| style. |
| SetCheckedColor( Color( (sal_uInt8)(((sal_uInt16)aBack.GetRed()+(sal_uInt16)aColor2.GetRed())/2), |
| (sal_uInt8)(((sal_uInt16)aBack.GetGreen()+(sal_uInt16)aColor2.GetGreen())/2), |
| (sal_uInt8)(((sal_uInt16)aBack.GetBlue()+(sal_uInt16)aColor2.GetBlue())/2) |
| ) ); |
| } |
| |
| // Selection |
| style.SetHighlightColor( aHigh ); |
| style.SetHighlightTextColor( toColor(pal.color( QPalette::HighlightedText)) ); |
| |
| // Font |
| Font aFont = toFont( kapp->font(), rSettings.GetUILocale() ); |
| |
| style.SetAppFont( aFont ); |
| style.SetHelpFont( aFont ); |
| |
| if( !bSetTitleFont ) |
| { |
| style.SetTitleFont( aFont ); |
| } |
| |
| style.SetFloatTitleFont( aFont ); |
| style.SetMenuFont( aFont ); // will be changed according to pMenuBar |
| //style.SetToolFont( aFont ); //already set above |
| style.SetLabelFont( aFont ); |
| style.SetInfoFont( aFont ); |
| style.SetRadioCheckFont( aFont ); |
| style.SetPushButtonFont( aFont ); |
| style.SetFieldFont( aFont ); |
| style.SetIconFont( aFont ); |
| style.SetGroupFont( aFont ); |
| |
| int flash_time = QApplication::cursorFlashTime(); |
| style.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME ); |
| |
| // Menu |
| style.SetSkipDisabledInMenus( TRUE ); |
| KMenuBar* pMenuBar = new KMenuBar(); |
| if ( pMenuBar ) |
| { |
| // Color |
| QPalette qMenuCG = pMenuBar->palette(); |
| |
| // Menu text and background color, theme specific |
| Color aMenuFore = toColor( qMenuCG.color( QPalette::WindowText ) ); |
| Color aMenuBack = toColor( qMenuCG.color( QPalette::Window ) ); |
| |
| aMenuFore = toColor( qMenuCG.color( QPalette::ButtonText ) ); |
| aMenuBack = toColor( qMenuCG.color( QPalette::Button ) ); |
| |
| style.SetMenuTextColor( aMenuFore ); |
| style.SetMenuBarTextColor( aMenuFore ); |
| style.SetMenuColor( aMenuBack ); |
| style.SetMenuBarColor( aMenuBack ); |
| |
| style.SetMenuHighlightColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) ); |
| |
| style.SetMenuHighlightTextColor( aMenuFore ); |
| |
| // set special menubar higlight text color |
| if ( kapp->style()->inherits( "HighContrastStyle" ) ) |
| ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.color( QPalette::HighlightedText ) ); |
| else |
| ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore; |
| |
| // Font |
| aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() ); |
| style.SetMenuFont( aFont ); |
| } |
| |
| delete pMenuBar; |
| |
| // Scroll bar size |
| style.SetScrollBarSize( kapp->style()->pixelMetric( QStyle::PM_ScrollBarExtent ) ); |
| |
| rSettings.SetStyleSettings( style ); |
| } |
| |
| |
| void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) |
| { |
| for( int i = 0; i < nMaxGraphics; i++ ) |
| { |
| if( m_aGraphics[i].pGraphics == pGraphics ) |
| { |
| m_aGraphics[i].bInUse = false; |
| break; |
| } |
| } |
| } |
| |
| void KDESalFrame::updateGraphics( bool bClear ) |
| { |
| Drawable aDrawable = bClear ? None : GetWindow(); |
| for( int i = 0; i < nMaxGraphics; i++ ) |
| { |
| if( m_aGraphics[i].bInUse ) |
| m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); |
| } |
| } |
| |
| KDESalFrame::~KDESalFrame() |
| { |
| } |
| |
| KDESalFrame::GraphicsHolder::~GraphicsHolder() |
| { |
| delete pGraphics; |
| } |
| |
| SalGraphics* KDESalFrame::GetGraphics() |
| { |
| if( GetWindow() ) |
| { |
| for( int i = 0; i < nMaxGraphics; i++ ) |
| { |
| if( ! m_aGraphics[i].bInUse ) |
| { |
| m_aGraphics[i].bInUse = true; |
| if( ! m_aGraphics[i].pGraphics ) |
| { |
| m_aGraphics[i].pGraphics = new KDESalGraphics(); |
| m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() ); |
| } |
| return m_aGraphics[i].pGraphics; |
| } |
| } |
| } |
| |
| return NULL; |
| } |