/**************************************************************
 *
 * 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 <sal/config.h>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/drawing/XSelectionFunction.hpp>
#include <com/sun/star/awt/KeyModifier.hpp>
#include <com/sun/star/lang/XInitialization.hpp>

#include <cppuhelper/compbase2.hxx>
#include <cppuhelper/basemutex.hxx>

#include <vcl/svapp.hxx>

#include <svx/svdotable.hxx>
#include <svx/sdr/overlay/overlayobjectcell.hxx>
#include <svx/sdr/overlay/overlaymanager.hxx>
#include <svx/svxids.hrc>
#include <editeng/outlobj.hxx>
#include <svx/svdoutl.hxx>
#include <svx/svdpagv.hxx>
#include <svx/svdetc.hxx>
#include <editeng/editstat.hxx>
#include <editeng/unolingu.hxx>
#include <svx/sdrpagewindow.hxx>
#include <svx/sdr/table/tabledesign.hxx>
#include <svx/svxdlg.hxx>
#include <vcl/msgbox.hxx>

#include <svl/itempool.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/request.hxx>
#include <sfx2/sidebar/Sidebar.hxx>
#include <svl/style.hxx>

#include "framework/FrameworkHelper.hxx"
#include "app.hrc"
#include "glob.hrc"
#include "DrawViewShell.hxx"
#include "drawdoc.hxx"
#include "DrawDocShell.hxx"
#include "Window.hxx"
#include "drawview.hxx"
#include "sdresid.hxx"
#include "undo/undoobjects.hxx"

using ::rtl::OUString;
using namespace ::sd;
using namespace ::sdr::table;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::drawing;
using namespace ::com::sun::star::linguistic2;

namespace css = ::com::sun::star;

namespace sd
{
extern void showTableDesignDialog( ::Window*, ViewShellBase& );

static void apply_table_style( SdrTableObj* pObj, SdrModel* pModel, const OUString& sTableStyle )
{
	if( pModel && pObj )
	{
		Reference< XNameAccess > xPool( dynamic_cast< XNameAccess* >( pModel->GetStyleSheetPool() ) );
		if( xPool.is() ) try
		{
			const OUString sFamilyName( RTL_CONSTASCII_USTRINGPARAM( "table" ) );
			Reference< XNameContainer > xTableFamily( xPool->getByName( sFamilyName ), UNO_QUERY_THROW );
			OUString aStdName( RTL_CONSTASCII_USTRINGPARAM("default") );
			if( sTableStyle.getLength() )
				aStdName = sTableStyle;
			Reference< XIndexAccess > xStyle( xTableFamily->getByName( aStdName ), UNO_QUERY_THROW );
			pObj->setTableStyle( xStyle );
		}
		catch( Exception& )
		{
			DBG_ERROR("sd::apply_default_table_style(), exception caught!");
		}
	}
}

void DrawViewShell::FuTable(SfxRequest& rReq)
{
	switch( rReq.GetSlot() )
	{
	case SID_INSERT_TABLE:
	{
		sal_Int32 nColumns = 0;
		sal_Int32 nRows = 0;
		OUString sTableStyle;

		SFX_REQUEST_ARG( rReq, pCols, SfxUInt16Item, SID_ATTR_TABLE_COLUMN, sal_False );
		SFX_REQUEST_ARG( rReq, pRows, SfxUInt16Item, SID_ATTR_TABLE_ROW, sal_False );
		SFX_REQUEST_ARG( rReq, pStyle, SfxStringItem, SID_TABLE_STYLE, sal_False );

		if( pCols )
			nColumns = pCols->GetValue();

		if( pRows )
			nRows = pRows->GetValue();

		if( pStyle )
			sTableStyle = pStyle->GetValue();

		if( (nColumns == 0) || (nRows == 0) )
		{
			SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
			::std::auto_ptr<SvxAbstractNewTableDialog> pDlg( pFact ? pFact->CreateSvxNewTableDialog( NULL ) : 0);

			if( !pDlg.get() || (pDlg->Execute() != RET_OK) )
				break;

			nColumns = pDlg->getColumns();
			nRows = pDlg->getRows();
		}

		Rectangle aRect;

		SdrObject* pPickObj = mpView->GetEmptyPresentationObject( PRESOBJ_TABLE );
		if( pPickObj )
		{
			aRect = pPickObj->GetLogicRect();
			aRect.setHeight( 200 );
		}
		else
		{
			Size aSize( 14100, 200 );

			Point aPos;
			Rectangle aWinRect(aPos, GetActiveWindow()->GetOutputSizePixel() );
			aPos = aWinRect.Center();
			aPos = GetActiveWindow()->PixelToLogic(aPos);
			aPos.X() -= aSize.Width() / 2;
			aPos.Y() -= aSize.Height() / 2;
			aRect = Rectangle(aPos, aSize);
		}

		::sdr::table::SdrTableObj* pObj = new ::sdr::table::SdrTableObj( GetDoc(), aRect, nColumns, nRows );
		pObj->NbcSetStyleSheet( GetDoc()->GetDefaultStyleSheet(), sal_True );
		apply_table_style( pObj, GetDoc(), sTableStyle );
		SdrPageView* pPV = mpView->GetSdrPageView();

        // #123359# if an object is to be replaced/manipulated it may be that it is in text edit mode,
        // so to be on the safe side call SdrEndTextEdit here
        SdrTextObj* pCheckForTextEdit = dynamic_cast< SdrTextObj* >(pPickObj);

        if(pCheckForTextEdit && pCheckForTextEdit->IsInEditMode())
        {
            mpView->SdrEndTextEdit();
        }

		// if we have a pick obj we need to make this new ole a pres obj replacing the current pick obj
		if( pPickObj )
		{
			SdPage* pPage = static_cast< SdPage* >(pPickObj->GetPage());
			if(pPage && pPage->IsPresObj(pPickObj))
			{
				pObj->SetUserCall( pPickObj->GetUserCall() );
				pPage->InsertPresObj( pObj, PRESOBJ_TABLE );
			}
		}

		GetParentWindow()->GrabFocus();
		if( pPickObj )
			mpView->ReplaceObjectAtView(pPickObj, *pPV, pObj, sal_True );
		else
			mpView->InsertObjectAtView(pObj, *pPV, SDRINSERT_SETDEFLAYER);

		Invalidate(SID_DRAWTBX_INSERT);
		rReq.Ignore();
SfxViewShell* pViewShell = GetViewShell();
        OSL_ASSERT (pViewShell!=NULL);
		SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
		rBindings.Invalidate( SID_INSERT_TABLE, sal_True, sal_False );
		break;
	}
	case SID_TABLEDESIGN:
	{
		if( GetDoc() && (GetDoc()->GetDocumentType() == DOCUMENT_TYPE_DRAW) )
		{
			// in draw open a modal dialog since we have no tool pane yet
			showTableDesignDialog( GetActiveWindow(), GetViewShellBase() );
		}
		else
		{
			// Make the table design panel visible (expand it) in the
	        // sidebar.
            ::sfx2::sidebar::Sidebar::ShowPanel(
                ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ImpressTableDesignPanel")),
                GetViewFrame()->GetFrame().GetFrameInterface());
		}

		Cancel();
		rReq.Done ();
	}
	default:
		break;
	}
}

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

void DrawViewShell::GetTableMenuState( SfxItemSet &rSet )
{
	bool bIsUIActive = GetDocSh()->IsUIActive();
	if( bIsUIActive )
	{
		rSet.DisableItem( SID_INSERT_TABLE );
	}
	else
	{
		String aActiveLayer = mpDrawView->GetActiveLayer();
		SdrPageView* pPV = mpDrawView->GetSdrPageView();

		if( bIsUIActive ||
			( aActiveLayer.Len() != 0 && pPV && ( pPV->IsLayerLocked(aActiveLayer) ||
			!pPV->IsLayerVisible(aActiveLayer) ) ) ||
			SD_MOD()->GetWaterCan() )
		{
			rSet.DisableItem( SID_INSERT_TABLE );
		}
	}
}

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

void CreateTableFromRTF( SvStream& rStream, SdDrawDocument* pModel )
{
	rStream.Seek( 0 );

	if( pModel )
	{
		SdrPage* pPage = pModel->GetPage(0);
		if( pPage )
		{
			Size aSize( 200, 200 );
			Point aPos;
			Rectangle aRect (aPos, aSize);
			::sdr::table::SdrTableObj* pObj = new ::sdr::table::SdrTableObj( pModel, aRect, 1, 1 );
			pObj->NbcSetStyleSheet( pModel->GetDefaultStyleSheet(), sal_True );
			OUString sTableStyle;
			apply_table_style( pObj, pModel, sTableStyle );

			pPage->NbcInsertObject( pObj );

			sdr::table::SdrTableObj::ImportAsRTF( rStream, *pObj );
		}
	}
}

}
