/**************************************************************
 *
 * 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_VERTSPLITVIEW_HXX
#include "VertSplitView.hxx"
#endif

#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif

#define SPLITTER_WIDTH	80

using namespace ::dbaui;

//==================================================================
// class OSplitterView
//==================================================================
DBG_NAME(OSplitterView)
OSplitterView::OSplitterView(Window* _pParent,sal_Bool _bVertical) : Window(_pParent,WB_DIALOGCONTROL) // ,WB_BORDER
	,m_pSplitter( NULL )
	,m_pLeft(NULL)
	,m_pRight(NULL)
	,m_bVertical(_bVertical)
{
	DBG_CTOR(OSplitterView,NULL);
	ImplInitSettings( sal_True, sal_True, sal_True );
}
// -----------------------------------------------------------------------------
OSplitterView::~OSplitterView()
{
	DBG_DTOR(OSplitterView,NULL);
	m_pRight = m_pLeft = NULL;
}
//------------------------------------------------------------------------------
IMPL_LINK( OSplitterView, SplitHdl, Splitter*, /*pSplit*/ )
{
	OSL_ENSURE(m_pSplitter, "Splitter is NULL!");
	if ( m_bVertical )
	{
		long nPosY = m_pSplitter->GetPosPixel().Y();
		m_pSplitter->SetPosPixel( Point( m_pSplitter->GetSplitPosPixel(), nPosY ) );
	}
	else
		m_pSplitter->SetPosPixel( Point( m_pSplitter->GetPosPixel().X(),m_pSplitter->GetSplitPosPixel() ) );

	Resize();
	return 0L;
}
// -----------------------------------------------------------------------------
void OSplitterView::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 OSplitterView::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 OSplitterView::GetFocus()
{
	Window::GetFocus();

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

// -------------------------------------------------------------------------
void OSplitterView::Resize()
{
	Window::Resize();
	OSL_ENSURE( m_pRight, "No init called!");

	Point	aSplitPos;
	Size	aSplitSize;
	Point	aPlaygroundPos( 0,0 );
	Size	aPlaygroundSize( GetOutputSizePixel() );

	if ( m_pLeft && m_pLeft->IsVisible() && m_pSplitter )
	{
		aSplitPos	= m_pSplitter->GetPosPixel();
		aSplitSize	= m_pSplitter->GetOutputSizePixel();
		if ( m_bVertical )
		{
			// calculate the splitter pos and size
			aSplitPos.Y() = aPlaygroundPos.Y();
			aSplitSize.Height() = aPlaygroundSize.Height();

			if( ( aSplitPos.X() + aSplitSize.Width() ) > ( aPlaygroundSize.Width() ))
				aSplitPos.X() = aPlaygroundSize.Width() - aSplitSize.Width();

			if( aSplitPos.X() <= aPlaygroundPos.X() )
				aSplitPos.X() = aPlaygroundPos.X() + sal_Int32(aPlaygroundSize.Width() * 0.3);

			// the tree pos and size
			Point	aTreeViewPos( aPlaygroundPos );
			Size	aTreeViewSize( aSplitPos.X(), aPlaygroundSize.Height() );

			// set the size of treelistbox
			m_pLeft->SetPosSizePixel( aTreeViewPos, aTreeViewSize );

			//set the size of the splitter
			m_pSplitter->SetPosSizePixel( aSplitPos, Size( aSplitSize.Width(), aPlaygroundSize.Height() ) );
			m_pSplitter->SetDragRectPixel( Rectangle(aPlaygroundPos,aPlaygroundSize) );
		}
		else
		{
			aSplitPos.X() = aPlaygroundPos.X();
			aSplitSize.Width() = aPlaygroundSize.Width();

			if( ( aSplitPos.Y() + aSplitSize.Height() ) > ( aPlaygroundSize.Height() ))
				aSplitPos.Y() = aPlaygroundSize.Height() - aSplitSize.Height();

			if( aSplitPos.Y() <= aPlaygroundPos.Y() )
				aSplitPos.Y() = aPlaygroundPos.Y() + sal_Int32(aPlaygroundSize.Height() * 0.3);

			// the tree pos and size
			Point	aTreeViewPos( aPlaygroundPos );
			Size	aTreeViewSize( aPlaygroundSize.Width() ,aSplitPos.Y());

			// set the size of treelistbox
			m_pLeft->SetPosSizePixel( aTreeViewPos, aTreeViewSize );

			//set the size of the splitter
			m_pSplitter->SetPosSizePixel( aSplitPos, Size( aPlaygroundSize.Width(), aSplitSize.Height() ) );
			m_pSplitter->SetDragRectPixel( Rectangle(aPlaygroundPos,aPlaygroundSize) );
		}
	}

	if ( m_pRight )
	{
		if ( m_bVertical )
			m_pRight->SetPosSizePixel( aSplitPos.X() + aSplitSize.Width(), aPlaygroundPos.Y(),
								   aPlaygroundSize.Width() - aSplitSize.Width() - aSplitPos.X(), aPlaygroundSize.Height());
		else
			m_pRight->SetPosSizePixel( aSplitPos.X(), aPlaygroundPos.Y() + aSplitPos.Y() + aSplitSize.Height(),
								   aPlaygroundSize.Width() , aPlaygroundSize.Height() - aSplitSize.Height() - aSplitPos.Y());
	}

}
// -----------------------------------------------------------------------------
void OSplitterView::set(Window* _pRight,Window* _pLeft)
{
	m_pLeft = _pLeft;
	m_pRight = _pRight;
}
// -----------------------------------------------------------------------------
void OSplitterView::setSplitter(Splitter* _pSplitter)
{
	m_pSplitter = _pSplitter;
	if ( m_pSplitter )
	{
		m_pSplitter->SetSplitPosPixel( LogicToPixel( Size( SPLITTER_WIDTH, 0 ), MAP_APPFONT ).Width() );
		m_pSplitter->SetSplitHdl( LINK(this, OSplitterView, SplitHdl) );
		m_pSplitter->Show();
		LINK( this, OSplitterView, SplitHdl ).Call(m_pSplitter);
	}
}
