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

// System - Includes ---------------------------------------------------------
#include <vcl/svapp.hxx>
#include <tools/shl.hxx>
#include <sfx2/app.hxx>
#include <sfx2/module.hxx>
#include <svtools/txtcmp.hxx>
#include <unotools/charclass.hxx>
// INCLUDE -------------------------------------------------------------------
#include <editeng/unolingu.hxx>
#include <svx/dialmgr.hxx>
#include "ctredlin.hrc"
#include <svx/ctredlin.hxx>
#include "helpid.hrc"

//============================================================================
//	Local Defines and Function
//----------------------------------------------------------------------------

inline void EnableDisable( Window& rWin, sal_Bool bEnable )
{
	if (bEnable)
		rWin.Enable();
	else
		rWin.Disable();
}

static long nStaticTabs[]=
{
	5,10,65,120,170,220
};

#define	MIN_DISTANCE	6
#define WRITER_AUTHOR   1
#define WRITER_DATE		2
#define CALC_AUTHOR		2
#define CALC_DATE		3

RedlinData::RedlinData()
{
	bDisabled=sal_False;
	pData=NULL;
}
RedlinData::~RedlinData()
{
}

//============================================================================
//	class SvxRedlinEntry (Eintraege fuer Liste)
//----------------------------------------------------------------------------

SvxRedlinEntry::SvxRedlinEntry()
	:SvLBoxEntry()
{
}

SvxRedlinEntry::~SvxRedlinEntry()
{
	RedlinData* pRedDat=(RedlinData*) GetUserData();
	if(pRedDat!=NULL)
	{
		delete pRedDat;
	}
}

/*************************************************************************
#* Funktionen der in den SvxRedlinTable eingefuegten Items
#************************************************************************/

DBG_NAME(SvLBoxColorString);

/*************************************************************************
#*	Member:		SvLBoxColorString							Datum:23.10.97
#*------------------------------------------------------------------------
#*
#*  Klasse:		SvLBoxColorString
#*
#*  Funktion:	Konstruktor der Klasse SvLBoxColorString
#*
#*  Input:		Box- Entry,Flags, Text fuer Anzeige, Schrift
#*
#*	Output:		---
#*
#************************************************************************/

SvLBoxColorString::SvLBoxColorString( SvLBoxEntry*pEntry,sal_uInt16 nFlags,const XubString& rStr,
									const Color& rCol)

: SvLBoxString( pEntry, nFlags, rStr )
{
	DBG_CTOR(SvLBoxColorString,0);
	aPrivColor=rCol;
	SetText( pEntry, rStr );
}

/*************************************************************************
#*	Member:		SvLBoxColorString							Datum:23.10.97
#*------------------------------------------------------------------------
#*
#*  Klasse:		SvLBoxColorString
#*
#*  Funktion:	Default Konstruktor der Klasse SvLBoxColorString
#*
#*  Input:		---
#*
#*	Output:		---
#*
#************************************************************************/

SvLBoxColorString::SvLBoxColorString()
: SvLBoxString()
{
	DBG_CTOR(SvLBoxColorString,0);
}

/*************************************************************************
#*	Member:		~SvLBoxColorString							Datum:23.10.97
#*------------------------------------------------------------------------
#*
#*  Klasse:		SvLBoxColorString
#*
#*  Funktion:	Destruktor der Klasse SvLBoxColorString
#*
#*  Input:		---
#*
#*	Output:		---
#*
#************************************************************************/

SvLBoxColorString::~SvLBoxColorString()
{
	DBG_DTOR(SvLBoxColorString,0);
}


/*************************************************************************
#*	Member:		SvLBoxColorString							Datum:23.10.97
#*------------------------------------------------------------------------
#*
#*  Klasse:		SvLBoxColorString
#*
#*  Funktion:	Erzeugt einen neuen SvLBoxColorString
#*
#*  Input:		---
#*
#*	Output:		SvLBoxColorString
#*
#************************************************************************/

SvLBoxItem* SvLBoxColorString::Create() const
{
	DBG_CHKTHIS(SvLBoxColorString,0);
	return new SvLBoxColorString;
}



/*************************************************************************
#*	Member:		SvLBoxColorString							Datum:23.10.97
#*------------------------------------------------------------------------
#*
#*  Klasse:		SvLBoxColorString
#*
#*  Funktion:	Zeichenroutine des SvLBoxColorString. Gezeichnet wird
#*				der entsprechende Text mit der eingestellten Farbe
#*				im Ausgabe- Device.
#*
#*  Input:		Position, Ausgabe- Device, Flag fuer Selection,
#*				Zeiger auf den Eintrag
#*
#*	Output:		---
#*
#************************************************************************/

void SvLBoxColorString::Paint( const Point& rPos, SvLBox& rDev,
							 sal_uInt16 nFlags,	SvLBoxEntry* pEntry )
{
	Color aColor=rDev.GetTextColor();
	Color a2Color=aColor;
	if(!(nFlags & SVLISTENTRYFLAG_SELECTED))
	{
		rDev.SetTextColor(aPrivColor);
	}
	SvLBoxString::Paint(rPos,rDev,nFlags,pEntry );
	rDev.SetTextColor(a2Color);
}

//============================================================================
//	class SvxRedlinTable
//----------------------------------------------------------------------------

SvxRedlinTable::SvxRedlinTable( Window* pParent,WinBits nBits ):
		SvxSimpleTable(pParent,nBits )
{
	bAuthor=sal_False;
	bDate=sal_False;
	bIsCalc=sal_False;
	bComment=sal_False;
	nDatePos=WRITER_DATE;
	pCommentSearcher=NULL;
    SetNodeDefaultImages();
}

SvxRedlinTable::SvxRedlinTable( Window* pParent,const ResId& rResId):
		SvxSimpleTable(pParent,rResId)
{
	bAuthor=sal_False;
	bDate=sal_False;
	bIsCalc=sal_False;
	bComment=sal_False;
	nDatePos=WRITER_DATE;
	pCommentSearcher=NULL;
    SetNodeDefaultImages();
}

SvxRedlinTable::~SvxRedlinTable()
{
	if(pCommentSearcher!=NULL)
		delete pCommentSearcher;
}

StringCompare SvxRedlinTable::ColCompare(SvLBoxEntry* pLeft,SvLBoxEntry* pRight)
{
	StringCompare eCompare=COMPARE_EQUAL;

	if(aColCompareLink.IsSet())
	{
		SvSortData aRedlinCompare;
		aRedlinCompare.pLeft=pLeft;
		aRedlinCompare.pRight=pRight;
		eCompare=(StringCompare) aColCompareLink.Call(&aRedlinCompare);
	}
	else
	{
		if(nDatePos==GetSortedCol())
		{
			RedlinData *pLeftData=(RedlinData *)(pLeft->GetUserData());
			RedlinData *pRightData=(RedlinData *)(pRight->GetUserData());

			if(pLeftData!=NULL && pRightData!=NULL)
			{
				if(pLeftData->aDateTime < pRightData->aDateTime)
				{
					eCompare=COMPARE_LESS;
				}
				else if(pLeftData->aDateTime > pRightData->aDateTime)
				{
					eCompare=COMPARE_GREATER;
				}
			}
			else
				eCompare=SvxSimpleTable::ColCompare(pLeft,pRight);
		}
		else
		{
			eCompare=SvxSimpleTable::ColCompare(pLeft,pRight);
		}

	}

	return eCompare;
}
void SvxRedlinTable::SetCalcView(sal_Bool bFlag)
{
	bIsCalc=bFlag;
	if(bFlag)
	{
		nDatePos=CALC_DATE;
	}
	else
	{
		nDatePos=WRITER_DATE;
	}
}


void SvxRedlinTable::UpdateFilterTest()
{
	Date aDateMax;
	sal_uInt16 nYEAR=aDateMax.GetYear()+100;
	aDateMax.SetYear(nYEAR);
	Date aDateMin(1,1,1989);
	Time aTMin(0);
	Time aTMax(23,59,59);


	DateTime aDTMin(aDateMin);
	DateTime aDTMax(aDateMax);

	switch(nDaTiMode)
	{
		case FLT_DATE_BEFORE:
								aDaTiFilterFirst=aDTMin;
								aDaTiFilterLast=aDaTiFirst;
								break;
		case FLT_DATE_SAVE:
		case FLT_DATE_SINCE:
								aDaTiFilterFirst=aDaTiFirst;
								aDaTiFilterLast=aDTMax;
								break;
		case FLT_DATE_EQUAL:
								aDaTiFilterFirst=aDaTiFirst;
								aDaTiFilterLast=aDaTiFirst;
								aDaTiFilterFirst.SetTime(aTMin.GetTime());
								aDaTiFilterLast.SetTime(aTMax.GetTime());
								break;
		case FLT_DATE_NOTEQUAL:
								aDaTiFilterFirst=aDaTiFirst;
								aDaTiFilterLast=aDaTiFirst;
								aDaTiFilterFirst.SetTime(aTMin.GetTime());
								aDaTiFilterLast.SetTime(aTMax.GetTime());
								break;
		case FLT_DATE_BETWEEN:
								aDaTiFilterFirst=aDaTiFirst;
								aDaTiFilterLast=aDaTiLast;
								break;
	}
}


void SvxRedlinTable::SetFilterDate(sal_Bool bFlag)
{
	bDate=bFlag;
}

void SvxRedlinTable::SetDateTimeMode(sal_uInt16 nMode)
{
	nDaTiMode=nMode;
}

void SvxRedlinTable::SetFirstDate(const Date& aDate)
{
	aDaTiFirst.SetDate(aDate.GetDate());
}

void SvxRedlinTable::SetLastDate(const Date& aDate)
{
	aDaTiLast.SetDate(aDate.GetDate());
}

void SvxRedlinTable::SetFirstTime(const Time& aTime)
{
	aDaTiFirst.SetTime(aTime.GetTime());
}

void SvxRedlinTable::SetLastTime(const Time& aTime)
{
	aDaTiLast.SetTime(aTime.GetTime());
}

void SvxRedlinTable::SetFilterAuthor(sal_Bool bFlag)
{
	bAuthor=bFlag;
}

void SvxRedlinTable::SetAuthor(const String &aString)
{
	aAuthor=aString;
}

void SvxRedlinTable::SetFilterComment(sal_Bool bFlag)
{
	bComment=bFlag;
}

void SvxRedlinTable::SetCommentParams( const utl::SearchParam* pSearchPara )
{
	if(pSearchPara!=NULL)
	{
		if(pCommentSearcher!=NULL) delete pCommentSearcher;

		pCommentSearcher=new utl::TextSearch(*pSearchPara, LANGUAGE_SYSTEM );
	}
}

sal_Bool SvxRedlinTable::IsValidWriterEntry(const String& rString,RedlinData *pUserData)
{
	sal_Bool nTheFlag=sal_True;
	String aString=rString.GetToken(WRITER_AUTHOR,'\t');
	if(pUserData==NULL)
	{
		if(bAuthor)
		{
			if(aAuthor.CompareTo(aString)==COMPARE_EQUAL)
				nTheFlag=sal_True;
			else
				nTheFlag=sal_False;
		}
	}
	else
	{
		DateTime aDateTime=pUserData->aDateTime;
		nTheFlag=IsValidEntry(&aString,&aDateTime);
	}
	return nTheFlag;
}

sal_Bool SvxRedlinTable::IsValidCalcEntry(const String& rString,RedlinData *pUserData)
{
	sal_Bool nTheFlag=sal_True;
	String aString=rString.GetToken(CALC_AUTHOR,'\t');
	if(pUserData==NULL)
	{
		if(bAuthor)
		{
			if(aAuthor.CompareTo(aString)==COMPARE_EQUAL)
				nTheFlag=sal_True;
			else
				nTheFlag=sal_False;
		}
	}
	else
	{
		DateTime aDateTime=pUserData->aDateTime;
		nTheFlag=IsValidEntry(&aString,&aDateTime);
	}
	return nTheFlag;
}

sal_Bool SvxRedlinTable::IsValidEntry(const String* pAuthorStr,
								  const DateTime *pDateTime,const String* pCommentStr)
{
	bool nTheFlag=true;
	if(bAuthor)
	{
		nTheFlag = aAuthor.CompareTo(*pAuthorStr)==COMPARE_EQUAL;
	}
	if(bDate && nTheFlag)
	{
		if(nDaTiMode!=FLT_DATE_NOTEQUAL)
		{
			nTheFlag=pDateTime->IsBetween(aDaTiFilterFirst,aDaTiFilterLast);
		}
		else
		{
			nTheFlag=!(pDateTime->IsBetween(aDaTiFilterFirst,aDaTiFilterLast));
		}
	}
	if(bComment && nTheFlag)
	{
		xub_StrLen nStartPos = 0;
		xub_StrLen nEndPos = pCommentStr->Len();

		nTheFlag=pCommentSearcher->SearchFrwrd( *pCommentStr, &nStartPos, &nEndPos);
	}
	return nTheFlag;
}

sal_Bool SvxRedlinTable::IsValidEntry(const String* pAuthorStr,const DateTime *pDateTime)
{
	sal_Bool nTheFlag=sal_True;
	if(bAuthor)
	{
		if(aAuthor.CompareTo(*pAuthorStr)==COMPARE_EQUAL)
			nTheFlag=sal_True;
		else
			nTheFlag=sal_False;
	}
	if(bDate && nTheFlag)
	{
		if(nDaTiMode!=FLT_DATE_NOTEQUAL)
		{
			nTheFlag=pDateTime->IsBetween(aDaTiFilterFirst,aDaTiFilterLast);
		}
		else
		{
			nTheFlag=!(pDateTime->IsBetween(aDaTiFilterFirst,aDaTiFilterLast));
		}
	}
	return nTheFlag;
}

sal_Bool SvxRedlinTable::IsValidComment(const String* pCommentStr)
{
	bool nTheFlag=true;

	if(bComment)
	{
		xub_StrLen nStartPos = 0;
		xub_StrLen nEndPos = pCommentStr->Len();

		nTheFlag=pCommentSearcher->SearchFrwrd( *pCommentStr, &nStartPos, &nEndPos);
	}
	return nTheFlag;
}

SvLBoxEntry* SvxRedlinTable::InsertEntry(const String& rStr,RedlinData *pUserData,
								SvLBoxEntry* pParent,sal_uIntPtr nPos)
{
	aEntryColor=GetTextColor();
	if(pUserData!=NULL)
	{
		if(pUserData->bDisabled)
			aEntryColor=Color(COL_GRAY);
	}

	XubString aStr= rStr;

	XubString aFirstStr( aStr );
	xub_StrLen nEnd = aFirstStr.Search( sal_Unicode( '\t' ) );
	if( nEnd != STRING_NOTFOUND )
	{
		aFirstStr.Erase( nEnd );
		aCurEntry = aStr;
		aCurEntry.Erase( 0, ++nEnd );
	}
	else
		aCurEntry.Erase();

	return SvTreeListBox::InsertEntry( aFirstStr, pParent, sal_False, nPos, pUserData );

}

SvLBoxEntry* SvxRedlinTable::InsertEntry(const String& rStr,RedlinData *pUserData,const Color& aColor,
								SvLBoxEntry* pParent,sal_uIntPtr nPos)
{
	aEntryColor=aColor;

	XubString aStr= rStr;

	XubString aFirstStr( aStr );
	xub_StrLen nEnd = aFirstStr.Search( sal_Unicode ( '\t' ) );
	if( nEnd != STRING_NOTFOUND )
	{
		aFirstStr.Erase( nEnd );
		aCurEntry = aStr;
		aCurEntry.Erase( 0, ++nEnd );
	}
	else
		aCurEntry.Erase();

	return SvTreeListBox::InsertEntry( aFirstStr, pParent, sal_False, nPos, pUserData );
}

SvLBoxEntry* SvxRedlinTable::CreateEntry() const
{
	return new SvxRedlinEntry;
}

void SvxRedlinTable::InitEntry( SvLBoxEntry* pEntry, const XubString& rStr,
	const Image& rColl, const Image& rExp, SvLBoxButtonKind eButtonKind )
{
	SvLBoxButton* pButton;
	SvLBoxString* pString;
	SvLBoxContextBmp* pContextBmp;

	if( nTreeFlags & TREEFLAG_CHKBTN )
	{
		pButton= new SvLBoxButton( pEntry,eButtonKind,0,pCheckButtonData );
		pEntry->AddItem( pButton );
	}

	pContextBmp= new SvLBoxContextBmp( pEntry,0, rColl,rExp,
									 SVLISTENTRYFLAG_EXPANDED);
	pEntry->AddItem( pContextBmp );

	pString = new SvLBoxColorString( pEntry, 0, rStr ,aEntryColor);
	pEntry->AddItem( pString );

	XubString aToken;

	xub_Unicode* pCurToken = (xub_Unicode*)aCurEntry.GetBuffer();
	sal_uInt16 nCurTokenLen;
	xub_Unicode* pNextToken = (xub_Unicode*)GetToken( pCurToken, nCurTokenLen );
	sal_uInt16 nCount = TabCount(); nCount--;

	for( sal_uInt16 nToken = 0; nToken < nCount; nToken++ )
	{
		if( pCurToken && nCurTokenLen )
			// aToken.Assign( pCurToken, nCurTokenLen );
			aToken = XubString( pCurToken, nCurTokenLen );
		else
			aToken.Erase();

		SvLBoxColorString* pStr = new SvLBoxColorString( pEntry, 0, aToken ,aEntryColor);
		pEntry->AddItem( pStr );

		pCurToken = pNextToken;
		if( pCurToken )
			pNextToken = (xub_Unicode*)GetToken( pCurToken, nCurTokenLen );
		else
			nCurTokenLen = 0;
	}
}




//============================================================================
//	class SvxTPView
//----------------------------------------------------------------------------

SvxTPView::SvxTPView( Window * pParent)
	: TabPage( pParent, SVX_RES(SID_REDLIN_VIEW_PAGE)),
	aViewData	( this, SVX_RES( DG_VIEW) ),
	PbAccept	( this, SVX_RES(PB_ACCEPT	 ) ),
    PbReject    ( this, SVX_RES(PB_REJECT  ) ),
    PbAcceptAll ( this, SVX_RES(PB_ACCEPTALL  ) ),
    PbRejectAll ( this, SVX_RES(PB_REJECTALL  ) ),
	PbUndo		( this, SVX_RES(PB_UNDO  ) ),
	aTitle1		( SVX_RES( STR_TITLE1 ) ),		// lokale Resource
	aTitle2		( SVX_RES( STR_TITLE2 ) ),
	aTitle3		( SVX_RES( STR_TITLE3 ) ),
	aTitle4		( SVX_RES( STR_TITLE4 ) ),
	aTitle5		( SVX_RES( STR_TITLE5 ) ),
	aStrMyName	( SVX_RES( STR_VIEW) )
{
	aViewData.SetAccessibleName(String(SVX_RES(STR_TREE)));
	FreeResource();

    aViewData.SetHelpId(HID_REDLINING_VIEW_DG_VIEW_TABLE);
    aViewData.SetHeaderBarHelpId(HID_REDLINING_VIEW_DG_VIEW_HEADER);

	aMinSize=GetSizePixel();

	Link aLink=LINK( this, SvxTPView, PbClickHdl);

	PbAccept.SetClickHdl(aLink);
	PbAcceptAll.SetClickHdl(aLink);
	PbReject.SetClickHdl(aLink);
	PbRejectAll.SetClickHdl(aLink);
	PbUndo.SetClickHdl(aLink);

	nDistance=PbAccept.GetSizePixel().Height()+2*MIN_DISTANCE;
	aViewData.SetTabs(nStaticTabs);
}

String SvxTPView::GetMyName() const
{
	return aStrMyName;
}

void SvxTPView::Resize()
{
	Size aSize=GetOutputSizePixel();
	Point aPos=aViewData.GetPosPixel();
	aSize.Height()-=aPos.Y()+nDistance;
	aSize.Width()-=2*aPos.X();

	long newY=aPos.Y()+aSize.Height()+MIN_DISTANCE;
	aPos=PbAccept.GetPosPixel();
	aPos.Y()=newY;
	PbAccept.SetPosPixel(aPos);
	aPos=PbAcceptAll.GetPosPixel();
	aPos.Y()=newY;
	PbAcceptAll.SetPosPixel(aPos);
	aPos=PbReject.GetPosPixel();
	aPos.Y()=newY;
	PbReject.SetPosPixel(aPos);
	aPos=PbRejectAll.GetPosPixel();
	aPos.Y()=newY;
	PbRejectAll.SetPosPixel(aPos);

	if(PbUndo.IsVisible())
	{
		aPos=PbUndo.GetPosPixel();
		aPos.Y()=newY;
		PbUndo.SetPosPixel(aPos);
	}
	aViewData.SetSizePixel(aSize);
}

void SvxTPView::InsertWriterHeader()
{
	String aStrTab(sal_Unicode('\t'));
	String aString(aTitle1);
	aString+=aStrTab;
	aString+=aTitle3;
	aString+=aStrTab;
	aString+=aTitle4;
	aString+=aStrTab;
	aString+=aTitle5;
	aViewData.ClearHeader();
	aViewData.InsertHeaderEntry(aString);
}

void SvxTPView::InsertCalcHeader()
{
	String aStrTab(sal_Unicode('\t'));
	String aString(aTitle1);
	aString+=aStrTab;
	aString+=aTitle2;
	aString+=aStrTab;
	aString+=aTitle3;
	aString+=aStrTab;
	aString+=aTitle4;
	aString+=aStrTab;
	aString+=aTitle5;
	aViewData.ClearHeader();
	aViewData.InsertHeaderEntry(aString);
}

void SvxTPView::EnableAccept(sal_Bool nFlag)
{
	PbAccept.Enable(nFlag);
}

void SvxTPView::EnableAcceptAll(sal_Bool nFlag)
{
	PbAcceptAll.Enable(nFlag);
}

void SvxTPView::EnableReject(sal_Bool nFlag)
{
	PbReject.Enable(nFlag);
}

void SvxTPView::EnableRejectAll(sal_Bool nFlag)
{
	PbRejectAll.Enable(nFlag);
}

void SvxTPView::ShowUndo(sal_Bool nFlag)
{
	PbUndo.Show(nFlag);
}

void SvxTPView::EnableUndo(sal_Bool nFlag)
{
	PbUndo.Enable(nFlag);
}

Size SvxTPView::GetMinSizePixel()
{
	Size aSize=aMinSize;
	if(PbUndo.IsVisible())
	{
		sal_uIntPtr nSize=PbUndo.GetSizePixel().Width()
					+PbUndo.GetPosPixel().X()
					+PbAccept.GetPosPixel().X();

		aSize.Width()=nSize;
	}

	return aSize;
}


SvxRedlinTable* SvxTPView::GetTableControl()
{
	return &aViewData;
}

IMPL_LINK( SvxTPView, PbClickHdl, PushButton*, pPushB )
{
	if(pPushB==&PbAccept)
	{
		AcceptClickLk.Call(this);
	}
	else if(pPushB==&PbAcceptAll)
	{
		AcceptAllClickLk.Call(this);
	}
	else if(pPushB==&PbReject)
	{
		RejectClickLk.Call(this);
	}
	else if(pPushB==&PbRejectAll)
	{
		RejectAllClickLk.Call(this);
	}
	else if(pPushB==&PbUndo)
	{
		UndoClickLk.Call(this);
	}

	return 0;
}




//============================================================================
//	class SvxTPFilter
//----------------------------------------------------------------------------

SvxTPFilter::SvxTPFilter( Window * pParent)
	: TabPage( pParent, SVX_RES(SID_REDLIN_FILTER_PAGE)),
    pRedlinTable(NULL),
    aCbDate     ( this, SVX_RES( CB_DATE ) ),
	aLbDate		( this, SVX_RES( LB_DATE ) ),
	aDfDate		( this, SVX_RES( DF_DATE ) ),
	aTfDate		( this, SVX_RES( TF_DATE ) ),
	aIbClock 	( this, SVX_RES( IB_CLOCK ) ),
	aFtDate2	( this, SVX_RES( FT_DATE2 ) ),
	aDfDate2	( this, SVX_RES( DF_DATE2 ) ),
	aTfDate2	( this, SVX_RES( TF_DATE2 ) ),
	aIbClock2 	( this, SVX_RES( IB_CLOCK2) ),
	aCbAuthor	( this, SVX_RES( CB_AUTOR ) ),
	aLbAuthor	( this, SVX_RES( LB_AUTOR ) ),
	aCbRange 	( this, SVX_RES( CB_RANGE ) ),
	aEdRange 	( this, SVX_RES( ED_RANGE ) ),
	aBtnRange 	( this, SVX_RES( BTN_REF ) ),
	aLbAction	( this, SVX_RES( LB_ACTION ) ),
	aCbComment	( this, SVX_RES( CB_COMMENT) ),
	aEdComment	( this, SVX_RES( ED_COMMENT) ),
    aActionStr  (       SVX_RES( STR_ACTION) ),
    aStrMyName  (       SVX_RES( STR_FILTER) ),
    bModified   (sal_False)
{
    aLbDate.SetAccessibleName( String( SVX_RES( STR_DATE_COMBOX) ) );
    aDfDate.SetAccessibleName( String( SVX_RES( STR_DATE_SPIN) ) );
    aTfDate.SetAccessibleName( String( SVX_RES( STR_DATE_TIME_SPIN) ) );
    aDfDate2.SetAccessibleName( String( SVX_RES( STR_DATE_SPIN1) ) );
    aTfDate2.SetAccessibleName( String( SVX_RES( STR_DATE_TIME_SPIN1) ) );
	aLbAuthor.SetAccessibleName(aCbAuthor.GetText());
	aLbAction.SetAccessibleName( String( SVX_RES( STR_ACTION) ) );
	aEdComment.SetAccessibleName(aCbComment.GetText());
    Image aImgTimeHC( SVX_RES( IMG_TIME_H ) );
	FreeResource();

    aIbClock.SetModeImage( aImgTimeHC, BMP_COLOR_HIGHCONTRAST );
    aIbClock2.SetModeImage( aImgTimeHC, BMP_COLOR_HIGHCONTRAST );

	aDfDate.SetShowDateCentury( sal_True );
	aDfDate2.SetShowDateCentury( sal_True );

	aRangeStr=aCbRange.GetText();
	aLbDate.SelectEntryPos(0);
	aLbDate.SetSelectHdl( LINK( this, SvxTPFilter, SelDateHdl ) );
	aIbClock.SetClickHdl( LINK( this, SvxTPFilter, TimeHdl) );
	aIbClock2.SetClickHdl( LINK( this, SvxTPFilter,TimeHdl) );
	aBtnRange.SetClickHdl( LINK( this, SvxTPFilter, RefHandle));

	Link aLink=LINK( this, SvxTPFilter, RowEnableHdl) ;
	aCbDate.SetClickHdl(aLink);
	aCbAuthor.SetClickHdl(aLink);
	aCbRange.SetClickHdl(aLink);
	aCbComment.SetClickHdl(aLink);

	Link a2Link=LINK( this, SvxTPFilter, ModifyDate);
	aDfDate.SetModifyHdl(a2Link);
	aTfDate.SetModifyHdl(a2Link);
	aDfDate2.SetModifyHdl(a2Link);
	aTfDate2.SetModifyHdl(a2Link);

	Link a3Link=LINK( this, SvxTPFilter, ModifyHdl);
	aEdRange.SetModifyHdl(a3Link);
	aEdComment.SetModifyHdl(a3Link);
	aLbAction.SetSelectHdl(a3Link);
	aLbAuthor.SetSelectHdl(a3Link);

	RowEnableHdl(&aCbDate);
	RowEnableHdl(&aCbAuthor);
	RowEnableHdl(&aCbRange);
	RowEnableHdl(&aCbComment);

	Date aDate;
	Time aTime;
	aDfDate.SetDate(aDate);
	aTfDate.SetTime(aTime);
	aDfDate2.SetDate(aDate);
	aTfDate2.SetTime(aTime);
	HideRange();
	ShowAction();
	bModified=sal_False;

	aLbDate.SetAccessibleRelationLabeledBy(&aCbDate);
	aLbAuthor.SetAccessibleRelationLabeledBy(&aCbAuthor);
	aLbAction.SetAccessibleRelationLabeledBy(&aCbRange);
	aEdRange.SetAccessibleRelationLabeledBy(&aCbRange);
	aBtnRange.SetAccessibleRelationLabeledBy(&aCbRange);
	aEdComment.SetAccessibleRelationLabeledBy(&aCbComment);
	aDfDate2.SetAccessibleRelationLabeledBy(&aDfDate2);
	aTfDate2.SetAccessibleRelationLabeledBy(&aTfDate2);
}

void SvxTPFilter::SetRedlinTable(SvxRedlinTable* pTable)
{
	pRedlinTable=pTable;
}

String SvxTPFilter::GetMyName() const
{
	return aStrMyName;
}

void SvxTPFilter::DisableRange(sal_Bool bFlag)
{
	if(bFlag)
	{
		aCbRange.Disable();
		aEdRange.Disable();
		aBtnRange.Disable();
	}
	else
	{
		aCbRange.Enable();
		aEdRange.Enable();
		aBtnRange.Enable();
	}
}

void SvxTPFilter::ShowDateFields(sal_uInt16 nKind)
{
	String aEmpty;
	switch(nKind)
	{
		case FLT_DATE_BEFORE:
				EnableDateLine1(sal_True);
				EnableDateLine2(sal_False);
				break;
		case FLT_DATE_SINCE:
				EnableDateLine1(sal_True);
				EnableDateLine2(sal_False);
				break;
		case FLT_DATE_EQUAL:
				EnableDateLine1(sal_True);
				aTfDate.Disable();
				aTfDate.SetText(aEmpty);
				EnableDateLine2(sal_False);
				break;
		case FLT_DATE_NOTEQUAL:
				EnableDateLine1(sal_True);
				aTfDate.Disable();
				aTfDate.SetText(aEmpty);
				EnableDateLine2(sal_False);
				break;
		case FLT_DATE_BETWEEN:
				EnableDateLine1(sal_True);
				EnableDateLine2(sal_True);
				break;
		case FLT_DATE_SAVE:
				EnableDateLine1(sal_False);
				EnableDateLine2(sal_False);
				break;
	}
}

void SvxTPFilter::EnableDateLine1(sal_Bool bFlag)
{
	if(bFlag && aCbDate.IsChecked())
	{
		aDfDate.Enable();
		aTfDate.Enable();
		aIbClock.Enable();
	}
	else
	{
		aDfDate.Disable();
		aTfDate.Disable();
		aIbClock.Disable();
	}
}
void SvxTPFilter::EnableDateLine2(sal_Bool bFlag)
{
	String aEmpty;
	if(bFlag && aCbDate.IsChecked())
	{
		aFtDate2.Enable();
		aDfDate2.Enable();
		aTfDate2.Enable();
		aIbClock2.Enable();
	}
	else
	{
		aFtDate2.Disable();
		aDfDate2.Disable();
		aDfDate2.SetText(aEmpty);
		aTfDate2.Disable();
		aTfDate2.SetText(aEmpty);
		aIbClock2.Disable();
	}
}

Date SvxTPFilter::GetFirstDate() const
{
	return aDfDate.GetDate();
}

void SvxTPFilter::SetFirstDate(const Date &aDate)
{
	aDfDate.SetDate(aDate);
}

Time SvxTPFilter::GetFirstTime() const
{
	return aTfDate.GetTime();
}

void SvxTPFilter::SetFirstTime(const Time &aTime)
{
	aTfDate.SetTime(aTime);
}


Date SvxTPFilter::GetLastDate() const
{
	return aDfDate2.GetDate();
}

void SvxTPFilter::SetLastDate(const Date &aDate)
{
	aDfDate2.SetDate(aDate);
}

Time SvxTPFilter::GetLastTime() const
{
	return aTfDate2.GetTime();
}

void SvxTPFilter::SetLastTime(const Time &aTime)
{
	aTfDate2.SetTime(aTime);
}

void SvxTPFilter::SetDateMode(sal_uInt16 nMode)
{
	aLbDate.SelectEntryPos(nMode);
	SelDateHdl(&aLbDate);
}

sal_uInt16 SvxTPFilter::GetDateMode()
{
	return (sal_uInt16) aLbDate.GetSelectEntryPos();
}
void SvxTPFilter::ClearAuthors()
{
	aLbAuthor.Clear();
}

void SvxTPFilter::InsertAuthor( const String& rString, sal_uInt16 nPos)
{
	aLbAuthor.InsertEntry(rString,nPos);
}

String SvxTPFilter::GetSelectedAuthor()	const
{
	return aLbAuthor.GetSelectEntry();
}

sal_uInt16	SvxTPFilter::GetSelectedAuthorPos()
{
	return (sal_uInt16) aLbAuthor.GetSelectEntryPos();
}

void SvxTPFilter::SelectedAuthorPos(sal_uInt16 nPos)
{
	aLbAuthor.SelectEntryPos(nPos);
}

sal_uInt16 SvxTPFilter::SelectAuthor(const String& aString)
{
	aLbAuthor.SelectEntry(aString);
	return aLbAuthor.GetSelectEntryPos();
}

void SvxTPFilter::SetRange(const String& rString)
{
	aEdRange.SetText(rString);
}

String SvxTPFilter::GetRange() const
{
	return aEdRange.GetText();
}

void SvxTPFilter::SetFocusToRange()
{
	aEdRange.GrabFocus();
}

void SvxTPFilter::HideRange(sal_Bool bHide)
{
	if(bHide)
	{
		aCbRange.Hide();
		aEdRange.Hide();
		aBtnRange.Hide();
	}
	else
	{
		ShowAction(sal_False);
		aCbRange.SetText(aRangeStr);
		aCbRange.Show();
		aEdRange.Show();
		aBtnRange.Show();
	}
}

void SvxTPFilter::HideClocks(sal_Bool bHide)
{
	if(bHide)
	{
		aIbClock. Hide();
		aIbClock2.Hide();
	}
	else
	{
		aIbClock. Show();
		aIbClock2.Show();
	}
}

void SvxTPFilter::SetComment(const String &rComment)
{
	aEdComment.SetText(rComment);
}
String SvxTPFilter::GetComment()const
{
	return aEdComment.GetText();
}

sal_Bool SvxTPFilter::IsDate()
{
	return aCbDate.IsChecked();
}

sal_Bool SvxTPFilter::IsAuthor()
{
	return aCbAuthor.IsChecked();
}

sal_Bool SvxTPFilter::IsRange()
{
	return aCbRange.IsChecked();
}
sal_Bool SvxTPFilter::IsAction()
{
	return aCbRange.IsChecked();
}

sal_Bool SvxTPFilter::IsComment()
{
	return aCbComment.IsChecked();
}

void SvxTPFilter::CheckDate(sal_Bool bFlag)
{
	aCbDate.Check(bFlag);
	RowEnableHdl(&aCbDate);
	bModified=sal_False;
}

void SvxTPFilter::CheckAuthor(sal_Bool bFlag)
{
	aCbAuthor.Check(bFlag);
	RowEnableHdl(&aCbAuthor);
	bModified=sal_False;
}

void SvxTPFilter::CheckRange(sal_Bool bFlag)
{
	aCbRange.Check(bFlag);
	RowEnableHdl(&aCbRange);
	bModified=sal_False;
}

void SvxTPFilter::CheckAction(sal_Bool bFlag)
{
	aCbRange.Check(bFlag);
	RowEnableHdl(&aCbRange);
	bModified=sal_False;
}

void SvxTPFilter::CheckComment(sal_Bool bFlag)
{
	aCbComment.Check(bFlag);
	RowEnableHdl(&aCbComment);
	bModified=sal_False;
}

void SvxTPFilter::ShowAction(sal_Bool bShow)
{
	if(!bShow)
	{
		aCbRange.Hide();
		aLbAction.Hide();
		aCbRange.SetHelpId(HID_REDLINING_FILTER_CB_RANGE);
	}
	else
	{
		HideRange();
		aCbRange.SetText(aActionStr);
		aCbRange.SetHelpId(HID_REDLINING_FILTER_CB_ACTION);
		aCbRange.Show();
		aLbAction.Show();

	}
}

ListBox* SvxTPFilter::GetLbAction()
{
	return &aLbAction;
}

IMPL_LINK( SvxTPFilter, SelDateHdl, ListBox*, pLb )
{
	ShowDateFields((sal_uInt16)aLbDate.GetSelectEntryPos());
	ModifyHdl(pLb);
	return 0;
}

IMPL_LINK( SvxTPFilter, RowEnableHdl, CheckBox*, pCB )
{
	if(pCB==&aCbDate)
	{
		aLbDate.Enable(aCbDate.IsChecked());
		aLbDate.Invalidate();
		EnableDateLine1(sal_False);
		EnableDateLine2(sal_False);
		if(aCbDate.IsChecked()) SelDateHdl(&aLbDate);
	}
	else if(pCB==&aCbAuthor)
	{
		aLbAuthor.Enable(aCbAuthor.IsChecked());
		aLbAuthor.Invalidate();
	}
	else if(pCB==&aCbRange)
	{
		aLbAction.Enable(aCbRange.IsChecked());
		aLbAction.Invalidate();
		aEdRange.Enable(aCbRange.IsChecked());
		aBtnRange.Enable(aCbRange.IsChecked());
	}
	else if(pCB==&aCbComment)
	{
		aEdComment.Enable(aCbComment.IsChecked());
		aEdComment.Invalidate();
	}

	ModifyHdl(pCB);
	return 0;
}

IMPL_LINK( SvxTPFilter, TimeHdl, ImageButton*,pIB )
{
	Date aDate;
	Time aTime;
	if(pIB==&aIbClock)
	{
		aDfDate.SetDate(aDate);
		aTfDate.SetTime(aTime);
	}
	else if(pIB==&aIbClock2)
	{
		aDfDate2.SetDate(aDate);
		aTfDate2.SetTime(aTime);
	}
	ModifyHdl(&aDfDate);
	return 0;
}

IMPL_LINK( SvxTPFilter, ModifyHdl, void*, pCtr)
{
	if(pCtr!=NULL)
	{
		if(pCtr==&aCbDate  || pCtr==&aLbDate ||
		   pCtr==&aDfDate  || pCtr==&aTfDate ||
		   pCtr==&aIbClock || pCtr==&aFtDate2||
		   pCtr==&aDfDate2 || pCtr==&aTfDate2||
		   pCtr==&aIbClock2)
		{
			aModifyDateLink.Call(this);
		}
		else if(pCtr==&aCbAuthor || pCtr==&aLbAuthor)
		{
			aModifyAuthorLink.Call(this);
		}
		else if(pCtr==&aCbRange  || pCtr==&aEdRange ||
				pCtr==&aBtnRange )
		{
			aModifyRefLink.Call(this);
		}
		else if(pCtr==&aCbComment || pCtr==&aEdComment)
		{
			aModifyComLink.Call(this);
		}

		bModified=sal_True;
		aModifyLink.Call(this);
	}
	return 0;
}

void SvxTPFilter::DeactivatePage()
{
	if(bModified)
	{
		if(pRedlinTable!=NULL)
		{
			pRedlinTable->SetFilterDate(IsDate());
			pRedlinTable->SetDateTimeMode(GetDateMode());
			pRedlinTable->SetFirstDate(aDfDate.GetDate());
			pRedlinTable->SetLastDate(aDfDate2.GetDate());
			pRedlinTable->SetFirstTime(aTfDate.GetTime());
			pRedlinTable->SetLastTime(aTfDate2.GetTime());
			pRedlinTable->SetFilterAuthor(IsAuthor());
			pRedlinTable->SetAuthor(GetSelectedAuthor());

			pRedlinTable->SetFilterComment(IsComment());

			utl::SearchParam aSearchParam( aEdComment.GetText(),
					utl::SearchParam::SRCH_REGEXP,sal_False,sal_False,sal_False );

			pRedlinTable->SetCommentParams(&aSearchParam);

			pRedlinTable->UpdateFilterTest();
		}

		aReadyLink.Call(this);
	}
	bModified=sal_False;
	TabPage::DeactivatePage();
}

void SvxTPFilter::Enable( bool bEnable, bool bChild)
{
	TabPage::Enable(bEnable,bChild);
	if(aCbDate.IsEnabled())
	{
		RowEnableHdl(&aCbDate);
		RowEnableHdl(&aCbAuthor);
		RowEnableHdl(&aCbRange);
		RowEnableHdl(&aCbComment);
	}
}
void SvxTPFilter::Disable( bool bChild)
{
	Enable( false, bChild );
}

//IAccessibility2 Implementation 2009-----
void SvxTPFilter::SetAccessibleRelationMemberOf( Window* pWin )
{
	aCbDate.SetAccessibleRelationMemberOf(pWin);
	aLbDate.SetAccessibleRelationMemberOf(pWin);
	aDfDate.SetAccessibleRelationMemberOf(pWin);
	aTfDate.SetAccessibleRelationMemberOf(pWin);
	aIbClock.SetAccessibleRelationMemberOf(pWin);
	aFtDate2.SetAccessibleRelationMemberOf(pWin);
	aDfDate2.SetAccessibleRelationMemberOf(pWin);
	aTfDate2.SetAccessibleRelationMemberOf(pWin);
	aIbClock2.SetAccessibleRelationMemberOf(pWin);
	aCbAuthor.SetAccessibleRelationMemberOf(pWin);
	aLbAuthor.SetAccessibleRelationMemberOf(pWin);
	aCbRange.SetAccessibleRelationMemberOf(pWin);
	aEdRange.SetAccessibleRelationMemberOf(pWin);
	aBtnRange.SetAccessibleRelationMemberOf(pWin);
	aLbAction.SetAccessibleRelationMemberOf(pWin);
	aCbComment.SetAccessibleRelationMemberOf(pWin);
	aEdComment.SetAccessibleRelationMemberOf(pWin);
}
//-----IAccessibility2 Implementation 2009

IMPL_LINK( SvxTPFilter, ModifyDate, void*,pTF)
{

	Date aDate;
	Time aTime(0);
	if(&aDfDate==pTF)
	{
		if(aDfDate.GetText().Len()==0)
		   aDfDate.SetDate(aDate);

		if(pRedlinTable!=NULL)
			pRedlinTable->SetFirstDate(aDfDate.GetDate());
	}
	else if(&aDfDate2==pTF)
	{
		if(aDfDate2.GetText().Len()==0)
		   aDfDate2.SetDate(aDate);

		if(pRedlinTable!=NULL)
			pRedlinTable->SetLastDate(aDfDate2.GetDate());
	}
	else if(&aTfDate==pTF)
	{
		if(aTfDate.GetText().Len()==0)
		   aTfDate.SetTime(aTime);

		if(pRedlinTable!=NULL)
			pRedlinTable->SetFirstTime(aTfDate.GetTime());
	}
	else if(&aTfDate2==pTF)
	{
		if(aTfDate2.GetText().Len()==0)
		   aTfDate2.SetTime(aTime);

		if(pRedlinTable!=NULL)
			pRedlinTable->SetLastTime(aTfDate2.GetTime());

	}
	ModifyHdl(&aDfDate);
	return 0;
}

IMPL_LINK( SvxTPFilter, RefHandle, PushButton*, pRef )
{
	if(pRef!=NULL)
	{
		aRefLink.Call(this);
	}
	return 0;
}

static Size gDiffSize;
//============================================================================
//	class SvxAcceptChgCtr
//----------------------------------------------------------------------------

SvxAcceptChgCtr::SvxAcceptChgCtr( Window* pParent, WinBits nWinStyle)
		:	Control(pParent,nWinStyle |WB_DIALOGCONTROL),
			aTCAccept(this,WB_TABSTOP |WB_DIALOGCONTROL)
{
	pTPFilter=new SvxTPFilter(&aTCAccept);
	pTPView=new SvxTPView(&aTCAccept);
	aMinSize=pTPView->GetMinSizePixel();

	aTCAccept.InsertPage( TP_VIEW,	 pTPView->GetMyName());
	aTCAccept.InsertPage( TP_FILTER, pTPFilter->GetMyName());
	aTCAccept.SetTabPage( TP_VIEW,	 pTPView);
	aTCAccept.SetTabPage( TP_FILTER, pTPFilter);
	aTCAccept.SetHelpId(HID_REDLINING_TABCONTROL);

	aTCAccept.SetTabPageSizePixel(aMinSize);
	Size aSize=aTCAccept.GetSizePixel();

	gDiffSize.Height()=aSize.Height()-aMinSize.Height();
	gDiffSize.Width()=aSize.Width()-aMinSize.Width();


	pTPFilter->SetRedlinTable(GetViewTable());

	aTCAccept.Show();
	ShowViewPage();
}

SvxAcceptChgCtr::SvxAcceptChgCtr( Window* pParent, const ResId& rResId )
		:	Control(pParent,rResId ),
			aTCAccept(this,WB_TABSTOP |WB_DIALOGCONTROL)
{
	pTPFilter=new SvxTPFilter(&aTCAccept);
	pTPView=new SvxTPView(&aTCAccept);
	aMinSize=pTPView->GetMinSizePixel();

	aTCAccept.InsertPage( TP_VIEW,	 pTPView->GetMyName());
	aTCAccept.InsertPage( TP_FILTER, pTPFilter->GetMyName());
	aTCAccept.SetTabPage( TP_VIEW,	 pTPView);
	aTCAccept.SetTabPage( TP_FILTER, pTPFilter);
	aTCAccept.SetHelpId(HID_REDLINING_TABCONTROL);

	aTCAccept.SetTabPageSizePixel(aMinSize);
	Size aSize=aTCAccept.GetSizePixel();

	gDiffSize.Height()=aSize.Height()-aMinSize.Height();
	gDiffSize.Width()=aSize.Width()-aMinSize.Width();


	pTPFilter->SetRedlinTable(GetViewTable());
	WinBits nWinStyle=GetStyle()|WB_DIALOGCONTROL;
	SetStyle(nWinStyle);

	aTCAccept.Show();
	ShowViewPage();
	Resize();
}

SvxAcceptChgCtr::~SvxAcceptChgCtr()
{
	delete pTPView;
	delete pTPFilter;
}

void SvxAcceptChgCtr::Resize()
{
	aMinSize=pTPView->GetMinSizePixel();
	Size aSize=GetOutputSizePixel();
	sal_Bool bFlag=sal_False;

	if(aMinSize.Height()>aSize.Height())
	{
		aSize.Height()=aMinSize.Height();
		bFlag=sal_True;
	}
	if(aMinSize.Width()>aSize.Width())
	{
		aSize.Width()=aMinSize.Width();
		bFlag=sal_True;
	}

	if(bFlag)
	{
		SetOutputSizePixel(aSize);
		aMinSizeLink.Call(this);
	}

	aSize.Height()-=2;
	aSize.Width()-=2;
	aTCAccept.SetSizePixel(aSize);
}

Size SvxAcceptChgCtr::GetMinSizePixel() const
{
	Size aSize=pTPView->GetMinSizePixel();
	aSize.Height()+=gDiffSize.Height();
	aSize.Width()+=gDiffSize.Width();
	return aSize;
}

void SvxAcceptChgCtr::ShowFilterPage()
{
	aTCAccept.SetCurPageId(TP_FILTER);
}

void SvxAcceptChgCtr::ShowViewPage()
{
	aTCAccept.SetCurPageId(TP_VIEW);
}

sal_Bool SvxAcceptChgCtr::IsFilterPageVisible()
{
	return (aTCAccept.GetCurPageId()==TP_FILTER);
}

sal_Bool SvxAcceptChgCtr::IsViewPageVisible()
{
	return (aTCAccept.GetCurPageId()==TP_VIEW);
}

SvxTPFilter* SvxAcceptChgCtr::GetFilterPage()
{
	return pTPFilter;
}

SvxTPView* SvxAcceptChgCtr::GetViewPage()
{
	return pTPView;
}

SvxRedlinTable* SvxAcceptChgCtr::GetViewTable()
{
	if(pTPView!=NULL)
	{
		return pTPView->GetTableControl();
	}
	else
	{
		return NULL;
	}
}