/* -*- 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::util; using namespace ::com::sun::star::frame; using namespace ::com::sun::star::task; // SfxURLToolBoxControl_Impl SFX_IMPL_TOOLBOX_CONTROL(SfxURLToolBoxControl_Impl,SfxStringItem) SfxURLToolBoxControl_Impl::SfxURLToolBoxControl_Impl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rBox ) : SfxToolBoxControl( nSlotId, nId, rBox ) { addStatusListener( ".uno:CurrentURL"); } SfxURLToolBoxControl_Impl::~SfxURLToolBoxControl_Impl() { } SvtURLBox* SfxURLToolBoxControl_Impl::GetURLBox() const { return static_cast(GetToolBox().GetItemWindow( GetId() )); } void SfxURLToolBoxControl_Impl::OpenURL( const OUString& rName ) const { OUString aName; OUString aFilter; INetURLObject aObj( rName ); if ( aObj.GetProtocol() == INetProtocol::NotValid ) { OUString aBaseURL = GetURLBox()->GetBaseURL(); aName = SvtURLBox::ParseSmart( rName, aBaseURL ); } else aName = rName; if ( aName.isEmpty() ) return; Reference< XDispatchProvider > xDispatchProvider( getFrameInterface(), UNO_QUERY ); if ( !xDispatchProvider.is() ) return; URL aTargetURL; aTargetURL.Complete = aName; getURLTransformer()->parseStrict( aTargetURL ); Reference< XDispatch > xDispatch = xDispatchProvider->queryDispatch( aTargetURL, "_default", 0 ); if ( !xDispatch.is() ) return; Sequence< PropertyValue > aArgs( 2 ); aArgs[0].Name = "Referer"; aArgs[0].Value <<= OUString( "private:user" ); aArgs[1].Name = "FileName"; aArgs[1].Value <<= aName; if ( !aFilter.isEmpty() ) { aArgs.realloc( 4 ); aArgs[2].Name = "FilterOptions"; aArgs[2].Value <<= OUString(); aArgs[3].Name = "FilterName"; aArgs[3].Value <<= aFilter; } SfxURLToolBoxControl_Impl::ExecuteInfo* pExecuteInfo = new SfxURLToolBoxControl_Impl::ExecuteInfo; pExecuteInfo->xDispatch = xDispatch; pExecuteInfo->aTargetURL = aTargetURL; pExecuteInfo->aArgs = aArgs; Application::PostUserEvent( LINK( nullptr, SfxURLToolBoxControl_Impl, ExecuteHdl_Impl), pExecuteInfo ); } IMPL_STATIC_LINK( SfxURLToolBoxControl_Impl, ExecuteHdl_Impl, void*, p, void ) { ExecuteInfo* pExecuteInfo = static_cast(p); try { // Asynchronous execution as this can lead to our own destruction! // Framework can recycle our current frame and the layout manager disposes all user interface // elements if a component gets detached from its frame! pExecuteInfo->xDispatch->dispatch( pExecuteInfo->aTargetURL, pExecuteInfo->aArgs ); } catch ( Exception& ) { } delete pExecuteInfo; } VclPtr SfxURLToolBoxControl_Impl::CreateItemWindow( vcl::Window* pParent ) { VclPtrInstance pURLBox( pParent ); pURLBox->SetOpenHdl( LINK( this, SfxURLToolBoxControl_Impl, OpenHdl ) ); pURLBox->SetSelectHdl( LINK( this, SfxURLToolBoxControl_Impl, SelectHdl ) ); return pURLBox.get(); } IMPL_LINK_NOARG(SfxURLToolBoxControl_Impl, SelectHdl, ComboBox&, void) { SvtURLBox* pURLBox = GetURLBox(); OUString aName( pURLBox->GetURL() ); if ( !pURLBox->IsTravelSelect() && !aName.isEmpty() ) OpenURL( aName ); } IMPL_LINK_NOARG(SfxURLToolBoxControl_Impl, OpenHdl, SvtURLBox*, void) { SvtURLBox* pURLBox = GetURLBox(); OpenURL( pURLBox->GetURL() ); Reference< XDesktop2 > xDesktop = Desktop::create( m_xContext ); Reference< XFrame > xFrame = xDesktop->getActiveFrame(); if ( xFrame.is() ) { VclPtr pWin = VCLUnoHelper::GetWindow( xFrame->getContainerWindow() ); if ( pWin ) { pWin->GrabFocus(); pWin->ToTop( ToTopFlags::RestoreWhenMin ); } } } void SfxURLToolBoxControl_Impl::StateChanged ( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) { if ( nSID == SID_OPENURL ) { // Disable URL box if command is disabled GetURLBox()->Enable( SfxItemState::DISABLED != eState ); } if ( !GetURLBox()->IsEnabled() ) return; if( nSID == SID_FOCUSURLBOX ) { if ( GetURLBox()->IsVisible() ) GetURLBox()->GrabFocus(); } else if ( !GetURLBox()->IsModified() && SfxItemState::DEFAULT == eState ) { SvtURLBox* pURLBox = GetURLBox(); pURLBox->Clear(); const css::uno::Sequence< css::uno::Sequence< css::beans::PropertyValue > > lList = SvtHistoryOptions().GetList(ePICKLIST); for (const css::uno::Sequence< css::beans::PropertyValue >& lProps : lList) { for (const auto& rProp : lProps) { if (rProp.Name != HISTORY_PROPERTYNAME_URL) continue; OUString sURL; if (!(rProp.Value>>=sURL) || sURL.isEmpty()) continue; INetURLObject aURL ( sURL ); OUString sMainURL( aURL.GetMainURL( INetURLObject::DecodeMechanism::WithCharset ) ); OUString sFile; if (osl::FileBase::getSystemPathFromFileURL(sMainURL, sFile) == osl::FileBase::E_None) pURLBox->InsertEntry(sFile); else pURLBox->InsertEntry(sMainURL); } } const SfxStringItem *pURL = dynamic_cast< const SfxStringItem* >(pState); assert(pURL); INetURLObject aURL( pURL->GetValue() ); INetProtocol eProt = aURL.GetProtocol(); if ( eProt == INetProtocol::File ) { pURLBox->SetText( aURL.PathToFileName() ); } else pURLBox->SetText( aURL.GetURLNoPass() ); } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */