linguistic/source/spelldsp.cxx |   69 ++++++++++++++++++++++++++++++++++++++++-
 linguistic/source/spelldsp.hxx |   10 ++++-
 2 files changed, 76 insertions(+), 3 deletions(-)

New commits:
commit 4d160f28b510ce9277b5d6f85eb83b87beb717fe
Author: László Németh <nem...@numbertext.org>
Date:   Sun Nov 25 00:30:27 2012 +0100

    fdo#37954, #i18737# accept capitalized lowercase custom words
    
    Change-Id: I3f8a7d1912952730151e2444f426aff8b2ba4c97
    Reviewed-on: https://gerrit.libreoffice.org/1162
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Eike Rathke <er...@redhat.com>
    Reviewed-by: Németh László <nem...@numbertext.org>

diff --git a/linguistic/source/spelldsp.cxx b/linguistic/source/spelldsp.cxx
index 03e156e..5c3c974 100644
--- a/linguistic/source/spelldsp.cxx
+++ b/linguistic/source/spelldsp.cxx
@@ -37,6 +37,13 @@
 #include "lngsvcmgr.hxx"
 #include "linguistic/lngprops.hxx"
 
+// values asigned to capitalization types
+#define CAPTYPE_UNKNOWN 0
+#define CAPTYPE_NOCAP   1
+#define CAPTYPE_INITCAP 2
+#define CAPTYPE_ALLCAP  3
+#define CAPTYPE_MIXED   4
+
 using namespace osl;
 using namespace com::sun::star;
 using namespace com::sun::star::beans;
@@ -180,6 +187,7 @@ SpellCheckerDispatcher::SpellCheckerDispatcher( LngSvcMgr 
&rLngSvcMgr ) :
     rMgr    (rLngSvcMgr)
 {
     pCache = NULL;
+    pCharClass = NULL;
 }
 
 
@@ -187,6 +195,7 @@ SpellCheckerDispatcher::~SpellCheckerDispatcher()
 {
     ClearSvcList();
     delete pCache;
+    delete pCharClass;
 }
 
 
@@ -428,8 +437,18 @@ sal_Bool SpellCheckerDispatcher::isValid_Impl(
             GetDicList().is()  &&  IsUseDicList( rProperties, GetPropSet() ))
         {
             Reference< XDictionaryEntry > xTmp( lcl_GetRulingDictionaryEntry( 
aChkWord, nLanguage ) );
-            if (xTmp.is())
+            if (xTmp.is()) {
                 bRes = !xTmp->isNegative();
+            } else {
+                setCharClass(LanguageTag(nLanguage));
+                sal_uInt16 ct = capitalType(aChkWord, pCharClass);
+                if (ct == CAPTYPE_INITCAP || ct == CAPTYPE_ALLCAP) {
+                    Reference< XDictionaryEntry > xTmp2( 
lcl_GetRulingDictionaryEntry( makeLowerCase(aChkWord, pCharClass), nLanguage ) 
);
+                    if (xTmp2.is()) {
+                        bRes = !xTmp2->isNegative();
+                    }
+                }
+            }
         }
     }
 
@@ -811,4 +830,52 @@ void SpellCheckerDispatcher::FlushSpellCache()
         pCache->Flush();
 }
 
+void SpellCheckerDispatcher::setCharClass(const LanguageTag& rLanguageTag)
+{
+    if (!pCharClass)
+        pCharClass = new CharClass(rLanguageTag);
+    pCharClass->setLanguageTag(rLanguageTag);
+}
+
+sal_uInt16 SAL_CALL SpellCheckerDispatcher::capitalType(const OUString& aTerm, 
CharClass * pCC)
+{
+        sal_Int32 tlen = aTerm.getLength();
+        if ((pCC) && (tlen))
+        {
+            String aStr(aTerm);
+            sal_Int32 nc = 0;
+            for (sal_uInt16 tindex = 0; tindex < tlen;  tindex++)
+            {
+                if (pCC->getCharacterType(aStr,tindex) &
+                   ::com::sun::star::i18n::KCharacterType::UPPER) nc++;
+            }
+
+            if (nc == 0)
+                return (sal_uInt16) CAPTYPE_NOCAP;
+            if (nc == tlen)
+                return (sal_uInt16) CAPTYPE_ALLCAP;
+            if ((nc == 1) && (pCC->getCharacterType(aStr,0) &
+                  ::com::sun::star::i18n::KCharacterType::UPPER))
+                return (sal_uInt16) CAPTYPE_INITCAP;
+
+            return (sal_uInt16) CAPTYPE_MIXED;
+        }
+        return (sal_uInt16) CAPTYPE_UNKNOWN;
+}
+
+
+
+OUString SAL_CALL SpellCheckerDispatcher::makeLowerCase(const OUString& aTerm, 
CharClass * pCC)
+{
+    if (pCC)
+        return pCC->lowercase(aTerm);
+    return aTerm;
+}
+
+#undef CAPTYPE_UNKNOWN
+#undef CAPTYPE_NOCAP
+#undef CAPTYPE_INITCAP
+#undef CAPTYPE_ALLCAP
+#undef CAPTYPE_MIXED
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/linguistic/source/spelldsp.hxx b/linguistic/source/spelldsp.hxx
index 2e24ade..e68bc5b 100644
--- a/linguistic/source/spelldsp.hxx
+++ b/linguistic/source/spelldsp.hxx
@@ -41,6 +41,7 @@
 
 #include <boost/shared_ptr.hpp>
 #include <map>
+#include <unotools/charclass.hxx>
 
 class LngSvcMgr;
 
@@ -65,6 +66,7 @@ class SpellCheckerDispatcher :
 
     LngSvcMgr                   &rMgr;
     mutable linguistic::SpellCache      *pCache; // Spell Cache (holds known 
words)
+    CharClass                   * pCharClass;
 
     // disallow copy-constructor and assignment-operator for now
     SpellCheckerDispatcher(const SpellCheckerDispatcher &);
@@ -119,8 +121,13 @@ public:
     virtual DspType GetDspType() const;
 
     void    FlushSpellCache();
-};
 
+private:
+    void setCharClass(const LanguageTag& rLanguageTag);
+    sal_uInt16 SAL_CALL capitalType(const OUString&, CharClass *);
+    OUString SAL_CALL makeLowerCase(const OUString&, CharClass *);
+
+};
 
 inline linguistic::SpellCache & SpellCheckerDispatcher::GetCache() const
 {
@@ -148,7 +155,6 @@ inline ::com::sun::star::uno::Reference<
 }
 
 
-
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to