xref: /trunk/main/svx/source/form/fmsrccfg.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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