/**************************************************************
 * 
 * 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_MARKTREE_HXX_
#include "marktree.hxx"
#endif
#ifndef _DBU_CONTROL_HRC_
#include "dbu_control.hrc"
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif

//.........................................................................
namespace dbaui
{
	using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
//.........................................................................
#define SPACEBETWEENENTRIES		4
//========================================================================
//= OMarkableTreeListBox
//========================================================================
DBG_NAME(OMarkableTreeListBox)
//------------------------------------------------------------------------
OMarkableTreeListBox::OMarkableTreeListBox( Window* pParent, const Reference< XMultiServiceFactory >& _rxORB, WinBits nWinStyle ) 
	: DBTreeListBox(pParent,_rxORB,nWinStyle)
{
    DBG_CTOR(OMarkableTreeListBox,NULL);

	InitButtonData();
}
//------------------------------------------------------------------------
OMarkableTreeListBox::OMarkableTreeListBox( Window* pParent, const Reference< XMultiServiceFactory >& _rxORB, const ResId& rResId) 
	: DBTreeListBox(pParent,_rxORB,rResId)
{
    DBG_CTOR(OMarkableTreeListBox,NULL);

	InitButtonData();
}
//------------------------------------------------------------------------
OMarkableTreeListBox::~OMarkableTreeListBox()
{
	delete m_pCheckButton;

    DBG_DTOR(OMarkableTreeListBox,NULL);
}
//------------------------------------------------------------------------
void OMarkableTreeListBox::Paint(const Rectangle& _rRect)
{
	if (!IsEnabled())
	{
		Font aOldFont = GetFont();
		Font aNewFont(aOldFont);

		StyleSettings aSystemStyle = Application::GetSettings().GetStyleSettings();
		aNewFont.SetColor(aSystemStyle.GetDisableColor());

		SetFont(aNewFont);
		DBTreeListBox::Paint(_rRect);
		SetFont(aOldFont);
	}
	else
		DBTreeListBox::Paint(_rRect);
}
//------------------------------------------------------------------------
void OMarkableTreeListBox::InitButtonData()
{
	m_pCheckButton = new SvLBoxButtonData( this );
	EnableCheckButton( m_pCheckButton );
}
//------------------------------------------------------------------------
void OMarkableTreeListBox::KeyInput( const KeyEvent& rKEvt )
{
	// nur wenn space
	if (rKEvt.GetKeyCode().GetCode() == KEY_SPACE && !rKEvt.GetKeyCode().IsShift() && !rKEvt.GetKeyCode().IsMod1())
	{
		SvLBoxEntry* pCurrentHandlerEntry = GetHdlEntry();
		if(pCurrentHandlerEntry)
		{
			SvButtonState eState = GetCheckButtonState( pCurrentHandlerEntry);
			if(eState == SV_BUTTON_CHECKED)
				SetCheckButtonState( pCurrentHandlerEntry, SV_BUTTON_UNCHECKED);
			else
				SetCheckButtonState( pCurrentHandlerEntry, SV_BUTTON_CHECKED);

			CheckButtonHdl();
		}
		else
			DBTreeListBox::KeyInput(rKEvt);
	}
	else
		DBTreeListBox::KeyInput(rKEvt);

}
//------------------------------------------------------------------------
SvButtonState OMarkableTreeListBox::implDetermineState(SvLBoxEntry* _pEntry)
{
	SvButtonState eState = GetCheckButtonState(_pEntry);
	if (!GetModel()->HasChilds(_pEntry))
		// nothing to do in this bottom-up routine if there are no children ...
		return eState;
#ifdef DBG_UTIL
	String sEntryText  =GetEntryText(_pEntry);
#endif

	// loop through the children and check their states
	sal_uInt16 nCheckedChildren = 0;
	sal_uInt16 nChildrenOverall = 0;

	SvLBoxEntry* pChildLoop = GetModel()->FirstChild(_pEntry);
	while (pChildLoop)
	{
#ifdef DBG_UTIL
		String sChildText  =GetEntryText(pChildLoop);
#endif
		SvButtonState eChildState = implDetermineState(pChildLoop);
		if (SV_BUTTON_TRISTATE == eChildState)
			break;

		if (SV_BUTTON_CHECKED == eChildState)
			++nCheckedChildren;
		++nChildrenOverall;

		pChildLoop = GetModel()->NextSibling(pChildLoop);
	}

	if (pChildLoop)
	{
		// we did not finish the loop because at least one of the children is in tristate
		eState = SV_BUTTON_TRISTATE;

		// but this means that we did not finish all the siblings of pChildLoop, so their checking may be
		// incorrect at the moment
		// -> correct this
		// 88485 - 20.06.2001 - frank.schoenheit@sun.com
		while (pChildLoop)
		{
			implDetermineState(pChildLoop);
			pChildLoop = GetModel()->NextSibling(pChildLoop);
		}
	}
	else
		// none if the children is in tristate
		if (nCheckedChildren)
			// we have at least one chil checked
			if (nCheckedChildren != nChildrenOverall)
				// not all children are checked
				eState = SV_BUTTON_TRISTATE;
			else
				// all children are checked
				eState = SV_BUTTON_CHECKED;
		else
			// no children are checked
			eState = SV_BUTTON_UNCHECKED;

	// finally set the entry to the state we just determined
	SetCheckButtonState(_pEntry, eState);

	// outta here
	return eState;
}

//------------------------------------------------------------------------
void OMarkableTreeListBox::CheckButtons()
{
	SvLBoxEntry* pEntry = GetModel()->First();
	while (pEntry)
	{
		implDetermineState(pEntry);
		pEntry = GetModel()->NextSibling(pEntry);
	}
}
//------------------------------------------------------------------------
void OMarkableTreeListBox::CheckButtonHdl()
{
	checkedButton_noBroadcast(GetHdlEntry());
	if (m_aCheckButtonHandler.IsSet())
		m_aCheckButtonHandler.Call(this);
}

//------------------------------------------------------------------------
void OMarkableTreeListBox::checkedButton_noBroadcast(SvLBoxEntry* _pEntry)
{
	SvButtonState eState = GetCheckButtonState( _pEntry);
	if (GetModel()->HasChilds(_pEntry))	// Falls Kinder, dann diese auch checken
	{
		SvLBoxEntry* pChildEntry = GetModel()->Next(_pEntry);
		SvLBoxEntry* pSiblingEntry = GetModel()->NextSibling(_pEntry);
		while(pChildEntry && pChildEntry != pSiblingEntry)
		{
			SetCheckButtonState(pChildEntry, eState);
			pChildEntry = GetModel()->Next(pChildEntry);
		}
	}

	SvLBoxEntry* pEntry = IsSelected(_pEntry) ? FirstSelected() : NULL;
	while(pEntry)
	{
		SetCheckButtonState(pEntry,eState);
		if(GetModel()->HasChilds(pEntry))	// Falls Kinder, dann diese auch checken
		{
			SvLBoxEntry* pChildEntry = GetModel()->Next(pEntry);
			SvLBoxEntry* pSiblingEntry = GetModel()->NextSibling(pEntry);
			while(pChildEntry && pChildEntry != pSiblingEntry)
			{
				SetCheckButtonState(pChildEntry,eState);
				pChildEntry = GetModel()->Next(pChildEntry);
			}
		}
		pEntry = NextSelected(pEntry);
	}
	CheckButtons();
}

//------------------------------------------------------------------------
//.........................................................................
}	// namespace dbaui
//.........................................................................

