/**************************************************************
 *
 * 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/msg.hxx>
#include <sfx2/app.hxx>
#include <sfx2/sfxsids.hrc>
#include <sfx2/request.hxx>
#include <sfx2/objface.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/msgpool.hxx>
#include <sfx2/sidebar/EnumContext.hxx>
#include <svl/whiter.hxx>
#include <svl/itempool.hxx>
#include <svx/svdomedia.hxx>
#include <svx/sdr/contact/viewcontactofsdrmediaobj.hxx>
#include <svx/svxdlg.hxx>
#include <svx/dialogs.hrc>
#include <svx/svxids.hrc>

#include "app.hrc"
#include "res_bmp.hrc"
#include "glob.hrc"
#include "strings.hrc"
#include "DrawDocShell.hxx"
#include "ViewShell.hxx"
#include "Window.hxx"
#include "drawview.hxx"
#include "sdresid.hxx"
#include "drawdoc.hxx"
#include "DrawViewShell.hxx"

#include "tableobjectbar.hxx"

using namespace sd;
using namespace sd::ui::table;

#define TableObjectBar
#include "sdslots.hxx"


namespace sd { namespace ui { namespace table {

/** creates a table object bar for the given ViewShell */
SfxShell* CreateTableObjectBar( ViewShell& rShell, ::sd::View* pView )
{
	return new TableObjectBar( &rShell, pView );
}


/** registers the interfaces from the table ui */
void RegisterInterfaces(SfxModule* pMod)
{
	TableObjectBar::RegisterInterface(pMod);
}

// ------------------
// - TableObjectBar -
// ------------------

TYPEINIT1( TableObjectBar, SfxShell );

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

SFX_IMPL_INTERFACE( TableObjectBar, SfxShell, SdResId( STR_TABLEOBJECTBARSHELL ) )
{
}

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

TableObjectBar::TableObjectBar( ViewShell* pSdViewShell, ::sd::View* pSdView )
:	SfxShell( pSdViewShell->GetViewShell() )
,	mpView( pSdView )
,	mpViewSh( pSdViewShell )
{
	DrawDocShell* pDocShell = mpViewSh->GetDocSh();
	if( pDocShell )
	{
		SetPool( &pDocShell->GetPool() );
		SetUndoManager( pDocShell->GetUndoManager() );
	}
	SetRepeatTarget( mpView );
	SetHelpId( SD_IF_SDDRAWTABLEOBJECTBAR );
	SetName( String( SdResId( RID_DRAW_TABLE_TOOLBOX ) ) );
    SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Table));
}

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

TableObjectBar::~TableObjectBar()
{
	SetRepeatTarget( NULL );
}

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

void TableObjectBar::GetState( SfxItemSet& rSet )
{
	bool bReadOnly = false;

	if( bReadOnly )
	{
        rSet.DisableItem (SID_INSERT_TABLE );
	}

	if( mpView )
	{
		rtl::Reference< sdr::SelectionController > xController( mpView->getSelectionController() );
		if( xController.is() )
		{
			xController->GetState( rSet );
		}
	}
}

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

void TableObjectBar::GetAttrState( SfxItemSet& rSet )
{
	DrawViewShell* pDrawViewShell = dynamic_cast< DrawViewShell* >( mpViewSh );
	if( pDrawViewShell )
		pDrawViewShell->GetAttrState( rSet );
}

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

void TableObjectBar::Execute( SfxRequest& rReq )
{
	if( mpView )
	{
		SdrView* pView = mpView;
		SfxBindings* pBindings = &mpViewSh->GetViewFrame()->GetBindings();

		rtl::Reference< sdr::SelectionController > xController( mpView->getSelectionController() );
		sal_uLong nSlotId = rReq.GetSlot();
		if( xController.is() )
		{
		    switch( nSlotId )
		    {
		    case SID_TABLE_INSERT_ROW_DLG:
		    case SID_TABLE_INSERT_COL_DLG:
		    {
                SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
	            ::std::auto_ptr<SvxAbstractInsRowColDlg> pDlg( pFact ? pFact->CreateSvxInsRowColDlg( mpView->GetViewShell()->GetParentWindow(), nSlotId == SID_TABLE_INSERT_COL_DLG, SD_MOD()->GetSlotPool()->GetSlot(nSlotId)->GetCommand()) : 0);

		        if( pDlg.get() && (pDlg->Execute() == 1) )
		        {
		            if( nSlotId == SID_TABLE_INSERT_ROW_DLG )
		                nSlotId = SID_TABLE_INSERT_ROW;
		            else
		                nSlotId = SID_TABLE_INSERT_COL;

		            rReq.AppendItem( SfxInt16Item( (sal_uInt16)nSlotId, (sal_uInt16)pDlg->getInsertCount() ) );
		            rReq.AppendItem( SfxBoolItem( SID_TABLE_PARAM_INSERT_AFTER, !pDlg->isInsertBefore() ) );

		             rReq.SetSlot( (sal_uInt16)nSlotId );
		        }
		    }
		    }

			xController->Execute( rReq );
		}

		// note: we may be deleted at this point, no more member access possible

		switch( rReq.GetSlot() )
		{
		case SID_ATTR_BORDER:
		case SID_TABLE_MERGE_CELLS:
		case SID_TABLE_SPLIT_CELLS:
		case SID_OPTIMIZE_TABLE:
		case SID_TABLE_DELETE_ROW:
		case SID_TABLE_DELETE_COL:
		case SID_FORMAT_TABLE_DLG:
		case SID_TABLE_INSERT_ROW:
		case SID_TABLE_INSERT_COL:
		{
			pView->AdjustMarkHdl();
			pBindings->Invalidate( SID_TABLE_DELETE_ROW );
			pBindings->Invalidate( SID_TABLE_DELETE_COL );
			pBindings->Invalidate( SID_FRAME_LINESTYLE );
			pBindings->Invalidate( SID_FRAME_LINECOLOR );
			pBindings->Invalidate( SID_ATTR_BORDER );
			pBindings->Invalidate( SID_ATTR_FILL_STYLE );
			pBindings->Invalidate( SID_ATTR_FILL_TRANSPARENCE );
			pBindings->Invalidate( SID_ATTR_FILL_FLOATTRANSPARENCE );
			pBindings->Invalidate( SID_TABLE_MERGE_CELLS );
			pBindings->Invalidate( SID_TABLE_SPLIT_CELLS );
			pBindings->Invalidate( SID_OPTIMIZE_TABLE );
			pBindings->Invalidate( SID_TABLE_VERT_BOTTOM );
			pBindings->Invalidate( SID_TABLE_VERT_CENTER );
			pBindings->Invalidate( SID_TABLE_VERT_NONE );
			break;
		}
		case SID_TABLE_VERT_BOTTOM:
		case SID_TABLE_VERT_CENTER:
		case SID_TABLE_VERT_NONE:
		{
			pBindings->Invalidate( SID_TABLE_VERT_BOTTOM );
			pBindings->Invalidate( SID_TABLE_VERT_CENTER );
			pBindings->Invalidate( SID_TABLE_VERT_NONE );
			break;
		}
		}

		pBindings->Invalidate( SID_UNDO );
		pBindings->Invalidate( SID_REDO );
	}
}

} } }
