Files
libreoffice/sfx2/source/dialog/backingwindow.cxx

691 lines
24 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes: Patches contributed by: Armin Le Grand. #118558# Correcting OLE attributes of LO3.4 at load time by loading as OOo3.3, details see task. http://svn.apache.org/viewvc?view=revision&revision=1195906 #118485# - Styles for OLEs are not saved. http://svn.apache.org/viewvc?view=revision&revision=1182166 #118898# Adapted ImpGraphic::ImplGetBitmap to correctly convert metafiles http://svn.apache.org/viewvc?view=revision&revision=1293316 #119337# Solves the wrong get/setPropertyValue calls in SvxShapeText (and thus in SvxOle2Shape) http://svn.apache.org/viewvc?view=revision&revision=1344156 Patches contributed by Mathias Bauer (and others) gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 cws mba34issues01: #i117717#: remove wrong assertion http://svn.apache.org/viewvc?view=revision&revision=1172349 Patch contributed by Herbert Duerr goodbye Registration and License dialogs, don't let the door hit you http://svn.apache.org/viewvc?view=revision&revision=1172613 help gcc 4.6.0 on 32bit ubuntu 11.10" http://svn.apache.org/viewvc?view=revision&revision=1245357 Do not add targets for junit tests when junit is disabled. Patch contributed by Andre Fischer http://svn.apache.org/viewvc?view=revision&revision=1241508 Revert "sb140: #i117082# avoid unncessary static class data members commit 21d97438e2944861e26e4984195f959a0cce1e41. remove obsolete FreeBSD visibility special case. retain consolidated BSD bridge code, remove OS/2 pieces.
2012-11-12 17:21:24 +00:00
/*
* This file is part of the LibreOffice project.
*
re-base on ALv2 code. Includes: Patches contributed by: Armin Le Grand. #118558# Correcting OLE attributes of LO3.4 at load time by loading as OOo3.3, details see task. http://svn.apache.org/viewvc?view=revision&revision=1195906 #118485# - Styles for OLEs are not saved. http://svn.apache.org/viewvc?view=revision&revision=1182166 #118898# Adapted ImpGraphic::ImplGetBitmap to correctly convert metafiles http://svn.apache.org/viewvc?view=revision&revision=1293316 #119337# Solves the wrong get/setPropertyValue calls in SvxShapeText (and thus in SvxOle2Shape) http://svn.apache.org/viewvc?view=revision&revision=1344156 Patches contributed by Mathias Bauer (and others) gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 cws mba34issues01: #i117717#: remove wrong assertion http://svn.apache.org/viewvc?view=revision&revision=1172349 Patch contributed by Herbert Duerr goodbye Registration and License dialogs, don't let the door hit you http://svn.apache.org/viewvc?view=revision&revision=1172613 help gcc 4.6.0 on 32bit ubuntu 11.10" http://svn.apache.org/viewvc?view=revision&revision=1245357 Do not add targets for junit tests when junit is disabled. Patch contributed by Andre Fischer http://svn.apache.org/viewvc?view=revision&revision=1241508 Revert "sb140: #i117082# avoid unncessary static class data members commit 21d97438e2944861e26e4984195f959a0cce1e41. remove obsolete FreeBSD visibility special case. retain consolidated BSD bridge code, remove OS/2 pieces.
2012-11-12 17:21:24 +00:00
* 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/.
*
re-base on ALv2 code. Includes: Patches contributed by: Armin Le Grand. #118558# Correcting OLE attributes of LO3.4 at load time by loading as OOo3.3, details see task. http://svn.apache.org/viewvc?view=revision&revision=1195906 #118485# - Styles for OLEs are not saved. http://svn.apache.org/viewvc?view=revision&revision=1182166 #118898# Adapted ImpGraphic::ImplGetBitmap to correctly convert metafiles http://svn.apache.org/viewvc?view=revision&revision=1293316 #119337# Solves the wrong get/setPropertyValue calls in SvxShapeText (and thus in SvxOle2Shape) http://svn.apache.org/viewvc?view=revision&revision=1344156 Patches contributed by Mathias Bauer (and others) gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 cws mba34issues01: #i117717#: remove wrong assertion http://svn.apache.org/viewvc?view=revision&revision=1172349 Patch contributed by Herbert Duerr goodbye Registration and License dialogs, don't let the door hit you http://svn.apache.org/viewvc?view=revision&revision=1172613 help gcc 4.6.0 on 32bit ubuntu 11.10" http://svn.apache.org/viewvc?view=revision&revision=1245357 Do not add targets for junit tests when junit is disabled. Patch contributed by Andre Fischer http://svn.apache.org/viewvc?view=revision&revision=1241508 Revert "sb140: #i117082# avoid unncessary static class data members commit 21d97438e2944861e26e4984195f959a0cce1e41. remove obsolete FreeBSD visibility special case. retain consolidated BSD bridge code, remove OS/2 pieces.
2012-11-12 17:21:24 +00:00
* This file incorporates work covered by the following license notice:
*
re-base on ALv2 code. Includes: Patches contributed by: Armin Le Grand. #118558# Correcting OLE attributes of LO3.4 at load time by loading as OOo3.3, details see task. http://svn.apache.org/viewvc?view=revision&revision=1195906 #118485# - Styles for OLEs are not saved. http://svn.apache.org/viewvc?view=revision&revision=1182166 #118898# Adapted ImpGraphic::ImplGetBitmap to correctly convert metafiles http://svn.apache.org/viewvc?view=revision&revision=1293316 #119337# Solves the wrong get/setPropertyValue calls in SvxShapeText (and thus in SvxOle2Shape) http://svn.apache.org/viewvc?view=revision&revision=1344156 Patches contributed by Mathias Bauer (and others) gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 cws mba34issues01: #i117717#: remove wrong assertion http://svn.apache.org/viewvc?view=revision&revision=1172349 Patch contributed by Herbert Duerr goodbye Registration and License dialogs, don't let the door hit you http://svn.apache.org/viewvc?view=revision&revision=1172613 help gcc 4.6.0 on 32bit ubuntu 11.10" http://svn.apache.org/viewvc?view=revision&revision=1245357 Do not add targets for junit tests when junit is disabled. Patch contributed by Andre Fischer http://svn.apache.org/viewvc?view=revision&revision=1241508 Revert "sb140: #i117082# avoid unncessary static class data members commit 21d97438e2944861e26e4984195f959a0cce1e41. remove obsolete FreeBSD visibility special case. retain consolidated BSD bridge code, remove OS/2 pieces.
2012-11-12 17:21:24 +00:00
* 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/colorcfg.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/sequenceashashmap.hxx>
#include <toolkit/awt/vclxmenu.hxx>
#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/frame/PopupMenuControllerFactory.hpp>
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star;
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 nShadowTop = 30;
const int nShadowLeft = 30;
const int nShadowRight = 30;
const int nShadowBottom = 30;
const int nPaddingTop = 30;
const int nPaddingLeft = 50;
const int nPaddingRight = 50;
const int nPaddingBottom = 30;
const int nLogoHeight = 150;
BackingWindow::BackingWindow( Window* i_pParent ) :
Window( i_pParent ),
mbInitControls( false ),
mnHideExternalLinks( 0 ),
mpAccExec( NULL )
{
m_pUIBuilder = new VclBuilder(this, getUIRootDir(),
"sfx/ui/startcenter.ui",
"StartCenter" );
get(mpWriterButton, "writer");
get(mpCalcButton, "calc");
get(mpImpressButton, "impress");
get(mpOpenButton, "open");
get(mpDrawButton, "draw");
get(mpDBButton, "database");
get(mpMathButton, "math");
get(mpTemplateButton, "templates");
get(mpExtensionsButton, "extension");
get(mpInfoButton, "info");
get(mpTplRepButton, "add_temp");
get(mpStartCenterContainer, "sccontainer");
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>();
}
mxPopupMenuFactory.set(
frame::PopupMenuControllerFactory::create( mxContext ) );
// TODO If there is no PopupMenuController, the button should be a nomral one not a MenuButton
if ( mxPopupMenuFactory->hasController(
OUString( RECENT_FILE_LIST ) , OUString("com.sun.star.frame.StartModule") ) )
{
mxPopupMenu.set( mxContext->getServiceManager()->createInstanceWithContext(
OUString( "com.sun.star.awt.PopupMenu" ), mxContext ), uno::UNO_QUERY_THROW );
}
}
catch (const Exception& e)
{
SAL_WARN( "fwk", "BackingWindow - caught an exception! " << e.Message );
}
// clean up resource stack
//FreeResource();
// 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;
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" );
mpTemplateButton->SetHelpId( ".HelpId:StartCenter:TemplateButton" );
mpOpenButton->SetHelpId( ".HelpId:StartCenter:OpenButton" );
mpExtensionsButton->SetHelpId( ".HelpId:StartCenter:Extensions" );
mpInfoButton->SetHelpId( ".HelpId:StartCenter:Info" );
mpTplRepButton->SetHelpId( ".HelpId:StartCenter:TemplateRepository" );
// init background
initBackground();
}
BackingWindow::~BackingWindow()
{
if( mxPopupMenuController.is() )
{
Reference< lang::XComponent > xComponent( mxPopupMenuController, UNO_QUERY );
if( xComponent.is() )
{
try
{
xComponent->dispose();
}
catch (...)
{}
}
mxPopupMenuController.clear();
}
mxPopupMenuFactory.clear();
mxPopupMenu.clear();
}
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 )
{
initBackground();
Invalidate();
// fdo#34392: Resize buttons to match the new text size.
Resize();
}
}
return 0;
}
void BackingWindow::prepareRecentFileMenu()
{
if( ! mxPopupMenu.is() )
return;
if ( !mxPopupMenuController.is() )
{
uno::Sequence< uno::Any > aArgs( 2 );
beans::PropertyValue aProp;
aProp.Name = OUString( "Frame" );
aProp.Value <<= mxFrame;
aArgs[0] <<= aProp;
aProp.Name = OUString( "ModuleIdentifier" );
aProp.Value <<= OUString("com.sun.star.frame.StartModule");
aArgs[1] <<= aProp;
try
{
mxPopupMenuController.set(
mxPopupMenuFactory->createInstanceWithArgumentsAndContext(
OUString( RECENT_FILE_LIST ), aArgs, mxContext),
uno::UNO_QUERY_THROW );
mxPopupMenuController->setPopupMenu( mxPopupMenu );
}
catch ( const Exception &e )
{
SAL_WARN( "fwk", "BackingWindow - caught an exception! " << e.Message );
}
PopupMenu *pRecentMenu = NULL;
VCLXMenu* pTKMenu = VCLXMenu::GetImplementation( mxPopupMenu );
if ( pTKMenu )
pRecentMenu = dynamic_cast< PopupMenu * >( pTKMenu->GetMenu() );
mpOpenButton->SetPopupMenu( pRecentMenu );
}
}
void BackingWindow::initBackground()
{
2011-03-14 11:15:36 +01:00
SetBackground();
// scale middle segment
Size aMiddleSize;
if( !! maBackgroundMiddle )
aMiddleSize = maBackgroundMiddle.GetSizePixel();
// load middle segment
Application::LoadBrandBitmap ("shell/backing_space", maBackgroundMiddle);
// and scale it to previous size
if( aMiddleSize.Width() && aMiddleSize.Height() )
maBackgroundMiddle.Scale( aMiddleSize );
if( GetSettings().GetLayoutRTL() )
{
// replace images by RTL versions
Application::LoadBrandBitmap ("shell/backing_rtl_right", maBackgroundLeft);
Application::LoadBrandBitmap ("shell/backing_rtl_left", maBackgroundRight);
}
else
{
Application::LoadBrandBitmap ("shell/backing_left", maBackgroundLeft);
Application::LoadBrandBitmap ("shell/backing_right", maBackgroundRight);
}
mpOpenButton->SetMenuMode( MENUBUTTON_MENUMODE_TIMED );
mpOpenButton->SetActivateHdl( LINK( this, BackingWindow, ActivateHdl ) );
// this will be moved to somewhere saner later
mnSCWidth = 780;
mnSCHeight = maBackgroundLeft.GetSizePixel().Height();
}
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 );
}
setupButton( mpWriterButton, WRITER_URL, aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SWRITER );
setupButton( mpDrawButton, DRAW_URL, aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SDRAW );
setupButton( mpCalcButton, CALC_URL, aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SCALC );
setupButton( mpDBButton, BASE_URL, aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SDATABASE );
setupButton( mpImpressButton, IMPRESS_WIZARD_URL, aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SIMPRESS );
setupButton( mpMathButton, MATH_URL, aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SMATH );
setupButton( mpOpenButton, "", aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SWRITER );
setupButton( mpTemplateButton, "", aFileNewAppsAvailable,
aModuleOptions, SvtModuleOptions::E_SWRITER );
setupExternalLink( mpExtensionsButton );
setupExternalLink( mpInfoButton );
setupExternalLink( mpTplRepButton );
Resize();
2010-03-29 14:06:42 +02:00
mpWriterButton->GrabFocus();
}
void BackingWindow::setupButton( PushButton* pButton, const OUString &rURL,
const std::set<OUString>& rURLS,
SvtModuleOptions& rOpt, SvtModuleOptions::EModule eMod )
{
pButton->SetClickHdl( LINK( this, BackingWindow, ClickHdl ) );
// disable the parts that are not installed
if( !rURL.isEmpty() && (!rOpt.IsModuleInstalled( eMod ) || rURLS.find( rURL ) == rURLS.end()) )
{
pButton->Enable( sal_False );
}
// 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::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 );
2011-03-14 11:15:36 +01:00
Region aClip( Rectangle( Point( 0, 0 ), GetOutputSizePixel() ) );
Rectangle aBmpRect(Point((GetOutputSizePixel().Width()-mnSCWidth)/2,
(GetOutputSizePixel().Height()-mnSCHeight)/2),
Size(mnSCWidth,mnSCHeight));
2011-03-14 11:15:36 +01:00
aClip.Exclude( aBmpRect );
2011-03-14 11:15:36 +01:00
Push( PUSH_CLIPREGION );
IntersectClipRegion( aClip );
DrawWallpaper( Rectangle( Point( 0, 0 ), GetOutputSizePixel() ), aBack );
Pop();
VirtualDevice aDev( *this );
aDev.EnableRTL( IsRTLEnabled() );
aDev.SetOutputSizePixel( aBmpRect.GetSize() );
Point aOffset( Point( 0, 0 ) - aBmpRect.TopLeft());
2011-03-14 11:15:36 +01:00
aDev.DrawWallpaper( Rectangle( aOffset, GetOutputSizePixel() ), aBack );
maBackgroundMiddle.Scale(
Size(mnSCWidth - maBackgroundLeft.GetSizePixel().Width() - maBackgroundRight.GetSizePixel().Width(),
maBackgroundMiddle.GetSizePixel().Height()),
BMP_SCALE_FAST);
// draw bitmap
2011-03-14 11:15:36 +01:00
Point aTL( 0, 0 );
aDev.DrawBitmapEx( aTL, maBackgroundLeft );
aTL.X() += maBackgroundLeft.GetSizePixel().Width();
if( !!maBackgroundMiddle )
{
2011-03-14 11:15:36 +01:00
aDev.DrawBitmapEx( aTL, maBackgroundMiddle );
aTL.X() += maBackgroundMiddle.GetSizePixel().Width();
}
2011-03-14 11:15:36 +01:00
aDev.DrawBitmapEx( aTL, maBackgroundRight );
DrawOutDev( aBmpRect.TopLeft(), aBmpRect.GetSize(),
Point( 0, 0 ), aBmpRect.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;
// #i110344# extrawurst: specialized arrow key control
if( rKeyCode.GetModifier() == 0 )
{
if( rKeyCode.GetCode() == KEY_RIGHT )
{
if( mpWriterButton->HasFocus() )
mpDrawButton->GrabFocus();
else if( mpCalcButton->HasFocus() )
mpDBButton->GrabFocus();
else if( mpImpressButton->HasFocus() )
mpMathButton->GrabFocus();
else if( mpOpenButton->HasFocus() )
mpTemplateButton->GrabFocus();
return 1;
}
else if( rKeyCode.GetCode() == KEY_LEFT )
{
if( mpDrawButton->HasFocus() )
mpWriterButton->GrabFocus();
else if( mpDBButton->HasFocus() )
mpCalcButton->GrabFocus();
else if( mpMathButton->HasFocus() )
mpImpressButton->GrabFocus();
else if( mpTemplateButton->HasFocus() )
mpOpenButton->GrabFocus();
return 1;
}
else if( rKeyCode.GetCode() == KEY_UP )
{
// first column
if( mpOpenButton->HasFocus() )
mpImpressButton->GrabFocus();
else if( mpImpressButton->HasFocus() )
mpCalcButton->GrabFocus();
else if( mpCalcButton->HasFocus() )
mpWriterButton->GrabFocus();
// second column
else if( mpTemplateButton->HasFocus() )
mpMathButton->GrabFocus();
else if( mpMathButton->HasFocus() )
mpDBButton->GrabFocus();
else if( mpDBButton->HasFocus() )
mpDrawButton->GrabFocus();
return 1;
}
else if( rKeyCode.GetCode() == KEY_DOWN )
{
// first column
if( mpWriterButton->HasFocus() )
mpCalcButton->GrabFocus();
else if( mpCalcButton->HasFocus() )
mpImpressButton->GrabFocus();
else if( mpImpressButton->HasFocus() )
mpOpenButton->GrabFocus();
// second column
else if( mpDrawButton->HasFocus() )
mpDBButton->GrabFocus();
else if( mpDBButton->HasFocus() )
mpMathButton->GrabFocus();
else if( mpMathButton->HasFocus() )
mpTemplateButton->GrabFocus();
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();
}
void BackingWindow::Resize()
{
maStartCentButtons = Rectangle(
Point((GetOutputSizePixel().Width()-mnSCWidth)/2 + nShadowTop + nPaddingTop,
(GetOutputSizePixel().Height()-mnSCHeight)/2 + nShadowLeft + nPaddingLeft + nLogoHeight),
Size(mnSCWidth - nShadowLeft - nShadowRight - nPaddingLeft - nPaddingRight,
mnSCHeight - nShadowTop - nShadowBottom - nPaddingTop - nPaddingBottom - nLogoHeight));
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);
}
}
2011-06-19 22:48:52 +01:00
catch (const Exception&)
{
}
}
return 0;
}
IMPL_LINK( BackingWindow, ClickHdl, Button*, pButton )
{
// dispatch the appropriate URL and end the dialog
if( pButton == mpWriterButton )
dispatchURL( WRITER_URL );
else if( pButton == mpCalcButton )
dispatchURL( CALC_URL );
else if( pButton == mpImpressButton )
dispatchURL( IMPRESS_WIZARD_URL );
else if( pButton == mpDrawButton )
dispatchURL( DRAW_URL );
else if( pButton == mpDBButton )
dispatchURL( BASE_URL );
else if( pButton == mpMathButton )
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, ActivateHdl, Button*, pButton )
{
if( pButton == mpOpenButton )
prepareRecentFileMenu();
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 );
}
2011-06-19 22:48:52 +01:00
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:*/