summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/control/opendoccontrols.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dbaccess/source/ui/control/opendoccontrols.cxx')
-rw-r--r--dbaccess/source/ui/control/opendoccontrols.cxx335
1 files changed, 335 insertions, 0 deletions
diff --git a/dbaccess/source/ui/control/opendoccontrols.cxx b/dbaccess/source/ui/control/opendoccontrols.cxx
new file mode 100644
index 000000000000..e02b7c000501
--- /dev/null
+++ b/dbaccess/source/ui/control/opendoccontrols.cxx
@@ -0,0 +1,335 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_dbaccess.hxx"
+
+#include "opendoccontrols.hxx"
+
+/** === begin UNO includes === **/
+#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/XModuleUIConfigurationManagerSupplier.hpp>
+#include <com/sun/star/ui/XUIConfigurationManager.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/ui/XImageManager.hpp>
+/** === end UNO includes === **/
+
+#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>
+
+//........................................................................
+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::container::XNameAccess;
+ using ::com::sun::star::lang::XMultiServiceFactory;
+ using ::com::sun::star::beans::PropertyValue;
+ using ::com::sun::star::ui::XModuleUIConfigurationManagerSupplier;
+ using ::com::sun::star::ui::XUIConfigurationManager;
+ using ::com::sun::star::ui::XImageManager;
+ using ::com::sun::star::graphic::XGraphic;
+
+ String GetCommandText( const sal_Char* _pCommandURL, const ::rtl::OUString& _rModuleName )
+ {
+ ::rtl::OUString sLabel;
+ if ( !_pCommandURL || !*_pCommandURL )
+ return sLabel;
+
+ Reference< XNameAccess > xUICommandLabels;
+ ::rtl::OUString sCommandURL = ::rtl::OUString::createFromAscii( _pCommandURL );
+
+ try
+ {
+ do
+ {
+ // Retrieve popup menu labels
+ Reference< XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
+ if ( !xFactory.is() )
+ break;
+
+ Reference< XNameAccess> xNameAccess;
+ xNameAccess = xNameAccess.query( xFactory->createInstance(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.UICommandDescription" ) )
+ ) );
+ if ( !xNameAccess.is() )
+ break;
+
+ 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 )
+ {
+ ::rtl::OUString sPropertyName( aProperties[i].Name );
+ if ( sPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Label" ) ) )
+ {
+ aProperties[i].Value >>= sLabel;
+ break;
+ }
+ }
+ }
+ while ( false );
+ }
+ catch( Exception& rException )
+ {
+ (void)rException;
+ }
+
+ return sLabel;
+ }
+
+ Image GetCommandIcon( const sal_Char* _pCommandURL, const ::rtl::OUString& _rModuleName )
+ {
+ Image aIcon;
+ if ( !_pCommandURL || !*_pCommandURL )
+ return aIcon;
+
+ Reference< XNameAccess > xUICommandLabels;
+ ::rtl::OUString sCommandURL = ::rtl::OUString::createFromAscii( _pCommandURL );
+ try
+ {
+ do
+ {
+ // Retrieve popup menu labels
+ Reference< XMultiServiceFactory> xFactory( ::comphelper::getProcessServiceFactory() );
+ if ( !xFactory.is() )
+ break;
+
+ Reference< XModuleUIConfigurationManagerSupplier > xSupplier(
+ xFactory->createInstance( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
+ "com.sun.star.ui.ModuleUIConfigurationManagerSupplier" ) ) ),
+ UNO_QUERY_THROW );
+
+ Reference< XUIConfigurationManager > xManager( xSupplier->getUIConfigurationManager( _rModuleName ) );
+ Reference< XImageManager > xImageManager;
+ if ( xManager.is() )
+ xImageManager = xImageManager.query( xManager->getImageManager() );
+ if ( !xImageManager.is() )
+ break;
+
+ Sequence< ::rtl::OUString > aCommandList( &sCommandURL, 1 );
+ Sequence<Reference< XGraphic> > xIconList( xImageManager->getImages( 0, aCommandList ) );
+ if ( !xIconList.hasElements() )
+ break;
+
+ aIcon = Graphic( xIconList[0] ).GetBitmapEx();
+ }
+ while ( false );
+ }
+ catch ( Exception& rException )
+ {
+ (void)rException;
+ }
+
+ return aIcon;
+ }
+
+
+ }
+
+ //====================================================================
+ //= OpenButton
+ //====================================================================
+ //--------------------------------------------------------------------
+ OpenDocumentButton::OpenDocumentButton( Window* _pParent, const sal_Char* _pAsciiModuleName, const ResId& _rResId )
+ :PushButton( _pParent, _rResId )
+ {
+ impl_init( _pAsciiModuleName );
+ }
+
+ //--------------------------------------------------------------------
+ void OpenDocumentButton::impl_init( const sal_Char* _pAsciiModuleName )
+ {
+ OSL_ENSURE( _pAsciiModuleName, "OpenDocumentButton::impl_init: invalid module name!" );
+ m_sModule = ::rtl::OUString::createFromAscii( _pAsciiModuleName );
+
+ // our label should equal the UI text of the "Open" command
+ String sLabel( GetCommandText( ".uno:Open", m_sModule ) );
+ sLabel.SearchAndReplaceAllAscii( "~", String() );
+ sLabel.Insert( (sal_Unicode)' ', 0 );
+ SetText( sLabel );
+
+ // Place icon left of text and both centered in the button.
+ SetModeImage( GetCommandIcon( ".uno:Open", m_sModule ) );
+ EnableImageDisplay( sal_True );
+ EnableTextDisplay( sal_True );
+ SetImageAlign( IMAGEALIGN_LEFT );
+ SetStyle( GetStyle() | WB_CENTER );
+ }
+
+ //====================================================================
+ //= OpenDocumentListBox
+ //====================================================================
+ //--------------------------------------------------------------------
+ OpenDocumentListBox::OpenDocumentListBox( Window* _pParent, const sal_Char* _pAsciiModuleName, const ResId& _rResId )
+ :ListBox( _pParent, _rResId )
+ {
+ impl_init( _pAsciiModuleName );
+ }
+
+ //--------------------------------------------------------------------
+ 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 = xFilterFactory.query( ::comphelper::getProcessServiceFactory()->createInstance(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.FilterFactory" ) ) ) );
+
+ 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 ] );
+ ::rtl::OUString sURL = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_URL, ::rtl::OUString() );
+ ::rtl::OUString sFilter = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_FILTER, ::rtl::OUString() );
+ String sTitle = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_TITLE, ::rtl::OUString() );
+ ::rtl::OUString sPassword = aItemProperties.getUnpackedValueOrDefault( HISTORY_PROPERTYNAME_PASSWORD, ::rtl::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 );
+ ::rtl::OUString sDocumentService = aFilterProperties.getUnpackedValueOrDefault(
+ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DocumentService" ) ), ::rtl::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.getLength() > 0 )
+ aURL.SetPass( sPassword );
+
+ if ( !sTitle.Len() )
+ sTitle = aURL.getBase( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_UNAMBIGUOUS );
+
+ String sDecodedURL = aURL.GetMainURL( INetURLObject::NO_DECODE );
+
+ sal_uInt16 nPos = InsertEntry( sTitle );
+ m_aURLs.insert( MapIndexToStringPair::value_type( nPos, StringPair( sDecodedURL, sFilter ) ) );
+ }
+ }
+ catch( Exception& rException )
+ {
+ (void)rException;
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------
+ String OpenDocumentListBox::GetSelectedDocumentURL() const
+ {
+ String sURL;
+ sal_uInt16 nSelected = GetSelectEntryPos();
+ if ( LISTBOX_ENTRY_NOTFOUND != GetSelectEntryPos() )
+ sURL = impl_getDocumentAtIndex( nSelected ).first;
+ return sURL;
+ }
+
+ //--------------------------------------------------------------------
+ String OpenDocumentListBox::GetSelectedDocumentFilter() const
+ {
+ String sFilter;
+ sal_uInt16 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.Len() )
+ {
+ ::svt::OFileNotation aNotation( aDocumentDescriptor.first );
+ aDocumentDescriptor.first = aNotation.get( ::svt::OFileNotation::N_SYSTEM );
+ }
+ }
+ return aDocumentDescriptor;
+ }
+
+ //--------------------------------------------------------------------
+ void OpenDocumentListBox::RequestHelp( const HelpEvent& _rHEvt )
+ {
+ if( !( _rHEvt.GetMode() & HELPMODE_QUICK ) )
+ return;
+ if ( !IsEnabled() )
+ return;
+
+ Point aRequestPos( ScreenToOutputPixel( _rHEvt.GetMousePosPixel() ) );
+ sal_uInt16 nItemIndex = LISTBOX_ENTRY_NOTFOUND;
+ if ( GetIndexForPoint( aRequestPos, nItemIndex ) != -1 )
+ {
+ Rectangle aItemRect( GetBoundingRectangle( nItemIndex ) );
+ aItemRect = Rectangle(
+ OutputToScreenPixel( aItemRect.TopLeft() ),
+ OutputToScreenPixel( aItemRect.BottomRight() ) );
+ String sHelpText = impl_getDocumentAtIndex( nItemIndex, true ).first;
+ Help::ShowQuickHelp( this, aItemRect, sHelpText, QUICKHELP_LEFT | QUICKHELP_VCENTER );
+ }
+ }
+
+//........................................................................
+} // namespace dbaui
+//........................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */