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

// System - Includes ---------------------------------------------------------



// INCLUDE -------------------------------------------------------------------

#include <vcl/msgbox.hxx>

#include "reffact.hxx"
#include "document.hxx"
#include "scresid.hxx"
#include "globstr.hrc"
#include "dbnamdlg.hrc"
#include "rangenam.hxx"		// IsNameValid

#define _DBNAMDLG_CXX
#include "dbnamdlg.hxx"
#undef _DBNAMDLG_CXX


//============================================================================

#define ABS_SREF		  SCA_VALID \
						| SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE
#define ABS_DREF		  ABS_SREF \
						| SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE
#define ABS_SREF3D		ABS_SREF | SCA_TAB_3D
#define ABS_DREF3D		ABS_DREF | SCA_TAB_3D

//----------------------------------------------------------------------------

class DBSaveData;

static DBSaveData* pSaveObj = NULL;

#define ERRORBOX(s) ErrorBox(this,WinBits(WB_OK|WB_DEF_OK),s).Execute()
#define QUERYBOX(m) QueryBox(this,WinBits(WB_YES_NO|WB_DEF_YES),m).Execute()

//============================================================================
//	class DBSaveData

class DBSaveData
{
public:
	DBSaveData( Edit& rEd, CheckBox& rHdr, CheckBox& rSize, CheckBox& rFmt,
							CheckBox& rStrip, ScRange& rArea )
        : rEdAssign(rEd),
          rBtnHeader(rHdr), rBtnSize(rSize), rBtnFormat(rFmt), rBtnStrip(rStrip),
          rCurArea(rArea),
          bHeader(sal_False), bSize(sal_False), bFormat(sal_False), bDirty(sal_False) {}
	void Save();
	void Restore();

private:
	Edit&		rEdAssign;
	CheckBox&	rBtnHeader;
	CheckBox&	rBtnSize;
	CheckBox&	rBtnFormat;
	CheckBox&	rBtnStrip;
	ScRange&	rCurArea;
	String		aStr;
	ScRange		aArea;
	sal_Bool		bHeader:1;
	sal_Bool		bSize:1;
	sal_Bool		bFormat:1;
	sal_Bool		bStrip:1;
	sal_Bool		bDirty:1;
};



//----------------------------------------------------------------------------

void DBSaveData::Save()
{
	aArea   = rCurArea;
	aStr    = rEdAssign.GetText();
	bHeader = rBtnHeader.IsChecked();
	bSize   = rBtnSize.IsChecked();
	bFormat = rBtnFormat.IsChecked();
	bStrip	= rBtnStrip.IsChecked();
	bDirty  = sal_True;
}


//----------------------------------------------------------------------------

void DBSaveData::Restore()
{
	if ( bDirty )
	{
		rCurArea = aArea;
		rEdAssign.SetText( aStr );
		rBtnHeader.Check ( bHeader );
		rBtnSize.Check   ( bSize );
		rBtnFormat.Check ( bFormat );
		rBtnStrip.Check  ( bStrip );
		bDirty = sal_False;
	}
}


//============================================================================
//	class ScDbNameDlg

//----------------------------------------------------------------------------

ScDbNameDlg::ScDbNameDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
						  ScViewData*	ptrViewData )

	:	ScAnyRefDlg	( pB, pCW, pParent, RID_SCDLG_DBNAMES ),
		//
        aFlName         ( this, ScResId( FL_NAME ) ),
		aEdName			( this, ScResId( ED_NAME ) ),

        aFlAssign       ( this, ScResId( FL_ASSIGN ) ),
        aEdAssign       ( this, this, ScResId( ED_DBAREA ) ),
		aRbAssign		( this, ScResId( RB_DBAREA ), &aEdAssign, this ),

        aFlOptions      ( this, ScResId( FL_OPTIONS ) ),
		aBtnHeader		( this, ScResId( BTN_HEADER ) ),
		aBtnDoSize		( this, ScResId( BTN_SIZE ) ),
		aBtnKeepFmt		( this, ScResId( BTN_FORMAT ) ),
		aBtnStripData	( this, ScResId( BTN_STRIPDATA ) ),
		aFTSource		( this, ScResId( FT_SOURCE ) ),
		aFTOperations	( this, ScResId( FT_OPERATIONS ) ),

		aBtnOk			( this, ScResId( BTN_OK ) ),
		aBtnCancel		( this, ScResId( BTN_CANCEL ) ),
		aBtnHelp		( this, ScResId( BTN_HELP ) ),
		aBtnAdd			( this, ScResId( BTN_ADD ) ),
		aBtnRemove		( this, ScResId( BTN_REMOVE ) ),
		aBtnMore		( this, ScResId( BTN_MORE ) ),

		aStrAdd			( ScResId( STR_ADD ) ),
		aStrModify		( ScResId( STR_MODIFY ) ),
		aStrInvalid		( ScResId( STR_DB_INVALID ) ),
		//
		pViewData		( ptrViewData ),
		pDoc			( ptrViewData->GetDocument() ),
		bRefInputMode	( sal_False ),
        aAddrDetails    ( pDoc->GetAddressConvention(), 0, 0 ),
		aLocalDbCol		( *(pDoc->GetDBCollection()) )
{
	// WB_NOLABEL can't be set in resource...
	aFTSource.SetStyle( aFTSource.GetStyle() | WB_NOLABEL );
	aFTOperations.SetStyle( aFTOperations.GetStyle() | WB_NOLABEL );

	//	damit die Strings in der Resource bei den FixedTexten bleiben koennen:
	aStrSource		= aFTSource.GetText();
	aStrOperations	= aFTOperations.GetText();

	pSaveObj = new DBSaveData( aEdAssign, aBtnHeader,
						aBtnDoSize, aBtnKeepFmt, aBtnStripData, theCurArea );
	Init();
	FreeResource();
	aRbAssign.SetAccessibleRelationMemberOf(&aFlAssign);
}


//----------------------------------------------------------------------------

__EXPORT ScDbNameDlg::~ScDbNameDlg()
{
	DELETEZ( pSaveObj );

	ScRange* pEntry = (ScRange*)aRemoveList.First();
	while ( pEntry )
	{
        aRemoveList.Remove( pEntry );
        delete pEntry;
		pEntry = (ScRange*)aRemoveList.Next();
	}
}


//----------------------------------------------------------------------------

void ScDbNameDlg::Init()
{
    aBtnHeader.Check( sal_True );		// Default: mit Spaltenkoepfen

    aBtnMore.AddWindow( &aFlOptions );
    aBtnMore.AddWindow( &aBtnHeader );
    aBtnMore.AddWindow( &aBtnDoSize );
    aBtnMore.AddWindow( &aBtnKeepFmt );
    aBtnMore.AddWindow( &aBtnStripData );
    aBtnMore.AddWindow( &aFTSource );
    aBtnMore.AddWindow( &aFTOperations );

    String	theAreaStr;
    SCCOL	nStartCol 	= 0;
    SCROW	nStartRow 	= 0;
    SCTAB	nStartTab 	= 0;
    SCCOL	nEndCol 	= 0;
    SCROW	nEndRow		= 0;
    SCTAB	nEndTab 	= 0;

    aBtnOk.SetClickHdl		( LINK( this, ScDbNameDlg, OkBtnHdl ) );
    aBtnCancel.SetClickHdl	( LINK( this, ScDbNameDlg, CancelBtnHdl ) );
    aBtnAdd.SetClickHdl		( LINK( this, ScDbNameDlg, AddBtnHdl ) );
    aBtnRemove.SetClickHdl	( LINK( this, ScDbNameDlg, RemoveBtnHdl ) );
    aEdName.SetModifyHdl	( LINK( this, ScDbNameDlg, NameModifyHdl ) );
    aEdAssign.SetModifyHdl	( LINK( this, ScDbNameDlg, AssModifyHdl ) );
    UpdateNames();

    if ( pViewData && pDoc )
    {
        ScDBCollection*	pDBColl	= pDoc->GetDBCollection();
        ScDBData*		pDBData = NULL;

        pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
            nEndCol,	 nEndRow,  nEndTab );

        theCurArea = ScRange( ScAddress( nStartCol, nStartRow, nStartTab ),
            ScAddress( nEndCol,   nEndRow,   nEndTab ) );

        theCurArea.Format( theAreaStr, ABS_DREF3D, pDoc, aAddrDetails );

        if ( pDBColl )
        {
            // Feststellen, ob definierter DB-Bereich markiert wurde:
            pDBData = pDBColl->GetDBAtCursor( nStartCol, nStartRow, nStartTab, sal_True );
            if ( pDBData )
            {
                String		theDbName;
                ScAddress&	rStart = theCurArea.aStart;
                ScAddress&	rEnd   = theCurArea.aEnd;
                SCCOL nCol1;
                SCCOL  nCol2;
                SCROW  nRow1;
                SCROW  nRow2;
                SCTAB  nTab;

                pDBData->GetArea( nTab, nCol1, nRow1, nCol2, nRow2 );

                if (   (rStart.Tab() == nTab)
                    && (rStart.Col() == nCol1) && (rStart.Row() == nRow1)
                    && (rEnd.Col()   == nCol2) && (rEnd.Row()   == nRow2 ) )
                {
                    pDBData->GetName( theDbName );
                    if ( !pDBData->IsInternalUnnamed()
                         && !pDBData->IsInternalForAutoFilter() )
                    {
                        aEdName.SetText( theDbName );
                    }
                    else
                    {
                        aEdName.SetText( EMPTY_STRING );
                    }
                    aBtnHeader.Check( pDBData->HasHeader() );
                    aBtnDoSize.Check( pDBData->IsDoSize() );
                    aBtnKeepFmt.Check( pDBData->IsKeepFmt() );
                    aBtnStripData.Check( pDBData->IsStripData() );
                    SetInfoStrings( pDBData );
                }
            }
        }
    }

    aEdAssign.SetText( theAreaStr );
    aEdName.GrabFocus();
    bSaved=sal_True;
    pSaveObj->Save();
    NameModifyHdl( 0 );
}


void ScDbNameDlg::SetInfoStrings( const ScDBData* pDBData )
{
	String aSource = aStrSource;
	if (pDBData)
	{
		aSource += ' ';
		aSource += pDBData->GetSourceString();
	}
	aFTSource.SetText( aSource );

	String aOper = aStrOperations;
	if (pDBData)
	{
		aOper += ' ';
		aOper += pDBData->GetOperations();
	}
	aFTOperations.SetText( aOper );
}

//----------------------------------------------------------------------------
// Uebergabe eines mit der Maus selektierten Tabellenbereiches, der dann als
//  neue Selektion im Referenz-Fenster angezeigt wird.

void ScDbNameDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
{
	if ( aEdAssign.IsEnabled() )
	{
		if ( rRef.aStart != rRef.aEnd )
			RefInputStart( &aEdAssign );

		theCurArea = rRef;

		String aRefStr;
        theCurArea.Format( aRefStr, ABS_DREF3D, pDocP, aAddrDetails );
		aEdAssign.SetRefString( aRefStr );
		aBtnHeader.Enable();
		aBtnDoSize.Enable();
		aBtnKeepFmt.Enable();
		aBtnStripData.Enable();
		aFTSource.Enable();
		aFTOperations.Enable();
		aBtnAdd.Enable();
		bSaved=sal_True;
		pSaveObj->Save();
	}
}


//----------------------------------------------------------------------------

sal_Bool __EXPORT ScDbNameDlg::Close()
{
	return DoClose( ScDbNameDlgWrapper::GetChildWindowId() );
}

//------------------------------------------------------------------------

void ScDbNameDlg::SetActive()
{
	aEdAssign.GrabFocus();

	//	kein NameModifyHdl, weil sonst Bereiche nicht geaendert werden koennen
	//	(nach dem Aufziehen der Referenz wuerde der alte Inhalt wieder angezeigt)
	//	(der ausgewaehlte DB-Name hat sich auch nicht veraendert)

	RefInputDone();
}

//------------------------------------------------------------------------

void ScDbNameDlg::UpdateNames()
{
    sal_uInt16	nNameCount = aLocalDbCol.GetCount();

    aEdName.SetUpdateMode( sal_False );
    //-----------------------------------------------------------
    aEdName.Clear();
    aEdAssign.SetText( EMPTY_STRING );

    if ( nNameCount > 0 )
    {
        ScDBData*	pDbData = NULL;
        String		aString;

        for ( sal_uInt16 i=0; i<nNameCount; i++ )
        {
            pDbData = (ScDBData*)(aLocalDbCol.At( i ));
            if ( pDbData )
            {
                pDbData->GetName( aString );
                if ( !pDbData->IsInternalUnnamed()
                     && !pDbData->IsInternalForAutoFilter() )
                    aEdName.InsertEntry( aString );
            }
        }
    }
    else
    {
        aBtnAdd.SetText( aStrAdd );
        aBtnAdd.Disable();
        aBtnRemove.Disable();
    }
    //-----------------------------------------------------------
    aEdName.SetUpdateMode( sal_True );
    aEdName.Invalidate();
}

//------------------------------------------------------------------------

void ScDbNameDlg::UpdateDBData( const String& rStrName )
{
	String		theArea;
	sal_uInt16 		nAt;
	ScDBData*	pData;

	aLocalDbCol.SearchName( rStrName, nAt );
	pData = (ScDBData*)(aLocalDbCol.At( nAt ));

	if ( pData )
	{
		SCCOL nColStart = 0;
		SCROW nRowStart = 0;
		SCCOL nColEnd	 = 0;
		SCROW nRowEnd	 = 0;
		SCTAB nTab		 = 0;

		pData->GetArea( nTab, nColStart, nRowStart, nColEnd, nRowEnd );
		theCurArea = ScRange( ScAddress( nColStart, nRowStart, nTab ),
							  ScAddress( nColEnd,	nRowEnd,   nTab ) );
		theCurArea.Format( theArea, ABS_DREF3D, pDoc, aAddrDetails );
		aEdAssign.SetText( theArea );
		aBtnAdd.SetText( aStrModify );
		aBtnHeader.Check( pData->HasHeader() );
		aBtnDoSize.Check( pData->IsDoSize() );
		aBtnKeepFmt.Check( pData->IsKeepFmt() );
		aBtnStripData.Check( pData->IsStripData() );
		SetInfoStrings( pData );
	}

	aBtnAdd.SetText( aStrModify );
	aBtnAdd.Enable();
	aBtnRemove.Enable();
	aBtnHeader.Enable();
	aBtnDoSize.Enable();
	aBtnKeepFmt.Enable();
	aBtnStripData.Enable();
	aFTSource.Enable();
	aFTOperations.Enable();
}

//------------------------------------------------------------------------


sal_Bool ScDbNameDlg::IsRefInputMode() const
{
	return bRefInputMode;
}

//------------------------------------------------------------------------
// Handler:
// ========

IMPL_LINK( ScDbNameDlg, OkBtnHdl, void *, EMPTYARG )
{
	AddBtnHdl( 0 );

	// Der View die Aenderungen und die Remove-Liste uebergeben:
	// beide werden nur als Referenz uebergeben, so dass an dieser
	// Stelle keine Speicherleichen entstehen koennen:
	if ( pViewData )
		pViewData->GetView()->
			NotifyCloseDbNameDlg( aLocalDbCol, aRemoveList );

	Close();
	return 0;
}

//------------------------------------------------------------------------

IMPL_LINK_INLINE_START( ScDbNameDlg, CancelBtnHdl, void *, EMPTYARG )
{
	Close();
	return 0;
}
IMPL_LINK_INLINE_END( ScDbNameDlg, CancelBtnHdl, void *, EMPTYARG )

//------------------------------------------------------------------------

IMPL_LINK( ScDbNameDlg, AddBtnHdl, void *, EMPTYARG )
{
	String	aNewName = aEdName.GetText();
	String	aNewArea = aEdAssign.GetText();

	aNewName.EraseLeadingChars( ' ' );
	aNewName.EraseTrailingChars( ' ' );

	if ( aNewName.Len() > 0 && aNewArea.Len() > 0 )
	{
		if ( ScRangeData::IsNameValid( aNewName, pDoc ) )
		{
			//	weil jetzt editiert werden kann, muss erst geparst werden
			ScRange aTmpRange;
			String aText = aEdAssign.GetText();
			if ( aTmpRange.ParseAny( aText, pDoc, aAddrDetails ) & SCA_VALID )
			{
				theCurArea = aTmpRange;
				ScAddress aStart = theCurArea.aStart;
				ScAddress aEnd   = theCurArea.aEnd;

				ScDBData* pOldEntry = NULL;
				sal_uInt16 nFoundAt = 0;
				if ( aLocalDbCol.SearchName( aNewName, nFoundAt ) )
					pOldEntry = aLocalDbCol[nFoundAt];
				if (pOldEntry)
				{
					//	Bereich veraendern

					pOldEntry->MoveTo( aStart.Tab(), aStart.Col(), aStart.Row(),
														aEnd.Col(), aEnd.Row() );
					pOldEntry->SetByRow( sal_True );
					pOldEntry->SetHeader( aBtnHeader.IsChecked() );
					pOldEntry->SetDoSize( aBtnDoSize.IsChecked() );
					pOldEntry->SetKeepFmt( aBtnKeepFmt.IsChecked() );
					pOldEntry->SetStripData( aBtnStripData.IsChecked() );
				}
				else
				{
					//	neuen Bereich einfuegen

					ScDBData* pNewEntry = new ScDBData( aNewName, aStart.Tab(),
														aStart.Col(), aStart.Row(),
														aEnd.Col(), aEnd.Row(),
														sal_True, aBtnHeader.IsChecked() );
					pNewEntry->SetDoSize( aBtnDoSize.IsChecked() );
					pNewEntry->SetKeepFmt( aBtnKeepFmt.IsChecked() );
					pNewEntry->SetStripData( aBtnStripData.IsChecked() );

					if ( !aLocalDbCol.Insert( pNewEntry ) )
						delete pNewEntry;
				}

				UpdateNames();

				aEdName.SetText( EMPTY_STRING );
				aEdName.GrabFocus();
				aBtnAdd.SetText( aStrAdd );
				aBtnAdd.Disable();
				aBtnRemove.Disable();
				aEdAssign.SetText( EMPTY_STRING );
				aBtnHeader.Check( sal_True );		// Default: mit Spaltenkoepfen
				aBtnDoSize.Check( sal_False );
				aBtnKeepFmt.Check( sal_False );
				aBtnStripData.Check( sal_False );
				SetInfoStrings( NULL );		// leer
				theCurArea = ScRange();
				bSaved=sal_True;
				pSaveObj->Save();
				NameModifyHdl( 0 );
			}
			else
			{
				ERRORBOX( aStrInvalid );
				aEdAssign.SetSelection( Selection( 0, SELECTION_MAX ) );
				aEdAssign.GrabFocus();
			}
		}
		else
		{
			ERRORBOX( ScGlobal::GetRscString(STR_INVALIDNAME) );
			aEdName.SetSelection( Selection( 0, SELECTION_MAX ) );
			aEdName.GrabFocus();
		}
	}
	return 0;
}

//------------------------------------------------------------------------

IMPL_LINK( ScDbNameDlg, RemoveBtnHdl, void *, EMPTYARG )
{
	sal_uInt16		 nRemoveAt = 0;
	const String aStrEntry = aEdName.GetText();

	if ( aLocalDbCol.SearchName( aStrEntry, nRemoveAt ) )
	{
		String aStrDelMsg = ScGlobal::GetRscString( STR_QUERY_DELENTRY );
		String aMsg		  = aStrDelMsg.GetToken( 0, '#' );

		aMsg += aStrEntry;
		aMsg += aStrDelMsg.GetToken( 1, '#' );

		if ( RET_YES == QUERYBOX(aMsg) )
		{
			ScDBData* pEntry = (ScDBData*)aLocalDbCol.At(nRemoveAt);

			if ( pEntry )
			{
                SCTAB nTab;
                SCCOL nColStart, nColEnd;
                SCROW nRowStart, nRowEnd;
                pEntry->GetArea( nTab, nColStart, nRowStart, nColEnd, nRowEnd );
				aRemoveList.Insert(
					new ScRange( ScAddress( nColStart, nRowStart, nTab ),
								 ScAddress( nColEnd,   nRowEnd,   nTab ) ) );
			}
			aLocalDbCol.AtFree( nRemoveAt );

			UpdateNames();

			aEdName.SetText( EMPTY_STRING );
			aEdName.GrabFocus();
			aBtnAdd.SetText( aStrAdd );
			aBtnAdd.Disable();
			aBtnRemove.Disable();
			aEdAssign.SetText( EMPTY_STRING );
			theCurArea = ScRange();
			aBtnHeader.Check( sal_True );		// Default: mit Spaltenkoepfen
			aBtnDoSize.Check( sal_False );
			aBtnKeepFmt.Check( sal_False );
			aBtnStripData.Check( sal_False );
			SetInfoStrings( NULL );		// leer
			bSaved=sal_False;
			pSaveObj->Restore();
			NameModifyHdl( 0 );
		}
	}
	return 0;
}

//------------------------------------------------------------------------

IMPL_LINK( ScDbNameDlg, NameModifyHdl, void *, EMPTYARG )
{
	String	theName		= aEdName.GetText();
	sal_Bool	bNameFound  = (COMBOBOX_ENTRY_NOTFOUND
						   != aEdName.GetEntryPos( theName ));

	if ( theName.Len() == 0 )
	{
		if ( aBtnAdd.GetText() != aStrAdd )
			aBtnAdd.SetText( aStrAdd );
		aBtnAdd		.Disable();
		aBtnRemove	.Disable();
        aFlAssign   .Disable();
		aBtnHeader	.Disable();
		aBtnDoSize	.Disable();
		aBtnKeepFmt	.Disable();
		aBtnStripData.Disable();
		aFTSource	.Disable();
		aFTOperations.Disable();
		aEdAssign	.Disable();
		aRbAssign	.Disable();
		//bSaved=sal_False;
		//pSaveObj->Restore();
		//@BugID 54702 Enablen/Disablen nur noch in Basisklasse
		//SFX_APPWINDOW->Disable(sal_False);		//! allgemeine Methode im ScAnyRefDlg
		bRefInputMode = sal_False;
	}
	else
	{
		if ( bNameFound )
		{
			if ( aBtnAdd.GetText() != aStrModify )
				aBtnAdd.SetText( aStrModify );

			if(!bSaved)
			{
				bSaved=sal_True;
				pSaveObj->Save();
			}
			UpdateDBData( theName );
		}
		else
		{
			if ( aBtnAdd.GetText() != aStrAdd )
				aBtnAdd.SetText( aStrAdd );

			bSaved=sal_False;
			pSaveObj->Restore();

			if ( aEdAssign.GetText().Len() > 0 )
			{
				aBtnAdd.Enable();
				aBtnHeader.Enable();
				aBtnDoSize.Enable();
				aBtnKeepFmt.Enable();
				aBtnStripData.Enable();
				aFTSource.Enable();
				aFTOperations.Enable();
			}
			else
			{
				aBtnAdd.Disable();
				aBtnHeader.Disable();
				aBtnDoSize.Disable();
				aBtnKeepFmt.Disable();
				aBtnStripData.Disable();
				aFTSource.Disable();
				aFTOperations.Disable();
			}
			aBtnRemove.Disable();
		}

        aFlAssign.Enable();
		aEdAssign.Enable();
		aRbAssign.Enable();

		//@BugID 54702 Enablen/Disablen nur noch in Basisklasse
		//SFX_APPWINDOW->Enable();
		bRefInputMode = sal_True;
	}
	return 0;
}

//------------------------------------------------------------------------

IMPL_LINK( ScDbNameDlg, AssModifyHdl, void *, EMPTYARG )
{
	//	hier parsen fuer Save() etc.

	ScRange aTmpRange;
	String aText = aEdAssign.GetText();
	if ( aTmpRange.ParseAny( aText, pDoc, aAddrDetails ) & SCA_VALID )
		theCurArea = aTmpRange;

	return 0;
}


