/**************************************************************
 * 
 * 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_sw.hxx"

#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif



#include "cmdid.h"
#include <tools/list.hxx>
#include "swmodule.hxx"
#include "view.hxx"
#include "wrtsh.hxx"
#include "globals.hrc"
#include "helpid.h"


#include <sfx2/styfitem.hxx>

#include "uitool.hxx"
#include "ccoll.hxx"
#include "fmtcol.hxx"
#include "hintids.hxx"
#include "docsh.hxx"
#include "docstyle.hxx"
#include "hints.hxx"

#include "chrdlg.hrc"
#include "ccoll.hrc"
#include <vcl/svapp.hxx>

#include "swuiccoll.hxx"

static sal_uInt16 __FAR_DATA aPageRg[] = {
	FN_COND_COLL, FN_COND_COLL,
	0
};

// Achtung im Code wird dieses Array direkt (0, 1, ...) indiziert
static long nTabs[] =
	{	2, // Number of Tabs
		0, 100
	};

/****************************************************************************
Page: Ctor
****************************************************************************/


SwCondCollPage::SwCondCollPage(Window *pParent, const SfxItemSet &rSet)

	: SfxTabPage(pParent, SW_RES(TP_CONDCOLL), rSet),
    aConditionFL( this, SW_RES( FL_CONDITION )),
	aConditionCB( this, SW_RES( CB_CONDITION ) ),
	aContextFT  ( this, SW_RES( FT_CONTEXT 	) ),
	aUsedFT     ( this, SW_RES( FT_USED 		) ),
	aTbLinks( 	  this, SW_RES( TB_CONDCOLLS ) ),
	aStyleFT    ( this, SW_RES( FT_STYLE 	) ),
	aStyleLB    ( this, SW_RES( LB_STYLE 	) ),
	aFilterLB   ( this, SW_RES( LB_FILTER 	) ),
	aRemovePB   ( this, SW_RES( PB_REMOVE 	) ),
	aAssignPB   ( this, SW_RES( PB_ASSIGN 	) ),
	sNoTmpl		(		SW_RES( STR_NOTEMPL  ) ),
	aStrArr 	( 		SW_RES( STR_REGIONS  ) ),
	rSh(::GetActiveView()->GetWrtShell()),
    pCmds( SwCondCollItem::GetCmds() ),
	pFmt(0),

    bNewTemplate(sal_False)
{
	FreeResource();
	SetExchangeSupport();

	aRemovePB.SetAccessibleRelationMemberOf(&aConditionFL);
	aAssignPB.SetAccessibleRelationMemberOf(&aConditionFL);
	aTbLinks.SetAccessibleRelationLabeledBy(&aConditionCB);

	// Handler installieren
	aConditionCB.SetClickHdl(	LINK(this, SwCondCollPage, OnOffHdl));
	aTbLinks.SetDoubleClickHdl( LINK(this, SwCondCollPage, AssignRemoveHdl ));
	aStyleLB.SetDoubleClickHdl( LINK(this, SwCondCollPage, AssignRemoveHdl ));
	aRemovePB.SetClickHdl(		LINK(this, SwCondCollPage, AssignRemoveHdl ));
	aAssignPB.SetClickHdl(		LINK(this, SwCondCollPage, AssignRemoveHdl ));
	aTbLinks.SetSelectHdl(		LINK(this, SwCondCollPage, SelectHdl));
	aStyleLB.SetSelectHdl(		LINK(this, SwCondCollPage, SelectHdl));
	aFilterLB.SetSelectHdl(		LINK(this, SwCondCollPage, SelectHdl));

	aTbLinks.SetStyle(aTbLinks.GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN);
	aTbLinks.SetSelectionMode( SINGLE_SELECTION );
	aTbLinks.SetTabs( &nTabs[0], MAP_APPFONT );
	aTbLinks.Resize();	// OS: Hack fuer richtige Selektion
	aTbLinks.SetSpaceBetweenEntries( 0 );
	aTbLinks.SetHelpId(HID_COND_COLL_TABLIST);

	SfxStyleFamilies aFamilies(SW_RES(DLG_STYLE_DESIGNER));
    const SfxStyleFamilyItem* pFamilyItem = 0;
	sal_uInt16 nCount = aFamilies.Count();
	sal_uInt16 i;

	for( i = 0; i < nCount; ++i)
	{
		if(SFX_STYLE_FAMILY_PARA == (sal_uInt16)(pFamilyItem = aFamilies.GetObject(i))->GetFamily())
			break;
	}

	const SfxStyleFilter& rFilterList = pFamilyItem->GetFilterList();
	for( i = 0; i < rFilterList.Count(); ++i)
	{
		aFilterLB.InsertEntry(rFilterList.GetObject(i)->aName);
		sal_uInt16* pFilter = new sal_uInt16(rFilterList.GetObject(i)->nFlags);
		aFilterLB.SetEntryData(i, pFilter);
	}
	aFilterLB.SelectEntryPos(1);

	aTbLinks.Show();

}

/****************************************************************************
Page: Dtor
****************************************************************************/


__EXPORT SwCondCollPage::~SwCondCollPage()
{
	for(sal_uInt16 i = 0; i < aFilterLB.GetEntryCount(); ++i)
		delete (sal_uInt16*)aFilterLB.GetEntryData(i);

}


int __EXPORT SwCondCollPage::DeactivatePage(SfxItemSet * _pSet)
{
    if( _pSet )
        FillItemSet(*_pSet);

	return LEAVE_PAGE;
}

/****************************************************************************
Page: Factory
****************************************************************************/


SfxTabPage* __EXPORT SwCondCollPage::Create(Window *pParent, const SfxItemSet &rSet)
{
	return new SwCondCollPage(pParent, rSet);
}

/****************************************************************************
Page: FillItemSet-Overload
****************************************************************************/


sal_Bool __EXPORT SwCondCollPage::FillItemSet(SfxItemSet &rSet)
{
	sal_Bool bModified = sal_True;
	SwCondCollItem aCondItem;
	for(sal_uInt16 i = 0; i < aStrArr.Count(); i++)
	{
		String sEntry = aTbLinks.GetEntryText(i, 1);
		aCondItem.SetStyle( &sEntry, i);
	}
	rSet.Put(aCondItem);
	return bModified;
}

/****************************************************************************
Page: Reset-Overload
****************************************************************************/


void __EXPORT SwCondCollPage::Reset(const SfxItemSet &/*rSet*/)
{
	if(bNewTemplate)
		aConditionCB.Enable();
	if(RES_CONDTXTFMTCOLL == pFmt->Which())
		aConditionCB.Check();
	OnOffHdl(&aConditionCB);

	aTbLinks.Clear();

	SfxStyleSheetBasePool* pPool = rSh.GetView().GetDocShell()->GetStyleSheetPool();
	pPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_ALL);
	aStyleLB.Clear();
	const SfxStyleSheetBase* pBase = pPool->First();
	while( pBase )
	{
		if(!pFmt || pBase->GetName() != pFmt->GetName())
			aStyleLB.InsertEntry(pBase->GetName());
		pBase = pPool->Next();
	}
	aStyleLB.SelectEntryPos(0);

	for( sal_uInt16 n = 0; n < aStrArr.Count(); n++)
	{
		String aEntry( aStrArr.GetString(n) );
		aEntry += '\t';

        const SwCollCondition* pCond = 0;
		if( pFmt && RES_CONDTXTFMTCOLL == pFmt->Which() &&
			0 != ( pCond = ((SwConditionTxtFmtColl*)pFmt)->
			HasCondition( SwCollCondition( 0, pCmds[n].nCnd, pCmds[n].nSubCond ) ) )
			&& pCond->GetTxtFmtColl() )
		{
			aEntry += pCond->GetTxtFmtColl()->GetName();
		}

		SvLBoxEntry* pE = aTbLinks.InsertEntryToColumn( aEntry, n );
		if(0 == n)
			aTbLinks.Select(pE);
	}

}

/****************************************************************************

****************************************************************************/


sal_uInt16* __EXPORT SwCondCollPage::GetRanges()
{
	return aPageRg;
}


/****************************************************************************

****************************************************************************/


IMPL_LINK( SwCondCollPage, OnOffHdl, CheckBox*, pBox )
{
	const sal_Bool bEnable = pBox->IsChecked();
	aContextFT.Enable( bEnable );
	aUsedFT   .Enable( bEnable );
    aTbLinks  .EnableList( bEnable != sal_False );
	aStyleFT  .Enable( bEnable );
	aStyleLB  .Enable( bEnable );
	aFilterLB .Enable( bEnable );
	aRemovePB .Enable( bEnable );
	aAssignPB .Enable( bEnable );
	if( bEnable )
		SelectHdl(0);
	return 0;
}

/****************************************************************************

****************************************************************************/


IMPL_LINK( SwCondCollPage, AssignRemoveHdl, PushButton*, pBtn)
{
	SvLBoxEntry* pE = aTbLinks.FirstSelected();
	sal_uLong nPos;
	if( !pE || LISTBOX_ENTRY_NOTFOUND ==
		( nPos = aTbLinks.GetModel()->GetAbsPos( pE ) ) )
	{
		ASSERT( pE, "wo kommt der leere Eintrag her?" );
		return 0;
	}

	String sSel = aStrArr.GetString( sal_uInt16(nPos) );
	sSel += '\t';

	const sal_Bool bAssEnabled = pBtn != &aRemovePB && aAssignPB.IsEnabled();
	aAssignPB.Enable( !bAssEnabled );
	aRemovePB.Enable(  bAssEnabled );
	if ( bAssEnabled )
		sSel += aStyleLB.GetSelectEntry();

	aTbLinks.SetUpdateMode(sal_False);
	aTbLinks.GetModel()->Remove(pE);
	pE = aTbLinks.InsertEntryToColumn(sSel, nPos);
	aTbLinks.Select(pE);
	aTbLinks.MakeVisible(pE);
	aTbLinks.SetUpdateMode(sal_True);
	return 0;
}

/****************************************************************************

****************************************************************************/


IMPL_LINK( SwCondCollPage, SelectHdl, ListBox*, pBox)
{
	if(pBox == &aFilterLB)
	{
		aStyleLB.Clear();
		sal_uInt16 nSearchFlags = pBox->GetSelectEntryPos();
		nSearchFlags = *(sal_uInt16*)aFilterLB.GetEntryData(nSearchFlags);
		SfxStyleSheetBasePool* pPool = rSh.GetView().GetDocShell()->GetStyleSheetPool();
		pPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, nSearchFlags);
		const SfxStyleSheetBase* pBase = pPool->First();
		while( pBase )
		{
			if(!pFmt || pBase->GetName() != pFmt->GetName())
				aStyleLB.InsertEntry(pBase->GetName());
			pBase = pPool->Next();
		}
		aStyleLB.SelectEntryPos(0);
		SelectHdl(&aStyleLB);

	}
	else
	{
		String sTbEntry;
		SvLBoxEntry* pE = aTbLinks.FirstSelected();
		if(pE)
			sTbEntry = aTbLinks.GetEntryText(pE);
		sTbEntry = sTbEntry.GetToken(1, '\t');
		String sStyle = aStyleLB.GetSelectEntry();

		aAssignPB.Enable( sStyle != sTbEntry && aConditionCB.IsChecked() );

		if(pBox != &aStyleLB)
			aRemovePB.Enable( aConditionCB.IsChecked() && sTbEntry.Len() );
	}
	return 0;
}

/****************************************************************************

****************************************************************************/


void SwCondCollPage::SetCollection( SwFmt* pFormat, sal_Bool bNew )
{
	pFmt = pFormat;
	bNewTemplate = bNew;
}
