1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _WRONG_HXX 25 #define _WRONG_HXX 26 27 #ifndef _COM_SUN_STAR_SMARTTAGS_XSMARTTAGPROPERTIES_HPP_ 28 #include <com/sun/star/container/XStringKeyMap.hpp> 29 #endif 30 31 #include <com/sun/star/util/Color.hpp> 32 #include <com/sun/star/awt/FontUnderline.hpp> 33 #include <com/sun/star/uno/Any.hxx> 34 35 #include <vector> 36 37 #include <tools/string.hxx> 38 #include <tools/color.hxx> 39 #include <viewopt.hxx> 40 41 class SwWrongList; 42 43 enum WrongAreaLineType 44 { 45 WRONGAREA_DASHED, 46 WRONGAREA_WAVE, 47 WRONGAREA_WAVE_NORMAL, 48 WRONGAREA_WAVE_SMALL, 49 WRONGAREA_WAVE_FLAT, 50 WRONGAREA_NONE 51 }; 52 53 enum WrongListType 54 { 55 WRONGLIST_SPELL, 56 WRONGLIST_GRAMMAR, 57 WRONGLIST_SMARTTAG, 58 WRONGLIST_CHANGETRACKING 59 }; 60 61 62 // ST2 63 class SwWrongArea 64 { 65 public: 66 rtl::OUString maType; 67 com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > mxPropertyBag; 68 xub_StrLen mnPos; 69 xub_StrLen mnLen; 70 SwWrongList* mpSubList; 71 72 Color mColor; 73 WrongAreaLineType mLineType; 74 75 SwWrongArea( const rtl::OUString& rType, 76 WrongListType listType, 77 com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag, 78 xub_StrLen nPos, 79 xub_StrLen nLen); 80 81 SwWrongArea( const rtl::OUString& rType, 82 com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag, 83 xub_StrLen nPos, 84 xub_StrLen nLen, 85 SwWrongList* pSubList); 86 private: 87 SwWrongArea()88 SwWrongArea() : mnPos(0), mnLen(0), mpSubList(NULL), mColor(0,0,0), mLineType(WRONGAREA_WAVE) {} 89 getSmartColor(com::sun::star::uno::Reference<com::sun::star::container::XStringKeyMap> xPropertyBag)90 Color getSmartColor ( com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag) 91 { 92 try 93 { 94 if (xPropertyBag.is()) 95 { 96 const ::rtl::OUString colorKey = ::rtl::OUString::createFromAscii ("LineColor"); 97 com::sun::star::uno::Any aLineColor = xPropertyBag->getValue(colorKey).get< com::sun::star::uno::Any>(); 98 com::sun::star::util::Color lineColor = 0; 99 100 if (aLineColor >>= lineColor) 101 { 102 return Color( lineColor ); 103 } 104 } 105 } 106 catch(::com::sun::star::container::NoSuchElementException& ) 107 { 108 } 109 catch(::com::sun::star::uno::RuntimeException& ) 110 { 111 } 112 113 return SwViewOption::GetSmarttagColor( ); 114 } 115 getSmartLineType(com::sun::star::uno::Reference<com::sun::star::container::XStringKeyMap> xPropertyBag)116 WrongAreaLineType getSmartLineType( com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag ) 117 { 118 try 119 { 120 if (xPropertyBag.is()) 121 { 122 const ::rtl::OUString typeKey = ::rtl::OUString::createFromAscii ("LineType"); 123 com::sun::star::uno::Any aLineType = xPropertyBag->getValue(typeKey).get< com::sun::star::uno::Any>(); 124 ::sal_Int16 lineType = 0; 125 126 if (!(aLineType >>= lineType)) 127 { 128 return WRONGAREA_DASHED; 129 } 130 if (::com::sun::star::awt::FontUnderline::WAVE == lineType) 131 { 132 return WRONGAREA_WAVE_NORMAL; 133 } 134 if (::com::sun::star::awt::FontUnderline::SMALLWAVE == lineType) 135 { 136 return WRONGAREA_WAVE_SMALL; 137 } 138 } 139 } 140 catch(::com::sun::star::container::NoSuchElementException& ) 141 { 142 } 143 catch(::com::sun::star::uno::RuntimeException& ) 144 { 145 } 146 147 return WRONGAREA_DASHED; 148 } 149 getWrongAreaColor(WrongListType listType,com::sun::star::uno::Reference<com::sun::star::container::XStringKeyMap> xPropertyBag)150 Color getWrongAreaColor(WrongListType listType, 151 com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag ) 152 { 153 if (WRONGLIST_SPELL == listType) 154 { 155 return SwViewOption::GetSpellColor(); 156 } 157 else if (WRONGLIST_GRAMMAR == listType) 158 { 159 return Color( COL_LIGHTBLUE ); 160 } 161 else if (WRONGLIST_SMARTTAG == listType) 162 { 163 return getSmartColor(xPropertyBag); 164 } 165 166 return SwViewOption::GetSpellColor(); 167 } 168 getWrongAreaLineType(WrongListType listType,com::sun::star::uno::Reference<com::sun::star::container::XStringKeyMap> xPropertyBag)169 WrongAreaLineType getWrongAreaLineType(WrongListType listType, 170 com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag ) 171 { 172 if (WRONGLIST_SPELL == listType) 173 { 174 return WRONGAREA_WAVE; 175 } 176 else if (WRONGLIST_GRAMMAR == listType) 177 { 178 return WRONGAREA_WAVE; 179 } 180 else if (WRONGLIST_SMARTTAG == listType) 181 { 182 return getSmartLineType(xPropertyBag); 183 } 184 185 return WRONGAREA_WAVE; 186 } 187 188 }; 189 190 class SwWrongList 191 { 192 std::vector<SwWrongArea> maList; 193 WrongListType meType; 194 195 xub_StrLen nBeginInvalid; // Start des ungueltigen Bereichs 196 xub_StrLen nEndInvalid; // Ende des ungueltigen Bereichs 197 ShiftLeft(xub_StrLen & rPos,xub_StrLen nStart,xub_StrLen nEnd)198 void ShiftLeft( xub_StrLen &rPos, xub_StrLen nStart, xub_StrLen nEnd ) 199 { if( rPos > nStart ) rPos = rPos > nEnd ? rPos - nEnd + nStart : nStart; } ShiftRight(xub_StrLen & rPos,xub_StrLen nStart,xub_StrLen nEnd)200 void ShiftRight( xub_StrLen &rPos, xub_StrLen nStart, xub_StrLen nEnd ) 201 { if( rPos >= nStart ) rPos += nStart - nEnd; } 202 void _Invalidate( xub_StrLen nBegin, xub_StrLen nEnd ); 203 204 void Insert(sal_uInt16 nWhere, std::vector<SwWrongArea>::iterator startPos, std::vector<SwWrongArea>::iterator endPos); 205 void Remove( sal_uInt16 nIdx, sal_uInt16 nLen ); 206 207 // forbidden and not implemented 208 SwWrongList& operator= (const SwWrongList &); 209 SwWrongList( const SwWrongList& rCpy ); 210 211 public: 212 SwWrongList( WrongListType eType ); 213 214 virtual ~SwWrongList(); 215 virtual SwWrongList* Clone(); 216 virtual void CopyFrom( const SwWrongList& rCopy ); 217 GetWrongListType() const218 inline WrongListType GetWrongListType() const { return meType; } GetBeginInv() const219 inline xub_StrLen GetBeginInv() const { return nBeginInvalid; } GetEndInv() const220 inline xub_StrLen GetEndInv() const { return nEndInvalid; } InsideInvalid(xub_StrLen nChk) const221 inline sal_Bool InsideInvalid( xub_StrLen nChk ) const 222 { return nChk >= nBeginInvalid && nChk <= nEndInvalid; } 223 void SetInvalid( xub_StrLen nBegin, xub_StrLen nEnd ); Validate()224 inline void Validate(){ nBeginInvalid = STRING_LEN; } 225 void Invalidate( xub_StrLen nBegin, xub_StrLen nEnd ); 226 sal_Bool InvalidateWrong(); 227 sal_Bool Fresh( xub_StrLen &rStart, xub_StrLen &rEnd, xub_StrLen nPos, 228 xub_StrLen nLen, sal_uInt16 nIndex, xub_StrLen nCursorPos ); 229 sal_uInt16 GetWrongPos( xub_StrLen nValue ) const; 230 231 sal_Bool Check( xub_StrLen &rChk, xub_StrLen &rLn ) const; 232 sal_Bool InWrongWord( xub_StrLen &rChk, xub_StrLen &rLn ) const; 233 xub_StrLen NextWrong( xub_StrLen nChk ) const; 234 235 void Move( xub_StrLen nPos, long nDiff ); 236 void ClearList(); 237 238 // Divide the list into two part, the wrong words until nSplitPos will be 239 // removed and transferred to a new SwWrongList. 240 SwWrongList* SplitList( xub_StrLen nSplitPos ); 241 // Join the next SwWrongList, nInsertPos is my own text length, where 242 // the other wrong list has to be inserted. 243 void JoinList( SwWrongList* pNext, xub_StrLen nInsertPos ); 244 Len(sal_uInt16 nIdx) const245 inline xub_StrLen Len( sal_uInt16 nIdx ) const 246 { 247 return nIdx < maList.size() ? maList[nIdx].mnLen : 0; 248 } 249 Pos(sal_uInt16 nIdx) const250 inline xub_StrLen Pos( sal_uInt16 nIdx ) const 251 { 252 return nIdx < maList.size() ? maList[nIdx].mnPos : 0; 253 } 254 Count() const255 inline sal_uInt16 Count() const { return (sal_uInt16)maList.size(); } 256 Insert(const rtl::OUString & rType,com::sun::star::uno::Reference<com::sun::star::container::XStringKeyMap> xPropertyBag,xub_StrLen nNewPos,xub_StrLen nNewLen,sal_uInt16 nWhere)257 inline void Insert( const rtl::OUString& rType, 258 com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag, 259 xub_StrLen nNewPos, xub_StrLen nNewLen, sal_uInt16 nWhere ) 260 { 261 std::vector<SwWrongArea>::iterator i = maList.begin(); 262 if ( nWhere >= maList.size() ) 263 i = maList.end(); // robust 264 else 265 i += nWhere; 266 267 maList.insert(i, SwWrongArea( rType, meType, xPropertyBag, nNewPos, nNewLen) ); 268 } 269 270 void Insert( const rtl::OUString& rType, 271 com::sun::star::uno::Reference< com::sun::star::container::XStringKeyMap > xPropertyBag, 272 xub_StrLen nNewPos, xub_StrLen nNewLen ); 273 SubList(sal_uInt16 nIdx) const274 inline SwWrongList* SubList( sal_uInt16 nIdx ) const 275 { 276 return nIdx < maList.size() ? maList[nIdx].mpSubList : 0; 277 } 278 279 void InsertSubList( xub_StrLen nNewPos, xub_StrLen nNewLen, sal_uInt16 nWhere, SwWrongList* pSubList ); 280 GetElement(sal_uInt16 nIdx) const281 inline const SwWrongArea* GetElement( sal_uInt16 nIdx ) const 282 { 283 return nIdx < maList.size() ? &maList[nIdx] : 0; 284 } 285 void RemoveEntry( xub_StrLen nBegin, xub_StrLen nEnd ); 286 bool LookForEntry( xub_StrLen nBegin, xub_StrLen nEnd ); 287 }; 288 289 #endif 290