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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_starmath.hxx" 26 27 28 #include <sfx2/app.hxx> 29 #include <vcl/virdev.hxx> 30 #include <tools/string.hxx> 31 #include <tools/tenccvt.hxx> 32 #include <osl/thread.h> 33 34 #include <tools/stream.hxx> 35 36 #include "starmath.hrc" 37 38 #include "utility.hxx" 39 #include "dialog.hxx" 40 #include "view.hxx" 41 #include "smdll.hxx" 42 43 44 //////////////////////////////////////////////////////////// 45 46 // return pointer to active SmViewShell, if this is not possible 47 // return 0 instead. 48 //!! Since this method is based on the current focus it is somewhat 49 //!! unreliable and may return unexpected 0 pointers! 50 SmViewShell * SmGetActiveView() 51 { 52 SfxViewShell *pView = SfxViewShell::Current(); 53 return PTR_CAST(SmViewShell, pView); 54 } 55 56 57 //////////////////////////////////////////////////////////// 58 59 60 /**************************************************************************/ 61 62 SmPickList::SmPickList(sal_uInt16 nInitSize, sal_uInt16 nMaxSize) : 63 SfxPtrArr((sal_uInt8) nInitSize, 1) 64 { 65 nSize = nMaxSize; 66 } 67 68 69 SmPickList::~SmPickList() 70 { 71 Clear(); 72 } 73 74 75 SmPickList& SmPickList::operator=(const SmPickList& rList) 76 { 77 sal_uInt16 nPos; 78 79 Clear(); 80 nSize = rList.nSize; 81 for (nPos = 0; nPos < rList.Count(); nPos++) 82 InsertPtr(nPos, CreateItem(rList.Get(nPos))); 83 84 return *this; 85 } 86 87 88 void SmPickList::Insert(const void *pItem) 89 { 90 Remove(pItem); 91 InsertPtr(0, CreateItem(pItem)); 92 93 if (Count() > nSize) 94 { 95 DestroyItem(GetPtr(nSize)); 96 RemovePtr(nSize, 1); 97 } 98 } 99 100 101 void SmPickList::Update(const void *pItem, const void *pNewItem) 102 { 103 sal_uInt16 nPos; 104 105 for (nPos = 0; nPos < Count(); nPos++) 106 if (CompareItem(GetPtr(nPos), pItem)) 107 { 108 DestroyItem(GetPtr(nPos)); 109 GetPtr(nPos) = CreateItem(pNewItem); 110 break; 111 } 112 } 113 114 void SmPickList::Remove(const void *pItem) 115 { 116 sal_uInt16 nPos; 117 118 for (nPos = 0; nPos < Count(); nPos++) 119 if (CompareItem(GetPtr(nPos), pItem)) 120 { 121 DestroyItem(GetPtr(nPos)); 122 RemovePtr(nPos, 1); 123 break; 124 } 125 } 126 127 void SmPickList::Clear() 128 { 129 sal_uInt16 nPos; 130 131 for (nPos = 0; nPos < Count(); nPos++) 132 DestroyItem(GetPtr(nPos)); 133 134 RemovePtr(0, Count()); 135 } 136 137 138 /**************************************************************************/ 139 /**************************************************************************/ 140 141 void * SmFontPickList::CreateItem(const String& /*rString*/) 142 { 143 return new Font(); 144 } 145 146 void * SmFontPickList::CreateItem(const void *pItem) 147 { 148 return new Font(*((Font *) pItem)); 149 } 150 151 void SmFontPickList::DestroyItem(void *pItem) 152 { 153 delete (Font *)pItem; 154 } 155 156 sal_Bool SmFontPickList::CompareItem(const void *pFirstItem, const void *pSecondItem) const 157 { 158 Font *pFirstFont, *pSecondFont; 159 160 pFirstFont = (Font *)pFirstItem; 161 pSecondFont = (Font *)pSecondItem; 162 163 if (pFirstFont->GetName() == pSecondFont->GetName()) 164 if ((pFirstFont->GetFamily() == pSecondFont->GetFamily()) && 165 (pFirstFont->GetCharSet() == pSecondFont->GetCharSet()) && 166 (pFirstFont->GetWeight() == pSecondFont->GetWeight()) && 167 (pFirstFont->GetItalic() == pSecondFont->GetItalic())) 168 return (sal_True); 169 170 return sal_False; 171 } 172 173 String SmFontPickList::GetStringItem(void *pItem) 174 { 175 Font *pFont; 176 String aString; 177 const sal_Char *pDelim = ", "; 178 179 pFont = (Font *)pItem; 180 181 aString = pFont->GetName(); 182 183 if (IsItalic( *pFont )) 184 { 185 aString.AppendAscii( pDelim ); 186 aString += String(SmResId(RID_FONTITALIC)); 187 } 188 if (IsBold( *pFont )) // bold? 189 { 190 aString.AppendAscii( pDelim ); 191 aString += String(SmResId(RID_FONTBOLD)); 192 } 193 194 return (aString); 195 } 196 197 void SmFontPickList::Insert(const Font &rFont) 198 { 199 SmPickList::Insert((void *)&rFont); 200 } 201 202 void SmFontPickList::Update(const Font &rFont, const Font &rNewFont) 203 { 204 SmPickList::Update((void *)&rFont, (void *)&rNewFont); 205 } 206 207 void SmFontPickList::Remove(const Font &rFont) 208 { 209 SmPickList::Remove((void *)&rFont); 210 } 211 212 213 void SmFontPickList::ReadFrom(const SmFontDialog& rDialog) 214 { 215 Insert(rDialog.GetFont()); 216 } 217 218 void SmFontPickList::WriteTo(SmFontDialog& rDialog) const 219 { 220 rDialog.SetFont(Get()); 221 } 222 223 224 /**************************************************************************/ 225 226 227 /**************************************************************************/ 228 229 IMPL_LINK( SmFontPickListBox, SelectHdl, ListBox *, /*pListBox*/ ) 230 { 231 sal_uInt16 nPos; 232 String aString; 233 234 nPos = GetSelectEntryPos(); 235 236 if (nPos != 0) 237 { 238 SmFontPickList::Insert(Get(nPos)); 239 aString = GetEntry(nPos); 240 RemoveEntry(nPos); 241 InsertEntry(aString, 0); 242 } 243 244 SelectEntryPos(0); 245 246 return 0; 247 } 248 249 250 SmFontPickListBox::SmFontPickListBox(Window* pParent, const ResId& rResId, sal_uInt16 nMax) : 251 SmFontPickList(nMax, nMax), 252 ListBox(pParent, rResId) 253 { 254 SetSelectHdl(LINK(this, SmFontPickListBox, SelectHdl)); 255 } 256 257 258 SmFontPickListBox& SmFontPickListBox::operator=(const SmFontPickList& rList) 259 { 260 sal_uInt16 nPos; 261 262 *(SmFontPickList *)this = rList; 263 264 for (nPos = 0; nPos < Count(); nPos++) 265 InsertEntry(GetStringItem(GetPtr(nPos)), nPos); 266 267 if (Count() > 0) 268 SelectEntry(GetStringItem(GetPtr(0))); 269 270 return *this; 271 } 272 273 void SmFontPickListBox::Insert(const Font &rFont) 274 { 275 SmFontPickList::Insert(rFont); 276 277 RemoveEntry(GetStringItem(GetPtr(0))); 278 InsertEntry(GetStringItem(GetPtr(0)), 0); 279 SelectEntry(GetStringItem(GetPtr(0))); 280 281 while (GetEntryCount() > nSize) 282 RemoveEntry(GetEntryCount() - 1); 283 284 return; 285 } 286 287 288 void SmFontPickListBox::Update(const Font &rFont, const Font &rNewFont) 289 { 290 SmFontPickList::Update(rFont, rNewFont); 291 292 // ********************** hier fehlt noch was 293 294 return; 295 } 296 297 298 void SmFontPickListBox::Remove(const Font &rFont) 299 { 300 SmFontPickList::Remove(rFont); 301 302 // ********************** hier fehlt noch was 303 304 return; 305 } 306 307 //////////////////////////////////////// 308 309 sal_Bool IsItalic( const Font &rFont ) 310 { 311 FontItalic eItalic = rFont.GetItalic(); 312 // the code below leaves only _NONE and _DONTKNOW as not italic 313 return eItalic == ITALIC_OBLIQUE || eItalic == ITALIC_NORMAL; 314 } 315 316 317 sal_Bool IsBold( const Font &rFont ) 318 { 319 FontWeight eWeight = rFont.GetWeight(); 320 return eWeight != WEIGHT_DONTKNOW && eWeight > WEIGHT_NORMAL; 321 } 322 323 324 void SmFace::Impl_Init() 325 { 326 SetSize( GetSize() ); 327 SetTransparent( sal_True ); 328 SetAlign( ALIGN_BASELINE ); 329 SetColor( COL_AUTO ); 330 } 331 332 void SmFace::SetSize(const Size& rSize) 333 { 334 Size aSize (rSize); 335 336 // check the requested size against minimum value 337 static int __READONLY_DATA nMinVal = SmPtsTo100th_mm(2); 338 339 if (aSize.Height() < nMinVal) 340 aSize.Height() = nMinVal; 341 342 //! we don't force a maximum value here because this may prevent eg the 343 //! parentheses in "left ( ... right )" from matching up with large 344 //! bodies (eg stack{...} with many entries). 345 //! Of course this is holds only if characters are used and not polygons. 346 347 Font::SetSize(aSize); 348 } 349 350 351 long SmFace::GetBorderWidth() const 352 { 353 if (nBorderWidth < 0) 354 return GetDefaultBorderWidth(); 355 else 356 return nBorderWidth; 357 } 358 359 SmFace & SmFace::operator = (const SmFace &rFace) 360 { 361 Font::operator = (rFace); 362 nBorderWidth = -1; 363 return *this; 364 } 365 366 367 SmFace & operator *= (SmFace &rFace, const Fraction &rFrac) 368 // scales the width and height of 'rFace' by 'rFrac' and returns a 369 // reference to 'rFace'. 370 // It's main use is to make scaling fonts look easier. 371 { const Size &rFaceSize = rFace.GetSize(); 372 373 rFace.SetSize(Size(Fraction(rFaceSize.Width()) *= rFrac, 374 Fraction(rFaceSize.Height()) *= rFrac)); 375 return rFace; 376 } 377 378 379 380