/**************************************************************
 * 
 * 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;
	}

	if( pFamilyItem )
	{
		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;
}