1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <sfx2/htmlmode.hxx>
21 #include <svtools/htmlcfg.hxx>
22 
23 #include <editeng/editids.hrc>
24 #include <editeng/svxacorr.hxx>
25 #include <officecfg/Office/Common.hxx>
26 #include <unotools/localedatawrapper.hxx>
27 #include <vcl/outdev.hxx>
28 #include <swmodule.hxx>
29 #include <viewopt.hxx>
30 #include <wdocsh.hxx>
31 #include <swrect.hxx>
32 #include <crstate.hxx>
33 #include <authratr.hxx>
34 #include <svtools/colorcfg.hxx>
35 #include <svtools/accessibilityoptions.hxx>
36 #include <unotools/configmgr.hxx>
37 #include <unotools/syslocale.hxx>
38 
39 #include <editeng/acorrcfg.hxx>
40 #include <comphelper/lok.hxx>
41 #include <comphelper/configurationlistener.hxx>
42 
43 Color SwViewOption::s_aDocBoundColor(COL_LIGHTGRAY);
44 Color SwViewOption::s_aObjectBoundColor(COL_LIGHTGRAY);
45 Color SwViewOption::s_aDocColor(COL_LIGHTGRAY);
46 Color SwViewOption::s_aAppBackgroundColor(COL_LIGHTGRAY);
47 Color SwViewOption::s_aTableBoundColor(COL_LIGHTGRAY);
48 Color SwViewOption::s_aIndexShadingsColor(COL_LIGHTGRAY);
49 Color SwViewOption::s_aLinksColor(COL_BLUE);
50 Color SwViewOption::s_aVisitedLinksColor(COL_RED);
51 Color SwViewOption::s_aDirectCursorColor(COL_BLUE);
52 Color SwViewOption::s_aTextGridColor(COL_LIGHTGRAY);
53 Color SwViewOption::s_aSpellColor(COL_LIGHTRED);
54 Color SwViewOption::s_aSmarttagColor(COL_LIGHTMAGENTA);
55 Color SwViewOption::s_aFontColor(COL_BLACK);
56 Color SwViewOption::s_aFieldShadingsColor(COL_LIGHTGRAY);
57 Color SwViewOption::s_aSectionBoundColor(COL_LIGHTGRAY);
58 Color SwViewOption::s_aPageBreakColor(COL_BLUE);
59 Color SwViewOption::s_aScriptIndicatorColor(COL_GREEN);
60 Color SwViewOption::s_aShadowColor(COL_GRAY);
61 Color SwViewOption::s_aHeaderFooterMarkColor(COL_BLUE);
62 
63 ViewOptFlags SwViewOption::s_nAppearanceFlags = ViewOptFlags::DocBoundaries|ViewOptFlags::ObjectBoundaries;
64 sal_uInt16 SwViewOption::s_nPixelTwips = 0;   // one pixel on the screen
65 
IsEqualFlags(const SwViewOption & rOpt) const66 bool SwViewOption::IsEqualFlags( const SwViewOption &rOpt ) const
67 {
68     return  m_nCoreOptions == rOpt.m_nCoreOptions
69             && m_nCore2Options == rOpt.m_nCore2Options
70             && m_aSnapSize    == rOpt.m_aSnapSize
71             && mnViewLayoutColumns == rOpt.mnViewLayoutColumns
72             && m_nDivisionX   == rOpt.GetDivisionX()
73             && m_nDivisionY   == rOpt.GetDivisionY()
74             && m_nPagePreviewRow == rOpt.GetPagePrevRow()
75             && m_nPagePreviewCol == rOpt.GetPagePrevCol()
76             && m_aRetouchColor == rOpt.GetRetoucheColor()
77             && mbFormView == rOpt.IsFormView()
78             && mbBrowseMode == rOpt.getBrowseMode()
79             && mbViewLayoutBookMode == rOpt.mbViewLayoutBookMode
80             && mbHideWhitespaceMode == rOpt.mbHideWhitespaceMode
81             && m_bShowPlaceHolderFields == rOpt.m_bShowPlaceHolderFields
82             && m_bIdle == rOpt.m_bIdle
83             && m_nDefaultAnchor == rOpt.m_nDefaultAnchor
84 #ifdef DBG_UTIL
85             // correspond to the statements in ui/config/cfgvw.src
86             && m_bTest1 == rOpt.IsTest1()
87             && m_bTest2 == rOpt.IsTest2()
88             && m_bTest3 == rOpt.IsTest3()
89             && m_bTest4 == rOpt.IsTest4()
90             && m_bTest5 == rOpt.IsTest5()
91             && m_bTest6 == rOpt.IsTest6()
92             && m_bTest7 == rOpt.IsTest7()
93             && m_bTest8 == rOpt.IsTest8()
94             && m_bTest10 == rOpt.IsTest10()
95 #endif
96             ;
97 }
98 
IsShowOutlineContentVisibilityButton() const99 bool SwViewOption::IsShowOutlineContentVisibilityButton() const
100 {
101     return officecfg::Office::Common::Misc::ExperimentalMode::get() &&
102         (m_nCoreOptions & ViewOptFlags1::ShowOutlineContentVisibilityButton);
103 }
104 
IsTreatSubOutlineLevelsAsContent() const105 bool SwViewOption::IsTreatSubOutlineLevelsAsContent() const
106 {
107     return officecfg::Office::Common::Misc::ExperimentalMode::get() &&
108         (m_nCoreOptions & ViewOptFlags1::TreatSubOutlineLevelsAsContent);
109 }
110 
DrawRect(OutputDevice * pOut,const SwRect & rRect,::Color nCol)111 void SwViewOption::DrawRect( OutputDevice *pOut,
112                              const SwRect &rRect, ::Color nCol )
113 {
114     if ( pOut->GetOutDevType() != OUTDEV_PRINTER )
115     {
116         const Color aCol( nCol );
117         const Color aOldColor( pOut->GetFillColor() );
118         pOut->SetFillColor( aCol );
119         pOut->DrawRect( rRect.SVRect() );
120         pOut->SetFillColor( aOldColor );
121     }
122     else
123         DrawRectPrinter( pOut, rRect );
124 }
125 
DrawRectPrinter(OutputDevice * pOut,const SwRect & rRect)126 void SwViewOption::DrawRectPrinter( OutputDevice *pOut,
127                                     const SwRect &rRect )
128 {
129     Color aOldColor(pOut->GetLineColor());
130     Color aOldFillColor( pOut->GetFillColor() );
131     pOut->SetLineColor( COL_BLACK );
132     pOut->SetFillColor( COL_TRANSPARENT);
133     pOut->DrawRect( rRect.SVRect() );
134     pOut->SetFillColor( aOldFillColor );
135     pOut->SetLineColor( aOldColor );
136 }
137 
GetPostItsWidth(const OutputDevice * pOut)138 sal_uInt16 SwViewOption::GetPostItsWidth( const OutputDevice *pOut )
139 {
140     assert(pOut && "no Outdev");
141     return sal_uInt16(pOut->GetTextWidth("  "));
142 }
143 
PaintPostIts(OutputDevice * pOut,const SwRect & rRect,bool bIsScript)144 void SwViewOption::PaintPostIts( OutputDevice *pOut, const SwRect &rRect, bool bIsScript )
145 {
146     if( !(pOut && bIsScript) )
147         return;
148 
149     Color aOldLineColor( pOut->GetLineColor() );
150     pOut->SetLineColor( COL_GRAY );
151     // to make it look nice, we subtract two pixels everywhere
152     sal_uInt16 nPix = s_nPixelTwips * 2;
153     if( rRect.Width() <= 2 * nPix || rRect.Height() <= 2 * nPix )
154         nPix = 0;
155     const Point aTopLeft(  rRect.Left()  + nPix, rRect.Top()    + nPix );
156     const Point aBotRight( rRect.Right() - nPix, rRect.Bottom() - nPix );
157     const SwRect aRect( aTopLeft, aBotRight );
158     DrawRect( pOut, aRect, s_aScriptIndicatorColor );
159     pOut->SetLineColor( aOldLineColor );
160 }
161 
SwViewOption()162 SwViewOption::SwViewOption() :
163     m_sSymbolFont( "symbol" ),
164     m_aRetouchColor( COL_TRANSPARENT ),
165     mnViewLayoutColumns( 0 ),
166     m_nPagePreviewRow( 1 ),
167     m_nPagePreviewCol( 2 ),
168     m_nShadowCursorFillMode( SwFillMode::Tab ),
169     m_bReadonly(false),
170     m_bStarOneSetting(false),
171     m_bIsPagePreview(false),
172     m_bSelectionInReadonly(false),
173     mbFormView(false),
174     mbBrowseMode(false),
175     mbBookView(false),
176     mbViewLayoutBookMode(false),
177     mbHideWhitespaceMode(false),
178     m_bShowPlaceHolderFields( true ),
179     m_nZoom( 100 ),
180     m_eZoom( SvxZoomType::PERCENT ),
181     m_nTableDestination(TBL_DEST_CELL)
182 {
183     // Initialisation is a little simpler now
184     // all Bits to 0
185     m_nCoreOptions =
186         ViewOptFlags1::HardBlank |
187         ViewOptFlags1::SoftHyph |
188         ViewOptFlags1::Ref |
189         ViewOptFlags1::Graphic |
190         ViewOptFlags1::Table |
191         ViewOptFlags1::Draw |
192         ViewOptFlags1::Control |
193         ViewOptFlags1::Pageback |
194         ViewOptFlags1::Postits;
195 
196     m_nCore2Options =
197         ViewOptCoreFlags2::BlackFont |
198         ViewOptCoreFlags2::HiddenPara;
199 
200     m_nUIOptions =
201         ViewOptFlags2::Modified |
202         ViewOptFlags2::GrfKeepZoom |
203         ViewOptFlags2::ResolvedPostits |
204         ViewOptFlags2::AnyRuler;
205 
206     if (!utl::ConfigManager::IsFuzzing() && MeasurementSystem::Metric != SvtSysLocale().GetLocaleData().getMeasurementSystemEnum())
207     {
208         m_aSnapSize.setWidth(720);   // 1/2"
209         m_aSnapSize.setHeight(720);   // 1/2"
210 
211     }
212     else
213     {
214         m_aSnapSize.setWidth(567);   // 1 cm
215         m_aSnapSize.setHeight(567);   // 1 cm
216     }
217     m_nDivisionX = m_nDivisionY = 1;
218 
219     m_bSelectionInReadonly = !utl::ConfigManager::IsFuzzing() && SW_MOD()->GetAccessibilityOptions().IsSelectionInReadonly();
220 
221     m_bIdle = true;
222 
223     m_nDefaultAnchor = 1; //FLY_TO_CHAR
224 
225 #ifdef DBG_UTIL
226     // correspond to the statements in ui/config/cfgvw.src
227     m_bTest1 = m_bTest2 = m_bTest3 = m_bTest4 =
228              m_bTest5 = m_bTest6 = m_bTest7 = m_bTest8 = m_bTest10 = false;
229 #endif
230     if (comphelper::LibreOfficeKit::isActive())
231         s_aAppBackgroundColor = COL_TRANSPARENT;
232 }
233 
SwViewOption(const SwViewOption & rVOpt)234 SwViewOption::SwViewOption(const SwViewOption& rVOpt)
235 {
236     m_bReadonly = false;
237     m_bSelectionInReadonly = false;
238     // #114856# Form view
239     mbFormView       = rVOpt.mbFormView;
240     m_nZoom           = rVOpt.m_nZoom       ;
241     m_aSnapSize       = rVOpt.m_aSnapSize   ;
242     mnViewLayoutColumns = rVOpt.mnViewLayoutColumns ;
243     m_nDivisionX      = rVOpt.m_nDivisionX  ;
244     m_nDivisionY      = rVOpt.m_nDivisionY  ;
245     m_nPagePreviewRow    = rVOpt.m_nPagePreviewRow;
246     m_nPagePreviewCol    = rVOpt.m_nPagePreviewCol;
247     m_bIsPagePreview  = rVOpt.m_bIsPagePreview;
248     m_eZoom           = rVOpt.m_eZoom       ;
249     m_nTableDestination        = rVOpt.m_nTableDestination    ;
250     m_nUIOptions      = rVOpt.m_nUIOptions  ;
251     m_nCoreOptions    = rVOpt.m_nCoreOptions  ;
252     m_nCore2Options   = rVOpt.m_nCore2Options  ;
253     m_aRetouchColor  = rVOpt.GetRetoucheColor();
254     m_sSymbolFont     = rVOpt.m_sSymbolFont;
255     m_nShadowCursorFillMode = rVOpt.m_nShadowCursorFillMode;
256     m_bStarOneSetting = rVOpt.m_bStarOneSetting;
257     mbBookView      = rVOpt.mbBookView;
258     mbBrowseMode    = rVOpt.mbBrowseMode;
259     mbViewLayoutBookMode = rVOpt.mbViewLayoutBookMode;
260     mbHideWhitespaceMode = rVOpt.mbHideWhitespaceMode;
261     m_bShowPlaceHolderFields = rVOpt.m_bShowPlaceHolderFields;
262     m_bIdle           = rVOpt.m_bIdle;
263     m_nDefaultAnchor  = rVOpt.m_nDefaultAnchor;
264 
265 #ifdef DBG_UTIL
266     m_bTest1  = rVOpt.m_bTest1;
267     m_bTest2  = rVOpt.m_bTest2;
268     m_bTest3  = rVOpt.m_bTest3;
269     m_bTest4  = rVOpt.m_bTest4;
270     m_bTest5  = rVOpt.m_bTest5;
271     m_bTest6  = rVOpt.m_bTest6;
272     m_bTest7  = rVOpt.m_bTest7;
273     m_bTest8  = rVOpt.m_bTest8;
274     m_bTest10 = rVOpt.m_bTest10;
275 #endif
276 }
277 
operator =(const SwViewOption & rVOpt)278 SwViewOption& SwViewOption::operator=( const SwViewOption &rVOpt )
279 {
280     // #114856# Form view
281     mbFormView       = rVOpt.mbFormView   ;
282     m_nZoom           = rVOpt.m_nZoom       ;
283     m_aSnapSize       = rVOpt.m_aSnapSize   ;
284     mnViewLayoutColumns = rVOpt.mnViewLayoutColumns ;
285     m_nDivisionX      = rVOpt.m_nDivisionX  ;
286     m_nDivisionY      = rVOpt.m_nDivisionY  ;
287     m_nPagePreviewRow    = rVOpt.m_nPagePreviewRow;
288     m_nPagePreviewCol    = rVOpt.m_nPagePreviewCol;
289     m_bIsPagePreview  = rVOpt.m_bIsPagePreview;
290     m_eZoom           = rVOpt.m_eZoom       ;
291     m_nTableDestination        = rVOpt.m_nTableDestination    ;
292     m_nUIOptions      = rVOpt.m_nUIOptions  ;
293     m_nCoreOptions    = rVOpt.m_nCoreOptions;
294     m_nCore2Options   = rVOpt.m_nCore2Options;
295     m_aRetouchColor  = rVOpt.GetRetoucheColor();
296     m_sSymbolFont     = rVOpt.m_sSymbolFont;
297     m_nShadowCursorFillMode = rVOpt.m_nShadowCursorFillMode;
298     m_bStarOneSetting = rVOpt.m_bStarOneSetting;
299     mbBookView      = rVOpt.mbBookView;
300     mbBrowseMode    = rVOpt.mbBrowseMode;
301     mbViewLayoutBookMode = rVOpt.mbViewLayoutBookMode;
302     mbHideWhitespaceMode = rVOpt.mbHideWhitespaceMode;
303     m_bShowPlaceHolderFields = rVOpt.m_bShowPlaceHolderFields;
304     m_bIdle           = rVOpt.m_bIdle;
305     m_nDefaultAnchor  = rVOpt.m_nDefaultAnchor;
306 
307 #ifdef DBG_UTIL
308     m_bTest1  = rVOpt.m_bTest1;
309     m_bTest2  = rVOpt.m_bTest2;
310     m_bTest3  = rVOpt.m_bTest3;
311     m_bTest4  = rVOpt.m_bTest4;
312     m_bTest5  = rVOpt.m_bTest5;
313     m_bTest6  = rVOpt.m_bTest6;
314     m_bTest7  = rVOpt.m_bTest7;
315     m_bTest8  = rVOpt.m_bTest8;
316     m_bTest10 = rVOpt.m_bTest10;
317 #endif
318     return *this;
319 }
320 
~SwViewOption()321 SwViewOption::~SwViewOption()
322 {
323 }
324 
Init(const OutputDevice * pWin)325 void SwViewOption::Init(const OutputDevice* pWin)
326 {
327     if( !s_nPixelTwips && pWin )
328     {
329         s_nPixelTwips = o3tl::narrowing<sal_uInt16>(pWin->PixelToLogic( Size(1,1) ).Height());
330     }
331 }
332 
IsAutoCompleteWords()333 bool SwViewOption::IsAutoCompleteWords()
334 {
335     const SvxSwAutoFormatFlags& rFlags = SvxAutoCorrCfg::Get().GetAutoCorrect()->GetSwFlags();
336     return rFlags.bAutoCmpltCollectWords;
337 }
338 
SetOnlineSpell(bool b)339 void SwViewOption::SetOnlineSpell(bool b)
340 {
341     if (b)
342         m_nCoreOptions |= ViewOptFlags1::OnlineSpell;
343     else
344         m_nCoreOptions &= ~ViewOptFlags1::OnlineSpell;
345 }
346 
AuthorCharAttr()347 AuthorCharAttr::AuthorCharAttr() :
348     m_nItemId (SID_ATTR_CHAR_UNDERLINE),
349     m_nAttr   (LINESTYLE_SINGLE),
350     m_nColor  (COL_TRANSPARENT)
351 {
352 }
353 
GetHtmlMode(const SwDocShell * pShell)354 sal_uInt16      GetHtmlMode(const SwDocShell* pShell)
355 {
356     sal_uInt16 nRet = 0;
357     if(!pShell || dynamic_cast<const SwWebDocShell*>( pShell) )
358     {
359         nRet = HTMLMODE_ON | HTMLMODE_SOME_STYLES;
360         SvxHtmlOptions& rHtmlOpt = SvxHtmlOptions::Get();
361         switch ( rHtmlOpt.GetExportMode() )
362         {
363             case HTML_CFG_MSIE:
364                 nRet |= HTMLMODE_FULL_STYLES;
365             break;
366             case HTML_CFG_NS40:
367                 // no special features for this browser
368             break;
369             case HTML_CFG_WRITER:
370                 nRet |= HTMLMODE_FULL_STYLES;
371             break;
372         }
373     }
374     return nRet;
375 }
376 
GetDefaultAnchorType() const377 RndStdIds SwViewOption::GetDefaultAnchorType() const
378 {
379     switch ( m_nDefaultAnchor )
380     {
381       case 0:
382         return RndStdIds::FLY_AT_PARA; //0
383       case 1:
384         return RndStdIds::FLY_AT_CHAR; //4
385       case 2:
386         return RndStdIds::FLY_AS_CHAR; //1
387       default:
388         return RndStdIds::FLY_AT_CHAR; //4
389     }//switch
390 }
391 
GetDocColor()392 Color&   SwViewOption::GetDocColor()
393 {
394     return s_aDocColor;
395 }
396 
GetDocBoundariesColor()397 Color&   SwViewOption::GetDocBoundariesColor()
398 {
399     return s_aDocBoundColor;
400 }
401 
GetObjectBoundariesColor()402 Color&   SwViewOption::GetObjectBoundariesColor()
403 {
404     return s_aObjectBoundColor;
405 }
406 
GetAppBackgroundColor()407 Color& SwViewOption::GetAppBackgroundColor()
408 {
409     return s_aAppBackgroundColor;
410 }
411 
GetTableBoundariesColor()412 Color&   SwViewOption::GetTableBoundariesColor()
413 {
414     return s_aTableBoundColor;
415 }
416 
GetIndexShadingsColor()417 Color&   SwViewOption::GetIndexShadingsColor()
418 {
419     return s_aIndexShadingsColor;
420 }
421 
GetLinksColor()422 Color&   SwViewOption::GetLinksColor()
423 {
424     return s_aLinksColor;
425 }
426 
GetVisitedLinksColor()427 Color&   SwViewOption::GetVisitedLinksColor()
428 {
429     return s_aVisitedLinksColor;
430 }
431 
GetDirectCursorColor()432 Color&   SwViewOption::GetDirectCursorColor()
433 {
434     return s_aDirectCursorColor;
435 }
436 
GetTextGridColor()437 Color&   SwViewOption::GetTextGridColor()
438 {
439     return s_aTextGridColor;
440 }
441 
GetSpellColor()442 Color&   SwViewOption::GetSpellColor()
443 {
444     return s_aSpellColor;
445 }
446 
GetSmarttagColor()447 Color&   SwViewOption::GetSmarttagColor()
448 {
449     return s_aSmarttagColor;
450 }
451 
GetShadowColor()452 Color&   SwViewOption::GetShadowColor()
453 {
454     return s_aShadowColor;
455 }
456 
GetFontColor()457 Color&   SwViewOption::GetFontColor()
458 {
459     return s_aFontColor;
460 }
461 
GetFieldShadingsColor()462 Color&   SwViewOption::GetFieldShadingsColor()
463 {
464     return s_aFieldShadingsColor;
465 }
466 
GetSectionBoundColor()467 Color&   SwViewOption::GetSectionBoundColor()
468 {
469     return s_aSectionBoundColor;
470 }
471 
GetPageBreakColor()472 Color& SwViewOption::GetPageBreakColor()
473 {
474     return s_aPageBreakColor;
475 }
476 
GetHeaderFooterMarkColor()477 Color& SwViewOption::GetHeaderFooterMarkColor()
478 {
479     return s_aHeaderFooterMarkColor;
480 }
481 
ApplyColorConfigValues(const svtools::ColorConfig & rConfig)482 void SwViewOption::ApplyColorConfigValues(const svtools::ColorConfig& rConfig )
483 {
484     s_aDocColor = rConfig.GetColorValue(svtools::DOCCOLOR).nColor;
485 
486     svtools::ColorConfigValue aValue = rConfig.GetColorValue(svtools::DOCBOUNDARIES);
487     s_aDocBoundColor = aValue.nColor;
488     s_nAppearanceFlags = ViewOptFlags::NONE;
489     if(aValue.bIsVisible)
490         s_nAppearanceFlags |= ViewOptFlags::DocBoundaries;
491 
492     s_aAppBackgroundColor = rConfig.GetColorValue(svtools::APPBACKGROUND).nColor;
493 
494     aValue = rConfig.GetColorValue(svtools::OBJECTBOUNDARIES);
495     s_aObjectBoundColor = aValue.nColor;
496     if(aValue.bIsVisible)
497         s_nAppearanceFlags |= ViewOptFlags::ObjectBoundaries;
498 
499     aValue = rConfig.GetColorValue(svtools::TABLEBOUNDARIES);
500     s_aTableBoundColor = aValue.nColor;
501     if(aValue.bIsVisible)
502         s_nAppearanceFlags |= ViewOptFlags::TableBoundaries;
503 
504     aValue = rConfig.GetColorValue(svtools::WRITERIDXSHADINGS);
505     s_aIndexShadingsColor = aValue.nColor;
506     if(aValue.bIsVisible)
507         s_nAppearanceFlags |= ViewOptFlags::IndexShadings;
508 
509     aValue = rConfig.GetColorValue(svtools::LINKS);
510     s_aLinksColor = aValue.nColor;
511     if(aValue.bIsVisible)
512         s_nAppearanceFlags |= ViewOptFlags::Links;
513 
514     aValue = rConfig.GetColorValue(svtools::LINKSVISITED);
515     s_aVisitedLinksColor = aValue.nColor;
516     if(aValue.bIsVisible)
517         s_nAppearanceFlags |= ViewOptFlags::VisitedLinks;
518 
519     aValue = rConfig.GetColorValue(svtools::SHADOWCOLOR);
520     s_aShadowColor = aValue.nColor;
521     if(aValue.bIsVisible)
522         s_nAppearanceFlags |= ViewOptFlags::Shadow;
523 
524     s_aDirectCursorColor = rConfig.GetColorValue(svtools::WRITERDIRECTCURSOR).nColor;
525 
526     s_aTextGridColor = rConfig.GetColorValue(svtools::WRITERTEXTGRID).nColor;
527 
528     s_aSpellColor = rConfig.GetColorValue(svtools::SPELL).nColor;
529 
530     s_aSmarttagColor = rConfig.GetColorValue(svtools::SMARTTAGS).nColor;
531 
532     s_aFontColor = rConfig.GetColorValue(svtools::FONTCOLOR).nColor;
533 
534     aValue = rConfig.GetColorValue(svtools::WRITERFIELDSHADINGS);
535     s_aFieldShadingsColor = aValue.nColor;
536     if(aValue.bIsVisible)
537         s_nAppearanceFlags |= ViewOptFlags::FieldShadings;
538 
539     aValue = rConfig.GetColorValue(svtools::WRITERSECTIONBOUNDARIES);
540     s_aSectionBoundColor = aValue.nColor;
541     if(aValue.bIsVisible)
542         s_nAppearanceFlags |= ViewOptFlags::SectionBoundaries;
543 
544     aValue = rConfig.GetColorValue(svtools::WRITERPAGEBREAKS);
545     s_aPageBreakColor = aValue.nColor;
546 
547     aValue = rConfig.GetColorValue(svtools::WRITERHEADERFOOTERMARK);
548     s_aHeaderFooterMarkColor = aValue.nColor;
549 
550     s_aScriptIndicatorColor = rConfig.GetColorValue(svtools::WRITERSCRIPTINDICATOR).nColor;
551 }
552 
SetAppearanceFlag(ViewOptFlags nFlag,bool bSet,bool bSaveInConfig)553 void SwViewOption::SetAppearanceFlag(ViewOptFlags nFlag, bool bSet, bool bSaveInConfig )
554 {
555     if(bSet)
556         s_nAppearanceFlags |= nFlag;
557     else
558         s_nAppearanceFlags &= ~nFlag;
559     if(!bSaveInConfig)
560         return;
561 
562     //create an editable svtools::ColorConfig and store the change
563     svtools::EditableColorConfig aEditableConfig;
564     struct FlagToConfig_Impl
565     {
566         ViewOptFlags                nFlag;
567         svtools::ColorConfigEntry   eEntry;
568     };
569     static const FlagToConfig_Impl aFlags[] =
570     {
571         { ViewOptFlags::DocBoundaries     ,   svtools::DOCBOUNDARIES },
572         { ViewOptFlags::ObjectBoundaries  ,   svtools::OBJECTBOUNDARIES },
573         { ViewOptFlags::TableBoundaries   ,   svtools::TABLEBOUNDARIES },
574         { ViewOptFlags::IndexShadings     ,   svtools::WRITERIDXSHADINGS },
575         { ViewOptFlags::Links             ,   svtools::LINKS },
576         { ViewOptFlags::VisitedLinks      ,   svtools::LINKSVISITED },
577         { ViewOptFlags::FieldShadings     ,   svtools::WRITERFIELDSHADINGS },
578         { ViewOptFlags::SectionBoundaries ,   svtools::WRITERSECTIONBOUNDARIES },
579         { ViewOptFlags::Shadow            ,   svtools::SHADOWCOLOR },
580         { ViewOptFlags::NONE              ,   svtools::ColorConfigEntryCount }
581     };
582     sal_uInt16 nPos = 0;
583     while(aFlags[nPos].nFlag != ViewOptFlags::NONE)
584     {
585         if(nFlag & aFlags[nPos].nFlag)
586         {
587             svtools::ColorConfigValue aValue = aEditableConfig.GetColorValue(aFlags[nPos].eEntry);
588             aValue.bIsVisible = bSet;
589             aEditableConfig.SetColorValue(aFlags[nPos].eEntry, aValue);
590         }
591         nPos++;
592     }
593 }
594 
IsAppearanceFlag(ViewOptFlags nFlag)595 bool SwViewOption::IsAppearanceFlag(ViewOptFlags nFlag)
596 {
597     return bool(s_nAppearanceFlags & nFlag);
598 }
599 
600 namespace{
getWCOptionListener()601 rtl::Reference<comphelper::ConfigurationListener> const & getWCOptionListener()
602 {
603     static rtl::Reference<comphelper::ConfigurationListener> xListener(new comphelper::ConfigurationListener("/org.openoffice.Office.Writer/Cursor/Option"));
604     return xListener;
605 }
606 }
607 
IsIgnoreProtectedArea()608 bool SwViewOption::IsIgnoreProtectedArea()
609 {
610     static comphelper::ConfigurationListenerProperty<bool> gIgnoreProtectedArea(getWCOptionListener(), "IgnoreProtectedArea");
611     return gIgnoreProtectedArea.get();
612 }
613 
614 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
615