| /************************************************************** | 
 |  *  | 
 |  * 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 | 
 | //......................................................................... | 
 |  |