Files
libreoffice/svx/source/form/fmsrccfg.cxx
Jens-Heiner Rechtien fd069bee7e initial import
2000-09-18 16:07:07 +00:00

357 lines
13 KiB
C++

/*************************************************************************
*
* $RCSfile: fmsrccfg.cxx,v $
*
* $Revision: 1.1.1.1 $
*
* last change: $Author: hr $ $Date: 2000-09-18 17:01:17 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef _FMSRCCF_HXX_
#include "fmsrccfg.hxx"
#endif // _FMSRCCF_HXX_
#ifndef _SFXFILEREC_HXX //autogen
#include <svtools/filerec.hxx>
#endif
// ===================================================================================================
// = struct FmSearchParams - Parameter einer Suche
// ===================================================================================================
//------------------------------------------------------------------------
BOOL FmSearchParams::operator ==(const FmSearchParams& rComp) const
{
if (!strHistory.Equals(rComp.strHistory))
return FALSE;
if (nSearchForType != rComp.nSearchForType)
return FALSE;
if (bAllFields != rComp.bAllFields)
return FALSE;
if (nPosition != rComp.nPosition)
return FALSE;
if (bUseFormatter != rComp.bUseFormatter)
return FALSE;
if (bCaseSensitive != rComp.bCaseSensitive)
return FALSE;
if (bBackwards != rComp.bBackwards)
return FALSE;
if (bWildcard != rComp.bWildcard)
return FALSE;
if (bRegular != rComp.bRegular)
return FALSE;
if (bApproxSearch != rComp.bApproxSearch)
return FALSE;
if (bLevRelaxed != rComp.bLevRelaxed)
return FALSE;
if (nLevOther != rComp.nLevOther)
return FALSE;
if (nLevShorter != rComp.nLevShorter)
return FALSE;
if (nLevLonger != rComp.nLevLonger)
return FALSE;
// strSingleSearchField wird nicht mit verglichen : dieser Operator ist nur fuer die persistenten Eigenschaften gedacht,
// und strSingleSearchField ist nicht persistent
return TRUE;
}
// ===================================================================================================
// = class FmSearchConfigItem - ein ConfigItem, dass sich Suchparameter merkt
// ===================================================================================================
#define FM_SEARCH_TAG_PARAMS 1
#define FM_SEARCH_CONFIG_VERSION_SO50 1 // nur in internen Versionen und der 5.1 beta benutzt worden
#define FM_SEARCH_CONFIG_VERSION_SO51 2 // zur 5.1 eingesetzt
#define FM_SEARCH_CONFIG_VERSION_SO52 3 // ab der SRC557
//------------------------------------------------------------------------
FmSearchConfigItem::FmSearchConfigItem() : SfxConfigItem(SFX_ITEMTYPE_SVXSEARCHPARAMS)
{
}
//------------------------------------------------------------------------
INT32 FmSearchConfigItem::CalcCheckSum(const FmSearchParams& aParams, short nFormatVersion)
{
// ziemlich billig, aber es reicht ...
sal_Int32 nReturn = 0;
for (xub_StrLen i=0; i<aParams.strHistory.Len(); ++i)
nReturn += (sal_Int32)aParams.strHistory.GetChar(i);
nReturn += aParams.bAllFields;
nReturn += aParams.nPosition;
nReturn += aParams.bUseFormatter;
nReturn += aParams.bCaseSensitive;
nReturn += aParams.bBackwards;
nReturn += aParams.bWildcard;
nReturn += aParams.bRegular;
nReturn += aParams.bApproxSearch;
nReturn += aParams.bLevRelaxed;
nReturn += aParams.nLevOther;
nReturn += aParams.nLevShorter;
nReturn += aParams.nLevLonger;
if (nFormatVersion >= FM_SEARCH_CONFIG_VERSION_SO52)
nReturn += aParams.nSearchForType;
return nReturn;
}
//------------------------------------------------------------------------
int FmSearchConfigItem::Load(SvStream& rStore)
{
SfxSingleRecordReader aRecord(&rStore);
if (aRecord.GetTag() == FM_SEARCH_TAG_PARAMS)
{
if (aRecord.HasVersion(FM_SEARCH_CONFIG_VERSION_SO51)) // 5.1 oder groesser
{
INT32 nCheckSum;
*aRecord >> nCheckSum;
FmSearchParams aParams;
aParams.strSingleSearchField.Erase();
(*aRecord).ReadByteString(aParams.strHistory, gsl_getSystemTextEncoding());
INT16 nBitField;
*aRecord >> nBitField;
nBitField >>= 0; aParams.bAllFields = nBitField & 0x0001;
nBitField >>= 1; aParams.nPosition = nBitField & 0x0003;
nBitField >>= 2; aParams.bUseFormatter = nBitField & 0x0001;
nBitField >>= 1; aParams.bCaseSensitive = nBitField & 0x0001;
nBitField >>= 1; aParams.bBackwards = nBitField & 0x0001;
nBitField >>= 1; aParams.bWildcard = nBitField & 0x0001;
nBitField >>= 1; aParams.bRegular = nBitField & 0x0001;
nBitField >>= 1; aParams.bApproxSearch = nBitField & 0x0001;
nBitField >>= 1; aParams.bLevRelaxed = nBitField & 0x0001;
*aRecord >> aParams.nLevOther;
*aRecord >> aParams.nLevShorter;
*aRecord >> aParams.nLevLonger;
if (aRecord.HasVersion(FM_SEARCH_CONFIG_VERSION_SO52)) // 5.2 oder groesser
{
nBitField >>= 1; aParams.nSearchForType = nBitField & 0x0003;
}
else
aParams.nSearchForType = 0;
if (nCheckSum == CalcCheckSum(aParams, aRecord.GetVersion()))
{
m_aParams = aParams;
return ERR_OK;
}
}
else if (aRecord.HasVersion(FM_SEARCH_CONFIG_VERSION_SO50))
{
INT32 nCheckSum;
*aRecord >> nCheckSum;
FmSearchParams aParams;
aParams.strSingleSearchField.Erase();
(*aRecord).ReadByteString(aParams.strHistory, gsl_getSystemTextEncoding());
// kleine Verrenkung, da die Bools alle BitFields sind
BOOL bTempBool;
*aRecord >> bTempBool; aParams.bAllFields = bTempBool;
*aRecord >> bTempBool; aParams.bUseFormatter = bTempBool;
*aRecord >> bTempBool; aParams.bCaseSensitive = bTempBool;
*aRecord >> bTempBool; aParams.bBackwards = bTempBool;
*aRecord >> bTempBool; aParams.bWildcard = bTempBool;
*aRecord >> bTempBool; aParams.bRegular = bTempBool;
*aRecord >> bTempBool; aParams.bApproxSearch = bTempBool;
*aRecord >> bTempBool; aParams.bLevRelaxed = bTempBool;
*aRecord >> aParams.nLevOther;
*aRecord >> aParams.nLevShorter;
*aRecord >> aParams.nLevLonger;
USHORT nTempShort;
*aRecord >> nTempShort; aParams.nPosition = nTempShort;
if (nCheckSum == CalcCheckSum(aParams, FM_SEARCH_CONFIG_VERSION_SO50))
{
m_aParams = aParams;
return ERR_OK;
}
}
}
UseDefault();
return ERR_READ;
}
//------------------------------------------------------------------------
BOOL FmSearchConfigItem::Store(SvStream& rStore)
{
SfxSingleRecordWriter aRecord(&rStore, FM_SEARCH_TAG_PARAMS, FM_SEARCH_CONFIG_VERSION_SO52);
// eine Checksumme an den Anfang
INT32 nCheckSum = CalcCheckSum(m_aParams, FM_SEARCH_CONFIG_VERSION_SO52);
*aRecord << nCheckSum;
(*aRecord).WriteByteString(m_aParams.strHistory, gsl_getSystemTextEncoding());
INT16 nBitField = 0;
nBitField |= (INT16(m_aParams.bAllFields & 0x0001)) << 0;
nBitField |= (INT16(m_aParams.nPosition & 0x0003)) << 1;
nBitField |= (INT16(m_aParams.bUseFormatter & 0x0001)) << 3;
nBitField |= (INT16(m_aParams.bCaseSensitive & 0x0001)) << 4;
nBitField |= (INT16(m_aParams.bBackwards & 0x0001)) << 5;
nBitField |= (INT16(m_aParams.bWildcard & 0x0001)) << 6;
nBitField |= (INT16(m_aParams.bRegular & 0x0001)) << 7;
nBitField |= (INT16(m_aParams.bApproxSearch & 0x0001)) << 8;
nBitField |= (INT16(m_aParams.bLevRelaxed & 0x0001)) << 9;
nBitField |= (INT16(m_aParams.nSearchForType & 0x0003)) << 10;
// because of nSearchForType this is format version 5.2
*aRecord << nBitField;
*aRecord << m_aParams.nLevOther;
*aRecord << m_aParams.nLevShorter;
*aRecord << m_aParams.nLevLonger;
return TRUE;
}
//------------------------------------------------------------------------
void FmSearchConfigItem::UseDefault()
{
m_aParams.strHistory.Erase();
m_aParams.strSingleSearchField = String();
m_aParams.bAllFields = FALSE;
m_aParams.nPosition = MATCHING_ANYWHERE;
m_aParams.bUseFormatter = TRUE;
m_aParams.bCaseSensitive = FALSE;
m_aParams.bBackwards = FALSE;
m_aParams.bWildcard = FALSE;
m_aParams.bRegular = FALSE;
m_aParams.bApproxSearch = FALSE;
m_aParams.bLevRelaxed = TRUE;
m_aParams.nLevOther = 2;
m_aParams.nLevShorter = 2;
m_aParams.nLevLonger = 2;
SetDefault(TRUE);
}
// ===================================================================================================
// = class FmSearchConfigAdmin - verwaltet den Zugriff auf das einzige FmSearchConfigItem, das es gibt
// ===================================================================================================
// die statics der Klasse
FmSearchConfigItem* FmSearchConfigAdmin::s_pItem = NULL;
INT32 FmSearchConfigAdmin::s_nUsageCounter = 0;
// die Instanz, die durch ihre globale Instantiierung dafuer sorgt, dass das ConfigItem erst bei
// Programmende aufgeraeumt wird
//FmSearchConfigAdmin g_aEnsureLastPossibleDelete;
// da der FmSearchConfigAdmin einen Usage-Counter hat, wird das von ihm verwaltete Item wirklich erst
// mit dem Beenden des Office endgueltige aufgeraeumt, dann naemlich wird diese Instanz hier weggeworfen.
// Geladen wird es erst bei Benutzung : sobald naemlich jemand von einer FmSearchConfigAdmin-Instanz
// die Params erfragt. Also schadet dieses eine zusaetzliche Objekt niemandem.
DBG_NAME(FmSearchConfigAdmin);
//------------------------------------------------------------------------
FmSearchConfigAdmin::FmSearchConfigAdmin()
{
DBG_CTOR(FmSearchConfigAdmin,NULL);
++s_nUsageCounter;
}
//------------------------------------------------------------------------
FmSearchConfigAdmin::~FmSearchConfigAdmin()
{
if (--s_nUsageCounter == 0)
{
if (s_pItem)
{
s_pItem->StoreConfig(TRUE);
delete s_pItem;
s_pItem = NULL;
}
}
DBG_DTOR(FmSearchConfigAdmin,NULL);
}
//------------------------------------------------------------------------
FmSearchConfigItem* FmSearchConfigAdmin::GetItem() const
{
if (s_pItem)
return s_pItem;
s_pItem = new FmSearchConfigItem;
s_pItem->Initialize();
return s_pItem;
}
//------------------------------------------------------------------------
void FmSearchConfigAdmin::PutParams(const FmSearchParams& rParams)
{
if (GetParams() != rParams)
{
GetItem()->m_aParams = rParams;
GetItem()->SetDefault(FALSE); // damit wird das Ding implizit auch modified gesetzt
}
}