/**************************************************************
 * 
 * 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_sd.hxx"


#include <string> // HACK: prevent conflict between STLPORT and Workshop headers

#include <svx/dialogs.hrc>
#include <svx/svdglue.hxx>
#include <svl/intitem.hxx>
#include <sfx2/app.hxx>
#include <sfx2/dispatch.hxx>
#include <vcl/toolbox.hxx>
#include <sfx2/viewfrm.hxx>

#include "strings.hrc"
#include "gluectrl.hxx"
#include "sdresid.hxx"
#include "app.hrc"

using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;

// z.Z. werden von Joe nur die u.a. Moeglichkeiten unterstuetzt
#define ESCDIR_COUNT 5
static sal_uInt16 aEscDirArray[] =
{
	SDRESC_SMART,
	SDRESC_LEFT,
	SDRESC_RIGHT,
	SDRESC_TOP,
	SDRESC_BOTTOM,
//	SDRESC_LO,
//	SDRESC_LU,
//	SDRESC_RO,
//	SDRESC_RU,
//	SDRESC_HORZ,
//	SDRESC_VERT,
//	SDRESC_ALL
};



SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlGlueEscDir, SfxUInt16Item )

/*************************************************************************
|*
|* Konstruktor fuer Klebepunkt-Autrittsrichtungs-Listbox
|*
\************************************************************************/

GlueEscDirLB::GlueEscDirLB( Window* pParent, const Reference< XFrame >& rFrame ) :
		ListBox( pParent, WinBits( WB_BORDER | WB_DROPDOWN ) ),
        m_xFrame( rFrame )
{
	String aStr; aStr += sal_Unicode('X');
	Size aXSize( GetTextWidth( aStr ), GetTextHeight() );
	//SetPosPixel( Point( aSize.Width(), 0 ) );
	SetSizePixel( Size( aXSize.Width() * 12, aXSize.Height() * 10 ) );
	Fill();
	//SelectEntryPos( 0 );
	Show();
}

/*************************************************************************
|*
|*	Dtor
|*
\************************************************************************/

GlueEscDirLB::~GlueEscDirLB()
{
}

/*************************************************************************
|*
|* Ermittelt die Austrittsrichtung und verschickt den entspr. Slot
|*
\************************************************************************/

void GlueEscDirLB::Select()
{
	sal_uInt16 nPos = GetSelectEntryPos();
	SfxUInt16Item aItem( SID_GLUE_ESCDIR, aEscDirArray[ nPos ] );

    if ( m_xFrame.is() )
    {
        Any a;
        Sequence< PropertyValue > aArgs( 1 );
        aArgs[0].Name   = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "GlueEscapeDirection" ));
        aItem.QueryValue( a );
        aArgs[0].Value  = a;
        SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
                                    rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GlueEscapeDirection" )),
                                    aArgs );
    }
/*
	SfxViewFrame::Current()->GetDispatcher()->Execute( SID_GLUE_ESCDIR, SFX_CALLMODE_ASYNCHRON |
													   SFX_CALLMODE_RECORD, &aItem, (void*) NULL, 0L );
*/
}

/*************************************************************************
|*
|* Fuellen der Listbox mit Strings
|*
\************************************************************************/

void GlueEscDirLB::Fill()
{
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_SMART ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_LEFT ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_RIGHT ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_TOP ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_BOTTOM ) ) );
	/*
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_LO ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_LU ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_RO ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_RU ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_HORZ ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_VERT ) ) );
	InsertEntry( String( SdResId( STR_GLUE_ESCDIR_ALL ) ) );
	*/
}

/*************************************************************************
|*
|* Konstruktor fuer Klebepunkt-Autrittsrichtungs-Toolbox-Control
|*
\************************************************************************/

SdTbxCtlGlueEscDir::SdTbxCtlGlueEscDir( 
    sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
		SfxToolBoxControl( nSlotId, nId, rTbx )
{
}

/*************************************************************************
|*
|* Stellt Status in der Listbox des Controllers dar
|*
\************************************************************************/

void SdTbxCtlGlueEscDir::StateChanged( sal_uInt16 nSId,
						SfxItemState eState, const SfxPoolItem* pState )
{
	if( eState == SFX_ITEM_AVAILABLE )
	{
		GlueEscDirLB* pGlueEscDirLB = (GlueEscDirLB*) ( GetToolBox().
											GetItemWindow( GetId() ) );
		if( pGlueEscDirLB )
		{
			if( pState )
			{
				pGlueEscDirLB->Enable();
				if ( IsInvalidItem( pState ) )
				{
					pGlueEscDirLB->SetNoSelection();
				}
				else
				{
					sal_uInt16 nEscDir = ( (const SfxUInt16Item*) pState )->GetValue();
					pGlueEscDirLB->SelectEntryPos( GetEscDirPos( nEscDir ) );
				}
			}
			else
			{
				pGlueEscDirLB->Disable();
				pGlueEscDirLB->SetNoSelection();
			}
		}
	}

	SfxToolBoxControl::StateChanged( nSId, eState, pState );
}

/*************************************************************************
|*
|* No Comment
|*
\************************************************************************/

Window* SdTbxCtlGlueEscDir::CreateItemWindow( Window *pParent )
{
	if( GetSlotId() == SID_GLUE_ESCDIR )
	{
		return( new GlueEscDirLB( pParent, m_xFrame ) );
	}

	return( NULL );
}


/*************************************************************************
|*
|* Liefert Position im Array fuer EscDir zurueck (Mapping fuer Listbox)
|*
\************************************************************************/

sal_uInt16 SdTbxCtlGlueEscDir::GetEscDirPos( sal_uInt16 nEscDir )
{
	for( sal_uInt16 i = 0; i < ESCDIR_COUNT; i++ )
	{
		if( aEscDirArray[ i ] == nEscDir )
			return( i );
	}
	return( 99 );
}
