xref: /aoo41x/main/svx/source/form/fmsrccfg.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 #include "svx/fmsrccfg.hxx"
31 #include <svl/filerec.hxx>
32 #include <com/sun/star/i18n/TransliterationModules.hpp>
33 #include <comphelper/processfactory.hxx>
34 
35 
36 using namespace ::com::sun::star::uno;
37 using namespace ::com::sun::star::i18n;
38 
39 //........................................................................
40 namespace svxform
41 {
42 //........................................................................
43 
44 	// ====================================================================
45 	// = struct FmSearchParams - Parameter einer Suche
46 	// ====================================================================
47 
48 	//---------------------------------------------------------------------
49 	//--- 20.08.01 18:17:34 -----------------------------------------------
50 
51 	FmSearchParams::FmSearchParams()
52         :nTransliterationFlags( 0 )
53 		,nSearchForType     ( 0 )
54 		,nPosition			( MATCHING_ANYWHERE )
55 		,nLevOther			( 2 )
56 		,nLevShorter		( 2 )
57 		,nLevLonger			( 2 )
58 		,bLevRelaxed		( sal_True )
59         ,bAllFields			( sal_False )
60         ,bUseFormatter		( sal_True )
61 		,bBackwards			( sal_False )
62 		,bWildcard			( sal_False )
63 		,bRegular			( sal_False )
64 		,bApproxSearch		( sal_False )
65 		,bSoundsLikeCJK		( sal_False )
66 	{
67 		nTransliterationFlags =
68 				TransliterationModules_ignoreSpace_ja_JP
69 			|	TransliterationModules_ignoreMiddleDot_ja_JP
70 			|	TransliterationModules_ignoreProlongedSoundMark_ja_JP
71 			|	TransliterationModules_ignoreSeparator_ja_JP
72 			|	TransliterationModules_IGNORE_CASE;
73 	}
74 
75 	//---------------------------------------------------------------------
76 	//--- 21.08.01 13:31:48 -----------------------------------------------
77 
78 	sal_Bool FmSearchParams::isIgnoreWidthCJK( ) const
79 	{
80 		return 0 != (nTransliterationFlags & TransliterationModules_IGNORE_WIDTH);
81 	}
82 
83 	//---------------------------------------------------------------------
84 	//--- 21.08.01 13:32:03 -----------------------------------------------
85 
86 	void FmSearchParams::setIgnoreWidthCJK( sal_Bool _bIgnore )
87 	{
88 		if ( _bIgnore )
89 			nTransliterationFlags |= TransliterationModules_IGNORE_WIDTH;
90 		else
91 			nTransliterationFlags &= ~TransliterationModules_IGNORE_WIDTH;
92 	}
93 
94 	//---------------------------------------------------------------------
95 	//--- 21.08.01 13:47:52 -----------------------------------------------
96 
97 	sal_Bool FmSearchParams::isCaseSensitive( ) const
98 	{
99 	    return 0 == (nTransliterationFlags & TransliterationModules_IGNORE_CASE);
100 	}
101 
102 	//---------------------------------------------------------------------
103 	//--- 21.08.01 13:48:00 -----------------------------------------------
104 
105 	void FmSearchParams::setCaseSensitive( sal_Bool _bCase )
106 	{
107 		if ( _bCase )
108 			nTransliterationFlags &= ~TransliterationModules_IGNORE_CASE;
109 		else
110 			nTransliterationFlags |= TransliterationModules_IGNORE_CASE;
111 	}
112 
113 	// ====================================================================
114 	// = maps from ascii values to int values
115 	// ====================================================================
116 
117 	struct Ascii2Int16
118 	{
119 		const sal_Char*	pAscii;
120 		sal_Int16		nValue;
121 	};
122 
123 	//---------------------------------------------------------------------
124 	//--- 20.08.01 18:28:38 -----------------------------------------------
125 
126 	static const Ascii2Int16* lcl_getSearchForTypeValueMap()
127 	{
128 		static const Ascii2Int16 s_aSearchForTypeMap[] =
129 		{
130 			{ "text",		0 },
131 			{ "null",		1 },
132 			{ "non-null",	2 },
133 			{ NULL,			-1 }
134 		};
135 		return s_aSearchForTypeMap;
136 	}
137 
138 	//---------------------------------------------------------------------
139 	//--- 20.08.01 18:28:38 -----------------------------------------------
140 
141 	static const Ascii2Int16* lcl_getSearchPositionValueMap()
142 	{
143 		static const Ascii2Int16 s_aSearchPositionMap[] =
144 		{
145 			{ "anywhere-in-field",		MATCHING_ANYWHERE },
146 			{ "beginning-of-field",		MATCHING_BEGINNING },
147 			{ "end-of-field",			MATCHING_END },
148 			{ "complete-field",			MATCHING_WHOLETEXT },
149 			{ NULL,						-1 }
150 		};
151 		return s_aSearchPositionMap;
152 	}
153 
154 	//---------------------------------------------------------------------
155 	//--- 20.08.01 18:30:15 -----------------------------------------------
156 
157 	static sal_Int16 lcl_implMapAsciiValue( const ::rtl::OUString& _rAsciiValue, const Ascii2Int16* _pMap )
158 	{
159 		// search the map for the given ascii value
160 		const Ascii2Int16* pSearch = _pMap;
161 		while ( pSearch && pSearch->pAscii )
162 		{
163 			if ( 0 == _rAsciiValue.compareToAscii( pSearch->pAscii ) )
164 				// found
165 				return pSearch->nValue;
166 			++pSearch;
167 		}
168 
169 		DBG_ERROR(
170 			(	::rtl::OString( "lcl_implMapAsciiValue: could not convert the ascii value " )
171 			+=	::rtl::OString( _rAsciiValue.getStr(), _rAsciiValue.getLength(), RTL_TEXTENCODING_ASCII_US )
172 			+=	::rtl::OString( " !" )
173 			).getStr()
174 		);
175 		return -1;
176 	}
177 
178 	//---------------------------------------------------------------------
179 	//--- 20.08.01 18:33:06 -----------------------------------------------
180 
181 	static const sal_Char* lcl_implMapIntValue( const sal_Int16 _nValue, const Ascii2Int16* _pMap )
182 	{
183 		// search the map for the given integer value
184 		const Ascii2Int16* pSearch = _pMap;
185 		while ( pSearch && pSearch->pAscii )
186 		{
187 			if ( _nValue == pSearch->nValue )
188 				// found
189 				return pSearch->pAscii;
190 			++pSearch;
191 		}
192 
193 		DBG_ERROR(
194 			(	::rtl::OString( "lcl_implMapIntValue: could not convert the integer value " )
195 			+=	::rtl::OString::valueOf( (sal_Int32)_nValue )
196 			+=	::rtl::OString( " !" )
197 			).getStr()
198 		);
199 		static const sal_Char* s_pDummy = "";
200 			// just as a fallback ....
201 		return s_pDummy;
202 	}
203 
204 	// ====================================================================
205 	// = class FmSearchConfigItem - ein ConfigItem, dass sich Suchparameter merkt
206 	// ====================================================================
207 
208 #define TA( c )		&c, getCppuType( &c )
209 
210 	//---------------------------------------------------------------------
211 	//--- 20.08.01 18:19:59 -----------------------------------------------
212 
213 	FmSearchConfigItem::FmSearchConfigItem()
214 		:OConfigurationValueContainer( ::comphelper::getProcessServiceFactory(), m_aMutex, "/org.openoffice.Office.DataAccess/FormSearchOptions", CVC_UPDATE_ACCESS | CVC_LAZY_UPDATE, 2 )
215 	{
216 		// register our members so the data exchange with the node values is done automatically
217 
218 		registerExchangeLocation( "SearchHistory",						TA( aHistory ) );
219 		registerExchangeLocation( "LevenshteinOther",					TA( nLevOther ) );
220 		registerExchangeLocation( "LevenshteinShorter",					TA( nLevShorter ) );
221 		registerExchangeLocation( "LevenshteinLonger",					TA( nLevLonger ) );
222 		registerExchangeLocation( "IsLevenshteinRelaxed",				TA( bLevRelaxed ) );
223 		registerExchangeLocation( "IsSearchAllFields",					TA( bAllFields ) );
224 		registerExchangeLocation( "IsUseFormatter",						TA( bUseFormatter ) );
225 		registerExchangeLocation( "IsBackwards",						TA( bBackwards ) );
226 		registerExchangeLocation( "IsWildcardSearch",					TA( bWildcard ) );
227 		registerExchangeLocation( "IsUseRegularExpression",				TA( bRegular ) );
228 		registerExchangeLocation( "IsSimilaritySearch",					TA( bApproxSearch ) );
229 		registerExchangeLocation( "IsUseAsianOptions",					TA( bSoundsLikeCJK ) );
230 
231 		// the properties which need to be translated
232 		registerExchangeLocation( "SearchType",							TA( m_sSearchForType ) );
233 		registerExchangeLocation( "SearchPosition",						TA( m_sSearchPosition ) );
234 
235 		registerExchangeLocation( "IsMatchCase",						TA( m_bIsMatchCase ) );
236 		registerExchangeLocation( "Japanese/IsMatchFullHalfWidthForms",	TA( m_bIsMatchFullHalfWidthForms ) );
237 		registerExchangeLocation( "Japanese/IsMatchHiraganaKatakana",	TA( m_bIsMatchHiraganaKatakana ) );
238 		registerExchangeLocation( "Japanese/IsMatchContractions",		TA( m_bIsMatchContractions ) );
239 		registerExchangeLocation( "Japanese/IsMatchMinusDashCho-on",	TA( m_bIsMatchMinusDashCho_on ) );
240 		registerExchangeLocation( "Japanese/IsMatchRepeatCharMarks",	TA( m_bIsMatchRepeatCharMarks ) );
241 		registerExchangeLocation( "Japanese/IsMatchVariantFormKanji",	TA( m_bIsMatchVariantFormKanji ) );
242 		registerExchangeLocation( "Japanese/IsMatchOldKanaForms",		TA( m_bIsMatchOldKanaForms ) );
243 		registerExchangeLocation( "Japanese/IsMatch_DiZi_DuZu",			TA( m_bIsMatch_DiZi_DuZu ) );
244 		registerExchangeLocation( "Japanese/IsMatch_BaVa_HaFa",			TA( m_bIsMatch_BaVa_HaFa ) );
245 		registerExchangeLocation( "Japanese/IsMatch_TsiThiChi_DhiZi",	TA( m_bIsMatch_TsiThiChi_DhiZi ) );
246 		registerExchangeLocation( "Japanese/IsMatch_HyuIyu_ByuVyu",		TA( m_bIsMatch_HyuIyu_ByuVyu ) );
247 		registerExchangeLocation( "Japanese/IsMatch_SeShe_ZeJe",		TA( m_bIsMatch_SeShe_ZeJe ) );
248 		registerExchangeLocation( "Japanese/IsMatch_IaIya",				TA( m_bIsMatch_IaIya ) );
249 		registerExchangeLocation( "Japanese/IsMatch_KiKu",				TA( m_bIsMatch_KiKu ) );
250 		registerExchangeLocation( "Japanese/IsIgnorePunctuation",		TA( m_bIsIgnorePunctuation ) );
251 		registerExchangeLocation( "Japanese/IsIgnoreWhitespace",		TA( m_bIsIgnoreWhitespace ) );
252 		registerExchangeLocation( "Japanese/IsIgnoreProlongedSoundMark",TA( m_bIsIgnoreProlongedSoundMark ) );
253 		registerExchangeLocation( "Japanese/IsIgnoreMiddleDot",			TA( m_bIsIgnoreMiddleDot ) );
254 
255 		read( );
256 	}
257 
258 	//---------------------------------------------------------------------
259 	//--- 20.08.01 18:19:57 -----------------------------------------------
260 
261 	FmSearchConfigItem::~FmSearchConfigItem()
262 	{
263 		commit( );
264 	}
265 
266 	//---------------------------------------------------------------------
267 	//--- 20.08.01 18:20:48 -----------------------------------------------
268 
269 	void FmSearchConfigItem::implTranslateFromConfig( )
270 	{
271 		// the search-for string
272 		nSearchForType = lcl_implMapAsciiValue( m_sSearchForType, lcl_getSearchForTypeValueMap() );
273 
274 		// the search position
275 		nPosition = lcl_implMapAsciiValue( m_sSearchPosition, lcl_getSearchPositionValueMap() );
276 
277 		// the transliteration flags
278 		nTransliterationFlags = 0;
279 
280 		if ( !m_bIsMatchCase				)	nTransliterationFlags |= TransliterationModules_IGNORE_CASE;
281 		if ( m_bIsMatchFullHalfWidthForms	)	nTransliterationFlags |= TransliterationModules_IGNORE_WIDTH;
282 		if ( m_bIsMatchHiraganaKatakana		)	nTransliterationFlags |= TransliterationModules_IGNORE_KANA;
283 		if ( m_bIsMatchContractions			)	nTransliterationFlags |= TransliterationModules_ignoreSize_ja_JP;
284 		if ( m_bIsMatchMinusDashCho_on		)	nTransliterationFlags |= TransliterationModules_ignoreMinusSign_ja_JP;
285 		if ( m_bIsMatchRepeatCharMarks		)	nTransliterationFlags |= TransliterationModules_ignoreIterationMark_ja_JP;
286 		if ( m_bIsMatchVariantFormKanji		)	nTransliterationFlags |= TransliterationModules_ignoreTraditionalKanji_ja_JP;
287 		if ( m_bIsMatchOldKanaForms			)	nTransliterationFlags |= TransliterationModules_ignoreTraditionalKana_ja_JP;
288 		if ( m_bIsMatch_DiZi_DuZu			)	nTransliterationFlags |= TransliterationModules_ignoreZiZu_ja_JP;
289 		if ( m_bIsMatch_BaVa_HaFa			)	nTransliterationFlags |= TransliterationModules_ignoreBaFa_ja_JP;
290 		if ( m_bIsMatch_TsiThiChi_DhiZi		)	nTransliterationFlags |= TransliterationModules_ignoreTiJi_ja_JP;
291 		if ( m_bIsMatch_HyuIyu_ByuVyu		)	nTransliterationFlags |= TransliterationModules_ignoreHyuByu_ja_JP;
292 		if ( m_bIsMatch_SeShe_ZeJe			)	nTransliterationFlags |= TransliterationModules_ignoreSeZe_ja_JP;
293 		if ( m_bIsMatch_IaIya				)	nTransliterationFlags |= TransliterationModules_ignoreIandEfollowedByYa_ja_JP;
294 		if ( m_bIsMatch_KiKu				)	nTransliterationFlags |= TransliterationModules_ignoreKiKuFollowedBySa_ja_JP;
295 
296 		if ( m_bIsIgnorePunctuation			)	nTransliterationFlags |= TransliterationModules_ignoreSeparator_ja_JP;
297 		if ( m_bIsIgnoreWhitespace			)	nTransliterationFlags |= TransliterationModules_ignoreSpace_ja_JP;
298 		if ( m_bIsIgnoreProlongedSoundMark	)	nTransliterationFlags |= TransliterationModules_ignoreProlongedSoundMark_ja_JP;
299 		if ( m_bIsIgnoreMiddleDot			)	nTransliterationFlags |= TransliterationModules_ignoreMiddleDot_ja_JP;
300 	}
301 
302 	//---------------------------------------------------------------------
303 	//--- 20.08.01 18:42:23 -----------------------------------------------
304 
305 	void FmSearchConfigItem::implTranslateToConfig( )
306 	{
307 		// the search-for string
308 		m_sSearchForType = ::rtl::OUString::createFromAscii( lcl_implMapIntValue( nSearchForType, lcl_getSearchForTypeValueMap() ) );
309 
310 		// the search position
311 		m_sSearchPosition = ::rtl::OUString::createFromAscii( lcl_implMapIntValue( nPosition, lcl_getSearchPositionValueMap() ) );
312 
313 		// the transliteration flags
314 
315 		m_bIsMatchCase					= ( 0 == ( nTransliterationFlags & TransliterationModules_IGNORE_CASE ) );
316 		m_bIsMatchFullHalfWidthForms	= ( 0 != ( nTransliterationFlags & TransliterationModules_IGNORE_WIDTH ) );
317 		m_bIsMatchHiraganaKatakana		= ( 0 != ( nTransliterationFlags & TransliterationModules_IGNORE_KANA ) );
318 		m_bIsMatchContractions			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreSize_ja_JP ) );
319 		m_bIsMatchMinusDashCho_on		= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreMinusSign_ja_JP ) );
320 		m_bIsMatchRepeatCharMarks		= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreIterationMark_ja_JP ) );
321 		m_bIsMatchVariantFormKanji		= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreTraditionalKanji_ja_JP ) );
322 		m_bIsMatchOldKanaForms			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreTraditionalKana_ja_JP ) );
323 		m_bIsMatch_DiZi_DuZu			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreZiZu_ja_JP ) );
324 		m_bIsMatch_BaVa_HaFa			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreBaFa_ja_JP ) );
325 		m_bIsMatch_TsiThiChi_DhiZi		= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreTiJi_ja_JP ) );
326 		m_bIsMatch_HyuIyu_ByuVyu		= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreHyuByu_ja_JP ) );
327 		m_bIsMatch_SeShe_ZeJe			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreSeZe_ja_JP ) );
328 		m_bIsMatch_IaIya				= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreIandEfollowedByYa_ja_JP ) );
329 		m_bIsMatch_KiKu					= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreKiKuFollowedBySa_ja_JP ) );
330 
331 		m_bIsIgnorePunctuation			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreSeparator_ja_JP ) );
332 		m_bIsIgnoreWhitespace			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreSpace_ja_JP ) );
333 		m_bIsIgnoreProlongedSoundMark	= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreProlongedSoundMark_ja_JP ) );
334 		m_bIsIgnoreMiddleDot			= ( 0 != ( nTransliterationFlags & TransliterationModules_ignoreMiddleDot_ja_JP ) );
335 	}
336 
337 	//---------------------------------------------------------------------
338 	//--- 20.08.01 18:20:01 -----------------------------------------------
339 
340 	const FmSearchParams& FmSearchConfigItem::getParams() const
341 	{
342 		// ensure that the properties which are not stored directly are up-to-date
343 		const_cast< FmSearchConfigItem* >( this )->implTranslateFromConfig( );
344 
345 		// and return our FmSearchParams part
346 		return *this;
347 	}
348 
349 	//---------------------------------------------------------------------
350 	//--- 20.08.01 18:41:57 -----------------------------------------------
351 
352 	void FmSearchConfigItem::setParams( const FmSearchParams& _rParams )
353 	{
354 		// copy the FmSearchParams part
355 		*static_cast< FmSearchParams* >( this ) = _rParams;
356 
357 		// translate the settings not represented by a direct config value
358 		implTranslateToConfig();
359 	}
360 
361 //........................................................................
362 }	// namespace svxform
363 //........................................................................
364