/**************************************************************
 * 
 * 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_dbui.hxx"
#ifndef DBAUI_TABLEDESIGNVIEW_HXX
#include "TableDesignView.hxx"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef DBUI_TABLECONTROLLER_HXX
#include "TableController.hxx"
#endif
#ifndef _DBA_DBACCESS_HELPID_HRC_
#include "dbaccess_helpid.hrc"
#endif				  
#ifndef DBAUI_FIELDDESCRIPTIONS_HXX
#include "FieldDescriptions.hxx"
#endif
#ifndef DBAUI_TABLEEDITORCONTROL_HXX
#include "TEditControl.hxx"
#endif
#ifndef DBAUI_TABLEFIELDDESCRIPTION_HXX
#include "TableFieldDescWin.hxx"
#endif
#ifndef DBAUI_TABLEROW_HXX
#include "TableRow.hxx"
#endif
#ifndef _UTL_CONFIGMGR_HXX_
#include <unotools/configmgr.hxx>
#endif
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#ifndef _COM_SUN_STAR_DATATRANSFER_CLIPBOARD_XCLIPBOARD_HPP_
#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
#endif
#ifndef INCLUDED_SVTOOLS_SYSLOCALE_HXX
#include <unotools/syslocale.hxx>
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif


using namespace ::dbaui;
using namespace ::utl;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::datatransfer::clipboard;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;

//==================================================================
// class OTableBorderWindow
DBG_NAME(OTableBorderWindow)
//==================================================================
OTableBorderWindow::OTableBorderWindow(Window* pParent) : Window(pParent,WB_BORDER)
	,m_aHorzSplitter( this )
{
    DBG_CTOR(OTableBorderWindow,NULL);

	ImplInitSettings( sal_True, sal_True, sal_True );
	//////////////////////////////////////////////////////////////////////
	// Childs erzeugen
	m_pEditorCtrl	= new OTableEditorCtrl( this);
	m_pFieldDescWin = new OTableFieldDescWin( this );

	m_pFieldDescWin->SetHelpId(HID_TAB_DESIGN_DESCWIN);

	// set depending windows and controls
	m_pEditorCtrl->SetDescrWin(m_pFieldDescWin);

	//////////////////////////////////////////////////////////////////////
	// Splitter einrichten
	m_aHorzSplitter.SetSplitHdl( LINK(this, OTableBorderWindow, SplitHdl) );
	m_aHorzSplitter.Show();
}
// -----------------------------------------------------------------------------
OTableBorderWindow::~OTableBorderWindow()
{
	//////////////////////////////////////////////////////////////////////
	// Childs zerstoeren
	//	::dbaui::notifySystemWindow(this,m_pFieldDescWin,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
	m_pEditorCtrl->Hide();
	m_pFieldDescWin->Hide();

	{
		::std::auto_ptr<Window> aTemp(m_pEditorCtrl);
		m_pEditorCtrl = NULL;
	}
	{
		::std::auto_ptr<Window> aTemp(m_pFieldDescWin);
		m_pFieldDescWin = NULL;
	}

    DBG_DTOR(OTableBorderWindow,NULL);
}
// -----------------------------------------------------------------------------
void OTableBorderWindow::Resize()
{
	const long nSplitterHeight(3);

	//////////////////////////////////////////////////////////////////////
	// Abmessungen parent window
	Size aOutputSize( GetOutputSize() );
	long nOutputWidth	= aOutputSize.Width();
	long nOutputHeight	= aOutputSize.Height();
	long nSplitPos		= m_aHorzSplitter.GetSplitPosPixel();

	//////////////////////////////////////////////////////////////////////
	// Verschiebebereich Splitter mittleres Drittel des Outputs
	long nDragPosY = nOutputHeight/3;
	long nDragSizeHeight = nOutputHeight/3;
	m_aHorzSplitter.SetDragRectPixel( Rectangle(Point(0,nDragPosY), Size(nOutputWidth,nDragSizeHeight) ), this );
	if( (nSplitPos < nDragPosY) || (nSplitPos > (nDragPosY+nDragSizeHeight)) )
		nSplitPos = nDragPosY+nDragSizeHeight-5;

	//////////////////////////////////////////////////////////////////////
	// Splitter setzen
	m_aHorzSplitter.SetPosSizePixel( Point( 0, nSplitPos ), Size(nOutputWidth, nSplitterHeight));
	m_aHorzSplitter.SetSplitPosPixel( nSplitPos );

	//////////////////////////////////////////////////////////////////////
	// Fenster setzen
	m_pEditorCtrl->SetPosSizePixel( Point(0, 0), Size(nOutputWidth , nSplitPos) );

	m_pFieldDescWin->SetPosSizePixel(	Point(0, nSplitPos+nSplitterHeight),
						Size(nOutputWidth, nOutputHeight-nSplitPos-nSplitterHeight) );
}
//------------------------------------------------------------------------------
IMPL_LINK( OTableBorderWindow, SplitHdl, Splitter*, pSplit )
{
	if(pSplit == &m_aHorzSplitter)
	{
		m_aHorzSplitter.SetPosPixel( Point( m_aHorzSplitter.GetPosPixel().X(),m_aHorzSplitter.GetSplitPosPixel() ) );
		Resize();
	}
	return 0;
}
// -----------------------------------------------------------------------------
void OTableBorderWindow::ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground )
{
	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();

	if ( bFont )
	{
		Font aFont = rStyleSettings.GetAppFont();
		if ( IsControlFont() )
			aFont.Merge( GetControlFont() );
		SetPointFont( aFont );
//		Set/*Zoomed*/PointFont( aFont );
	}

	if ( bFont || bForeground )
	{
		Color aTextColor = rStyleSettings.GetButtonTextColor();
		if ( IsControlForeground() )
			aTextColor = GetControlForeground();
		SetTextColor( aTextColor );
	}

	if ( bBackground )
	{
		if( IsControlBackground() )
			SetBackground( GetControlBackground() );
		else
			SetBackground( rStyleSettings.GetFaceColor() );
	}
}
// -----------------------------------------------------------------------
void OTableBorderWindow::DataChanged( const DataChangedEvent& rDCEvt )
{
	Window::DataChanged( rDCEvt );

	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
		 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
	{
		ImplInitSettings( sal_True, sal_True, sal_True );
		Invalidate();
	}
}
// -----------------------------------------------------------------------------
void OTableBorderWindow::GetFocus()
{
	Window::GetFocus();

	// forward the focus to the current cell of the editor control
	if (m_pEditorCtrl)
		m_pEditorCtrl->GrabFocus();
}

//==================================================================
// class OTableDesignView
//==================================================================
DBG_NAME(OTableDesignView);
//------------------------------------------------------------------------------
OTableDesignView::OTableDesignView( Window* pParent,
									const Reference< XMultiServiceFactory >& _rxOrb,
									OTableController& _rController
								   ) :
	ODataView( pParent, _rController,_rxOrb )
	,m_rController( _rController )
	,m_eChildFocus(NONE)
{
	DBG_CTOR(OTableDesignView,NULL);

	try
	{
		m_aLocale = SvtSysLocale().GetLocaleData().getLocale();
	}
	catch(Exception&)
	{
	}

	m_pWin = new OTableBorderWindow(this);
	m_pWin->Show();	
}

//------------------------------------------------------------------------------
OTableDesignView::~OTableDesignView()
{
	DBG_DTOR(OTableDesignView,NULL);
	m_pWin->Hide();

	{
		::std::auto_ptr<Window> aTemp(m_pWin);
		m_pWin = NULL;
	}
}

// -----------------------------------------------------------------------------
void OTableDesignView::initialize()
{
	GetEditorCtrl()->Init();
	GetDescWin()->Init();
	// first call after the editctrl has been set
	
	GetEditorCtrl()->Show();
	GetDescWin()->Show();
	
	GetEditorCtrl()->DisplayData(0);
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
void OTableDesignView::resizeDocumentView(Rectangle& _rPlayground)
{
	m_pWin->SetPosSizePixel( _rPlayground.TopLeft(), _rPlayground.GetSize() );

	// just for completeness: there is no space left, we occupied it all ...
	_rPlayground.SetPos( _rPlayground.BottomRight() );
	_rPlayground.SetSize( Size( 0, 0 ) );
}

//------------------------------------------------------------------------------
IMPL_LINK( OTableDesignView, SwitchHdl, Accelerator*, /*pAcc*/ )
{
	if( getController().isReadOnly() )
		return 0;

	if( GetDescWin()->HasChildPathFocus() )
	{
		GetDescWin()->LoseFocus();
		GetEditorCtrl()->GrabFocus();
	}
	else
	{
		 ::boost::shared_ptr<OTableRow>  pRow = (*GetEditorCtrl()->GetRowList())[GetEditorCtrl()->GetCurRow()];
		OFieldDescription* pFieldDescr = pRow ? pRow->GetActFieldDescr() : NULL;
		if ( pFieldDescr )
			GetDescWin()->GrabFocus();
		else
			GetEditorCtrl()->GrabFocus();
	}

	return 0;
}
//------------------------------------------------------------------------------
long OTableDesignView::PreNotify( NotifyEvent& rNEvt )
{
	sal_Bool bHandled = sal_False;
	switch(rNEvt.GetType())
	{
		case EVENT_GETFOCUS:
			if( GetDescWin() && GetDescWin()->HasChildPathFocus() )
				m_eChildFocus = DESCRIPTION;
			else if ( GetEditorCtrl() && GetEditorCtrl()->HasChildPathFocus() )
				m_eChildFocus = EDITOR;
			else
				m_eChildFocus = NONE;
			break;
	}
	
	return bHandled ? 1L : ODataView::PreNotify(rNEvt);
}
// -----------------------------------------------------------------------------
IClipboardTest* OTableDesignView::getActiveChild() const
{
	IClipboardTest* pTest = NULL;
	switch(m_eChildFocus)
	{
		case DESCRIPTION:
			pTest = GetDescWin();
			break;
		case EDITOR:		
			pTest = GetEditorCtrl();
			break;
        case NONE:
            break;
	}
	return pTest;
}
// -----------------------------------------------------------------------------
sal_Bool OTableDesignView::isCopyAllowed()
{
	IClipboardTest* pTest = getActiveChild();
	return pTest && pTest->isCopyAllowed();
}
// -----------------------------------------------------------------------------
sal_Bool OTableDesignView::isCutAllowed()
{
	IClipboardTest* pTest = getActiveChild();
	return pTest && pTest->isCutAllowed();
}
// -----------------------------------------------------------------------------
sal_Bool OTableDesignView::isPasteAllowed()
{
	IClipboardTest* pTest = getActiveChild();
	return pTest && pTest->isPasteAllowed();
}
// -----------------------------------------------------------------------------
void OTableDesignView::copy()
{
	IClipboardTest* pTest = getActiveChild();
	if ( pTest ) 
		pTest->copy();
}
// -----------------------------------------------------------------------------
void OTableDesignView::cut()
{
	IClipboardTest* pTest = getActiveChild();
	if ( pTest ) 
		pTest->cut();
}
// -----------------------------------------------------------------------------
void OTableDesignView::paste()
{
	IClipboardTest* pTest = getActiveChild();
	if ( pTest ) 
		pTest->paste();
}
// -----------------------------------------------------------------------------
// set the view readonly or not
void OTableDesignView::setReadOnly(sal_Bool _bReadOnly)
{
	GetDescWin()->SetReadOnly(_bReadOnly);
	GetEditorCtrl()->SetReadOnly(_bReadOnly);
}
// -----------------------------------------------------------------------------
void OTableDesignView::reSync()
{
	GetEditorCtrl()->DeactivateCell();
	 ::boost::shared_ptr<OTableRow>  pRow = (*GetEditorCtrl()->GetRowList())[GetEditorCtrl()->GetCurRow()];
	OFieldDescription* pFieldDescr = pRow ? pRow->GetActFieldDescr() : NULL;
	if ( pFieldDescr )
		GetDescWin()->DisplayData(pFieldDescr);
}
// -----------------------------------------------------------------------------
void OTableDesignView::GetFocus()
{
	if ( GetEditorCtrl() )
		GetEditorCtrl()->GrabFocus();
}
// -----------------------------------------------------------------------------

