752 lines
27 KiB
C++
752 lines
27 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 "backingwindow.hxx"
|
|
|
|
#include <vcl/svapp.hxx>
|
|
#include <vcl/virdev.hxx>
|
|
|
|
#include <unotools/dynamicmenuoptions.hxx>
|
|
#include <svtools/langhelp.hxx>
|
|
#include <svtools/openfiledroptargetlistener.hxx>
|
|
#include <svtools/colorcfg.hxx>
|
|
|
|
#include <comphelper/processfactory.hxx>
|
|
#include <comphelper/sequenceashashmap.hxx>
|
|
|
|
#include <toolkit/awt/vclxmenu.hxx>
|
|
|
|
#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/container/XNameAccess.hpp>
|
|
#include <com/sun/star/configuration/theDefaultProvider.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>
|
|
|
|
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 RECENT_FILE_LIST[] = ".uno:RecentFileList";
|
|
|
|
const char WRITER_URL[] = "private:factory/swriter";
|
|
const char CALC_URL[] = "private:factory/scalc";
|
|
const char IMPRESS_WIZARD_URL[] = "private:factory/simpress?slot=6686";
|
|
const char DRAW_URL[] = "private:factory/sdraw";
|
|
const char BASE_URL[] = "private:factory/sdatabase?Interactive";
|
|
const char MATH_URL[] = "private:factory/smath";
|
|
const char TEMPLATE_URL[] = "slot:5500";
|
|
const char OPEN_URL[] = ".uno:Open";
|
|
const char SERVICENAME_CFGREADACCESS[] = "com.sun.star.configuration.ConfigurationAccess";
|
|
|
|
const int nItemId_Extensions = 1;
|
|
const int nItemId_Info = 3;
|
|
const int nItemId_TplRep = 4;
|
|
|
|
const int nTemplateItemMaxWidth = 160;
|
|
const int nTemplateItemMaxHeight = 148;
|
|
const int nTemplateItemPadding = 5;
|
|
const int nTemplateItemMaxTextLength = 20;
|
|
const int nTemplateItemThumbnailMaxHeight = 96;
|
|
|
|
BackingWindow::BackingWindow( Window* i_pParent ) :
|
|
Window( i_pParent ),
|
|
mxDesktop( Desktop::create(comphelper::getProcessComponentContext()) ),
|
|
mbInitControls( false ),
|
|
mnHideExternalLinks( 0 ),
|
|
mpAccExec( NULL )
|
|
{
|
|
m_pUIBuilder = new VclBuilder(this, getUIRootDir(),
|
|
"sfx/ui/startcenter.ui",
|
|
"StartCenter" );
|
|
|
|
get(mpOpenButton, "open");
|
|
get(mpTemplateButton, "templates");
|
|
|
|
get(mpModuleNotebook, "modules_notebook");
|
|
|
|
get(mpWriterButton, "writer");
|
|
get(mpCalcButton, "calc");
|
|
get(mpImpressButton, "impress");
|
|
get(mpDrawButton, "draw");
|
|
get(mpDBButton, "database");
|
|
get(mpMathButton, "math");
|
|
|
|
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(mpExtensionsButton, "extension");
|
|
get(mpInfoButton, "info");
|
|
get(mpTplRepButton, "add_temp");
|
|
|
|
get(mpWriterShowTemplateButton, "show_writer_template");
|
|
get(mpCalcShowTemplateButton, "show_calc_template");
|
|
get(mpImpressShowTemplateButton, "show_impress_template");
|
|
get(mpDrawShowTemplateButton, "show_draw_template");
|
|
|
|
get(mpWriterShowRecentButton, "show_writer_recent");
|
|
get(mpCalcShowRecentButton, "show_calc_recent");
|
|
get(mpImpressShowRecentButton, "show_impress_recent");
|
|
get(mpDrawShowRecentButton, "show_draw_recent");
|
|
|
|
get( mpAllRecentThumbnails, "all_recent");
|
|
get( mpWriterRecentThumbnails, "writer_recent");
|
|
get( mpCalcRecentThumbnails, "calc_recent");
|
|
get( mpImpressRecentThumbnails, "impress_recent");
|
|
get( mpDrawRecentThumbnails, "draw_recent");
|
|
get( mpDatabaseRecentThumbnails, "database_recent");
|
|
get( mpMathRecentThumbnails, "math_recent");
|
|
|
|
get( mpWriterTemplateThumbnails, "writer_templates");
|
|
get( mpCalcTemplateThumbnails, "calc_templates");
|
|
get( mpImpressTemplateThumbnails, "impress_templates");
|
|
get( mpDrawTemplateThumbnails, "draw_templates");
|
|
|
|
maDndWindows.push_back(mpAllRecentThumbnails);
|
|
maDndWindows.push_back(mpWriterRecentThumbnails);
|
|
maDndWindows.push_back(mpCalcRecentThumbnails);
|
|
maDndWindows.push_back(mpImpressRecentThumbnails);
|
|
maDndWindows.push_back(mpDrawRecentThumbnails);
|
|
maDndWindows.push_back(mpDatabaseRecentThumbnails);
|
|
maDndWindows.push_back(mpMathRecentThumbnails);
|
|
maDndWindows.push_back(mpWriterTemplateThumbnails);
|
|
maDndWindows.push_back(mpCalcTemplateThumbnails);
|
|
maDndWindows.push_back(mpImpressTemplateThumbnails);
|
|
maDndWindows.push_back(mpDrawTemplateThumbnails);
|
|
|
|
try
|
|
{
|
|
mxContext.set( ::comphelper::getProcessComponentContext(), uno::UNO_SET_THROW );
|
|
Reference<lang::XMultiServiceFactory> xConfig = configuration::theDefaultProvider::get( mxContext );
|
|
Sequence<Any> args(1);
|
|
PropertyValue val(
|
|
"nodepath",
|
|
0,
|
|
Any(OUString("/org.openoffice.Office.Common/Help/StartCenter")),
|
|
PropertyState_DIRECT_VALUE);
|
|
args.getArray()[0] <<= val;
|
|
Reference<container::XNameAccess> xNameAccess(xConfig->createInstanceWithArguments(SERVICENAME_CFGREADACCESS,args), UNO_QUERY);
|
|
if( xNameAccess.is() )
|
|
{
|
|
//throws css::container::NoSuchElementException, css::lang::WrappedTargetException
|
|
Any value( xNameAccess->getByName("StartCenterHideExternalLinks") );
|
|
mnHideExternalLinks = value.get<sal_Int32>();
|
|
}
|
|
}
|
|
catch (const Exception& e)
|
|
{
|
|
SAL_WARN( "fwk", "BackingWindow - caught an exception! " << e.Message );
|
|
}
|
|
|
|
// 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;
|
|
|
|
mpTemplateButton->SetHelpId( ".HelpId:StartCenter:TemplateButton" );
|
|
mpOpenButton->SetHelpId( ".HelpId:StartCenter:OpenButton" );
|
|
|
|
mpWriterButton->SetHelpId( ".HelpId:StartCenter:WriterButton" );
|
|
mpCalcButton->SetHelpId( ".HelpId:StartCenter:CalcButton" );
|
|
mpImpressButton->SetHelpId( ".HelpId:StartCenter:ImpressButton" );
|
|
mpDrawButton->SetHelpId( ".HelpId:StartCenter:DrawButton" );
|
|
mpDBButton->SetHelpId( ".HelpId:StartCenter:DBButton" );
|
|
mpMathButton->SetHelpId( ".HelpId:StartCenter:MathButton" );
|
|
|
|
mpExtensionsButton->SetHelpId( ".HelpId:StartCenter:Extensions" );
|
|
mpInfoButton->SetHelpId( ".HelpId:StartCenter:Info" );
|
|
mpTplRepButton->SetHelpId( ".HelpId:StartCenter:TemplateRepository" );
|
|
|
|
// init background
|
|
SetBackground();
|
|
}
|
|
|
|
|
|
BackingWindow::~BackingWindow()
|
|
{
|
|
mpWriterTemplateThumbnails ->setOpenTemplateHdl(Link());
|
|
mpCalcTemplateThumbnails ->setOpenTemplateHdl(Link());
|
|
mpImpressTemplateThumbnails ->setOpenTemplateHdl(Link());
|
|
mpDrawTemplateThumbnails ->setOpenTemplateHdl(Link());
|
|
|
|
// deregister drag&drop helper
|
|
if (mxDropTargetListener.is())
|
|
{
|
|
for (std::vector<Window*>::iterator aI = maDndWindows.begin(),
|
|
aEnd = maDndWindows.end(); aI != aEnd; ++aI)
|
|
{
|
|
Window *pDndWin = *aI;
|
|
css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget =
|
|
pDndWin->GetDropTarget();
|
|
if (xDropTarget.is())
|
|
{
|
|
xDropTarget->removeDropTargetListener(mxDropTargetListener);
|
|
xDropTarget->setActive(false);
|
|
}
|
|
}
|
|
mxDropTargetListener = css::uno::Reference< css::datatransfer::dnd::XDropTargetListener >();
|
|
}
|
|
|
|
}
|
|
|
|
IMPL_LINK( BackingWindow, WindowEventListener, VclSimpleEvent*, pEvent )
|
|
{
|
|
VclWindowEvent* pWinEvent = dynamic_cast<VclWindowEvent*>( pEvent );
|
|
if ( pWinEvent && pWinEvent->GetId() == VCLEVENT_WINDOW_DATACHANGED )
|
|
{
|
|
DataChangedEvent* pDCEvt =
|
|
static_cast<DataChangedEvent*>( pWinEvent->GetData() );
|
|
if ( pDCEvt->GetFlags() & SETTINGS_STYLE )
|
|
{
|
|
SetBackground();
|
|
Invalidate();
|
|
// fdo#34392: Resize buttons to match the new text size.
|
|
Resize();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void BackingWindow::initControls()
|
|
{
|
|
if( mbInitControls )
|
|
return;
|
|
|
|
mbInitControls = true;
|
|
|
|
// collect the URLs of the entries in the File/New menu
|
|
SvtModuleOptions aModuleOptions;
|
|
std::set< OUString > aFileNewAppsAvailable;
|
|
SvtDynamicMenuOptions aOpt;
|
|
Sequence < Sequence < PropertyValue > > aNewMenu = aOpt.GetMenu( E_NEWMENU );
|
|
const OUString sURLKey( "URL" );
|
|
|
|
const Sequence< PropertyValue >* pNewMenu = aNewMenu.getConstArray();
|
|
const Sequence< PropertyValue >* pNewMenuEnd = aNewMenu.getConstArray() + aNewMenu.getLength();
|
|
for ( ; pNewMenu != pNewMenuEnd; ++pNewMenu )
|
|
{
|
|
comphelper::SequenceAsHashMap aEntryItems( *pNewMenu );
|
|
OUString sURL( aEntryItems.getUnpackedValueOrDefault( sURLKey, OUString() ) );
|
|
if ( !sURL.isEmpty() )
|
|
aFileNewAppsAvailable.insert( sURL );
|
|
}
|
|
|
|
setupModuleTab( "tab_writer", mpWriterRecentThumbnails, TYPE_WRITER,
|
|
WRITER_URL, aFileNewAppsAvailable, aModuleOptions,
|
|
SvtModuleOptions::E_SWRITER );
|
|
setupModuleTab( "tab_calc", mpCalcRecentThumbnails, TYPE_CALC,
|
|
DRAW_URL, aFileNewAppsAvailable, aModuleOptions,
|
|
SvtModuleOptions::E_SDRAW );
|
|
setupModuleTab( "tab_impress", mpImpressRecentThumbnails, TYPE_IMPRESS,
|
|
CALC_URL, aFileNewAppsAvailable, aModuleOptions,
|
|
SvtModuleOptions::E_SCALC );
|
|
setupModuleTab( "tab_draw", mpDrawRecentThumbnails, TYPE_DRAW,
|
|
BASE_URL, aFileNewAppsAvailable, aModuleOptions,
|
|
SvtModuleOptions::E_SDATABASE );
|
|
setupModuleTab( "tab_database", mpDatabaseRecentThumbnails, TYPE_DATABASE,
|
|
IMPRESS_WIZARD_URL, aFileNewAppsAvailable, aModuleOptions,
|
|
SvtModuleOptions::E_SIMPRESS );
|
|
setupModuleTab( "tab_math", mpMathRecentThumbnails, TYPE_MATH,
|
|
MATH_URL, aFileNewAppsAvailable, aModuleOptions,
|
|
SvtModuleOptions::E_SMATH );
|
|
|
|
// File types for mpAllRecentThumbnails are added in the above calls
|
|
// of setupModuleTab. TYPE_OTHER is always added.
|
|
mpAllRecentThumbnails->mnFileTypes |= TYPE_OTHER;
|
|
mpAllRecentThumbnails->loadRecentDocs();
|
|
mpAllRecentThumbnails->ShowTooltips( true );
|
|
|
|
setupButton( mpWriterButton );
|
|
setupButton( mpDrawButton );
|
|
setupButton( mpCalcButton );
|
|
setupButton( mpDBButton );
|
|
setupButton( mpImpressButton );
|
|
setupButton( mpMathButton );
|
|
|
|
setupButton( mpWriterAllButton );
|
|
setupButton( mpDrawAllButton );
|
|
setupButton( mpCalcAllButton );
|
|
setupButton( mpDBAllButton );
|
|
setupButton( mpImpressAllButton );
|
|
setupButton( mpMathAllButton );
|
|
|
|
setupButton( mpOpenButton );
|
|
setupButton( mpTemplateButton );
|
|
|
|
setupExternalLink( mpExtensionsButton );
|
|
setupExternalLink( mpInfoButton );
|
|
setupExternalLink( mpTplRepButton );
|
|
|
|
setupTemplateView( mpWriterTemplateThumbnails, FILTER_APP_WRITER,
|
|
mpWriterShowRecentButton, mpWriterShowTemplateButton );
|
|
setupTemplateView( mpCalcTemplateThumbnails, FILTER_APP_CALC,
|
|
mpCalcShowRecentButton, mpCalcShowTemplateButton );
|
|
setupTemplateView( mpImpressTemplateThumbnails, FILTER_APP_IMPRESS,
|
|
mpImpressShowRecentButton, mpImpressShowTemplateButton );
|
|
setupTemplateView( mpDrawTemplateThumbnails, FILTER_APP_DRAW,
|
|
mpDrawShowRecentButton, mpDrawShowTemplateButton );
|
|
|
|
Resize();
|
|
}
|
|
|
|
void BackingWindow::setupModuleTab(const OString& rTabName, RecentDocsView* pRecView, int nFileTypes,
|
|
const OUString &rURL, const std::set<OUString>& rURLS, SvtModuleOptions& rOpt,
|
|
SvtModuleOptions::EModule eMod)
|
|
{
|
|
if( !rURL.isEmpty() && (!rOpt.IsModuleInstalled( eMod ) || rURLS.find( rURL ) == rURLS.end()) )
|
|
{
|
|
// disable the parts that are not installed
|
|
mpModuleNotebook->RemovePage( mpModuleNotebook->GetPageId(rTabName) );
|
|
}
|
|
else
|
|
{
|
|
// if a module is installed, add that filetype to the "All" page
|
|
mpAllRecentThumbnails-> mnFileTypes |= nFileTypes;
|
|
pRecView->mnFileTypes |= nFileTypes;
|
|
pRecView->loadRecentDocs();
|
|
pRecView->ShowTooltips( true );
|
|
}
|
|
}
|
|
|
|
void BackingWindow::setupButton( PushButton* pButton )
|
|
{
|
|
pButton->SetClickHdl( LINK( this, BackingWindow, ClickHdl ) );
|
|
|
|
// setup text - slighly larger font than normal labels on the texts
|
|
Font aFont;
|
|
aFont.SetSize( Size( 0, 11 ) );
|
|
aFont.SetWeight( WEIGHT_NORMAL );
|
|
|
|
pButton->SetFont( aFont );
|
|
pButton->SetControlFont( aFont );
|
|
}
|
|
|
|
void BackingWindow::setupTemplateView( TemplateLocalView* pView, FILTER_APPLICATION eFilter,
|
|
PushButton* pRecentButton, PushButton* pTemplateButton )
|
|
{
|
|
// setup view
|
|
pView->SetStyle(pView->GetStyle() | WB_VSCROLL);
|
|
pView->setItemMaxTextLength(nTemplateItemMaxTextLength);
|
|
|
|
pView->setItemDimensions(nTemplateItemMaxWidth, nTemplateItemThumbnailMaxHeight,
|
|
nTemplateItemMaxHeight-nTemplateItemThumbnailMaxHeight,
|
|
nTemplateItemPadding);
|
|
pView->filterItems(ViewFilter_Application(eFilter));
|
|
pView->Populate();
|
|
pView->Hide(); // hidden by default
|
|
pView->showRootRegion();
|
|
pView->setOpenTemplateHdl( LINK( this, BackingWindow, OpenTemplateHdl ) );
|
|
|
|
// setup buttons
|
|
pRecentButton->SetClickHdl( LINK( this, BackingWindow, RecentTemplateToggleHdl ) );
|
|
pTemplateButton->SetClickHdl( LINK( this, BackingWindow, RecentTemplateToggleHdl ) );
|
|
|
|
// button text - slighly larger font than normal labels on the texts
|
|
Font aFont;
|
|
aFont.SetSize( Size( 0, 11 ) );
|
|
aFont.SetWeight( WEIGHT_NORMAL );
|
|
|
|
pRecentButton->SetFont( aFont );
|
|
pRecentButton->SetControlFont( aFont );
|
|
|
|
pTemplateButton->SetFont( aFont );
|
|
pTemplateButton->SetControlFont( aFont );
|
|
|
|
pRecentButton->Hide(); // hidden by default
|
|
}
|
|
|
|
void BackingWindow::setupExternalLink( PushButton* pButton )
|
|
{
|
|
if( mnHideExternalLinks == 0 )
|
|
pButton->Show();
|
|
else
|
|
pButton->Hide();
|
|
|
|
pButton->SetClickHdl( LINK( this, BackingWindow, ExtLinkClickHdl ) );
|
|
}
|
|
|
|
void BackingWindow::Paint( const Rectangle& )
|
|
{
|
|
Resize();
|
|
|
|
Wallpaper aBack( svtools::ColorConfig().GetColorValue(::svtools::APPBACKGROUND).nColor );
|
|
Region aClip( Rectangle( Point( 0, 0 ), GetOutputSizePixel() ) );
|
|
|
|
aClip.Exclude( maStartCentButtons );
|
|
|
|
Push( PUSH_CLIPREGION );
|
|
IntersectClipRegion( aClip );
|
|
DrawWallpaper( Rectangle( Point( 0, 0 ), GetOutputSizePixel() ), aBack );
|
|
Pop();
|
|
|
|
VirtualDevice aDev( *this );
|
|
aDev.EnableRTL( IsRTLEnabled() );
|
|
aDev.SetOutputSizePixel( maStartCentButtons.GetSize() );
|
|
Point aOffset( Point( 0, 0 ) - maStartCentButtons.TopLeft());
|
|
aDev.DrawWallpaper( Rectangle( aOffset, GetOutputSizePixel() ), aBack );
|
|
|
|
DrawOutDev( maStartCentButtons.TopLeft(), maStartCentButtons.GetSize(),
|
|
Point( 0, 0 ), maStartCentButtons.GetSize(),
|
|
aDev );
|
|
}
|
|
|
|
long BackingWindow::Notify( NotifyEvent& rNEvt )
|
|
{
|
|
if( rNEvt.GetType() == EVENT_KEYINPUT )
|
|
{
|
|
// try the 'normal' accelerators (so that eg. Ctrl+Q works)
|
|
if( !mpAccExec )
|
|
{
|
|
mpAccExec = svt::AcceleratorExecute::createAcceleratorHelper();
|
|
mpAccExec->init( comphelper::getProcessComponentContext(), mxFrame);
|
|
}
|
|
|
|
const KeyEvent* pEvt = rNEvt.GetKeyEvent();
|
|
const KeyCode& rKeyCode(pEvt->GetKeyCode());
|
|
if( pEvt && mpAccExec->execute(rKeyCode) )
|
|
return 1;
|
|
}
|
|
|
|
return Window::Notify( rNEvt );
|
|
}
|
|
|
|
void BackingWindow::setOwningFrame( const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& xFrame )
|
|
{
|
|
mxFrame = xFrame;
|
|
if( ! mbInitControls )
|
|
initControls();
|
|
|
|
// establish drag&drop mode
|
|
mxDropTargetListener.set(new OpenFileDropTargetListener(mxContext, mxFrame));
|
|
|
|
for (std::vector<Window*>::iterator aI = maDndWindows.begin(),
|
|
aEnd = maDndWindows.end(); aI != aEnd; ++aI)
|
|
{
|
|
Window *pDndWin = *aI;
|
|
css::uno::Reference< css::datatransfer::dnd::XDropTarget > xDropTarget =
|
|
pDndWin->GetDropTarget();
|
|
if (xDropTarget.is())
|
|
{
|
|
xDropTarget->addDropTargetListener(mxDropTargetListener);
|
|
xDropTarget->setActive(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
void BackingWindow::Resize()
|
|
{
|
|
maStartCentButtons = Rectangle( Point(0, 0), GetOutputSizePixel() );
|
|
|
|
if (isLayoutEnabled(this))
|
|
VclContainer::setLayoutAllocation(*GetWindow(WINDOW_FIRSTCHILD),
|
|
maStartCentButtons.TopLeft(), maStartCentButtons.GetSize());
|
|
|
|
if( !IsInPaint())
|
|
Invalidate();
|
|
}
|
|
|
|
IMPL_LINK( BackingWindow, ExtLinkClickHdl, Button*, pButton )
|
|
{
|
|
const char* pNode = NULL;
|
|
|
|
if( pButton == mpExtensionsButton )
|
|
pNode = "AddFeatureURL";
|
|
else if( pButton == mpInfoButton )
|
|
pNode = "InfoURL";
|
|
else if( pButton == mpTplRepButton )
|
|
pNode = "TemplateRepositoryURL";
|
|
|
|
if( pNode )
|
|
{
|
|
const char* pNodePath = "/org.openoffice.Office.Common/Help/StartCenter";
|
|
try
|
|
{
|
|
Reference<lang::XMultiServiceFactory> xConfig = configuration::theDefaultProvider::get( comphelper::getProcessComponentContext() );
|
|
Sequence<Any> args(1);
|
|
PropertyValue val(
|
|
"nodepath",
|
|
0,
|
|
Any(OUString::createFromAscii(pNodePath)),
|
|
PropertyState_DIRECT_VALUE);
|
|
args.getArray()[0] <<= val;
|
|
Reference<container::XNameAccess> xNameAccess(xConfig->createInstanceWithArguments(SERVICENAME_CFGREADACCESS,args), UNO_QUERY);
|
|
if( xNameAccess.is() )
|
|
{
|
|
OUString sURL;
|
|
//throws css::container::NoSuchElementException, css::lang::WrappedTargetException
|
|
Any value( xNameAccess->getByName(OUString::createFromAscii(pNode)) );
|
|
sURL = value.get<OUString> ();
|
|
localizeWebserviceURI(sURL);
|
|
|
|
Reference< com::sun::star::system::XSystemShellExecute > xSystemShellExecute(
|
|
com::sun::star::system::SystemShellExecute::create(comphelper::getProcessComponentContext()));
|
|
//throws css::lang::IllegalArgumentException, css::system::SystemShellExecuteException
|
|
xSystemShellExecute->execute( sURL, OUString(), com::sun::star::system::SystemShellExecuteFlags::URIS_ONLY);
|
|
}
|
|
}
|
|
catch (const Exception&)
|
|
{
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK( BackingWindow, ClickHdl, Button*, pButton )
|
|
{
|
|
// dispatch the appropriate URL and end the dialog
|
|
if( pButton == mpWriterButton || pButton == mpWriterAllButton )
|
|
dispatchURL( WRITER_URL );
|
|
else if( pButton == mpCalcButton || pButton == mpCalcAllButton )
|
|
dispatchURL( CALC_URL );
|
|
else if( pButton == mpImpressButton || pButton == mpImpressAllButton )
|
|
dispatchURL( IMPRESS_WIZARD_URL );
|
|
else if( pButton == mpDrawButton || pButton == mpDrawAllButton )
|
|
dispatchURL( DRAW_URL );
|
|
else if( pButton == mpDBButton || pButton == mpDBAllButton )
|
|
dispatchURL( BASE_URL );
|
|
else if( pButton == mpMathButton || pButton == mpMathAllButton )
|
|
dispatchURL( MATH_URL );
|
|
else if( pButton == mpOpenButton )
|
|
{
|
|
Reference< XDispatchProvider > xFrame( mxFrame, UNO_QUERY );
|
|
|
|
Sequence< com::sun::star::beans::PropertyValue > aArgs(1);
|
|
PropertyValue* pArg = aArgs.getArray();
|
|
pArg[0].Name = "Referer";
|
|
pArg[0].Value <<= OUString("private:user");
|
|
|
|
dispatchURL( OPEN_URL, OUString(), xFrame, aArgs );
|
|
}
|
|
else if( pButton == mpTemplateButton )
|
|
{
|
|
Reference< XDispatchProvider > xFrame( mxFrame, UNO_QUERY );
|
|
|
|
Sequence< com::sun::star::beans::PropertyValue > aArgs(1);
|
|
PropertyValue* pArg = aArgs.getArray();
|
|
pArg[0].Name = OUString("Referer");
|
|
pArg[0].Value <<= OUString("private:user");
|
|
|
|
dispatchURL( TEMPLATE_URL, OUString(), xFrame, aArgs );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK( BackingWindow, RecentTemplateToggleHdl, Button*, pButton )
|
|
{
|
|
// writer
|
|
if( pButton == mpWriterShowTemplateButton )
|
|
{
|
|
mpWriterRecentThumbnails->Hide();
|
|
mpWriterShowTemplateButton->Hide();
|
|
mpWriterTemplateThumbnails->Show();
|
|
mpWriterShowRecentButton->Show();
|
|
mpWriterShowRecentButton->GrabFocus();
|
|
}
|
|
else if( pButton == mpWriterShowRecentButton )
|
|
{
|
|
mpWriterTemplateThumbnails->Hide();
|
|
mpWriterShowRecentButton->Hide();
|
|
mpWriterRecentThumbnails->Show();
|
|
mpWriterShowTemplateButton->Show();
|
|
mpWriterShowTemplateButton->GrabFocus();
|
|
}
|
|
// calc
|
|
else if( pButton == mpCalcShowTemplateButton )
|
|
{
|
|
mpCalcRecentThumbnails->Hide();
|
|
mpCalcShowTemplateButton->Hide();
|
|
mpCalcTemplateThumbnails->Show();
|
|
mpCalcShowRecentButton->Show();
|
|
mpCalcShowRecentButton->GrabFocus();
|
|
}
|
|
else if( pButton == mpCalcShowRecentButton )
|
|
{
|
|
mpCalcTemplateThumbnails->Hide();
|
|
mpCalcShowRecentButton->Hide();
|
|
mpCalcRecentThumbnails->Show();
|
|
mpCalcShowTemplateButton->Show();
|
|
mpCalcShowTemplateButton->GrabFocus();
|
|
}
|
|
// impress
|
|
else if( pButton == mpImpressShowTemplateButton )
|
|
{
|
|
mpImpressRecentThumbnails->Hide();
|
|
mpImpressShowTemplateButton->Hide();
|
|
mpImpressTemplateThumbnails->Show();
|
|
mpImpressShowRecentButton->Show();
|
|
mpImpressShowRecentButton->GrabFocus();
|
|
}
|
|
else if( pButton == mpImpressShowRecentButton )
|
|
{
|
|
mpImpressTemplateThumbnails->Hide();
|
|
mpImpressShowRecentButton->Hide();
|
|
mpImpressRecentThumbnails->Show();
|
|
mpImpressShowTemplateButton->Show();
|
|
mpImpressShowTemplateButton->GrabFocus();
|
|
}
|
|
// draw
|
|
else if( pButton == mpDrawShowTemplateButton )
|
|
{
|
|
mpDrawRecentThumbnails->Hide();
|
|
mpDrawShowTemplateButton->Hide();
|
|
mpDrawTemplateThumbnails->Show();
|
|
mpDrawShowRecentButton->Show();
|
|
mpDrawShowRecentButton->GrabFocus();
|
|
}
|
|
else if( pButton == mpDrawShowRecentButton )
|
|
{
|
|
mpDrawTemplateThumbnails->Hide();
|
|
mpDrawShowRecentButton->Hide();
|
|
mpDrawRecentThumbnails->Show();
|
|
mpDrawShowTemplateButton->Show();
|
|
mpDrawShowTemplateButton->GrabFocus();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK( BackingWindow, OpenTemplateHdl, ThumbnailViewItem*, pItem)
|
|
{
|
|
uno::Sequence< PropertyValue > aArgs(4);
|
|
aArgs[0].Name = "AsTemplate";
|
|
aArgs[0].Value <<= sal_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(), 0 );
|
|
|
|
TemplateViewItem *pTemplateItem = static_cast<TemplateViewItem*>(pItem);
|
|
|
|
try
|
|
{
|
|
mxDesktop->loadComponentFromURL(pTemplateItem->getPath(),"_default", 0, aArgs );
|
|
}
|
|
catch( const uno::Exception& )
|
|
{
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
struct ImplDelayedDispatch
|
|
{
|
|
Reference< XDispatch > xDispatch;
|
|
com::sun::star::util::URL aDispatchURL;
|
|
Sequence< PropertyValue > aArgs;
|
|
|
|
ImplDelayedDispatch( const Reference< XDispatch >& i_xDispatch,
|
|
const com::sun::star::util::URL& i_rURL,
|
|
const Sequence< PropertyValue >& i_rArgs )
|
|
: xDispatch( i_xDispatch ),
|
|
aDispatchURL( i_rURL ),
|
|
aArgs( i_rArgs )
|
|
{
|
|
}
|
|
~ImplDelayedDispatch() {}
|
|
};
|
|
|
|
static long implDispatchDelayed( void*, void* pArg )
|
|
{
|
|
struct ImplDelayedDispatch* pDispatch = reinterpret_cast<ImplDelayedDispatch*>(pArg);
|
|
try
|
|
{
|
|
pDispatch->xDispatch->dispatch( pDispatch->aDispatchURL, pDispatch->aArgs );
|
|
}
|
|
catch (const Exception&)
|
|
{
|
|
}
|
|
|
|
// clean up
|
|
delete pDispatch;
|
|
|
|
return 0;
|
|
}
|
|
|
|
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 an URL transformer to clean up the URL
|
|
com::sun::star::util::URL aDispatchURL;
|
|
aDispatchURL.Complete = i_rURL;
|
|
|
|
Reference < com::sun::star::util::XURLTransformer > xURLTransformer(
|
|
com::sun::star::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() )
|
|
{
|
|
ImplDelayedDispatch* pDisp = new ImplDelayedDispatch( xDispatch, aDispatchURL, i_rArgs );
|
|
sal_uLong nEventId = 0;
|
|
if( ! Application::PostUserEvent( nEventId, Link( NULL, implDispatchDelayed ), pDisp ) )
|
|
delete pDisp; // event could not be posted for unknown reason, at least don't leak
|
|
}
|
|
}
|
|
catch (const com::sun::star::uno::RuntimeException&)
|
|
{
|
|
throw;
|
|
}
|
|
catch (const com::sun::star::uno::Exception&)
|
|
{
|
|
}
|
|
}
|
|
|
|
Size BackingWindow::GetOptimalSize() const
|
|
{
|
|
if (isLayoutEnabled(this))
|
|
return VclContainer::getLayoutRequisition(*GetWindow(WINDOW_FIRSTCHILD));
|
|
|
|
return Window::GetOptimalSize();
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab:*/
|