/**************************************************************
 * 
 * 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 <tools/datetime.hxx>
#include <unotools/datetime.hxx>
#include <vcl/msgbox.hxx>
#include <ucbhelper/content.hxx>
#include <sfx2/app.hxx>
#include "helpid.hrc"
#include "svx/gallery1.hxx"
#include "svx/galtheme.hxx"
#include "svx/galmisc.hxx"
#include "galbrws1.hxx"
#include <com/sun/star/util/DateTime.hpp>
#include "gallery.hrc"
#include <algorithm>
#include <svx/dialogs.hrc>
#include <svx/dialmgr.hxx>

#include <svx/svxdlg.hxx> //CHINA001
//CHINA001 #include <svx/dialogs.hrc> //CHINA001

// --------------
// - Namespaces -
// --------------

using namespace ::rtl;
using namespace ::com::sun::star;

// -----------------
// - GalleryButton -
// -----------------
DBG_NAME(GalleryButton)

GalleryButton::GalleryButton( GalleryBrowser1* pParent, WinBits nWinBits ) :
    PushButton( pParent, nWinBits )
{
    DBG_CTOR(GalleryButton,NULL);

}

// -----------------------------------------------------------------------------

GalleryButton::~GalleryButton()
{

    DBG_DTOR(GalleryButton,NULL);
}

// -----------------------------------------------------------------------------

void GalleryButton::KeyInput( const KeyEvent& rKEvt )
{
    if( !static_cast< GalleryBrowser1* >( GetParent() )->KeyInput( rKEvt, this ) )
        PushButton::KeyInput( rKEvt );
}

// -----------------------
// - GalleryThemeListBox -
// -----------------------
DBG_NAME(GalleryThemeListBox)

GalleryThemeListBox::GalleryThemeListBox( GalleryBrowser1* pParent, WinBits nWinBits ) :
	ListBox( pParent, nWinBits )
{
    DBG_CTOR(GalleryThemeListBox,NULL);

    InitSettings();
}

// -----------------------------------------------------------------------------

GalleryThemeListBox::~GalleryThemeListBox()
{

    DBG_DTOR(GalleryThemeListBox,NULL);
}

// ------------------------------------------------------------------------

void GalleryThemeListBox::InitSettings()
{
	SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
	SetControlBackground( GALLERY_BG_COLOR );
	SetControlForeground( GALLERY_FG_COLOR );
}

// -----------------------------------------------------------------------

void GalleryThemeListBox::DataChanged( const DataChangedEvent& rDCEvt )
{
	if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
		InitSettings();
	else
		ListBox::DataChanged( rDCEvt );
}

// -----------------------------------------------------------------------------

long GalleryThemeListBox::PreNotify( NotifyEvent& rNEvt )
{
    long nDone = 0;

	if( rNEvt.GetType() == EVENT_COMMAND )
	{
		const CommandEvent* pCEvt = rNEvt.GetCommandEvent();

		if( pCEvt && pCEvt->GetCommand() == COMMAND_CONTEXTMENU )
			static_cast< GalleryBrowser1* >( GetParent() )->ShowContextMenu();
	}
    else if( rNEvt.GetType() == EVENT_KEYINPUT )
    {
		const KeyEvent* pKEvt = rNEvt.GetKeyEvent();

        if( pKEvt )
            nDone = static_cast< GalleryBrowser1* >( GetParent() )->KeyInput( *pKEvt, this );
    }

	return( nDone ? nDone : ListBox::PreNotify( rNEvt ) );
}

// -------------------
// - GalleryBrowser1 -
// -------------------
DBG_NAME(GalleryBrowser1)

GalleryBrowser1::GalleryBrowser1(
    Window* pParent,
    const ResId& rResId,
    Gallery* pGallery,
    const ::boost::function<sal_Bool(const KeyEvent&,Window*)>& rKeyInputHandler,
    const ::boost::function<void(void)>& rThemeSlectionHandler)
    :
    Control               ( pParent, rResId ),
    maNewTheme            ( this, WB_3DLOOK ),
    mpThemes              ( new GalleryThemeListBox( this, WB_TABSTOP | WB_3DLOOK | WB_BORDER | WB_HSCROLL | WB_VSCROLL | WB_AUTOHSCROLL | WB_SORT ) ),
    mpGallery             ( pGallery ),
    mpExchangeData        ( new ExchangeData ),
    mpThemePropsDlgItemSet( NULL ),
    aImgNormal            ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_NORMAL ) ),
    aImgDefault           ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_DEFAULT ) ),
    aImgReadOnly          ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_READONLY ) ),
    aImgImported          ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_IMPORTED ) ),
    maKeyInputHandler(rKeyInputHandler),
    maThemeSlectionHandler(rThemeSlectionHandler)
{
    DBG_CTOR(GalleryBrowser1,NULL);

	StartListening( *mpGallery );

	maNewTheme.SetHelpId( HID_GALLERY_NEWTHEME );
	maNewTheme.SetText( String( GAL_RESID( RID_SVXSTR_GALLERY_CREATETHEME ) ) );
	maNewTheme.SetClickHdl( LINK( this, GalleryBrowser1, ClickNewThemeHdl ) );

	// disable creation of new themes if a writable directory is not available
	if( mpGallery->GetUserURL().GetProtocol() == INET_PROT_NOT_VALID )
	    maNewTheme.Disable();

	mpThemes->SetHelpId( HID_GALLERY_THEMELIST );
	mpThemes->SetSelectHdl( LINK( this, GalleryBrowser1, SelectThemeHdl ) );
	mpThemes->SetAccessibleName(String(SVX_RES( RID_SVXSTR_GALLERYPROPS_GALTHEME ) ) );

	for( sal_uIntPtr i = 0, nCount = mpGallery->GetThemeCount(); i < nCount; i++ )
		ImplInsertThemeEntry( mpGallery->GetThemeInfo( i ) );

	ImplAdjustControls();
	maNewTheme.Show( sal_True );
	mpThemes->Show( sal_True );
}

// -----------------------------------------------------------------------------

GalleryBrowser1::~GalleryBrowser1()
{
	EndListening( *mpGallery );
	delete mpThemes;
	mpThemes = NULL;
    delete mpExchangeData;
    mpExchangeData = NULL;

    DBG_DTOR(GalleryBrowser1,NULL);
}

// -----------------------------------------------------------------------------

sal_uIntPtr GalleryBrowser1::ImplInsertThemeEntry( const GalleryThemeEntry* pEntry )
{
	static const sal_Bool bShowHiddenThemes = ( getenv( "GALLERY_SHOW_HIDDEN_THEMES" ) != NULL );

	sal_uIntPtr nRet = LISTBOX_ENTRY_NOTFOUND;

	if( pEntry && ( !pEntry->IsHidden() || bShowHiddenThemes ) )
	{
		const Image* pImage;

		if( pEntry->IsImported() )
			pImage = &aImgImported;
		else if( pEntry->IsReadOnly() )
			pImage = &aImgReadOnly;
		else if( pEntry->IsDefault() )
			pImage = &aImgDefault;
		else
			pImage = &aImgNormal;

		nRet = mpThemes->InsertEntry( pEntry->GetThemeName(), *pImage );
	}

	return nRet;
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::ImplAdjustControls()
{
	const Size	aOutSize( GetOutputSizePixel() );
	const long	nNewThemeHeight = LogicToPixel( Size( 0, 14 ), MAP_APPFONT ).Height();
    const long  nStartY = nNewThemeHeight + 4;

	maNewTheme.SetPosSizePixel( Point(),
								Size( aOutSize.Width(), nNewThemeHeight ) );

	mpThemes->SetPosSizePixel( Point( 0, nStartY ),
							   Size( aOutSize.Width(), aOutSize.Height() - nStartY ) );
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::ImplFillExchangeData( const GalleryTheme* pThm, ExchangeData& rData )
{
	rData.pTheme = (GalleryTheme*) pThm;
	rData.aEditedTitle = pThm->GetName();

	try
	{
		::ucbhelper::Content aCnt( pThm->GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >() );
		util::DateTime	aDateTimeModified;
		DateTime		aDateTime;

		aCnt.getPropertyValue( OUString::createFromAscii( "DateModified" ) ) >>= aDateTimeModified;
		::utl::typeConvert( aDateTimeModified, aDateTime );
		rData.aThemeChangeDate = aDateTime;
		rData.aThemeChangeTime = aDateTime;
	}
	catch( const ucb::ContentCreationException& )
	{
	}
	catch( const uno::RuntimeException& )
	{
	}
	catch( const uno::Exception& )
	{
	}
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::ImplGetExecuteVector(::std::vector< sal_uInt16 >& o_aExec)
{
	GalleryTheme*           pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );

	if( pTheme )
	{
		sal_Bool                bUpdateAllowed, bRenameAllowed, bRemoveAllowed;
		static const sal_Bool	bIdDialog = ( getenv( "GALLERY_ENABLE_ID_DIALOG" ) != NULL );

		if( pTheme->IsReadOnly() )
			bUpdateAllowed = bRenameAllowed = bRemoveAllowed = sal_False;
		else if( pTheme->IsImported() )
		{
			bUpdateAllowed = sal_False;
			bRenameAllowed = bRemoveAllowed = sal_True;
		}
		else if( pTheme->IsDefault() )
		{
			bUpdateAllowed = bRenameAllowed = sal_True;
			bRemoveAllowed = sal_False;
		}
		else
			bUpdateAllowed = bRenameAllowed = bRemoveAllowed = sal_True;

        if( bUpdateAllowed && pTheme->GetObjectCount() )
            o_aExec.push_back( MN_ACTUALIZE );

        if( bRenameAllowed )
            o_aExec.push_back( MN_RENAME );

        if( bRemoveAllowed )
            o_aExec.push_back( MN_DELETE );

        if( bIdDialog && !pTheme->IsReadOnly() && !pTheme->IsImported() )
            o_aExec.push_back( MN_ASSIGN_ID );

        o_aExec.push_back( MN_PROPERTIES );

		mpGallery->ReleaseTheme( pTheme, *this );
    }
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::ImplGalleryThemeProperties( const String & rThemeName, bool bCreateNew )
{
    DBG_ASSERT(!mpThemePropsDlgItemSet, "mpThemePropsDlgItemSet already set!");
    mpThemePropsDlgItemSet = new SfxItemSet( SFX_APP()->GetPool() );
    GalleryTheme*   pTheme = mpGallery->AcquireTheme( rThemeName, *this );

    ImplFillExchangeData( pTheme, *mpExchangeData );

    SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
    DBG_ASSERT(pFact, "Got no AbstractDialogFactory!");
    VclAbstractDialog2* pThemeProps = pFact->CreateGalleryThemePropertiesDialog( NULL, mpExchangeData, mpThemePropsDlgItemSet );
    DBG_ASSERT(pThemeProps, "Got no GalleryThemePropertiesDialog!");

    if ( bCreateNew )
    {
        pThemeProps->StartExecuteModal(
            LINK( this, GalleryBrowser1, EndNewThemePropertiesDlgHdl ) );
    }
    else
    {
        pThemeProps->StartExecuteModal(
            LINK( this, GalleryBrowser1, EndThemePropertiesDlgHdl ) );
    }
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::ImplEndGalleryThemeProperties( VclAbstractDialog2* pDialog, bool bCreateNew )
{
    long nRet = pDialog->GetResult();

    if( nRet == RET_OK )
    {
        String aName( mpExchangeData->pTheme->GetName() );

        if( mpExchangeData->aEditedTitle.Len() && aName != mpExchangeData->aEditedTitle )
        {
            const String    aOldName( aName );
            String          aTitle( mpExchangeData->aEditedTitle );
            sal_uInt16          nCount = 0;

            while( mpGallery->HasTheme( aTitle ) && ( nCount++ < 16000 ) )
            {
                aTitle = mpExchangeData->aEditedTitle;
                aTitle += ' ';
                aTitle += String::CreateFromInt32( nCount );
            }

            mpGallery->RenameTheme( aOldName, aTitle );
        }

        if ( bCreateNew )
        {
            mpThemes->SelectEntry( mpExchangeData->pTheme->GetName() );
            SelectThemeHdl( NULL );
        }
    }

    String aThemeName( mpExchangeData->pTheme->GetName() );
    mpGallery->ReleaseTheme( mpExchangeData->pTheme, *this );

    if ( bCreateNew && ( nRet != RET_OK ) )
    {
        mpGallery->RemoveTheme( aThemeName );
    }

    // destroy mpThemeProps asynchronously
    Application::PostUserEvent( LINK( this, GalleryBrowser1, DestroyThemePropertiesDlgHdl ) );
}

// -----------------------------------------------------------------------------

IMPL_LINK( GalleryBrowser1, EndNewThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
{
    ImplEndGalleryThemeProperties( pDialog, true );
    return 0L;
}

// -----------------------------------------------------------------------------

IMPL_LINK( GalleryBrowser1, EndThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
{
    ImplEndGalleryThemeProperties( pDialog, false );
    return 0L;
}

// -----------------------------------------------------------------------------

IMPL_LINK( GalleryBrowser1, DestroyThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
{
    delete pDialog;
    delete mpThemePropsDlgItemSet;
    mpThemePropsDlgItemSet = 0;
    return 0L;
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::ImplExecute( sal_uInt16 nId )
{
	switch( nId )
	{
		case( MN_ACTUALIZE ):
		{
			GalleryTheme*		pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
			//CHINA001 ActualizeProgress	aActualizeProgress( this, pTheme );
			SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
			if(pFact)
			{
				VclAbstractRefreshableDialog* aActualizeProgress = pFact->CreateActualizeProgressDialog( this, pTheme );
				DBG_ASSERT(aActualizeProgress, "Dialogdiet fail!");//CHINA001

				aActualizeProgress->Update();  //CHINA001 aActualizeProgress.Update();
				aActualizeProgress->Execute(); //CHINA001 aActualizeProgress.Execute();
				mpGallery->ReleaseTheme( pTheme, *this );
				delete aActualizeProgress;		//add CHINA001
			}
		}
		break;

		case( MN_DELETE  ):
		{
			if( QueryBox( NULL, WB_YES_NO, String( GAL_RESID( RID_SVXSTR_GALLERY_DELETETHEME ) ) ).Execute() == RET_YES )
				mpGallery->RemoveTheme( mpThemes->GetSelectEntry() );
		}
		break;

		case( MN_RENAME ):
		{
			GalleryTheme*	pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
			const String	aOldName( pTheme->GetName() );
			//CHINA001 TitleDialog		aDlg( this, aOldName );
			SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
			DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
			AbstractTitleDialog* aDlg = pFact->CreateTitleDialog( this, aOldName );
			DBG_ASSERT(aDlg, "Dialogdiet fail!");//CHINA001

			if( aDlg->Execute() == RET_OK ) //CHINA001 if( aDlg.Execute() == RET_OK )
			{
				const String aNewName( aDlg->GetTitle() ); //CHINA001 aDlg.GetTitle() );

				if( aNewName.Len() && ( aNewName != aOldName ) )
				{
					String	aName( aNewName );
					sal_uInt16	nCount = 0;

					while( mpGallery->HasTheme( aName ) && ( nCount++ < 16000 ) )
					{
						aName = aNewName;
						aName += ' ';
						aName += String::CreateFromInt32( nCount );
					}

					mpGallery->RenameTheme( aOldName, aName );
				}
			}
			mpGallery->ReleaseTheme( pTheme, *this );
			delete aDlg; //add CHINA001
		}
		break;

		case( MN_ASSIGN_ID ):
		{
			GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );

			if( pTheme && !pTheme->IsReadOnly() && !pTheme->IsImported() )
			{
				//CHINA001 GalleryIdDialog aDlg( this, pTheme );
				SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
				if(pFact)
				{
					AbstractGalleryIdDialog* aDlg = pFact->CreateGalleryIdDialog( this, pTheme );
					DBG_ASSERT(aDlg, "Dialogdiet fail!");//CHINA001

					if( aDlg->Execute() == RET_OK ) //CHINA001 if( aDlg.Execute() == RET_OK )
						pTheme->SetId( aDlg->GetId(), sal_True ); //CHINA001 pTheme->SetId( aDlg.GetId(), sal_True );
					delete aDlg; //add CHINA001
				}
			}

			mpGallery->ReleaseTheme( pTheme, *this );
		}
		break;

		case( MN_PROPERTIES ):
		{
            ImplGalleryThemeProperties( GetSelectedTheme(), false );
		}
		break;
	}
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::Resize()
{
	Control::Resize();
	ImplAdjustControls();
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::GetFocus()
{
	Control::GetFocus();
	if( mpThemes )
		mpThemes->GrabFocus();
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::Notify( SfxBroadcaster&, const SfxHint& rHint )
{
	const GalleryHint& rGalleryHint = (const GalleryHint&) rHint;

	switch( rGalleryHint.GetType() )
	{
		case( GALLERY_HINT_THEME_CREATED ):
			ImplInsertThemeEntry( mpGallery->GetThemeInfo( rGalleryHint.GetThemeName() ) );
		break;

		case( GALLERY_HINT_THEME_RENAMED ):
		{
			const sal_uInt16 nCurSelectPos = mpThemes->GetSelectEntryPos();
			const sal_uInt16 nRenameEntryPos = mpThemes->GetEntryPos( rGalleryHint.GetThemeName() );

			mpThemes->RemoveEntry( rGalleryHint.GetThemeName() );
			ImplInsertThemeEntry( mpGallery->GetThemeInfo( rGalleryHint.GetStringData() ) );

			if( nCurSelectPos == nRenameEntryPos )
			{
				mpThemes->SelectEntry( rGalleryHint.GetStringData() );
				SelectThemeHdl( NULL );
			}
		}
		break;

		case( GALLERY_HINT_THEME_REMOVED ):
		{
			mpThemes->RemoveEntry( rGalleryHint.GetThemeName() );
		}
		break;

		case( GALLERY_HINT_CLOSE_THEME ):
		{
			const sal_uInt16 nCurSelectPos = mpThemes->GetSelectEntryPos();
			const sal_uInt16 nCloseEntryPos = mpThemes->GetEntryPos( rGalleryHint.GetThemeName() );

			if( nCurSelectPos == nCloseEntryPos )
			{
				if( nCurSelectPos < ( mpThemes->GetEntryCount() - 1 ) )
					mpThemes->SelectEntryPos( nCurSelectPos + 1 );
				else if( nCurSelectPos )
					mpThemes->SelectEntryPos( nCurSelectPos - 1 );
				else
					mpThemes->SetNoSelection();

				SelectThemeHdl( NULL );
			}
		}
		break;

		default:
		break;
	}
}

// -----------------------------------------------------------------------------

void GalleryBrowser1::ShowContextMenu()
{
	Application::PostUserEvent( LINK( this, GalleryBrowser1, ShowContextMenuHdl ), this );
}

// -----------------------------------------------------------------------------

sal_Bool GalleryBrowser1::KeyInput( const KeyEvent& rKEvt, Window* pWindow )
{
    sal_Bool bRet (sal_False);
    if (maKeyInputHandler)
        bRet = maKeyInputHandler(rKEvt, pWindow);

    if( !bRet )
    {
        ::std::vector< sal_uInt16 > aExecVector;
        ImplGetExecuteVector(aExecVector);
        sal_uInt16                  nExecuteId = 0;
        sal_Bool                    bMod1 = rKEvt.GetKeyCode().IsMod1();

        switch( rKEvt.GetKeyCode().GetCode() )
        {
            case( KEY_INSERT ):
                ClickNewThemeHdl( NULL );
            break;

            case( KEY_I ):
            {
                if( bMod1 )
                   ClickNewThemeHdl( NULL );
            }
            break;

            case( KEY_U ):
            {
                if( bMod1 )
                    nExecuteId = MN_ACTUALIZE;
            }
            break;

            case( KEY_DELETE ):
                nExecuteId = MN_DELETE;
            break;

            case( KEY_D ):
            {
                if( bMod1 )
                    nExecuteId = MN_DELETE;
            }
            break;

            case( KEY_R ):
            {
                if( bMod1 )
                    nExecuteId = MN_RENAME;
            }
            break;

            case( KEY_RETURN ):
            {
                if( bMod1 )
                    nExecuteId = MN_PROPERTIES;
            }
            break;
        }

        if( nExecuteId && ( ::std::find( aExecVector.begin(), aExecVector.end(), nExecuteId ) != aExecVector.end() ) )
        {
            ImplExecute( nExecuteId );
            bRet = sal_True;
        }
    }

    return bRet;
}

// -----------------------------------------------------------------------------

IMPL_LINK( GalleryBrowser1, ShowContextMenuHdl, void*, EMPTYARG )
{
    ::std::vector< sal_uInt16 > aExecVector;
    ImplGetExecuteVector(aExecVector);

    if( !aExecVector.empty() )
    {
		PopupMenu aMenu( GAL_RESID( RID_SVXMN_GALLERY1 ) );

		aMenu.EnableItem( MN_ACTUALIZE, ::std::find( aExecVector.begin(), aExecVector.end(), MN_ACTUALIZE ) != aExecVector.end() );
		aMenu.EnableItem( MN_RENAME, ::std::find( aExecVector.begin(), aExecVector.end(), MN_RENAME ) != aExecVector.end() );
		aMenu.EnableItem( MN_DELETE, ::std::find( aExecVector.begin(), aExecVector.end(), MN_DELETE ) != aExecVector.end() );
		aMenu.EnableItem( MN_ASSIGN_ID, ::std::find( aExecVector.begin(), aExecVector.end(), MN_ASSIGN_ID ) != aExecVector.end() );
		aMenu.EnableItem( MN_PROPERTIES, ::std::find( aExecVector.begin(), aExecVector.end(), MN_PROPERTIES ) != aExecVector.end() );
		aMenu.SetSelectHdl( LINK( this, GalleryBrowser1, PopupMenuHdl ) );
		aMenu.RemoveDisabledEntries();

		const Rectangle aThemesRect( mpThemes->GetPosPixel(), mpThemes->GetOutputSizePixel() );
		Point			aSelPos( mpThemes->GetBoundingRectangle( mpThemes->GetSelectEntryPos() ).Center() );

		aSelPos.X() = Max( Min( aSelPos.X(), aThemesRect.Right() ), aThemesRect.Left() );
		aSelPos.Y() = Max( Min( aSelPos.Y(), aThemesRect.Bottom() ), aThemesRect.Top() );

		aMenu.Execute( this, aSelPos );
	}

	return 0L;
}

// -----------------------------------------------------------------------------

IMPL_LINK( GalleryBrowser1, PopupMenuHdl, Menu*, pMenu )
{
    ImplExecute( pMenu->GetCurItemId() );
    return 0L;
}

// -----------------------------------------------------------------------------

IMPL_LINK( GalleryBrowser1, SelectThemeHdl, void*, EMPTYARG )
{
    if (maThemeSlectionHandler)
        maThemeSlectionHandler();
	return 0L;
}

// -----------------------------------------------------------------------------

IMPL_LINK( GalleryBrowser1, ClickNewThemeHdl, void*, EMPTYARG )
{
	String	aNewTheme( GAL_RESID( RID_SVXSTR_GALLERY_NEWTHEME ) );
	String	aName( aNewTheme );
	sal_uIntPtr	nCount = 0;

	while( mpGallery->HasTheme( aName ) && ( nCount++ < 16000 ) )
	{
		aName = aNewTheme;
		aName += ' ';
		aName += String::CreateFromInt32( nCount );
	}

	if( !mpGallery->HasTheme( aName ) && mpGallery->CreateTheme( aName ) )
	{
        ImplGalleryThemeProperties( aName, true );
	}

	return 0L;
}