Files
libreoffice/dbaccess/source/ui/control/opendoccontrols.cxx
Stephan Bergmann 0f5e917024 Introduce rtl::OUStringLiteral1
...to use single ASCII character literals "more directly" in the OUString API
(instead of having to go via an intermediary OUString ctor call).  Especially
useful for character literals that are defined as const variables or via macros
("direct" uses of character literals in the OUString API can often simply be
replaced with single-character string literals, for improved readability).

(The functions overloaded for OUStringLiteral1 are those that are actually used
by the existing LO code; more could potentially be added.  The asymmetry in the
operator ==/!= parameter types is by design, though---writing code like

  'x' == s

is an abomination that shall not be abetted.)

Change-Id: Ic5264714be7439eed56b5dfca6ccaee277306f1f
2014-12-17 16:39:33 +01:00

313 lines
12 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include "opendoccontrols.hxx"
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
#include <com/sun/star/frame/theUICommandDescription.hpp>
#include <com/sun/star/ui/XUIConfigurationManager.hpp>
#include <com/sun/star/graphic/XGraphic.hpp>
#include <com/sun/star/ui/XImageManager.hpp>
#include <comphelper/processfactory.hxx>
#include <vcl/graph.hxx>
#include <vcl/help.hxx>
#include <unotools/historyoptions.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <tools/urlobj.hxx>
#include <svl/filenotation.hxx>
#include <osl/diagnose.h>
#include <vcl/builder.hxx>
namespace dbaui
{
namespace
{
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::UNO_QUERY_THROW;
using ::com::sun::star::uno::XComponentContext;
using ::com::sun::star::container::XNameAccess;
using ::com::sun::star::lang::XMultiServiceFactory;
using ::com::sun::star::beans::PropertyValue;
using ::com::sun::star::ui::theModuleUIConfigurationManagerSupplier;
using ::com::sun::star::ui::XModuleUIConfigurationManagerSupplier;
using ::com::sun::star::ui::XUIConfigurationManager;
using ::com::sun::star::ui::XImageManager;
using ::com::sun::star::frame::theUICommandDescription;
using ::com::sun::star::graphic::XGraphic;
OUString GetCommandText( const sal_Char* _pCommandURL, const OUString& _rModuleName )
{
OUString sLabel;
if ( !_pCommandURL || !*_pCommandURL )
return sLabel;
Reference< XNameAccess > xUICommandLabels;
OUString sCommandURL = OUString::createFromAscii( _pCommandURL );
try
{
do
{
// Retrieve popup menu labels
Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
if ( !xContext.is() )
break;
Reference< XNameAccess> xNameAccess( theUICommandDescription::get(xContext) );
xNameAccess->getByName( _rModuleName ) >>= xUICommandLabels;
if ( !xUICommandLabels.is() )
break;
Sequence< PropertyValue > aProperties;
if ( !( xUICommandLabels->getByName(sCommandURL) >>= aProperties ) )
break;
sal_Int32 nCount( aProperties.getLength() );
for ( sal_Int32 i=0; i<nCount; ++i )
{
OUString sPropertyName( aProperties[i].Name );
if ( sPropertyName == "Label" )
{
aProperties[i].Value >>= sLabel;
break;
}
}
}
while ( false );
}
catch( Exception& rException )
{
(void)rException;
}
return sLabel;
}
Image GetCommandIcon( const sal_Char* _pCommandURL, const OUString& _rModuleName )
{
Image aIcon;
if ( !_pCommandURL || !*_pCommandURL )
return aIcon;
Reference< XNameAccess > xUICommandLabels;
OUString sCommandURL = OUString::createFromAscii( _pCommandURL );
try
{
do
{
// Retrieve popup menu labels
Reference< com::sun::star::uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
if ( !xContext.is() )
break;
Reference< XModuleUIConfigurationManagerSupplier > xSupplier(
theModuleUIConfigurationManagerSupplier::get(xContext) );
Reference< XUIConfigurationManager > xManager( xSupplier->getUIConfigurationManager( _rModuleName ) );
Reference< XImageManager > xImageManager;
if ( xManager.is() )
xImageManager.set(xManager->getImageManager(), css::uno::UNO_QUERY);
if ( !xImageManager.is() )
break;
Sequence< OUString > aCommandList( &sCommandURL, 1 );
Sequence<Reference< XGraphic> > xIconList( xImageManager->getImages( 0, aCommandList ) );
if ( !xIconList.hasElements() )
break;
aIcon = Image(Graphic(xIconList[0]).GetBitmapEx());
}
while ( false );
}
catch ( Exception& rException )
{
(void)rException;
}
return aIcon;
}
}
// OpenButton
OpenDocumentButton::OpenDocumentButton( vcl::Window* _pParent, const sal_Char* _pAsciiModuleName )
:PushButton( _pParent )
{
impl_init( _pAsciiModuleName );
}
extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeOpenDocumentButton( vcl::Window *pParent, VclBuilder::stringmap & )
{
return new OpenDocumentButton( pParent, "com.sun.star.sdb.OfficeDatabaseDocument" );
}
void OpenDocumentButton::impl_init( const sal_Char* _pAsciiModuleName )
{
OSL_ENSURE( _pAsciiModuleName, "OpenDocumentButton::impl_init: invalid module name!" );
m_sModule = OUString::createFromAscii( _pAsciiModuleName );
// our label should equal the UI text of the "Open" command
OUString sLabel(GetCommandText(".uno:Open", m_sModule));
SetText(" " + sLabel.replaceAll("~", OUString()));
// Place icon left of text and both centered in the button.
SetModeImage( GetCommandIcon( ".uno:Open", m_sModule ) );
EnableImageDisplay( true );
EnableTextDisplay( true );
SetImageAlign( IMAGEALIGN_LEFT );
SetStyle( GetStyle() | WB_CENTER );
}
// OpenDocumentListBox
OpenDocumentListBox::OpenDocumentListBox( vcl::Window* _pParent, const sal_Char* _pAsciiModuleName )
:ListBox( _pParent, WB_BORDER | WB_DROPDOWN )
{
impl_init( _pAsciiModuleName );
}
extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeOpenDocumentListBox( vcl::Window *pParent, VclBuilder::stringmap & )
{
return new OpenDocumentListBox( pParent, "com.sun.star.sdb.OfficeDatabaseDocument" );
}
void OpenDocumentListBox::impl_init( const sal_Char* _pAsciiModuleName )
{
OSL_ENSURE( _pAsciiModuleName, "OpenDocumentListBox::impl_init: invalid module name!" );
Sequence< Sequence< PropertyValue> > aHistory = SvtHistoryOptions().GetList( ePICKLIST );
Reference< XNameAccess > xFilterFactory;
xFilterFactory.set(::comphelper::getProcessServiceFactory()->createInstance(
OUString( "com.sun.star.document.FilterFactory" ) ), css::uno::UNO_QUERY);
sal_uInt32 nCount = aHistory.getLength();
for ( sal_uInt32 nItem = 0; nItem < nCount; ++nItem )
{
try
{
// Get the current history item's properties.
::comphelper::SequenceAsHashMap aItemProperties( aHistory[ nItem ] );
OUString sURL = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_URL, OUString() );
OUString sFilter = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_FILTER, OUString() );
OUString sTitle = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_TITLE, OUString() );
OUString sPassword = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_PASSWORD, OUString() );
// If the entry is an impress file then insert it into the
// history list and the list box.
Sequence< PropertyValue > aProps;
xFilterFactory->getByName( sFilter ) >>= aProps;
::comphelper::SequenceAsHashMap aFilterProperties( aProps );
OUString sDocumentService = aFilterProperties.getUnpackedValueOrDefault(
OUString( "DocumentService" ), OUString() );
if ( sDocumentService.equalsAscii( _pAsciiModuleName ) )
{
// yes, it's a Base document
INetURLObject aURL;
aURL.SetSmartURL( sURL );
// The password is set only when it is not empty.
if ( !sPassword.isEmpty() )
aURL.SetPass( sPassword );
if ( sTitle.isEmpty() )
sTitle = aURL.getBase( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_UNAMBIGUOUS );
OUString sDecodedURL = aURL.GetMainURL( INetURLObject::NO_DECODE );
sal_Int32 nPos = InsertEntry( sTitle );
m_aURLs.insert( MapIndexToStringPair::value_type( nPos, StringPair( sDecodedURL, sFilter ) ) );
}
}
catch( Exception& rException )
{
(void)rException;
}
}
}
OUString OpenDocumentListBox::GetSelectedDocumentURL() const
{
OUString sURL;
sal_Int32 nSelected = GetSelectEntryPos();
if ( LISTBOX_ENTRY_NOTFOUND != GetSelectEntryPos() )
sURL = impl_getDocumentAtIndex( nSelected ).first;
return sURL;
}
OUString OpenDocumentListBox::GetSelectedDocumentFilter() const
{
OUString sFilter;
sal_Int32 nSelected = GetSelectEntryPos();
if ( LISTBOX_ENTRY_NOTFOUND != GetSelectEntryPos() )
sFilter = impl_getDocumentAtIndex( nSelected ).second;
return sFilter;
}
OpenDocumentListBox::StringPair OpenDocumentListBox::impl_getDocumentAtIndex( sal_uInt16 _nListIndex, bool _bSystemNotation ) const
{
MapIndexToStringPair::const_iterator pos = m_aURLs.find( _nListIndex );
OSL_ENSURE( pos != m_aURLs.end(), "OpenDocumentListBox::impl_getDocumentAtIndex: invalid index!" );
StringPair aDocumentDescriptor;
if ( pos != m_aURLs.end() )
{
aDocumentDescriptor = pos->second;
if ( _bSystemNotation && !aDocumentDescriptor.first.isEmpty() )
{
::svt::OFileNotation aNotation( aDocumentDescriptor.first );
aDocumentDescriptor.first = aNotation.get( ::svt::OFileNotation::N_SYSTEM );
}
}
return aDocumentDescriptor;
}
void OpenDocumentListBox::RequestHelp( const HelpEvent& _rHEvt )
{
if( !( _rHEvt.GetMode() & HelpEventMode::QUICK ) )
return;
if ( !IsEnabled() )
return;
Point aRequestPos( ScreenToOutputPixel( _rHEvt.GetMousePosPixel() ) );
sal_Int32 nItemIndex = LISTBOX_ENTRY_NOTFOUND;
if ( GetIndexForPoint( aRequestPos, nItemIndex ) != -1 )
{
Rectangle aItemRect( GetBoundingRectangle( nItemIndex ) );
aItemRect = Rectangle(
OutputToScreenPixel( aItemRect.TopLeft() ),
OutputToScreenPixel( aItemRect.BottomRight() ) );
OUString sHelpText = impl_getDocumentAtIndex( nItemIndex, true ).first;
Help::ShowQuickHelp( this, aItemRect, sHelpText, QUICKHELP_LEFT | QUICKHELP_VCENTER );
}
}
} // namespace dbaui
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */