diff options
author | Ivo Hinkelmann <ihi@openoffice.org> | 2007-11-23 15:47:08 +0000 |
---|---|---|
committer | Ivo Hinkelmann <ihi@openoffice.org> | 2007-11-23 15:47:08 +0000 |
commit | f8d54ad159f576da9dac9066269c60e1749708f3 (patch) | |
tree | c1ffa68dddff2cc071e60e4c9e79255dcb57d3d1 /framework/source | |
parent | 24bfea568d91e5da7bc2e1483bc52f37dbbdbb78 (diff) |
INTEGRATION: CWS langstatusbar (1.1.2); FILE ADDED
2007/11/01 07:33:30 tl 1.1.2.7: #i77208# uno slot names adapted to latest menu/string changes
2007/11/01 07:28:31 tl 1.1.2.6: #i77208# uno slot names adapted to latest menu/string changes
2007/10/25 14:54:25 tl 1.1.2.5: #i77208# new language status-bar control
2007/10/22 10:00:25 tl 1.1.2.4: #i77208# language status bar control
2007/10/19 09:57:13 tl 1.1.2.3: #i77208# language status bar control
2007/10/11 07:51:20 tl 1.1.2.2: #i77208# new language status-bar control
2007/08/10 09:35:09 cd 1.1.2.1: #i77208# Popup menu controller for set text/document language
Diffstat (limited to 'framework/source')
-rw-r--r-- | framework/source/uielement/langselectionmenucontroller.cxx | 565 |
1 files changed, 565 insertions, 0 deletions
diff --git a/framework/source/uielement/langselectionmenucontroller.cxx b/framework/source/uielement/langselectionmenucontroller.cxx new file mode 100644 index 000000000000..0c96c572a26b --- /dev/null +++ b/framework/source/uielement/langselectionmenucontroller.cxx @@ -0,0 +1,565 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: langselectionmenucontroller.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: ihi $ $Date: 2007-11-23 16:47:08 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_framework.hxx" + +#ifndef __FRAMEWORK_UIELEMENT_LANGUAGESELECTIONMENUCONTROLLER_HXX_ +#include <uielement/langselectionmenucontroller.hxx> +#endif + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ + +#ifndef __FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_ +#include <threadhelp/resetableguard.hxx> +#endif + +#ifndef __FRAMEWORK_SERVICES_H_ +#include "services.h" +#endif + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ + +#ifndef _COM_SUN_STAR_AWT_XDEVICE_HPP_ +#include <com/sun/star/awt/XDevice.hpp> +#endif + +#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ +#include <com/sun/star/beans/PropertyValue.hpp> +#endif + +#ifndef _COM_SUN_STAR_AWT_MENUITEMSTYLE_HPP_ +#include <com/sun/star/awt/MenuItemStyle.hpp> +#endif + +#ifndef _COM_SUN_STAR_UTIL_XURLTRANSFORMER_HPP_ +#include <com/sun/star/util/XURLTransformer.hpp> +#endif + +#ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDER_HPP_ +#include <com/sun/star/frame/XDispatchProvider.hpp> +#endif + +//_________________________________________________________________________________________________________________ +// includes of other projects +//_________________________________________________________________________________________________________________ + +#ifndef _VCL_MENU_HXX_ +#include <vcl/menu.hxx> +#endif +#ifndef _SV_SVAPP_HXX +#include <vcl/svapp.hxx> +#endif +#ifndef _VCL_I18NHELP_HXX +#include <vcl/i18nhelp.hxx> +#endif +#ifndef _URLOBJ_HXX +#include <tools/urlobj.hxx> +#endif +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif +#ifndef _VCL_MNEMONIC_HXX_ +#include <vcl/mnemonic.hxx> +#endif + +#ifndef _COM_SUN_STAR_AWT_XMENUEXTENDED_HPP_ +#include <com/sun/star/awt/XMenuExtended.hpp> +#endif + +#include <com/sun/star/document/XDocumentLanguages.hpp> +#include <com/sun/star/frame/XPopupMenuController.hpp> +#include <com/sun/star/linguistic2/XLanguageGuessing.hpp> +#include <map> + +#ifndef INCLUDED_I18NPOOL_MSLANGID_HXX +#include <i18npool/mslangid.hxx> +#endif +#include <svtools/languageoptions.hxx> +#include <com/sun/star/awt/MenuItemStyle.hpp> +#include <svtools/langtab.hxx> + +#ifndef __FRAMEWORK_CLASSES_FWKRESID_HXX_ +#include <classes/fwkresid.hxx> +#endif + +#ifndef __FRAMEWORK_CLASSES_RESOURCE_HRC_ +#include <classes/resource.hrc> +#endif + +//_________________________________________________________________________________________________________________ +// Defines +//_________________________________________________________________________________________________________________ +// +using namespace ::rtl; +using namespace ::com::sun::star; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::frame; +using namespace com::sun::star::beans; +using namespace com::sun::star::util; + + +namespace framework +{ + +DEFINE_XSERVICEINFO_MULTISERVICE ( LanguageSelectionMenuController , + OWeakObject , + SERVICENAME_POPUPMENUCONTROLLER , + IMPLEMENTATIONNAME_LANGUAGESELECTIONMENUCONTROLLER + ) + +DEFINE_INIT_SERVICE ( LanguageSelectionMenuController, {} ) + +LanguageSelectionMenuController::LanguageSelectionMenuController( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ) : + PopupMenuControllerBase( xServiceManager ) +{ +} + +LanguageSelectionMenuController::~LanguageSelectionMenuController() +{ +} + +// XEventListener +void SAL_CALL LanguageSelectionMenuController::disposing( const EventObject& ) throw ( RuntimeException ) +{ + Reference< css::awt::XMenuListener > xHolder(( OWeakObject *)this, UNO_QUERY ); + + ResetableGuard aLock( m_aLock ); + m_xFrame.clear(); + m_xDispatch.clear(); + m_xLanguageDispatch.clear(); + m_xServiceManager.clear(); + + if ( m_xPopupMenu.is() ) + m_xPopupMenu->removeMenuListener( Reference< css::awt::XMenuListener >(( OWeakObject *)this, UNO_QUERY )); + m_xPopupMenu.clear(); +} + +// XStatusListener +void SAL_CALL LanguageSelectionMenuController::statusChanged( const FeatureStateEvent& Event ) throw ( RuntimeException ) +{ + vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + + if ( m_bDisposed ) + return; + + nScriptType=7;//set the default value + + rtl::OUString aStrValue; + Sequence< ::rtl::OUString > aSeq; + + if ( Event.State >>= aStrValue ) + { + m_aCurrentLanguage=aStrValue; + } + else if ( Event.State >>= aSeq ) + { + if ( aSeq.getLength() == 4 ) + { + // Retrieve all other values from the sequence and + // store it members! + curLang=aSeq[0]; + nScriptType= static_cast< sal_Int16 >(aSeq[1].toInt32()); + keyboardLang=aSeq[2]; + guessedText=aSeq[3]; + } + } + else if ( !Event.State.hasValue() ) + { + + } +} + +// XMenuListener +void SAL_CALL LanguageSelectionMenuController::highlight( const css::awt::MenuEvent& ) throw (RuntimeException) +{ +} + +void SAL_CALL LanguageSelectionMenuController::select( const css::awt::MenuEvent& rEvent ) throw (RuntimeException) +{ + Reference< css::awt::XPopupMenu > xPopupMenu; + Reference< XDispatch > xDispatch; + Reference< XMultiServiceFactory > xServiceManager; + + ResetableGuard aLock( m_aLock ); + xPopupMenu = m_xPopupMenu; + //xDispatch = m_xDispatch; + xServiceManager = m_xServiceManager; + aLock.unlock(); + + if ( xPopupMenu.is())//&& xDispatch.is() + { + VCLXPopupMenu* pPopupMenu = (VCLXPopupMenu *)VCLXPopupMenu::GetImplementation( xPopupMenu ); + if ( pPopupMenu ) + { + css::util::URL aTargetURL; + Sequence< PropertyValue > aArgs; + Reference< XURLTransformer > xURLTransformer( xServiceManager->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))), + UNO_QUERY ); + + { + vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + + // Command URL used to dispatch the selected font family name + PopupMenu* pVCLPopupMenu = (PopupMenu *)pPopupMenu->GetMenu(); + aTargetURL.Complete = pVCLPopupMenu->GetItemCommand( rEvent.MenuId ); + } + + if ( aTargetURL.Complete == m_aMenuCommandURL_Font ) + { //open format/character dialog for current selection + xDispatch = m_xMenuDispatch_Font; + } + else if ( aTargetURL.Complete == m_aMenuCommandURL_Lang ) + { //open language tab-page in tools/options dialog + xDispatch = m_xMenuDispatch_Lang; + } + else if ( aTargetURL.Complete == m_aMenuCommandURL_CharDlgForParagraph ) + { //open format/character dialog for current selection + xDispatch = m_xMenuDispatch_CharDlgForParagraph; + } + + xURLTransformer->parseStrict( aTargetURL ); + if ( !xDispatch.is() ) + { + Reference< XDispatchProvider > xDispatchProvider( m_xFrame, UNO_QUERY ); + if ( xDispatchProvider.is() ) + xDispatch = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); + } + + if ( xDispatch.is() ) + { + xDispatch->dispatch( aTargetURL, aArgs ); + } + } + } +} + +void SAL_CALL LanguageSelectionMenuController::activate( const css::awt::MenuEvent& ) throw (RuntimeException) +{ +} + +void SAL_CALL LanguageSelectionMenuController::deactivate( const css::awt::MenuEvent& ) throw (RuntimeException) +{ +} + +// XPopupMenuController +void SAL_CALL LanguageSelectionMenuController::setPopupMenu( const Reference< css::awt::XPopupMenu >& xPopupMenu ) throw (RuntimeException) +{ + ResetableGuard aLock( m_aLock ); + + if ( m_bDisposed ) + throw DisposedException(); + + if ( m_xFrame.is() && !m_xPopupMenu.is() ) + { + // Create popup menu on demand + vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + + m_xPopupMenu = xPopupMenu; + m_xPopupMenu->addMenuListener( Reference< css::awt::XMenuListener >( (OWeakObject*)this, UNO_QUERY )); + + + Reference< XURLTransformer > xURLTransformer( m_xServiceManager->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))), + UNO_QUERY ); + Reference< XDispatchProvider > xDispatchProvider( m_xFrame, UNO_QUERY ); + + com::sun::star::util::URL aTargetURL; + aTargetURL.Complete = m_aCommandURL; + xURLTransformer->parseStrict( aTargetURL ); + m_xDispatch = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); + + // Register for language updates + aTargetURL.Complete = m_aLangStatusCommandURL; + xURLTransformer->parseStrict( aTargetURL ); + m_xLanguageDispatch = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); + + // Register for setting languages and opening language dialog + aTargetURL.Complete = m_aMenuCommandURL_Lang; + xURLTransformer->parseStrict( aTargetURL ); + m_xMenuDispatch_Lang = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); + + // Register for opening character dialog + aTargetURL.Complete = m_aMenuCommandURL_Font; + xURLTransformer->parseStrict( aTargetURL ); + m_xMenuDispatch_Font = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); + + // Register for opening character dialog with preselected paragraph + aTargetURL.Complete = m_aMenuCommandURL_CharDlgForParagraph; + xURLTransformer->parseStrict( aTargetURL ); + m_xMenuDispatch_CharDlgForParagraph = xDispatchProvider->queryDispatch( aTargetURL, ::rtl::OUString(), 0 ); + + updatePopupMenu(); + } +} + +//match ScriptType +bool lcl_checkScriptType(sal_Int16 nScriptType,LanguageType nLang) +{ + return 0 != (nScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage( nLang )); +} + +void LanguageSelectionMenuController::fillPopupMenu( Reference< css::awt::XPopupMenu >& rPopupMenu , const Mode eMode ) +{ + VCLXPopupMenu* pVCLPopupMenu = (VCLXPopupMenu *)VCLXMenu::GetImplementation( rPopupMenu ); + PopupMenu* pPopupMenu = 0; + + vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); + + resetPopupMenu( rPopupMenu ); + if ( pVCLPopupMenu ) + pPopupMenu = (PopupMenu *)pVCLPopupMenu->GetMenu(); + + String aCmd=String::CreateFromAscii(""); + String aCmd_Dialog=String::CreateFromAscii(""); + String aCmd_Language=String::CreateFromAscii(""); + if( eMode == MODE_SetLanguageSelectionMenu ) + { + aCmd_Dialog+=String::CreateFromAscii(".uno:FontDialog?Language:string=*"); + aCmd_Language+=String::CreateFromAscii(".uno:LanguageStatus?Language:string=Current_"); + } + else if ( eMode == MODE_SetLanguageParagraphMenu ) + { + aCmd_Dialog+=String::CreateFromAscii(".uno:FontDialogForParagraph"); + aCmd_Language+=String::CreateFromAscii(".uno:LanguageStatus?Language:string=Paragraph_"); + } + else if ( eMode == MODE_SetLanguageAllTextMenu ) + { + aCmd_Dialog+=String::CreateFromAscii(".uno:LanguageStatus?Language:string=*"); + aCmd_Language+=String::CreateFromAscii(".uno:LanguageStatus?Language:string=Default_"); + } + + //Reference< awt::XMenuExtended > m_xMenuExtended( m_xPopupMenu, UNO_QUERY ); + std::map< ::rtl::OUString, ::rtl::OUString > LangItems; + + SvtLanguageTable aLanguageTable; + USHORT nItemId = 1; + + //1--add current language + if(curLang!=OUString::createFromAscii("")) + { + LangItems[curLang]=curLang; + } + + SvtLanguageTable aLangTable; + //2--System + const AllSettings& rAllSettings=Application::GetSettings(); + LanguageType rSystemLanguage = rAllSettings.GetLanguage(); + if(rSystemLanguage!=LANGUAGE_DONTKNOW) + { + if (lcl_checkScriptType(nScriptType,rSystemLanguage )) + LangItems[OUString(aLangTable.GetString(rSystemLanguage))]=OUString(aLangTable.GetString(rSystemLanguage)); + } + + //3--UI + LanguageType rUILanguage = rAllSettings.GetUILanguage(); + if(rUILanguage!=LANGUAGE_DONTKNOW) + { + if (lcl_checkScriptType(nScriptType, rUILanguage )) + LangItems[OUString(aLangTable.GetString(rUILanguage))]=OUString(aLangTable.GetString(rUILanguage)); + } + + //4--guessed language + uno::Reference< linguistic2::XLanguageGuessing > xLangGuess; + if (xLangGuess.is() && guessedText!=OUString::createFromAscii("")) + { + ::com::sun::star::lang::Locale aLocale(xLangGuess->guessPrimaryLanguage( guessedText, 0, guessedText.getLength()) ); + LanguageType nLang = MsLangId::convertLocaleToLanguageWithFallback( aLocale ); + if((nLang!=LANGUAGE_DONTKNOW) && (lcl_checkScriptType(nScriptType, nLang ))) + LangItems[keyboardLang]=aLangTable.GetString(nLang); + } + + //5--keyboard language + if(keyboardLang!=OUString::createFromAscii("")) + { + if (lcl_checkScriptType(nScriptType, aLanguageTable.GetType(keyboardLang))) + LangItems[keyboardLang]=keyboardLang; + } + + //6--all languages used in current document + Reference< com::sun::star::frame::XModel > xModel; + if ( m_xFrame.is() ) + { + Reference< com::sun::star::frame::XController > xController( m_xFrame->getController(), UNO_QUERY ); + if ( xController.is() ) + xModel = xController->getModel(); + } + Reference< document::XDocumentLanguages > xDocumentLanguages( xModel, UNO_QUERY ); + /*the description of nScriptType + LATIN : 1 + ASIAN : 2 + COMPLEX:4 + LATIN + ASIAN : 3 + LATIN + COMPLEX : 5 + ASIAN + COMPLEX : 6 + LATIN + ASIAN + COMPLEX : 7 + */ + + sal_Int16 nCount=7; + if(xDocumentLanguages.is()) + { + Sequence< Locale > rLocales(xDocumentLanguages->getDocumentLanguages(nScriptType,nCount)); + if(rLocales.getLength()>0) + { + for(USHORT i = 0; i<rLocales.getLength();++i) + { + if (LangItems.size()==7) + break; + const Locale& rLocale=rLocales[i]; + if(lcl_checkScriptType(nScriptType, aLanguageTable.GetType(rLocale.Language))) + LangItems[OUString(rLocale.Language)]=OUString(rLocale.Language); + } + } + } + std::map< sal_Int16, ::rtl::OUString > LangTable; + + for(std::map<OUString, OUString>::const_iterator it = LangItems.begin(); it != LangItems.end(); ++it) + { + if(it->first != OUString( aLangTable.GetString( LANGUAGE_NONE ) )&& + it->first != OUString::createFromAscii("*") && + it->first != OUString::createFromAscii("")) + { + ++nItemId; + pPopupMenu->InsertItem( nItemId,it->first); + LangTable[nItemId] = it->first; + if(it->first == curLang && eMode == MODE_SetLanguageSelectionMenu ) + { + //make a sign for the current language + pPopupMenu->CheckItem(nItemId,TRUE); + } + aCmd=aCmd_Language; + aCmd+=(String)it->first; + pPopupMenu->SetItemCommand(nItemId,aCmd); + } + } + + //7--none + nItemId++; + pPopupMenu->InsertItem( nItemId, String(FwkResId( STR_LANGSTATUS_NONE )) ); + aCmd=aCmd_Language; + aCmd+=String::CreateFromAscii("LANGUAGE_NONE"); + pPopupMenu->SetItemCommand(nItemId,aCmd); + + //More... + nItemId++; + pPopupMenu->InsertItem( nItemId, String(FwkResId( STR_LANGSTATUS_MORE ))); + pPopupMenu->SetItemCommand(nItemId,aCmd_Dialog); +} + + +void SAL_CALL LanguageSelectionMenuController::updatePopupMenu() throw ( ::com::sun::star::uno::RuntimeException ) +{ + PopupMenuControllerBase::updatePopupMenu(); + + // Force status update to get information about the current languages + ResetableGuard aLock( m_aLock ); + Reference< XDispatch > xDispatch( m_xLanguageDispatch ); + Reference< XURLTransformer > xURLTransformer( m_xServiceManager->createInstance( + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ))), + UNO_QUERY ); + com::sun::star::util::URL aTargetURL; + aTargetURL.Complete = m_aLangStatusCommandURL; + xURLTransformer->parseStrict( aTargetURL ); + aLock.unlock(); + + if ( xDispatch.is() ) + { + xDispatch->addStatusListener( SAL_STATIC_CAST( XStatusListener*, this ), aTargetURL ); + xDispatch->removeStatusListener( SAL_STATIC_CAST( XStatusListener*, this ), aTargetURL ); + } + + // TODO: Fill menu with the information retrieved by the status update + + if( m_aCommandURL.equalsAscii( ".uno:SetLanguageSelectionMenu" )) + { + fillPopupMenu(m_xPopupMenu, MODE_SetLanguageSelectionMenu ); + } + else if( m_aCommandURL.equalsAscii( ".uno:SetLanguageParagraphMenu" )) + { + fillPopupMenu(m_xPopupMenu, MODE_SetLanguageParagraphMenu ); + } + else if( m_aCommandURL.equalsAscii( ".uno:SetLanguageAllTextMenu" )) + { + fillPopupMenu(m_xPopupMenu, MODE_SetLanguageAllTextMenu ); + } +} + +// XInitialization +void SAL_CALL LanguageSelectionMenuController::initialize( const Sequence< Any >& aArguments ) throw ( Exception, RuntimeException ) +{ + const rtl::OUString aFrameName( RTL_CONSTASCII_USTRINGPARAM( "Frame" )); + const rtl::OUString aCommandURLName( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" )); + + ResetableGuard aLock( m_aLock ); + + sal_Bool bInitalized( m_bInitialized ); + if ( !bInitalized ) + { + PropertyValue aPropValue; + rtl::OUString aCommandURL; + Reference< XFrame > xFrame; + + for ( int i = 0; i < aArguments.getLength(); i++ ) + { + if ( aArguments[i] >>= aPropValue ) + { + if ( aPropValue.Name.equalsAscii( "Frame" )) + aPropValue.Value >>= xFrame; + else if ( aPropValue.Name.equalsAscii( "CommandURL" )) + aPropValue.Value >>= aCommandURL; + } + } + + if ( xFrame.is() && aCommandURL.getLength() ) + { + m_xFrame = xFrame; + m_aCommandURL = aCommandURL; + m_aBaseURL = determineBaseURL( aCommandURL ); + m_aLangStatusCommandURL = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:LanguageStatus" )); + m_aMenuCommandURL_Lang = m_aLangStatusCommandURL; + m_aMenuCommandURL_Font = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontDialog" )); + m_aMenuCommandURL_CharDlgForParagraph = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontDialogForParagraph" )); + m_bInitialized = true; + } + } +} + +} |