blob: 3226558e276a487396cd4fb0133e7be3b071e439 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
#include <vcl/split.hxx>
#include <vcl/ctrl.hxx>
#include <unotools/pathoptions.hxx>
#include <sfx2/app.hxx>
#include <sfx2/sfxsids.hrc>
#include "gallery.hrc"
#include "svx/galmisc.hxx"
#include "svx/gallery1.hxx"
#include "galbrws1.hxx"
#include "galbrws2.hxx"
#include "svx/galbrws.hxx"
#include "GallerySplitter.hxx"
#include <boost/bind.hpp>
// -------------------------
// - SvxGalleryChildWindow -
// -------------------------
DBG_NAME(GalleryChildWindow)
GalleryChildWindow::GalleryChildWindow( Window* _pParent, sal_uInt16 nId, SfxBindings* pBindings, SfxChildWinInfo* pInfo ) :
SfxChildWindow( _pParent, nId )
{
DBG_CTOR(GalleryChildWindow,NULL);
pWindow = new GalleryBrowser( pBindings, this, _pParent, GAL_RESID( RID_SVXDLG_GALLERYBROWSER ) );
eChildAlignment = SFX_ALIGN_TOP;
( (GalleryBrowser*) pWindow )->Initialize( pInfo );
};
// -----------------------------------------------------------------------------
GalleryChildWindow::~GalleryChildWindow()
{
DBG_DTOR(GalleryChildWindow,NULL);
}
// -----------------------------------------------------------------------------
SFX_IMPL_DOCKINGWINDOW( GalleryChildWindow, SID_GALLERY )
// ------------------
// - GalleryBrowser -
// ------------------
DBG_NAME(GalleryBrowser)
GalleryBrowser::GalleryBrowser(
SfxBindings* _pBindings,
SfxChildWindow* pCW,
Window* pParent,
const ResId& rResId)
: SfxDockingWindow(_pBindings, pCW, pParent, rResId),
maLastSize(GetOutputSizePixel()),
mpSplitter(0),
mpBrowser1(0),
mpBrowser2(0),
mpGallery(0)
{
DBG_CTOR(GalleryBrowser,NULL);
mpGallery = Gallery::GetGalleryInstance();
mpBrowser1 = new GalleryBrowser1(
this,
GAL_RESID( GALLERY_BROWSER1 ),
mpGallery,
::boost::bind(&GalleryBrowser::KeyInput,this,_1,_2),
::boost::bind(&GalleryBrowser::ThemeSelectionHasChanged, this));
mpSplitter = new GallerySplitter( this, GAL_RESID( GALLERY_SPLITTER ),
::boost::bind(&GalleryBrowser::InitSettings, this));
mpBrowser2 = new GalleryBrowser2( this, GAL_RESID( GALLERY_BROWSER2 ), mpGallery );
FreeResource();
SetMinOutputSizePixel(maLastSize);
mpBrowser1->SelectTheme( 0 );
mpBrowser1->Show( sal_True );
mpBrowser2->Show( sal_True );
const bool bLayoutHorizontal(maLastSize.Width() > maLastSize.Height());
mpSplitter->SetHorizontal(bLayoutHorizontal);
mpSplitter->SetSplitHdl( LINK( this, GalleryBrowser, SplitHdl ) );
mpSplitter->Show( sal_True );
InitSettings();
}
// -----------------------------------------------------------------------------
GalleryBrowser::~GalleryBrowser()
{
delete mpBrowser2;
delete mpSplitter;
delete mpBrowser1;
DBG_DTOR(GalleryBrowser,NULL);
}
// -----------------------------------------------------------------------------
void GalleryBrowser::InitSettings()
{
SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
SetControlBackground( GALLERY_DLG_COLOR );
SetControlForeground( GALLERY_DLG_COLOR );
mpSplitter->SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
mpSplitter->SetControlBackground( GALLERY_DLG_COLOR );
mpSplitter->SetControlForeground( GALLERY_DLG_COLOR );
mpBrowser1->SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
mpBrowser1->SetControlBackground( GALLERY_DLG_COLOR );
mpBrowser1->SetControlForeground( GALLERY_DLG_COLOR );
mpBrowser2->SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
mpBrowser2->SetControlBackground( GALLERY_DLG_COLOR );
mpBrowser2->SetControlForeground( GALLERY_DLG_COLOR );
}
// -----------------------------------------------------------------------------
void GalleryBrowser::Resize()
{
// call parent
SfxDockingWindow::Resize();
// update hor/ver
const Size aNewSize( GetOutputSizePixel() );
const bool bNewLayoutHorizontal(aNewSize.Width() > aNewSize.Height());
const bool bOldLayoutHorizontal(mpSplitter->IsHorizontal());
const long nSplitPos( bOldLayoutHorizontal ? mpSplitter->GetPosPixel().X() : mpSplitter->GetPosPixel().Y());
const long nSplitSize( bOldLayoutHorizontal ? mpSplitter->GetOutputSizePixel().Width() : mpSplitter->GetOutputSizePixel().Height());
if(bNewLayoutHorizontal != bOldLayoutHorizontal)
{
mpSplitter->SetHorizontal(bNewLayoutHorizontal);
}
const long nFrameLen = LogicToPixel( Size( 3, 0 ), MAP_APPFONT ).Width();
const long nFrameLen2 = nFrameLen << 1;
if(bNewLayoutHorizontal)
{
mpBrowser1->SetPosSizePixel(
Point( nFrameLen, nFrameLen ),
Size(nSplitPos - nFrameLen, aNewSize.Height() - nFrameLen2) );
mpSplitter->SetPosSizePixel(
Point( nSplitPos, 0),
Size( nSplitSize, aNewSize.Height() ) );
mpSplitter->SetDragRectPixel(
Rectangle(
Point( nFrameLen2, 0 ),
Size( aNewSize.Width() - ( nFrameLen2 << 1 ) - nSplitSize, aNewSize.Height() ) ) );
mpBrowser2->SetPosSizePixel(
Point( nSplitPos + nSplitSize, nFrameLen ),
Size( aNewSize.Width() - nSplitSize - nSplitPos - nFrameLen, aNewSize.Height() - nFrameLen2 ) );
}
else
{
mpBrowser1->SetPosSizePixel(
Point( nFrameLen, nFrameLen ),
Size(aNewSize.Width() - nFrameLen2, nSplitPos - nFrameLen));
mpSplitter->SetPosSizePixel(
Point( 0, nSplitPos),
Size( aNewSize.Width(), nSplitSize ) );
mpSplitter->SetDragRectPixel(
Rectangle(
Point( 0, nFrameLen2 ),
Size( aNewSize.Width(), aNewSize.Height() - ( nFrameLen2 << 1 ) - nSplitSize ) ));
mpBrowser2->SetPosSizePixel(
Point( nFrameLen, nSplitPos + nSplitSize ),
Size( aNewSize.Width() - nFrameLen2, aNewSize.Height() - nSplitSize - nSplitPos - nFrameLen ));
}
maLastSize = aNewSize;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryBrowser::KeyInput( const KeyEvent& rKEvt, Window* )
{
const sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
sal_Bool bRet = ( !rKEvt.GetKeyCode().IsMod1() &&
( ( KEY_TAB == nCode ) || ( KEY_F6 == nCode && rKEvt.GetKeyCode().IsMod2() ) ) );
if( bRet )
{
if( !rKEvt.GetKeyCode().IsShift() )
{
if( mpBrowser1->mpThemes->HasChildPathFocus( sal_True ) )
mpBrowser2->GetViewWindow()->GrabFocus();
else if( mpBrowser2->GetViewWindow()->HasFocus() )
mpBrowser2->maViewBox.GrabFocus();
else if( mpBrowser2->maViewBox.HasFocus() )
mpBrowser1->maNewTheme.GrabFocus();
else
mpBrowser1->mpThemes->GrabFocus();
}
else
{
if( mpBrowser1->mpThemes->HasChildPathFocus( sal_True ) )
mpBrowser1->maNewTheme.GrabFocus();
else if( mpBrowser1->maNewTheme.HasFocus() )
mpBrowser2->maViewBox.GrabFocus();
else if( mpBrowser2->maViewBox.HasFocus() )
mpBrowser2->GetViewWindow()->GrabFocus();
else
mpBrowser1->mpThemes->GrabFocus();
}
}
return bRet;
}
// -----------------------------------------------------------------------------
sal_Bool GalleryBrowser::Close()
{
return SfxDockingWindow::Close();
}
// -----------------------------------------------------------------------------
void GalleryBrowser::GetFocus()
{
SfxDockingWindow::GetFocus();
mpBrowser1->GrabFocus();
}
// -----------------------------------------------------------------------------
void GalleryBrowser::ThemeSelectionHasChanged()
{
mpBrowser2->SelectTheme( mpBrowser1->GetSelectedTheme() );
}
// -----------------------------------------------------------------------------
IMPL_LINK( GalleryBrowser, SplitHdl, void*, EMPTYARG )
{
if(mpSplitter->IsHorizontal())
{
mpSplitter->SetPosPixel( Point( mpSplitter->GetSplitPosPixel(), mpSplitter->GetPosPixel().Y() ) );
}
else
{
mpSplitter->SetPosPixel( Point( mpSplitter->GetPosPixel().X(), mpSplitter->GetSplitPosPixel() ) );
}
Resize();
return 0L;
}
// -----------------------------------------------------------------------------
// eof