diff options
Diffstat (limited to 'sfx2/source/dialog/backingwindow.cxx')
-rw-r--r-- | sfx2/source/dialog/backingwindow.cxx | 804 |
1 files changed, 804 insertions, 0 deletions
diff --git a/sfx2/source/dialog/backingwindow.cxx b/sfx2/source/dialog/backingwindow.cxx new file mode 100644 index 000000000..caff3c45a --- /dev/null +++ b/sfx2/source/dialog/backingwindow.cxx @@ -0,0 +1,804 @@ +/* -*- 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 "backingwindow.hxx" + +#include <vcl/accel.hxx> +#include <vcl/settings.hxx> +#include <vcl/svapp.hxx> +#include <vcl/syswin.hxx> +#include <vcl/virdev.hxx> +#include <vcl/fixed.hxx> + +#include <unotools/historyoptions.hxx> +#include <unotools/moduleoptions.hxx> +#include <svtools/openfiledroptargetlistener.hxx> +#include <svtools/colorcfg.hxx> +#include <svtools/langhelp.hxx> +#include <templateviewitem.hxx> + +#include <vcl/menubtn.hxx> + +#include <comphelper/processfactory.hxx> +#include <comphelper/propertysequence.hxx> + +#include <tools/diagnose_ex.h> + +#include <com/sun/star/configuration/theDefaultProvider.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> +#include <com/sun/star/document/MacroExecMode.hpp> +#include <com/sun/star/document/UpdateDocMode.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/system/SystemShellExecute.hpp> +#include <com/sun/star/system/SystemShellExecuteFlags.hpp> +#include <com/sun/star/util/URLTransformer.hpp> +#include <com/sun/star/task/InteractionHandler.hpp> + +#include <officecfg/Office/Common.hxx> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::document; + +const char SERVICENAME_CFGREADACCESS[] = "com.sun.star.configuration.ConfigurationAccess"; + +// increase size of the text in the buttons on the left fMultiplier-times +float const g_fMultiplier = 1.4f; + +BackingWindow::BackingWindow( vcl::Window* i_pParent ) : + Window( i_pParent ), + mbLocalViewInitialized(false), + mbInitControls( false ) +{ + m_pUIBuilder.reset(new VclBuilder(this, getUIRootDir(), "sfx/ui/startcenter.ui", "StartCenter" )); + + get(mpOpenButton, "open_all"); + get(mpRemoteButton, "open_remote"); + get(mpRecentButton, "open_recent"); + get(mpTemplateButton, "templates_all"); + + get(mpCreateLabel, "create_label"); + + get(mpWriterAllButton, "writer_all"); + get(mpCalcAllButton, "calc_all"); + get(mpImpressAllButton, "impress_all"); + get(mpDrawAllButton, "draw_all"); + get(mpDBAllButton, "database_all"); + get(mpMathAllButton, "math_all"); + + get(mpHelpButton, "help"); + //set an alternative help label that doesn't hotkey the H of the Help menu + mpHelpButton->SetText(get<Window>("althelplabel")->GetText()); + get(mpExtensionsButton, "extensions"); + + //Containers are invisible to cursor traversal + //So on pressing "right" when in Help the + //extension button is considered as a candidate + + //But the containers are not invisible to the PushButton ctor which checks + //if the preceding window of its parent is a button and if it then + //defaults to grouping with it and if it is not a button defaults to + //setting itself as the start of a new group. + + //So here take the second button and set it as explicitly not the start + //of a group, i.e. allow it to be grouped with the preceding + //PushButton so when seen as a candidate by cursor travelling + //it will be accepted as a continuation of the group. + WinBits nBits = mpExtensionsButton->GetStyle(); + nBits &= ~WB_GROUP; + nBits |= WB_NOGROUP; + mpExtensionsButton->SetStyle(nBits); + assert(mpHelpButton->GetStyle() & WB_GROUP); + assert(!(mpExtensionsButton->GetStyle() & WB_GROUP)); + + get(mpAllButtonsBox, "all_buttons_box"); + get(mpButtonsBox, "buttons_box"); + get(mpSmallButtonsBox, "small_buttons_box"); + + get(mpAllRecentThumbnails, "all_recent"); + get(mpLocalView, "local_view"); + + maDndWindows.emplace_back(mpAllRecentThumbnails); + + try + { + mxContext.set( ::comphelper::getProcessComponentContext(), uno::UNO_SET_THROW ); + } + catch (const Exception&) + { + TOOLS_WARN_EXCEPTION( "fwk", "BackingWindow" ); + } + + // fdo#34392: we do the layout dynamically, the layout depends on the font, + // so we should handle data changed events (font changing) of the last child + // control, at this point all the controls have updated settings (i.e. font). + + EnableChildTransparentMode(); + + SetStyle( GetStyle() | WB_DIALOGCONTROL ); + + // get dispatch provider + Reference<XDesktop2> xDesktop = Desktop::create( comphelper::getProcessComponentContext() ); + mxDesktopDispatchProvider = xDesktop; + + // init background + SetBackground(); +} + +BackingWindow::~BackingWindow() +{ + disposeOnce(); +} + +void BackingWindow::dispose() +{ + // deregister drag&drop helper + if (mxDropTargetListener.is()) + { + for (auto const & pDndWin : maDndWindows) + { + css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget = + pDndWin->GetDropTarget(); + if (xDropTarget.is()) + { + xDropTarget->removeDropTargetListener(mxDropTargetListener); + xDropTarget->setActive(false); + } + } + mxDropTargetListener.clear(); + } + disposeBuilder(); + maDndWindows.clear(); + mpOpenButton.clear(); + mpRemoteButton.clear(); + mpRecentButton.clear(); + mpTemplateButton.clear(); + mpCreateLabel.clear(); + mpWriterAllButton.clear(); + mpCalcAllButton.clear(); + mpImpressAllButton.clear(); + mpDrawAllButton.clear(); + mpDBAllButton.clear(); + mpMathAllButton.clear(); + mpHelpButton.clear(); + mpExtensionsButton.clear(); + mpAllButtonsBox.clear(); + mpButtonsBox.clear(); + mpSmallButtonsBox.clear(); + mpAllRecentThumbnails.clear(); + mpLocalView.clear(); + vcl::Window::dispose(); +} + +void BackingWindow::initControls() +{ + if( mbInitControls ) + return; + + mbInitControls = true; + + // collect the URLs of the entries in the File/New menu + SvtModuleOptions aModuleOptions; + + if (aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::WRITER)) + mpAllRecentThumbnails->mnFileTypes |= sfx2::ApplicationType::TYPE_WRITER; + + if (aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::CALC)) + mpAllRecentThumbnails->mnFileTypes |= sfx2::ApplicationType::TYPE_CALC; + + if (aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::IMPRESS)) + mpAllRecentThumbnails->mnFileTypes |= sfx2::ApplicationType::TYPE_IMPRESS; + + if (aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::DRAW)) + mpAllRecentThumbnails->mnFileTypes |= sfx2::ApplicationType::TYPE_DRAW; + + if (aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::DATABASE)) + mpAllRecentThumbnails->mnFileTypes |= sfx2::ApplicationType::TYPE_DATABASE; + + if (aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::MATH)) + mpAllRecentThumbnails->mnFileTypes |= sfx2::ApplicationType::TYPE_MATH; + + mpAllRecentThumbnails->mnFileTypes |= sfx2::ApplicationType::TYPE_OTHER; + mpAllRecentThumbnails->Reload(); + mpAllRecentThumbnails->ShowTooltips( true ); + mpRecentButton->SetActive(true); + + //initialize Template view + mpLocalView->SetStyle( mpLocalView->GetStyle() | WB_VSCROLL); + mpLocalView->Hide(); + + //set handlers + mpLocalView->setCreateContextMenuHdl(LINK(this, BackingWindow, CreateContextMenuHdl)); + mpLocalView->setOpenTemplateHdl(LINK(this, BackingWindow, OpenTemplateHdl)); + mpLocalView->setEditTemplateHdl(LINK(this, BackingWindow, EditTemplateHdl)); + mpLocalView->ShowTooltips( true ); + + checkInstalledModules(); + + mpExtensionsButton->SetClickHdl(LINK(this, BackingWindow, ExtLinkClickHdl)); + + mpOpenButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + mpRemoteButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + mpWriterAllButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + mpDrawAllButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + mpCalcAllButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + mpDBAllButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + mpImpressAllButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + mpMathAllButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + + setupMenuButton(mpRecentButton); + setupMenuButton(mpTemplateButton); + + ApplyStyleSettings(); +} + +void BackingWindow::DataChanged(const DataChangedEvent& rDCEvt) +{ + if ((rDCEvt.GetType() != DataChangedEventType::SETTINGS) + || !(rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) + { + vcl::Window::DataChanged(rDCEvt); + return; + } + + ApplyStyleSettings(); + Invalidate(); +} + +template <typename WidgetClass> +void BackingWindow::setLargerFont(WidgetClass& pWidget, const vcl::Font& rFont) +{ + vcl::Font aFont(rFont); + aFont.SetFontSize(Size(0, aFont.GetFontSize().Height() * g_fMultiplier)); + pWidget->SetControlFont(aFont); +} + +void BackingWindow::ApplyStyleSettings() +{ + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + const Color aButtonsBackground(rStyleSettings.GetWindowColor()); + const vcl::Font& aButtonFont(rStyleSettings.GetPushButtonFont()); + const vcl::Font& aLabelFont(rStyleSettings.GetLabelFont()); + + // setup larger fonts + setLargerFont(mpOpenButton, aButtonFont); + setLargerFont(mpOpenButton, aButtonFont); + setLargerFont(mpRemoteButton, aButtonFont); + setLargerFont(mpRecentButton, aButtonFont); + setLargerFont(mpTemplateButton, aButtonFont); + setLargerFont(mpWriterAllButton, aButtonFont); + setLargerFont(mpDrawAllButton, aButtonFont); + setLargerFont(mpCalcAllButton, aButtonFont); + setLargerFont(mpDBAllButton, aButtonFont); + setLargerFont(mpImpressAllButton, aButtonFont); + setLargerFont(mpMathAllButton, aButtonFont); + setLargerFont(mpCreateLabel, aLabelFont); + + // motif image under the buttons + Wallpaper aWallpaper(get<FixedImage>("motif")->GetImage().GetBitmapEx()); + aWallpaper.SetStyle(WallpaperStyle::BottomRight); + aWallpaper.SetColor(aButtonsBackground); + mpButtonsBox->SetBackground(aWallpaper); + + mpAllButtonsBox->SetBackground(aButtonsBackground); + mpSmallButtonsBox->SetBackground(aButtonsBackground); + + Resize(); + + // compute the menubar height + sal_Int32 nMenuHeight = 0; + SystemWindow* pSystemWindow = GetSystemWindow(); + if (pSystemWindow) + { + MenuBar* pMenuBar = pSystemWindow->GetMenuBar(); + if (pMenuBar) + nMenuHeight = pMenuBar->ImplGetWindow()->GetOutputSizePixel().Height(); + } + + set_width_request(mpAllRecentThumbnails->get_width_request() + mpAllButtonsBox->GetOptimalSize().Width()); + set_height_request(nMenuHeight + mpAllButtonsBox->GetOptimalSize().Height()); +} + +void BackingWindow::initializeLocalView() +{ + if (!mbLocalViewInitialized) + { + mbLocalViewInitialized = true; + mpLocalView->Populate(); + mpLocalView->filterItems(ViewFilter_Application(FILTER_APPLICATION::NONE)); + mpLocalView->showAllTemplates(); + } +} + +void BackingWindow::setupMenuButton(MenuToggleButton* pButton) +{ + pButton->SetDelayMenu(true); + pButton->SetDropDown(PushButtonDropdownStyle::SplitMenuButton); + + PopupMenu* pMenu = pButton->GetPopupMenu(); + pMenu->SetMenuFlags(pMenu->GetMenuFlags() | MenuFlags::AlwaysShowDisabledEntries); + + pButton->SetClickHdl(LINK(this, BackingWindow, ClickHdl)); + pButton->SetSelectHdl(LINK(this, BackingWindow, MenuSelectHdl)); +} + +void BackingWindow::checkInstalledModules() +{ + SvtModuleOptions aModuleOpt; + + mpWriterAllButton->Enable( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::WRITER )); + + mpCalcAllButton->Enable( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::CALC ) ); + + mpImpressAllButton->Enable( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::IMPRESS ) ); + + mpDrawAllButton->Enable( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::DRAW ) ); + + mpMathAllButton->Enable(aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::MATH )); + + mpDBAllButton->Enable(aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::DATABASE )); +} + +void BackingWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) +{ + Resize(); + + Wallpaper aBack(svtools::ColorConfig().GetColorValue(::svtools::APPBACKGROUND).nColor); + vcl::Region aClip(tools::Rectangle(Point(0, 0), GetOutputSizePixel())); + + aClip.Exclude(maStartCentButtons); + + rRenderContext.Push(PushFlags::CLIPREGION); + rRenderContext.IntersectClipRegion(aClip); + rRenderContext.DrawWallpaper(tools::Rectangle(Point(0, 0), GetOutputSizePixel()), aBack); + rRenderContext.Pop(); + + ScopedVclPtrInstance<VirtualDevice> pVDev(rRenderContext); + pVDev->EnableRTL(rRenderContext.IsRTLEnabled()); + pVDev->SetOutputSizePixel(maStartCentButtons.GetSize()); + Point aOffset(Point(0, 0) - maStartCentButtons.TopLeft()); + pVDev->DrawWallpaper(tools::Rectangle(aOffset, GetOutputSizePixel()), aBack); + + rRenderContext.DrawOutDev(maStartCentButtons.TopLeft(), maStartCentButtons.GetSize(), + Point(0, 0), maStartCentButtons.GetSize(), + *pVDev); +} + +bool BackingWindow::PreNotify(NotifyEvent& rNEvt) +{ + if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) + { + const KeyEvent* pEvt = rNEvt.GetKeyEvent(); + const vcl::KeyCode& rKeyCode(pEvt->GetKeyCode()); + + // Subwindows of BackingWindow: Sidebar and Thumbnail view + if( rKeyCode.GetCode() == KEY_F6 ) + { + if( rKeyCode.IsShift() ) // Shift + F6 + { + if( mpAllRecentThumbnails->HasFocus() || mpLocalView->HasFocus()) + { + mpOpenButton->GrabFocus(); + return true; + } + } + else if ( rKeyCode.IsMod1() ) // Ctrl + F6 + { + if(mpAllRecentThumbnails->IsVisible()) + { + mpAllRecentThumbnails->GrabFocus(); + return true; + } + else if(mpLocalView->IsVisible()) + { + mpLocalView->GrabFocus(); + return true; + } + } + else // F6 + { + if( mpAllButtonsBox->HasChildPathFocus() ) + { + if(mpAllRecentThumbnails->IsVisible()) + { + mpAllRecentThumbnails->GrabFocus(); + return true; + } + else if(mpLocalView->IsVisible()) + { + mpLocalView->GrabFocus(); + return true; + } + } + } + } + + // try the 'normal' accelerators (so that eg. Ctrl+Q works) + if (!mpAccExec) + { + mpAccExec = svt::AcceleratorExecute::createAcceleratorHelper(); + mpAccExec->init( comphelper::getProcessComponentContext(), mxFrame); + } + + const OUString aCommand = mpAccExec->findCommand(svt::AcceleratorExecute::st_VCLKey2AWTKey(rKeyCode)); + if ((aCommand != "vnd.sun.star.findbar:FocusToFindbar") && pEvt && mpAccExec->execute(rKeyCode)) + return true; + } + else if (rNEvt.GetType() == MouseNotifyEvent::COMMAND) + { + Accelerator::ToggleMnemonicsOnHierarchy(*rNEvt.GetCommandEvent(), this); + } + + return Window::PreNotify( rNEvt ); +} + +void BackingWindow::GetFocus() +{ + GetFocusFlags nFlags = GetParent()->GetGetFocusFlags(); + if( nFlags & GetFocusFlags::F6 ) + { + if( nFlags & GetFocusFlags::Forward ) // F6 + { + mpOpenButton->GrabFocus(); + return; + } + else // Shift + F6 or Ctrl + F6 + { + mpAllRecentThumbnails->GrabFocus(); + return; + } + } + Window::GetFocus(); +} + +void BackingWindow::setOwningFrame( const css::uno::Reference< css::frame::XFrame >& xFrame ) +{ + mxFrame = xFrame; + if( ! mbInitControls ) + initControls(); + + // establish drag&drop mode + mxDropTargetListener.set(new OpenFileDropTargetListener(mxContext, mxFrame)); + + for (auto const & pDndWin : maDndWindows) + { + css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget = + pDndWin->GetDropTarget(); + if (xDropTarget.is()) + { + xDropTarget->addDropTargetListener(mxDropTargetListener); + xDropTarget->setActive(true); + } + } +} + +void BackingWindow::Resize() +{ + maStartCentButtons = tools::Rectangle( Point(0, 0), GetOutputSizePixel() ); + + if (isLayoutEnabled(this)) + VclContainer::setLayoutAllocation(*GetWindow(GetWindowType::FirstChild), + maStartCentButtons.TopLeft(), maStartCentButtons.GetSize()); + + if (!IsInPaint()) + Invalidate(); +} + +IMPL_LINK(BackingWindow, ExtLinkClickHdl, Button*, pButton, void) +{ + OUString aNode; + + if (pButton == mpExtensionsButton) + aNode = "AddFeatureURL"; + + if (aNode.isEmpty()) + return; + + try + { + uno::Sequence<uno::Any> args(comphelper::InitAnyPropertySequence( + { + {"nodepath", uno::Any(OUString("/org.openoffice.Office.Common/Help/StartCenter"))} + })); + + Reference<lang::XMultiServiceFactory> xConfig = configuration::theDefaultProvider::get( comphelper::getProcessComponentContext() ); + Reference<container::XNameAccess> xNameAccess(xConfig->createInstanceWithArguments(SERVICENAME_CFGREADACCESS, args), UNO_QUERY); + if (xNameAccess.is()) + { + OUString sURL; + Any value(xNameAccess->getByName(aNode)); + + sURL = value.get<OUString>(); + localizeWebserviceURI(sURL); + + Reference<css::system::XSystemShellExecute> const + xSystemShellExecute( + css::system::SystemShellExecute::create( + ::comphelper::getProcessComponentContext())); + xSystemShellExecute->execute(sURL, OUString(), + css::system::SystemShellExecuteFlags::URIS_ONLY); + } + } + catch (const Exception&) + { + } +} + +IMPL_LINK( BackingWindow, ClickHdl, Button*, pButton, void ) +{ + // dispatch the appropriate URL and end the dialog + if( pButton == mpWriterAllButton ) + dispatchURL( "private:factory/swriter" ); + else if( pButton == mpCalcAllButton ) + dispatchURL( "private:factory/scalc" ); + else if( pButton == mpImpressAllButton ) + dispatchURL( "private:factory/simpress?slot=6686" ); + else if( pButton == mpDrawAllButton ) + dispatchURL( "private:factory/sdraw" ); + else if( pButton == mpDBAllButton ) + dispatchURL( "private:factory/sdatabase?Interactive" ); + else if( pButton == mpMathAllButton ) + dispatchURL( "private:factory/smath" ); + else if( pButton == mpOpenButton ) + { + Reference< XDispatchProvider > xFrame( mxFrame, UNO_QUERY ); + + Sequence< css::beans::PropertyValue > aArgs(1); + PropertyValue* pArg = aArgs.getArray(); + pArg[0].Name = "Referer"; + pArg[0].Value <<= OUString("private:user"); + + dispatchURL( ".uno:Open", OUString(), xFrame, aArgs ); + } + else if( pButton == mpRemoteButton ) + { + Reference< XDispatchProvider > xFrame( mxFrame, UNO_QUERY ); + + Sequence< css::beans::PropertyValue > aArgs(0); + + dispatchURL( ".uno:OpenRemote", OUString(), xFrame, aArgs ); + } + else if( pButton == mpRecentButton ) + { + mpLocalView->Hide(); + mpAllRecentThumbnails->Show(); + mpAllRecentThumbnails->GrabFocus(); + mpRecentButton->SetActive(true); + mpTemplateButton->SetActive(false); + mpTemplateButton->Invalidate(); + } + else if( pButton == mpTemplateButton ) + { + mpAllRecentThumbnails->Hide(); + initializeLocalView(); + mpLocalView->filterItems(ViewFilter_Application(FILTER_APPLICATION::NONE)); + mpLocalView->Show(); + mpLocalView->reload(); + mpLocalView->GrabFocus(); + mpRecentButton->SetActive(false); + mpRecentButton->Invalidate(); + mpTemplateButton->SetActive(true); + } +} + +IMPL_LINK( BackingWindow, MenuSelectHdl, MenuButton*, pButton, void ) +{ + if(pButton == mpRecentButton) + { + SvtHistoryOptions().Clear(ePICKLIST); + mpAllRecentThumbnails->Reload(); + return; + } + else if(pButton == mpTemplateButton) + { + initializeLocalView(); + + OString sId = pButton->GetCurItemIdent(); + + if( sId == "filter_writer" ) + { + mpLocalView->filterItems(ViewFilter_Application(FILTER_APPLICATION::WRITER)); + } + else if( sId == "filter_calc" ) + { + mpLocalView->filterItems(ViewFilter_Application(FILTER_APPLICATION::CALC)); + } + else if( sId == "filter_impress" ) + { + mpLocalView->filterItems(ViewFilter_Application(FILTER_APPLICATION::IMPRESS)); + } + else if( sId == "filter_draw" ) + { + mpLocalView->filterItems(ViewFilter_Application(FILTER_APPLICATION::DRAW)); + } + else if( sId == "manage" ) + { + Reference< XDispatchProvider > xFrame( mxFrame, UNO_QUERY ); + + Sequence< css::beans::PropertyValue > aArgs(1); + PropertyValue* pArg = aArgs.getArray(); + pArg[0].Name = "Referer"; + pArg[0].Value <<= OUString("private:user"); + + dispatchURL( ".uno:NewDoc", OUString(), xFrame, aArgs ); + return; + } + + mpAllRecentThumbnails->Hide(); + mpLocalView->Show(); + mpLocalView->reload(); + mpLocalView->GrabFocus(); + mpRecentButton->SetActive(false); + mpTemplateButton->SetActive(true); + mpRecentButton->Invalidate(); + } +} + +IMPL_LINK(BackingWindow, CreateContextMenuHdl, ThumbnailViewItem*, pItem, void) +{ + const TemplateViewItem *pViewItem = dynamic_cast<TemplateViewItem*>(pItem); + + if (pViewItem) + mpLocalView->createContextMenu(); +} + +IMPL_LINK(BackingWindow, OpenTemplateHdl, ThumbnailViewItem*, pItem, void) +{ + uno::Sequence< PropertyValue > aArgs(4); + aArgs[0].Name = "AsTemplate"; + aArgs[0].Value <<= true; + aArgs[1].Name = "MacroExecutionMode"; + aArgs[1].Value <<= MacroExecMode::USE_CONFIG; + aArgs[2].Name = "UpdateDocMode"; + aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG; + aArgs[3].Name = "InteractionHandler"; + aArgs[3].Value <<= task::InteractionHandler::createWithParent( ::comphelper::getProcessComponentContext(), nullptr ); + + TemplateViewItem *pTemplateItem = static_cast<TemplateViewItem*>(pItem); + + Reference< XDispatchProvider > xFrame( mxFrame, UNO_QUERY ); + + try + { + dispatchURL( pTemplateItem->getPath(), "_default", xFrame, aArgs ); + } + catch( const uno::Exception& ) + { + } +} + +IMPL_LINK(BackingWindow, EditTemplateHdl, ThumbnailViewItem*, pItem, void) +{ + uno::Sequence< PropertyValue > aArgs(3); + aArgs[0].Name = "AsTemplate"; + aArgs[0].Value <<= false; + aArgs[1].Name = "MacroExecutionMode"; + aArgs[1].Value <<= MacroExecMode::USE_CONFIG; + aArgs[2].Name = "UpdateDocMode"; + aArgs[2].Value <<= UpdateDocMode::ACCORDING_TO_CONFIG; + + TemplateViewItem *pViewItem = static_cast<TemplateViewItem*>(pItem); + + Reference< XDispatchProvider > xFrame( mxFrame, UNO_QUERY ); + + try + { + dispatchURL( pViewItem->getPath(), "_default", xFrame, aArgs ); + } + catch( const uno::Exception& ) + { + } +} + +namespace { + +struct ImplDelayedDispatch +{ + Reference< XDispatch > xDispatch; + css::util::URL aDispatchURL; + Sequence< PropertyValue > aArgs; + + ImplDelayedDispatch( const Reference< XDispatch >& i_xDispatch, + const css::util::URL& i_rURL, + const Sequence< PropertyValue >& i_rArgs ) + : xDispatch( i_xDispatch ), + aDispatchURL( i_rURL ), + aArgs( i_rArgs ) + { + } +}; + +} + +static void implDispatchDelayed( void*, void* pArg ) +{ + struct ImplDelayedDispatch* pDispatch = static_cast<ImplDelayedDispatch*>(pArg); + try + { + pDispatch->xDispatch->dispatch( pDispatch->aDispatchURL, pDispatch->aArgs ); + } + catch (const Exception&) + { + } + + // clean up + delete pDispatch; +} + +void BackingWindow::dispatchURL( const OUString& i_rURL, + const OUString& rTarget, + const Reference< XDispatchProvider >& i_xProv, + const Sequence< PropertyValue >& i_rArgs ) +{ + // if no special dispatch provider is given, get the desktop + Reference< XDispatchProvider > xProvider( i_xProv.is() ? i_xProv : mxDesktopDispatchProvider ); + + // check for dispatch provider + if( !xProvider.is()) + return; + + // get a URL transformer to clean up the URL + css::util::URL aDispatchURL; + aDispatchURL.Complete = i_rURL; + + Reference < css::util::XURLTransformer > xURLTransformer( + css::util::URLTransformer::create( comphelper::getProcessComponentContext() ) ); + try + { + // clean up the URL + xURLTransformer->parseStrict( aDispatchURL ); + // get a Dispatch for the URL and target + Reference< XDispatch > xDispatch( + xProvider->queryDispatch( aDispatchURL, rTarget, 0 ) + ); + // dispatch the URL + if ( xDispatch.is() ) + { + std::unique_ptr<ImplDelayedDispatch> pDisp(new ImplDelayedDispatch( xDispatch, aDispatchURL, i_rArgs )); + if( Application::PostUserEvent( Link<void*,void>( nullptr, implDispatchDelayed ), pDisp.get() ) ) + pDisp.release(); + } + } + catch (const css::uno::RuntimeException&) + { + throw; + } + catch (const css::uno::Exception&) + { + } +} + +Size BackingWindow::GetOptimalSize() const +{ + if (isLayoutEnabled(this)) + return VclContainer::getLayoutRequisition(*GetWindow(GetWindowType::FirstChild)); + + return Window::GetOptimalSize(); +} + +void BackingWindow::clearRecentFileList() +{ + mpAllRecentThumbnails->Clear(); + set_width_request(mpAllRecentThumbnails->get_width_request() + mpAllButtonsBox->GetOptimalSize().Width()); +} +/* vim:set shiftwidth=4 softtabstop=4 expandtab:*/ |