office-gobmx/fpicker/source/win32/VistaFilePickerEventHandler.cxx
Stephan Bergmann 1d44b6e877 loplugin:staticmethods (clang-cl)
Change-Id: Ib096abfeea6cefb5df562cf75448ef38e432344c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114695
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2021-04-27 12:06:26 +02:00

312 lines
9.4 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 <sal/config.h>
#include "VistaFilePickerEventHandler.hxx"
#include "requests.hxx"
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/embed/XStorage.hpp>
#include <com/sun/star/document/XDocumentRevisionListPersistence.hpp>
#include <com/sun/star/util/RevisionTag.hpp>
#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
#include <osl/file.hxx>
// namespace directives
namespace fpicker{
namespace win32{
namespace vista{
VistaFilePickerEventHandler::VistaFilePickerEventHandler(IVistaFilePickerInternalNotify* pInternalNotify)
: m_nRefCount (0 )
, m_nListenerHandle (0 )
, m_pDialog ( )
, m_pInternalNotify (pInternalNotify)
, m_lListener (m_aMutex)
{
}
VistaFilePickerEventHandler::~VistaFilePickerEventHandler()
{
}
HRESULT STDMETHODCALLTYPE VistaFilePickerEventHandler::QueryInterface(REFIID rIID ,
void** ppObject)
{
*ppObject=nullptr;
if ( rIID == IID_IUnknown )
*ppObject = static_cast<IUnknown*>(static_cast<IFileDialogEvents*>(this));
if ( rIID == IID_IFileDialogEvents )
*ppObject = static_cast<IFileDialogEvents*>(this);
if ( rIID == IID_IFileDialogControlEvents )
*ppObject = static_cast<IFileDialogControlEvents*>(this);
if ( *ppObject != nullptr )
{
static_cast<IUnknown*>(*ppObject)->AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE VistaFilePickerEventHandler::AddRef()
{
return osl_atomic_increment(&m_nRefCount);
}
ULONG STDMETHODCALLTYPE VistaFilePickerEventHandler::Release()
{
ULONG nReturn = --m_nRefCount;
if ( m_nRefCount == 0 )
delete this;
return nReturn;
}
STDMETHODIMP VistaFilePickerEventHandler::OnFileOk(IFileDialog* /*pDialog*/)
{
return E_NOTIMPL;
}
STDMETHODIMP VistaFilePickerEventHandler::OnFolderChanging(IFileDialog* /*pDialog*/,
IShellItem* /*pFolder*/)
{
return E_NOTIMPL;
}
STDMETHODIMP VistaFilePickerEventHandler::OnFolderChange(IFileDialog* /*pDialog*/)
{
impl_sendEvent(E_DIRECTORY_CHANGED, 0);
m_pInternalNotify->onDirectoryChanged();
return S_OK;
}
STDMETHODIMP VistaFilePickerEventHandler::OnSelectionChange(IFileDialog* /*pDialog*/)
{
impl_sendEvent(E_FILE_SELECTION_CHANGED, 0);
return S_OK;
}
STDMETHODIMP VistaFilePickerEventHandler::OnShareViolation(IFileDialog* /*pDialog*/ ,
IShellItem* /*pItem*/ ,
FDE_SHAREVIOLATION_RESPONSE* /*pResponse*/)
{
impl_sendEvent(E_CONTROL_STATE_CHANGED, css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER);
return S_OK;
}
STDMETHODIMP VistaFilePickerEventHandler::OnTypeChange(IFileDialog* pDialog)
{
UINT nFileTypeIndex;
HRESULT hResult = pDialog->GetFileTypeIndex( &nFileTypeIndex );
if ( hResult == S_OK )
{
if ( m_pInternalNotify->onFileTypeChanged( nFileTypeIndex ))
impl_sendEvent(E_CONTROL_STATE_CHANGED, css::ui::dialogs::CommonFilePickerElementIds::LISTBOX_FILTER);
}
return S_OK;
}
STDMETHODIMP VistaFilePickerEventHandler::OnOverwrite(IFileDialog* /*pDialog*/ ,
IShellItem* /*pItem*/ ,
FDE_OVERWRITE_RESPONSE* /*pResponse*/)
{
return E_NOTIMPL;
}
STDMETHODIMP VistaFilePickerEventHandler::OnItemSelected(IFileDialogCustomize* /*pCustomize*/,
DWORD nIDCtl ,
DWORD /*nIDItem*/ )
{
impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl ));
return S_OK;
}
STDMETHODIMP VistaFilePickerEventHandler::OnButtonClicked(IFileDialogCustomize* /*pCustomize*/,
DWORD nIDCtl )
{
impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl));
return S_OK;
}
STDMETHODIMP VistaFilePickerEventHandler::OnCheckButtonToggled(IFileDialogCustomize* /*pCustomize*/,
DWORD nIDCtl ,
BOOL bChecked )
{
if (nIDCtl == css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION)
m_pInternalNotify->onAutoExtensionChanged(bChecked);
impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl));
return S_OK;
}
STDMETHODIMP VistaFilePickerEventHandler::OnControlActivating(IFileDialogCustomize* /*pCustomize*/,
DWORD nIDCtl )
{
impl_sendEvent(E_CONTROL_STATE_CHANGED, static_cast<sal_Int16>( nIDCtl));
return S_OK;
}
void VistaFilePickerEventHandler::addFilePickerListener( const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener )
{
m_lListener.addInterface(cppu::UnoType<css::ui::dialogs::XFilePickerListener>::get(), xListener);
}
void VistaFilePickerEventHandler::removeFilePickerListener( const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener )
{
m_lListener.removeInterface(cppu::UnoType<css::ui::dialogs::XFilePickerListener>::get(), xListener);
}
void VistaFilePickerEventHandler::startListening( const TFileDialog& pBroadcaster )
{
if (m_pDialog.is())
return;
m_pDialog = pBroadcaster;
m_pDialog->Advise(this, &m_nListenerHandle);
}
void VistaFilePickerEventHandler::stopListening()
{
if (m_pDialog.is())
{
m_pDialog->Unadvise(m_nListenerHandle);
m_pDialog.clear();
}
}
const OUStringLiteral PROP_CONTROL_ID = u"control_id";
const OUStringLiteral PROP_PICKER_LISTENER = u"picker_listener";
namespace {
void doRequest(Request& rRequest)
{
const ::sal_Int32 nEventID = rRequest.getRequest();
const ::sal_Int16 nControlID = rRequest.getArgumentOrDefault(PROP_CONTROL_ID, ::sal_Int16(0));
const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest.getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >());
if ( ! xListener.is())
return;
css::ui::dialogs::FilePickerEvent aEvent;
aEvent.ElementId = nControlID;
switch (nEventID)
{
case VistaFilePickerEventHandler::E_FILE_SELECTION_CHANGED :
xListener->fileSelectionChanged(aEvent);
break;
case VistaFilePickerEventHandler::E_DIRECTORY_CHANGED :
xListener->directoryChanged(aEvent);
break;
case VistaFilePickerEventHandler::E_HELP_REQUESTED :
xListener->helpRequested(aEvent);
break;
case VistaFilePickerEventHandler::E_CONTROL_STATE_CHANGED :
xListener->controlStateChanged(aEvent);
break;
case VistaFilePickerEventHandler::E_DIALOG_SIZE_CHANGED :
xListener->dialogSizeChanged();
break;
// no default here. Let compiler detect changes on enum set !
}
}
}
void VistaFilePickerEventHandler::impl_sendEvent( EEventType eEventType,
::sal_Int16 nControlID)
{
::cppu::OInterfaceContainerHelper* pContainer = m_lListener.getContainer( cppu::UnoType<css::ui::dialogs::XFilePickerListener>::get());
if ( ! pContainer)
return;
::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
while (pIterator.hasMoreElements())
{
try
{
css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener (pIterator.next(), css::uno::UNO_QUERY);
Request rRequest;
rRequest.setRequest (eEventType);
rRequest.setArgument(PROP_PICKER_LISTENER, xListener);
if ( nControlID )
rRequest.setArgument(PROP_CONTROL_ID, nControlID);
doRequest(rRequest);
}
catch(const css::uno::RuntimeException&)
{
pIterator.remove();
}
}
}
} // namespace vista
} // namespace win32
} // namespace fpicker
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */