/**************************************************************
 *
 * 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 <sfx2/bindings.hxx>
#include <svx/svxids.hrc>
#include <svx/grafctrl.hxx>
#include <svl/cjkoptions.hxx>
#include <sfx2/viewsh.hxx>
#ifndef _SFX_IMAGEMGR_HXX
#include <sfx2/imagemgr.hxx>
#endif
#include <rtl/ustring.hxx>
#include <rtl/ustrbuf.hxx>

#include "sddll.hxx"
#include "GraphicDocShell.hxx"

#include <vcl/toolbox.hxx>

#include "app.hxx"
#include "app.hrc"
#include "res_bmp.hrc"
#include "sdresid.hxx"
#include "tbx_ww.hxx"
#include "tbx_ww.hrc"

SFX_IMPL_TOOLBOX_CONTROL( SdTbxControl, TbxImageItem )

/*************************************************************************
|*
|* PopUp-Window
|*
\************************************************************************/
/*
SdPopupWindowTbx::SdPopupWindowTbx( sal_uInt16 nId, WindowAlign eAlign,
                                    SdResId aRIdWin, SdResId aRIdTbx,
									SfxBindings& rBindings ) :
				SfxPopupWindow	( nId, aRIdWin, rBindings ),
                aTbx            ( this, GetBindings(), aRIdTbx ),
                aSdResIdWin       ( aRIdWin ),
                aSdResIdTbx       ( aRIdTbx ),
				eTbxAlign		( eAlign )
{
	aTbx.UseDefault();
	aSelectLink = aTbx.GetToolBox().GetSelectHdl();
	aTbx.GetToolBox().SetSelectHdl( LINK( this, SdPopupWindowTbx, TbxSelectHdl ) );

	FreeResource();

	if( ( eAlign == WINDOWALIGN_TOP ) || ( eAlign == WINDOWALIGN_BOTTOM ) )
	{
        if ( aSdResIdWin.GetId() != RID_TEXT )
	        aTbx.GetToolBox().SetAlign( WINDOWALIGN_LEFT );

        SetText( String() );
	}

    AdaptToCTL();
}


void SdPopupWindowTbx::AdaptToCTL (void)
{
	Size aSize = aTbx.CalcWindowSizePixel();
	if (aSdResIdWin.GetId() == RID_TEXT)
	{
        SvtCJKOptions aCJKOptions;
        if ( ! aCJKOptions.IsVerticalTextEnabled())
        {
            ToolBox& aToolBox = aTbx.GetToolBox();

            // Iterate over all tool box items and remove those that are
            // specific to complex text layout.
            sal_uInt16 i=0;
            while (i < aToolBox.GetItemCount())
            {
                sal_uInt16 nIndex = aToolBox.GetItemId(i);
                switch (nIndex)
                {
                    case 0: // Line break.
                    case SID_ATTR_CHAR_VERTICAL:
                    case SID_TEXT_FITTOSIZE_VERTICAL:
                    case SID_DRAW_CAPTION_VERTICAL:
					case SID_DRAW_FONTWORK_VERTICAL:
                        aToolBox.RemoveItem (i);
                        break;

                    default:
                        // Leave the item unmodified.  Advance to the next one.
                        i+=1;
                }
            }
            aToolBox.RecalcItems();
            // Why is this necessary?
            aToolBox.SetLineCount(1);
            sal_uInt16 nLineCount = aToolBox.GetLineCount();
            aSize = aToolBox.CalcWindowSizePixel(nLineCount);
        }
    }
	aTbx.SetPosSizePixel( Point(), aSize );
	SetOutputSizePixel( aSize );
}
*/

/*-------------------------------------------------------------------------*/
/*
SdPopupWindowTbx::~SdPopupWindowTbx()
{
}
*/
/*-------------------------------------------------------------------------*/
/*
SfxPopupWindow* SdPopupWindowTbx::Clone() const
{
	SfxBindings& rBindings = (SfxBindings&)GetBindings();

	return( new SdPopupWindowTbx( GetId(), eTbxAlign,
                    aSdResIdWin, aSdResIdTbx, rBindings ) );

	//return( SfxPopupWindow::Clone() );
}
*/
/*-------------------------------------------------------------------------*/
/*
void SdPopupWindowTbx::Update()
{
    AdaptToCTL();

	ToolBox *pBox = &aTbx.GetToolBox();
	aTbx.Activate( pBox );
	aTbx.Deactivate( pBox );
}
*/
/*-------------------------------------------------------------------------*/
/*
void SdPopupWindowTbx::PopupModeEnd()
{
	aTbx.GetToolBox().EndSelection();

	SfxPopupWindow::PopupModeEnd();
}
*/
/*-------------------------------------------------------------------------*/
/*
IMPL_LINK( SdPopupWindowTbx, TbxSelectHdl, ToolBox*, pBox)
{
	if( IsInPopupMode() )
		EndPopupMode();

	aSelectLink.Call( &aTbx.GetToolBox() );

	if ( pBox->GetModifier() & KEY_MOD1 )
	{
		//	#99013# if selected with control key, return focus to current view
		Window* pShellWnd = SfxViewShell::Current()->GetWindow();
		if ( pShellWnd )
			pShellWnd->GrabFocus();
	}

	return( 0L );
}
*/
/*************************************************************************
|*
|* Klasse fuer Toolbox
|*
\************************************************************************/

SdTbxControl::SdTbxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
		SfxToolBoxControl( nSlotId, nId, rTbx )
{
	rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) );
	rTbx.Invalidate();
}

/*-------------------------------------------------------------------------*/

SfxPopupWindowType SdTbxControl::GetPopupWindowType() const
{
	return( SFX_POPUPWINDOW_ONTIMEOUT );
}

/*************************************************************************
|*
|* Hier wird das Fenster erzeugt
|* Lage der Toolbox mit GetToolBox() abfragbar
|* rItemRect sind die Screen-Koordinaten
|*
\************************************************************************/

SfxPopupWindow*	SdTbxControl::CreatePopupWindow()
{
	SfxPopupWindow *pWin = NULL;
    rtl::OUString aToolBarResStr;
    rtl::OUStringBuffer aTbxResName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/" )));
	switch( GetSlotId() )
	{
        case SID_OBJECT_ALIGN:
            aTbxResName.appendAscii( "alignmentbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
        break;
		case SID_ZOOM_TOOLBOX:
            aTbxResName.appendAscii( "zoombar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_OBJECT_CHOOSE_MODE:
            aTbxResName.appendAscii( "choosemodebar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_POSITION:
            aTbxResName.appendAscii( "positionbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_DRAWTBX_TEXT:
            aTbxResName.appendAscii( "textbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_DRAWTBX_RECTANGLES:
            aTbxResName.appendAscii( "rectanglesbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_DRAWTBX_ELLIPSES:
            aTbxResName.appendAscii( "ellipsesbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_DRAWTBX_LINES:
            aTbxResName.appendAscii( "linesbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_DRAWTBX_ARROWS:
            aTbxResName.appendAscii( "arrowsbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
		case SID_DRAWTBX_3D_OBJECTS:
            aTbxResName.appendAscii( "3dobjectsbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
        case SID_DRAWTBX_CONNECTORS:
            aTbxResName.appendAscii( "connectorsbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
        case SID_DRAWTBX_INSERT:
            aTbxResName.appendAscii( "insertbar" );
            aToolBarResStr = aTbxResName.makeStringAndClear();
		break;
    }

    if ( aToolBarResStr.getLength() > 0 )
        createAndPositionSubToolBar( aToolBarResStr );

	return( pWin );
}

/*-------------------------------------------------------------------------*/

void SdTbxControl::StateChanged( sal_uInt16 nSId,
						SfxItemState eState, const SfxPoolItem* pState )
{
	SfxToolBoxControl::StateChanged( nSId, eState, pState );

	if( eState == SFX_ITEM_AVAILABLE )
	{
		TbxImageItem* pItem = PTR_CAST( TbxImageItem, pState );
		//DBG_ASSERT( pItem, "TbxImageItem erwartet!" );
		// Im StarDesktop kann jetzt auch ein anderes Item ankommen,
		// das nicht ausgewertet werden darf (#33802# und #33838#)
		if( pItem )
		{
			ToolBox& rTbx = GetToolBox();
			sal_uInt16 nImage = pItem->GetValue();
			if( nImage == 0 )
			{
				if( rTbx.IsItemChecked( nSId ) )
					rTbx.CheckItem( nSId, sal_False );
			}
			else
			{
                rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" ));
                aSlotURL += rtl::OUString::valueOf( sal_Int32( nImage ));
                Image aImage = GetImage( m_xFrame,
                                         aSlotURL,
                                         hasBigImages(),
                                         GetToolBox().GetSettings().GetStyleSettings().GetHighContrastMode() );

				// !-Operator prueft, ob Image nicht vorhanden ist
				if( !!aImage )
				{
					rTbx.SetItemImage( GetId(), aImage );
					rTbx.CheckItem( GetId(), IsCheckable( nImage ) );

					if( nSId != SID_ZOOM_TOOLBOX &&
						nSId != SID_DRAWTBX_INSERT &&
						nSId != SID_POSITION &&
						nSId != SID_OBJECT_ALIGN )
					{
						if( nSId != SID_OBJECT_CHOOSE_MODE &&
							rTbx.IsItemChecked( SID_OBJECT_CHOOSE_MODE ) )
							rTbx.CheckItem( SID_OBJECT_CHOOSE_MODE, sal_False );
						if( nSId != SID_DRAWTBX_TEXT &&
							rTbx.IsItemChecked( SID_DRAWTBX_TEXT ) )
			 				rTbx.CheckItem( SID_DRAWTBX_TEXT, sal_False );
						if( nSId != SID_DRAWTBX_RECTANGLES &&
							rTbx.IsItemChecked( SID_DRAWTBX_RECTANGLES ) )
			   				rTbx.CheckItem( SID_DRAWTBX_RECTANGLES, sal_False );
						if( nSId != SID_DRAWTBX_ELLIPSES &&
							rTbx.IsItemChecked( SID_DRAWTBX_ELLIPSES ) )
			   				rTbx.CheckItem( SID_DRAWTBX_ELLIPSES, sal_False );
						if( nSId != SID_DRAWTBX_LINES &&
							rTbx.IsItemChecked( SID_DRAWTBX_LINES ) )
							rTbx.CheckItem( SID_DRAWTBX_LINES, sal_False );
						if( nSId != SID_DRAWTBX_ARROWS &&
							rTbx.IsItemChecked( SID_DRAWTBX_ARROWS ) )
							rTbx.CheckItem( SID_DRAWTBX_ARROWS, sal_False );
						if( nSId != SID_DRAWTBX_3D_OBJECTS &&
							rTbx.IsItemChecked( SID_DRAWTBX_3D_OBJECTS ) )
							rTbx.CheckItem( SID_DRAWTBX_3D_OBJECTS, sal_False );
                        if( nSId != SID_DRAWTBX_CONNECTORS &&
                            rTbx.IsItemChecked( SID_DRAWTBX_CONNECTORS ) )
                            rTbx.CheckItem( SID_DRAWTBX_CONNECTORS, sal_False );
                    }
				}
			}
		}
	}
}

/*-------------------------------------------------------------------------*/

sal_Bool SdTbxControl::IsCheckable( sal_uInt16 nSId )
{
	switch( nSId )
	{
		case SID_OBJECT_ROTATE:
		case SID_OBJECT_MIRROR:
		case SID_OBJECT_CROP:
		case SID_OBJECT_TRANSPARENCE:
		case SID_OBJECT_GRADIENT:
		case SID_OBJECT_SHEAR:
		case SID_OBJECT_CROOK_ROTATE:
		case SID_OBJECT_CROOK_SLANT:
		case SID_OBJECT_CROOK_STRETCH:
        case SID_CONVERT_TO_3D_LATHE:

		case SID_ATTR_CHAR:
		case SID_ATTR_CHAR_VERTICAL:
		case SID_TEXT_FITTOSIZE:
		case SID_TEXT_FITTOSIZE_VERTICAL:
		case SID_DRAW_CAPTION:
		case SID_DRAW_CAPTION_VERTICAL:
		case SID_DRAW_FONTWORK:
		case SID_DRAW_FONTWORK_VERTICAL:

		case SID_DRAW_RECT:
		case SID_DRAW_SQUARE:
		case SID_DRAW_RECT_ROUND:
		case SID_DRAW_SQUARE_ROUND:
		case SID_DRAW_RECT_NOFILL:
		case SID_DRAW_SQUARE_NOFILL:
		case SID_DRAW_RECT_ROUND_NOFILL:
		case SID_DRAW_SQUARE_ROUND_NOFILL:

		case SID_DRAW_ELLIPSE:
		case SID_DRAW_CIRCLE:
		case SID_DRAW_PIE:
		case SID_DRAW_CIRCLEPIE:
		case SID_DRAW_ELLIPSECUT:
		case SID_DRAW_CIRCLECUT:
		case SID_DRAW_ARC:
		case SID_DRAW_CIRCLEARC:
		case SID_DRAW_ELLIPSE_NOFILL:
		case SID_DRAW_CIRCLE_NOFILL:
		case SID_DRAW_PIE_NOFILL:
		case SID_DRAW_CIRCLEPIE_NOFILL:
		case SID_DRAW_ELLIPSECUT_NOFILL:
		case SID_DRAW_CIRCLECUT_NOFILL:

        case SID_DRAW_BEZIER_NOFILL:
		case SID_DRAW_POLYGON_NOFILL:
		case SID_DRAW_XPOLYGON_NOFILL:
        case SID_DRAW_BEZIER_FILL:
		case SID_DRAW_POLYGON:
		case SID_DRAW_XPOLYGON:
        case SID_DRAW_FREELINE:
        case SID_DRAW_FREELINE_NOFILL:

		case SID_DRAW_LINE:
		case SID_DRAW_XLINE:
		case SID_DRAW_MEASURELINE:
		case SID_LINE_ARROW_START:
		case SID_LINE_ARROW_END:
		case SID_LINE_ARROWS:
		case SID_LINE_ARROW_CIRCLE:
		case SID_LINE_CIRCLE_ARROW:
		case SID_LINE_ARROW_SQUARE:
		case SID_LINE_SQUARE_ARROW:

		case SID_3D_CUBE:
		case SID_3D_SPHERE:
		case SID_3D_CYLINDER:
		case SID_3D_CONE:
		case SID_3D_PYRAMID:
		case SID_3D_TORUS:
		case SID_3D_SHELL:
		case SID_3D_HALF_SPHERE:

        case SID_TOOL_CONNECTOR:
        case SID_CONNECTOR_ARROW_START:
        case SID_CONNECTOR_ARROW_END:
        case SID_CONNECTOR_ARROWS:
        case SID_CONNECTOR_CIRCLE_START:
        case SID_CONNECTOR_CIRCLE_END:
        case SID_CONNECTOR_CIRCLES:
        case SID_CONNECTOR_LINE:
        case SID_CONNECTOR_LINE_ARROW_START:
        case SID_CONNECTOR_LINE_ARROW_END:
        case SID_CONNECTOR_LINE_ARROWS:
        case SID_CONNECTOR_LINE_CIRCLE_START:
        case SID_CONNECTOR_LINE_CIRCLE_END:
        case SID_CONNECTOR_LINE_CIRCLES:
        case SID_CONNECTOR_CURVE:
        case SID_CONNECTOR_CURVE_ARROW_START:
        case SID_CONNECTOR_CURVE_ARROW_END:
        case SID_CONNECTOR_CURVE_ARROWS:
        case SID_CONNECTOR_CURVE_CIRCLE_START:
        case SID_CONNECTOR_CURVE_CIRCLE_END:
        case SID_CONNECTOR_CURVE_CIRCLES:
        case SID_CONNECTOR_LINES:
        case SID_CONNECTOR_LINES_ARROW_START:
        case SID_CONNECTOR_LINES_ARROW_END:
        case SID_CONNECTOR_LINES_ARROWS:
        case SID_CONNECTOR_LINES_CIRCLE_START:
        case SID_CONNECTOR_LINES_CIRCLE_END:
        case SID_CONNECTOR_LINES_CIRCLES:



		//case SID_ZOOM_OUT:
			return( sal_True );
	}
	return( sal_False );
}
