Line data Source code
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 <sal/config.h>
21 :
22 : #include <bitset>
23 :
24 : #include <svtools/colorcfg.hxx>
25 : #include <svtools/extcolorcfg.hxx>
26 : #include <svtools/headbar.hxx>
27 : #include <svtools/ctrlbox.hxx>
28 : #include <vcl/scrbar.hxx>
29 : #include <svx/xtable.hxx>
30 : #include <unotools/moduleoptions.hxx>
31 : #include <unotools/pathoptions.hxx>
32 : #include <vcl/msgbox.hxx>
33 : #include <vcl/settings.hxx>
34 : #include <vcl/builderfactory.hxx>
35 : #include <boost/scoped_ptr.hpp>
36 : #include <boost/shared_ptr.hpp>
37 : #include <svx/svxdlg.hxx>
38 : #include <helpid.hrc>
39 : #include <dialmgr.hxx>
40 : #include "optcolor.hxx"
41 : #include <cuires.hrc>
42 : #include <svx/dlgutil.hxx>
43 :
44 : using namespace ::com::sun::star;
45 : using namespace ::svtools;
46 :
47 : namespace
48 : {
49 :
50 : // list of default groups
51 : enum Group
52 : {
53 : Group_Unknown = -1,
54 :
55 : Group_General,
56 : Group_Writer,
57 : Group_Html,
58 : Group_Calc,
59 : Group_Draw,
60 : Group_Basic,
61 : Group_Sql,
62 :
63 : nGroupCount
64 : };
65 :
66 : // group data
67 : struct
68 : {
69 : // group
70 : Group eGroup;
71 : // .ui group name
72 : const char *pGroup;
73 : }
74 : const vGroupInfo[] =
75 : {
76 : // the groups are in the same order as in enum Group above
77 : { Group_General, "general" },
78 : { Group_Writer, "writer" },
79 : { Group_Html, "html" },
80 : { Group_Calc, "calc" },
81 : { Group_Draw, "draw" },
82 : { Group_Basic, "basic" },
83 : { Group_Sql, "sql" }
84 : };
85 :
86 : // color config entry data (see ColorConfigWindow_Impl::Entry below)
87 : struct
88 : {
89 : // group
90 : Group eGroup;
91 : //checkbox (or simple text)
92 : const char *pText;
93 : //color listbox
94 : const char *pColor;
95 : //preview box
96 : const char *pPreview;
97 : // has checkbox?
98 : bool bCheckBox;
99 : }
100 : const vEntryInfo[] =
101 : {
102 : #define IDS(Name) \
103 : SAL_STRINGIFY(Name), SAL_STRINGIFY(Name##_lb), SAL_STRINGIFY(Name##_wn), false
104 :
105 : #define IDS_CB(Name) \
106 : SAL_STRINGIFY(Name), SAL_STRINGIFY(Name##_lb), SAL_STRINGIFY(Name##_wn), true
107 :
108 : // The list of these entries (enum ColorConfigEntry) are in colorcfg.hxx.
109 :
110 : { Group_General, IDS(doccolor) },
111 : { Group_General, IDS_CB(docboundaries) },
112 : { Group_General, IDS(appback) },
113 : { Group_General, IDS_CB(objboundaries) },
114 : { Group_General, IDS_CB(tblboundaries) },
115 : { Group_General, IDS(font) },
116 : { Group_General, IDS_CB(unvisitedlinks) },
117 : { Group_General, IDS_CB(visitedlinks) },
118 : { Group_General, IDS(autospellcheck) },
119 : { Group_General, IDS(smarttags) },
120 : { Group_General, IDS_CB(shadows) },
121 :
122 : { Group_Writer, IDS(writergrid) },
123 : { Group_Writer, IDS_CB(field) },
124 : { Group_Writer, IDS_CB(index) },
125 : { Group_Writer, IDS(direct) },
126 : { Group_Writer, IDS(script) },
127 : { Group_Writer, IDS_CB(section) },
128 : { Group_Writer, IDS(hdft) },
129 : { Group_Writer, IDS(pagebreak) },
130 :
131 : { Group_Html, IDS(sgml) },
132 : { Group_Html, IDS(htmlcomment) },
133 : { Group_Html, IDS(htmlkeyword) },
134 : { Group_Html, IDS(unknown) },
135 :
136 : { Group_Calc, IDS(calcgrid) },
137 : { Group_Calc, IDS(brk) },
138 : { Group_Calc, IDS(brkmanual) },
139 : { Group_Calc, IDS(brkauto) },
140 : { Group_Calc, IDS(det) },
141 : { Group_Calc, IDS(deterror) },
142 : { Group_Calc, IDS(ref) },
143 : { Group_Calc, IDS(notes) },
144 :
145 : { Group_Draw, IDS(drawgrid) },
146 :
147 : { Group_Basic, IDS(basicid) },
148 : { Group_Basic, IDS(basiccomment) },
149 : { Group_Basic, IDS(basicnumber) },
150 : { Group_Basic, IDS(basicstring) },
151 : { Group_Basic, IDS(basicop) },
152 : { Group_Basic, IDS(basickeyword) },
153 : { Group_Basic, IDS(error) },
154 :
155 : { Group_Sql, IDS(sqlid) },
156 : { Group_Sql, IDS(sqlnumber) },
157 : { Group_Sql, IDS(sqlstring) },
158 : { Group_Sql, IDS(sqlop) },
159 : { Group_Sql, IDS(sqlkeyword) },
160 : { Group_Sql, IDS(sqlparam) },
161 : { Group_Sql, IDS(sqlcomment) }
162 :
163 : #undef IDS
164 : };
165 :
166 : } // namespace
167 :
168 :
169 : // ColorConfigWindow_Impl
170 :
171 :
172 : class ColorConfigWindow_Impl
173 : : public VclContainer
174 : , public VclBuilderContainer
175 : {
176 : public:
177 : ColorConfigWindow_Impl(vcl::Window* pParent);
178 0 : virtual ~ColorConfigWindow_Impl() { disposeOnce(); }
179 : virtual void dispose() SAL_OVERRIDE;
180 :
181 : public:
182 : void SetLinks (Link<> const&, Link<> const&, Link<> const&);
183 0 : unsigned GetEntryHeight () const { return vEntries[0]->GetHeight(); }
184 : void Update (EditableColorConfig const*, EditableExtendedColorConfig const*);
185 : void ScrollHdl(const ScrollBar&);
186 : void ClickHdl (EditableColorConfig*, CheckBox*);
187 : void ColorHdl (EditableColorConfig*, EditableExtendedColorConfig*, ColorListBox*);
188 : void Init(ScrollBar *pVScroll, HeaderBar *m_pHeaderHB);
189 : void AdjustScrollBar();
190 : void AdjustHeaderBar();
191 :
192 : private:
193 : // Chapter -- horizontal group separator stripe with text
194 : class Chapter
195 : {
196 : // text
197 : VclPtr<FixedText> m_pText;
198 : public:
199 : Chapter(FixedText *pText, bool bShow);
200 : Chapter(vcl::Window *pGrid, unsigned nYPos, const OUString& sDisplayName);
201 : ~Chapter();
202 0 : void dispose() { m_pText.disposeAndClear(); }
203 : public:
204 0 : void SetBackground(const Wallpaper& W) { m_pText->SetBackground(W); }
205 : void Show(const Wallpaper& rBackWall);
206 : void Hide();
207 : };
208 :
209 : // Entry -- a color config entry:
210 : // text (checkbox) + color list box + preview box
211 : class Entry
212 : {
213 : public:
214 : Entry(ColorConfigWindow_Impl& rParent, unsigned iEntry, long nCheckBoxLabelOffset, bool bShow);
215 : Entry(vcl::Window* pGrid, unsigned nYPos, const ExtendedColorConfigValue& aColorEntry,
216 : long nCheckBoxLabelOffset);
217 : ~Entry();
218 : public:
219 : void Show ();
220 : void Hide ();
221 : void SetAppearance(Wallpaper const& aTextWall, ColorListBox const& aSampleList);
222 0 : void SetTextColor (Color C) { m_pText->SetTextColor(C); }
223 : public:
224 : void SetLinks (Link<> const&, Link<> const&, Link<> const&);
225 : void Update (ColorConfigEntry, ColorConfigValue const&);
226 : void Update (ExtendedColorConfigValue const&);
227 : void ColorChanged (ColorConfigEntry, ColorConfigValue&);
228 : void ColorChanged (ExtendedColorConfigValue&);
229 : public:
230 0 : long GetTop () const { return m_pPreview->GetPosPixel().Y(); }
231 0 : unsigned GetHeight () const { return m_pColorList->GetSizePixel().Height(); }
232 : public:
233 0 : bool Is (CheckBox* pBox) const { return m_pText == pBox; }
234 0 : bool Is (ColorListBox* pBox) const { return m_pColorList == pBox; }
235 0 : void dispose()
236 : {
237 0 : m_pText.disposeAndClear();
238 0 : m_pColorList.disposeAndClear();
239 0 : m_pPreview.disposeAndClear();
240 0 : }
241 : private:
242 : bool m_bOwnsWidgets;
243 : // checkbox (CheckBox) or simple text (FixedText)
244 : VclPtr<Control> m_pText;
245 : // color list box
246 : VclPtr<ColorListBox> m_pColorList;
247 : // color preview box
248 : VclPtr<vcl::Window> m_pPreview;
249 : // default color
250 : Color m_aDefaultColor;
251 : private:
252 : void SetColor (Color);
253 : };
254 :
255 : // vChapters -- groups (group headers)
256 : std::vector<boost::shared_ptr<Chapter> > vChapters;
257 : // vEntries -- color options
258 : std::vector<boost::shared_ptr<Entry> > vEntries;
259 :
260 : // module options
261 : SvtModuleOptions aModuleOptions;
262 :
263 :
264 : private:
265 : VclPtr<VclGrid> m_pGrid;
266 : VclPtr<ScrollBar> m_pVScroll;
267 : VclPtr<HeaderBar> m_pHeaderHB;
268 :
269 : // initialization
270 : void CreateEntries();
271 : void SetAppearance();
272 :
273 : private:
274 : virtual void Command (CommandEvent const& rCEvt) SAL_OVERRIDE;
275 : virtual void DataChanged (DataChangedEvent const& rDCEvt) SAL_OVERRIDE;
276 :
277 : virtual Size calculateRequisition() const SAL_OVERRIDE;
278 : virtual void setAllocation(const Size &rAllocation) SAL_OVERRIDE;
279 :
280 : bool IsGroupVisible (Group) const;
281 : };
282 :
283 :
284 : // ColorConfigWindow_Impl::Chapter
285 :
286 :
287 : // ctor for default groups
288 : // rParent: parent window (ColorConfigWindow_Impl)
289 : // eGroup: which group is this?
290 : // rResMgr: resource manager
291 0 : ColorConfigWindow_Impl::Chapter::Chapter(FixedText* pText, bool bShow)
292 0 : : m_pText(pText)
293 : {
294 0 : if (!bShow)
295 0 : Hide();
296 0 : }
297 :
298 : // ctor for extended groups
299 0 : ColorConfigWindow_Impl::Chapter::Chapter(vcl::Window *pGrid,
300 0 : unsigned nYPos, const OUString& rDisplayName)
301 : {
302 0 : m_pText = VclPtr<FixedText>::Create(pGrid, WB_LEFT|WB_VCENTER|WB_3DLOOK);
303 0 : m_pText->set_font_attribute("weight", "bold");
304 0 : m_pText->set_grid_width(3);
305 0 : m_pText->set_grid_left_attach(0);
306 0 : m_pText->set_grid_top_attach(nYPos);
307 0 : m_pText->SetText(rDisplayName);
308 0 : }
309 :
310 0 : ColorConfigWindow_Impl::Chapter::~Chapter()
311 : {
312 : // FIXME: we had an horrible m_bOwnsWidget const
313 0 : m_pText.disposeAndClear();
314 0 : }
315 :
316 0 : void ColorConfigWindow_Impl::Chapter::Show(Wallpaper const& rBackWall)
317 : {
318 : // background
319 0 : m_pText->SetBackground(rBackWall);
320 0 : m_pText->Show();
321 0 : }
322 :
323 0 : void ColorConfigWindow_Impl::Chapter::Hide ()
324 : {
325 0 : m_pText->Hide();
326 0 : }
327 :
328 :
329 : // ColorConfigWindow_Impl::Entry
330 :
331 :
332 0 : ColorConfigWindow_Impl::Entry::Entry(ColorConfigWindow_Impl& rParent, unsigned iEntry,
333 : long nCheckBoxLabelOffset, bool bShow)
334 : : m_bOwnsWidgets(false)
335 0 : , m_aDefaultColor(ColorConfig::GetDefaultColor(static_cast<ColorConfigEntry>(iEntry)))
336 : {
337 0 : rParent.get(m_pText, vEntryInfo[iEntry].pText);
338 0 : if (!vEntryInfo[iEntry].bCheckBox)
339 : {
340 0 : m_pText->set_margin_left(m_pText->get_margin_left() +
341 0 : nCheckBoxLabelOffset);
342 : }
343 0 : rParent.get(m_pColorList, vEntryInfo[iEntry].pColor);
344 0 : rParent.get(m_pPreview, vEntryInfo[iEntry].pPreview);
345 :
346 0 : if (!bShow)
347 0 : Hide();
348 0 : }
349 :
350 : // ctor for extended entries
351 0 : ColorConfigWindow_Impl::Entry::Entry( vcl::Window *pGrid, unsigned nYPos,
352 : ExtendedColorConfigValue const& rColorEntry, long nCheckBoxLabelOffset)
353 : : m_bOwnsWidgets(true)
354 0 : , m_aDefaultColor(rColorEntry.getDefaultColor())
355 : {
356 0 : m_pText = VclPtr<FixedText>::Create(pGrid, WB_LEFT|WB_VCENTER|WB_3DLOOK);
357 0 : m_pText->set_grid_left_attach(0);
358 0 : m_pText->set_grid_top_attach(nYPos);
359 0 : m_pText->set_margin_left(6 + nCheckBoxLabelOffset);
360 0 : m_pText->SetText(rColorEntry.getDisplayName());
361 :
362 0 : WinBits nWinBits = WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_TABSTOP|WB_DROPDOWN;
363 0 : m_pColorList = VclPtr<ColorListBox>::Create(pGrid, nWinBits);
364 0 : m_pColorList->EnableAutoSize(true);
365 0 : m_pColorList->set_grid_left_attach(1);
366 0 : m_pColorList->set_grid_top_attach(nYPos);
367 :
368 0 : m_pPreview = VclPtr<vcl::Window>::Create(pGrid, WB_BORDER);
369 0 : m_pPreview->set_grid_left_attach(2);
370 0 : m_pPreview->set_grid_top_attach(nYPos);
371 0 : m_pPreview->set_margin_right(6);
372 :
373 0 : Show();
374 0 : }
375 :
376 0 : ColorConfigWindow_Impl::Entry::~Entry()
377 : {
378 0 : if (m_bOwnsWidgets)
379 : {
380 0 : m_pText.disposeAndClear();
381 0 : m_pColorList.disposeAndClear();
382 0 : m_pPreview.disposeAndClear();
383 : }
384 0 : }
385 :
386 0 : void ColorConfigWindow_Impl::Entry::Show()
387 : {
388 0 : m_pText->Show();
389 0 : m_pColorList->Show();
390 0 : m_pPreview->Show();
391 0 : }
392 :
393 0 : void ColorConfigWindow_Impl::Entry::Hide()
394 : {
395 0 : m_pText->Hide();
396 0 : m_pColorList->Hide();
397 0 : m_pPreview->Hide();
398 0 : }
399 :
400 : // SetAppearance()
401 : // iEntry: which entry is this?
402 : // aTextWall: background of the text (transparent)
403 : // aSampleList: sample color listbox (to copy from)
404 0 : void ColorConfigWindow_Impl::Entry::SetAppearance(
405 : Wallpaper const& aTextWall,
406 : ColorListBox const& aSampleList)
407 : {
408 : // text (and optionally checkbox)
409 0 : m_pText->SetBackground(aTextWall);
410 : // preview
411 0 : m_pPreview->SetBorderStyle(WindowBorderStyle::MONO);
412 : // color list
413 0 : m_pColorList->CopyEntries(aSampleList);
414 0 : m_pColorList->InsertAutomaticEntryColor(m_aDefaultColor);
415 0 : }
416 :
417 : // SetLinks()
418 0 : void ColorConfigWindow_Impl::Entry::SetLinks(
419 : Link<> const& aCheckLink, Link<> const& aColorLink,
420 : Link<> const& aGetFocusLink)
421 : {
422 0 : m_pColorList->SetSelectHdl(aColorLink);
423 0 : m_pColorList->SetGetFocusHdl(aGetFocusLink);
424 0 : if (CheckBox* pCheckBox = dynamic_cast<CheckBox*>(m_pText.get()))
425 : {
426 0 : pCheckBox->SetClickHdl(aCheckLink);
427 0 : pCheckBox->SetGetFocusHdl(aGetFocusLink);
428 : }
429 0 : }
430 :
431 : // updates a default color config entry
432 0 : void ColorConfigWindow_Impl::Entry::Update (
433 : ColorConfigEntry aColorEntry, ColorConfigValue const& rValue
434 : ) {
435 0 : Color aColor;
436 0 : if ((unsigned)rValue.nColor == COL_AUTO)
437 : {
438 0 : aColor = ColorConfig::GetDefaultColor(aColorEntry);
439 0 : m_pColorList->SelectEntryPos(0);
440 : }
441 : else
442 : {
443 0 : aColor = Color(rValue.nColor);
444 0 : m_pColorList->SelectEntry(aColor);
445 : }
446 0 : m_pPreview->SetBackground(Wallpaper(aColor));
447 0 : if (CheckBox* pCheckBox = dynamic_cast<CheckBox*>(m_pText.get()))
448 0 : pCheckBox->Check(rValue.bIsVisible);
449 0 : }
450 :
451 : // updates an extended color config entry
452 0 : void ColorConfigWindow_Impl::Entry::Update (
453 : ExtendedColorConfigValue const& rValue
454 : ) {
455 0 : Color aColor(rValue.getColor());
456 0 : if (rValue.getColor() == rValue.getDefaultColor())
457 0 : m_pColorList->SelectEntryPos(0);
458 : else
459 0 : m_pColorList->SelectEntry(aColor);
460 0 : SetColor(aColor);
461 0 : }
462 :
463 : // color of a default entry has changed
464 0 : void ColorConfigWindow_Impl::Entry::ColorChanged (
465 : ColorConfigEntry aColorEntry,
466 : ColorConfigValue& rValue
467 : ) {
468 0 : Color aColor;
469 0 : if (m_pColorList->IsAutomaticSelected())
470 : {
471 0 : aColor = ColorConfig::GetDefaultColor(aColorEntry);
472 0 : rValue.nColor = COL_AUTO;
473 : }
474 : else
475 : {
476 0 : aColor = m_pColorList->GetSelectEntryColor();
477 0 : rValue.nColor = aColor.GetColor();
478 : }
479 0 : SetColor(aColor);
480 0 : }
481 :
482 : // color of an extended entry has changed
483 0 : void ColorConfigWindow_Impl::Entry::ColorChanged (
484 : ExtendedColorConfigValue& rValue
485 : ) {
486 0 : Color aColor = m_pColorList->GetSelectEntryColor();
487 0 : rValue.setColor(aColor.GetColor());
488 : // automatic?
489 0 : if (m_pColorList->GetSelectEntryPos() == 0)
490 : {
491 0 : rValue.setColor(rValue.getDefaultColor());
492 0 : aColor.SetColor(rValue.getColor());
493 : }
494 0 : SetColor(aColor);
495 0 : }
496 :
497 0 : void ColorConfigWindow_Impl::Entry::SetColor (Color aColor)
498 : {
499 0 : m_pPreview->SetBackground(Wallpaper(aColor));
500 0 : m_pPreview->Invalidate();
501 0 : }
502 :
503 :
504 :
505 : // ColorConfigWindow_Impl
506 :
507 :
508 0 : ColorConfigWindow_Impl::ColorConfigWindow_Impl(vcl::Window* pParent)
509 0 : : VclContainer(pParent)
510 : {
511 0 : m_pUIBuilder = new VclBuilder(this, getUIRootDir(), "cui/ui/colorconfigwin.ui");
512 0 : get(m_pGrid, "ColorConfigWindow");
513 0 : CreateEntries();
514 0 : SetAppearance();
515 0 : }
516 :
517 0 : void ColorConfigWindow_Impl::dispose()
518 : {
519 0 : m_pGrid.clear();
520 0 : m_pVScroll.clear();
521 0 : m_pHeaderHB.clear();
522 0 : for (auto i = vChapters.begin(); i != vChapters.end(); ++i)
523 0 : (*i)->dispose();
524 0 : for (auto i = vEntries.begin(); i != vEntries.end(); ++i)
525 0 : (*i)->dispose();
526 0 : disposeBuilder();
527 0 : VclContainer::dispose();
528 0 : }
529 :
530 0 : Size ColorConfigWindow_Impl::calculateRequisition() const
531 : {
532 0 : return getLayoutRequisition(*m_pGrid);
533 : }
534 :
535 0 : void ColorConfigWindow_Impl::setAllocation(const Size &rAllocation)
536 : {
537 0 : Point aChildPos(0, 0);
538 0 : Size aChildSize(getLayoutRequisition(*m_pGrid));
539 0 : aChildSize.Width() = rAllocation.Width();
540 0 : setLayoutPosSize(*m_pGrid, aChildPos, aChildSize);
541 0 : AdjustScrollBar();
542 0 : AdjustHeaderBar();
543 0 : ScrollHdl(*m_pVScroll);
544 0 : }
545 :
546 0 : void ColorConfigWindow_Impl::CreateEntries()
547 : {
548 0 : std::bitset<nGroupCount> aModulesInstalled;
549 : // creating group headers
550 0 : vChapters.reserve(nGroupCount);
551 0 : for (unsigned i = 0; i != nGroupCount; ++i)
552 : {
553 0 : aModulesInstalled[i] = IsGroupVisible(vGroupInfo[i].eGroup);
554 : vChapters.push_back(boost::shared_ptr<Chapter>(
555 0 : new Chapter(get<FixedText>(vGroupInfo[i].pGroup), aModulesInstalled[i])));
556 : }
557 :
558 : //Here we want to get the amount to add to the position
559 : //of a FixedText to get it to align its contents
560 : //with that of a CheckBox
561 : //We should have something like a Control::getTextOrigin
562 : //Ideally we could use something like GetCharacterBounds,
563 : //but I think that only works on truly visible controls
564 0 : long nCheckBoxLabelOffset = 0;
565 : {
566 0 : OUString sSampleText("X");
567 0 : ScopedVclPtrInstance< CheckBox > aCheckBox(this);
568 0 : ScopedVclPtrInstance< FixedText > aFixedText(this);
569 0 : aCheckBox->SetText(sSampleText);
570 0 : aFixedText->SetText(sSampleText);
571 0 : Size aCheckSize(aCheckBox->CalcMinimumSize(0x7fffffff));
572 0 : Size aFixedSize(aFixedText->CalcMinimumSize(0x7fffffff));
573 0 : nCheckBoxLabelOffset = aCheckSize.Width() - aFixedSize.Width();
574 : }
575 :
576 : // creating entries
577 0 : vEntries.reserve(ColorConfigEntryCount);
578 0 : for (unsigned i = 0; i < SAL_N_ELEMENTS(vEntryInfo); ++i)
579 : {
580 : vEntries.push_back(boost::shared_ptr<Entry>(new Entry(*this, i, nCheckBoxLabelOffset,
581 0 : aModulesInstalled[vEntryInfo[i].eGroup])));
582 : }
583 :
584 : // extended entries
585 0 : ExtendedColorConfig aExtConfig;
586 0 : if (unsigned const nExtGroupCount = aExtConfig.GetComponentCount())
587 : {
588 0 : size_t nLineNum = vChapters.size() + vEntries.size() + 1;
589 0 : for (unsigned j = 0; j != nExtGroupCount; ++j)
590 : {
591 0 : OUString const sComponentName = aExtConfig.GetComponentName(j);
592 : vChapters.push_back(boost::shared_ptr<Chapter>(new Chapter(
593 : m_pGrid, nLineNum,
594 : aExtConfig.GetComponentDisplayName(sComponentName)
595 0 : )));
596 0 : ++nLineNum;
597 0 : unsigned nColorCount = aExtConfig.GetComponentColorCount(sComponentName);
598 0 : for (unsigned i = 0; i != nColorCount; ++i)
599 : {
600 : ExtendedColorConfigValue const aColorEntry =
601 0 : aExtConfig.GetComponentColorConfigValue(sComponentName, i);
602 : vEntries.push_back(boost::shared_ptr<Entry>( new Entry (
603 : m_pGrid, nLineNum, aColorEntry, nCheckBoxLabelOffset
604 0 : )));
605 0 : ++nLineNum;
606 0 : }
607 0 : }
608 0 : }
609 0 : }
610 :
611 0 : void ColorConfigWindow_Impl::SetAppearance ()
612 : {
613 0 : Color TempColor(COL_TRANSPARENT);
614 0 : Wallpaper const aTransparentWall(TempColor);
615 0 : StyleSettings const& rStyleSettings = GetSettings().GetStyleSettings();
616 0 : Color const aBackColor = rStyleSettings.GetHighContrastMode() ?
617 0 : rStyleSettings.GetShadowColor() : Color(COL_LIGHTGRAY);
618 0 : Wallpaper const aBackWall(aBackColor);
619 0 : for (size_t i = 0; i != vChapters.size(); ++i)
620 0 : vChapters[i]->Show(aBackWall);
621 0 : Wallpaper aBack(rStyleSettings.GetFieldColor());
622 0 : SetBackground(aBack);
623 0 : m_pGrid->SetBackground(aBack);
624 :
625 : // #104195# when the window color is the same as the text color it has to be changed
626 0 : Color aWinCol = rStyleSettings.GetWindowColor();
627 0 : Color aRCheckCol = rStyleSettings.GetRadioCheckTextColor();
628 0 : if (aWinCol == aRCheckCol)
629 : {
630 0 : aRCheckCol.Invert();
631 : // if inversion didn't work (gray) then it's set to black
632 0 : if (aRCheckCol == aWinCol)
633 0 : aRCheckCol = Color(COL_BLACK);
634 : // setting new text color for each entry
635 0 : for (size_t i = 0; i != vEntries.size(); ++i)
636 0 : vEntries[i]->SetTextColor(aRCheckCol);
637 : }
638 :
639 : OSL_ENSURE( vEntries.size() >= sizeof vEntryInfo / sizeof vEntryInfo[0], "wrong number of helpIDs for color listboxes" );
640 :
641 : // creating a sample color listbox with the color entries
642 0 : ScopedVclPtrInstance< ColorListBox > aSampleColorList(this);
643 : {
644 0 : XColorListRef const xColorTable = XColorList::CreateStdColorList();
645 0 : for (sal_Int32 i = 0; i != xColorTable->Count(); ++i)
646 : {
647 0 : XColorEntry& rEntry = *xColorTable->GetColor(i);
648 0 : aSampleColorList->InsertEntry(rEntry.GetColor(), rEntry.GetName());
649 0 : }
650 : }
651 :
652 : // appearance
653 0 : for (size_t i = 0; i != vEntries.size(); ++i)
654 : {
655 : // appearance
656 0 : vEntries[i]->SetAppearance(aTransparentWall, *aSampleColorList.get());
657 0 : }
658 0 : }
659 :
660 0 : void ColorConfigWindow_Impl::AdjustHeaderBar()
661 : {
662 : // horizontal positions
663 0 : unsigned const nX0 = 0;
664 0 : unsigned const nX1 = get<vcl::Window>("doccolor")->GetPosPixel().X();
665 0 : unsigned const nX2 = get<vcl::Window>("doccolor_lb")->GetPosPixel().X();
666 0 : unsigned const nX3 = get<vcl::Window>("doccolor_wn")->GetPosPixel().X();
667 0 : unsigned const nX4 = m_pHeaderHB->GetSizePixel().Width();
668 0 : m_pHeaderHB->SetItemSize(1, nX1 - nX0);
669 0 : m_pHeaderHB->SetItemSize(2, nX2 - nX1);
670 0 : m_pHeaderHB->SetItemSize(3, nX3 - nX2);
671 0 : m_pHeaderHB->SetItemSize(4, nX4 - nX3);
672 0 : }
673 :
674 0 : void ColorConfigWindow_Impl::AdjustScrollBar()
675 : {
676 : unsigned const nScrollOffset =
677 0 : vEntries[1]->GetTop() - vEntries[0]->GetTop();
678 0 : unsigned const nVisibleEntries = GetSizePixel().Height() / nScrollOffset;
679 0 : m_pVScroll->SetPageSize(nVisibleEntries - 1);
680 0 : m_pVScroll->SetVisibleSize(nVisibleEntries);
681 0 : }
682 :
683 0 : void ColorConfigWindow_Impl::Init(ScrollBar *pVScroll, HeaderBar *pHeaderHB)
684 : {
685 0 : m_pHeaderHB = pHeaderHB;
686 0 : m_pVScroll = pVScroll;
687 0 : m_pVScroll->EnableDrag();
688 0 : m_pVScroll->SetRangeMin(0);
689 0 : m_pVScroll->SetRangeMax(vEntries.size() + vChapters.size());
690 0 : }
691 :
692 : // SetLinks()
693 0 : void ColorConfigWindow_Impl::SetLinks (
694 : Link<> const& aCheckLink, Link<> const& aColorLink, Link<> const& aGetFocusLink
695 : ) {
696 0 : for (unsigned i = 0; i != vEntries.size(); ++i)
697 0 : vEntries[i]->SetLinks(aCheckLink, aColorLink, aGetFocusLink);
698 0 : }
699 :
700 : // Update()
701 0 : void ColorConfigWindow_Impl::Update (
702 : EditableColorConfig const* pConfig,
703 : EditableExtendedColorConfig const* pExtConfig)
704 : {
705 : // updating default entries
706 0 : for (unsigned i = 0; i != ColorConfigEntryCount; ++i)
707 : {
708 0 : ColorConfigEntry const aColorEntry = static_cast<ColorConfigEntry>(i);
709 0 : vEntries[i]->Update(
710 0 : aColorEntry, pConfig->GetColorValue(aColorEntry)
711 0 : );
712 : }
713 :
714 : // updating extended entries
715 0 : unsigned i = ColorConfigEntryCount;
716 0 : unsigned const nExtCount = pExtConfig->GetComponentCount();
717 0 : for (unsigned j = 0; j != nExtCount; ++j)
718 : {
719 0 : OUString sComponentName = pExtConfig->GetComponentName(j);
720 0 : unsigned const nColorCount = pExtConfig->GetComponentColorCount(sComponentName);
721 0 : for (unsigned k = 0; i != vEntries.size() && k != nColorCount; ++i, ++k)
722 0 : vEntries[i]->Update(
723 : pExtConfig->GetComponentColorConfigValue(sComponentName, k)
724 0 : );
725 0 : }
726 0 : }
727 :
728 : // ScrollHdl()
729 0 : void ColorConfigWindow_Impl::ScrollHdl(const ScrollBar& rVScroll)
730 : {
731 0 : SetUpdateMode(true);
732 0 : const long nRowHeight = (vEntries[1]->GetTop() - vEntries[0]->GetTop());
733 0 : Point aPos(0, 0 - rVScroll.GetThumbPos() * nRowHeight);
734 0 : m_pGrid->SetPosPixel(aPos);
735 0 : SetUpdateMode(true);
736 0 : }
737 :
738 : // ClickHdl()
739 0 : void ColorConfigWindow_Impl::ClickHdl (EditableColorConfig* pConfig, CheckBox* pBox)
740 : {
741 0 : for (unsigned i = 0; i != ColorConfigEntryCount; ++i)
742 : {
743 0 : if (vEntries[i]->Is(pBox))
744 : {
745 0 : ColorConfigEntry const aEntry = static_cast<ColorConfigEntry>(i);
746 0 : ColorConfigValue aValue = pConfig->GetColorValue(aEntry);
747 0 : aValue.bIsVisible = pBox->IsChecked();
748 0 : pConfig->SetColorValue(aEntry, aValue);
749 0 : break;
750 : }
751 : }
752 0 : }
753 :
754 : // ColorHdl()
755 0 : void ColorConfigWindow_Impl::ColorHdl (
756 : EditableColorConfig* pConfig, EditableExtendedColorConfig* pExtConfig,
757 : ColorListBox* pBox
758 : ) {
759 0 : unsigned i = 0;
760 :
761 : // default entries
762 0 : for ( ; i != ColorConfigEntryCount; ++i)
763 : {
764 0 : if (pBox && vEntries[i]->Is(pBox))
765 : {
766 0 : ColorConfigEntry const aColorEntry = static_cast<ColorConfigEntry>(i);
767 0 : ColorConfigValue aValue = pConfig->GetColorValue(aColorEntry);
768 0 : vEntries[i]->ColorChanged(aColorEntry, aValue);
769 0 : pConfig->SetColorValue(aColorEntry, aValue);
770 0 : break;
771 : }
772 : }
773 :
774 : // extended entries
775 0 : unsigned const nExtCount = pExtConfig->GetComponentCount();
776 0 : i = ColorConfigEntryCount;
777 0 : for (unsigned j = 0; j != nExtCount; ++j)
778 : {
779 0 : OUString sComponentName = pExtConfig->GetComponentName(j);
780 0 : unsigned const nColorCount = pExtConfig->GetComponentColorCount(sComponentName);
781 0 : unsigned const nCount = vEntries.size();
782 0 : for (unsigned k = 0; i != nCount && k != nColorCount; ++i, ++k)
783 : {
784 0 : if (pBox && vEntries[i]->Is(pBox))
785 : {
786 : ExtendedColorConfigValue aValue =
787 0 : pExtConfig->GetComponentColorConfigValue(sComponentName, k);
788 0 : vEntries[i]->ColorChanged(aValue);
789 0 : pExtConfig->SetColorValue(sComponentName, aValue);
790 0 : break;
791 : }
792 : }
793 0 : }
794 0 : }
795 :
796 :
797 : // IsGroupVisible()
798 0 : bool ColorConfigWindow_Impl::IsGroupVisible (Group eGroup) const
799 : {
800 0 : switch (eGroup)
801 : {
802 : case Group_Writer:
803 : case Group_Html:
804 0 : return aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::WRITER);
805 : case Group_Calc:
806 0 : return aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::CALC);
807 : case Group_Draw:
808 : return
809 0 : aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::DRAW) ||
810 0 : aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::IMPRESS);
811 : case Group_Sql:
812 0 : return aModuleOptions.IsModuleInstalled(SvtModuleOptions::EModule::DATABASE);
813 : default:
814 0 : return true;
815 : }
816 : }
817 :
818 0 : void ColorConfigWindow_Impl::DataChanged (DataChangedEvent const& rDCEvt)
819 : {
820 0 : Window::DataChanged( rDCEvt );
821 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
822 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
823 : {
824 0 : StyleSettings const& rStyleSettings = GetSettings().GetStyleSettings();
825 0 : bool const bHighContrast = rStyleSettings.GetHighContrastMode();
826 0 : Wallpaper const aBackWall(Color(bHighContrast ? COL_TRANSPARENT : COL_LIGHTGRAY));
827 0 : for (unsigned i = 0; i != vChapters.size(); ++i)
828 0 : vChapters[i]->SetBackground(aBackWall);
829 0 : SetBackground(Wallpaper(rStyleSettings.GetWindowColor()));
830 : }
831 0 : }
832 :
833 :
834 0 : void ColorConfigWindow_Impl::Command( const CommandEvent& rCEvt )
835 : {
836 0 : GetParent()->Command(rCEvt);
837 0 : }
838 :
839 : class ColorConfigCtrl_Impl : public VclVBox
840 : {
841 : VclPtr<HeaderBar> m_pHeaderHB;
842 : VclPtr<VclHBox> m_pBody;
843 : VclPtr<ColorConfigWindow_Impl> m_pScrollWindow;
844 : VclPtr<ScrollBar> m_pVScroll;
845 :
846 : EditableColorConfig* pColorConfig;
847 : EditableExtendedColorConfig* pExtColorConfig;
848 :
849 : DECL_LINK(ScrollHdl, ScrollBar*);
850 : DECL_LINK(ClickHdl, CheckBox*);
851 : DECL_LINK(ColorHdl, ColorListBox*);
852 : DECL_LINK(ControlFocusHdl, Control*);
853 :
854 : virtual bool PreNotify (NotifyEvent& rNEvt) SAL_OVERRIDE;
855 : virtual void Command (CommandEvent const& rCEvt) SAL_OVERRIDE;
856 : virtual void DataChanged (DataChangedEvent const& rDCEvt) SAL_OVERRIDE;
857 : public:
858 : ColorConfigCtrl_Impl(vcl::Window* pParent);
859 : virtual ~ColorConfigCtrl_Impl();
860 : virtual void dispose() SAL_OVERRIDE;
861 :
862 : void InitHeaderBar(const OUString &rOn, const OUString &rUIElems,
863 : const OUString &rColorSetting, const OUString &rPreview);
864 0 : void SetConfig (EditableColorConfig& rConfig) { pColorConfig = &rConfig; }
865 0 : void SetExtendedConfig (EditableExtendedColorConfig& rConfig) { pExtColorConfig = &rConfig; }
866 : void Update ();
867 0 : long GetScrollPosition ()
868 : {
869 0 : return m_pVScroll->GetThumbPos();
870 : }
871 0 : void SetScrollPosition (long nSet)
872 : {
873 0 : m_pVScroll->SetThumbPos(nSet);
874 0 : ScrollHdl(m_pVScroll);
875 0 : }
876 : };
877 :
878 0 : ColorConfigCtrl_Impl::ColorConfigCtrl_Impl(vcl::Window* pParent)
879 : : VclVBox(pParent)
880 : , pColorConfig(0)
881 0 : , pExtColorConfig(0)
882 : {
883 0 : m_pHeaderHB = VclPtr<HeaderBar>::Create(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER);
884 :
885 0 : m_pBody = VclPtr<VclHBox>::Create(this);
886 0 : m_pScrollWindow = VclPtr<ColorConfigWindow_Impl>::Create(m_pBody);
887 0 : m_pVScroll = VclPtr<ScrollBar>::Create(m_pBody, WB_VERT);
888 0 : m_pScrollWindow->Init(m_pVScroll, m_pHeaderHB);
889 :
890 0 : m_pBody->set_hexpand(true);
891 0 : m_pBody->set_vexpand(true);
892 0 : m_pBody->set_expand(true);
893 0 : m_pBody->set_fill(true);
894 :
895 0 : m_pScrollWindow->set_hexpand(true);
896 0 : m_pScrollWindow->set_vexpand(true);
897 0 : m_pScrollWindow->set_expand(true);
898 0 : m_pScrollWindow->set_fill(true);
899 :
900 0 : Link<> aScrollLink = LINK(this, ColorConfigCtrl_Impl, ScrollHdl);
901 0 : m_pVScroll->SetScrollHdl(aScrollLink);
902 0 : m_pVScroll->SetEndScrollHdl(aScrollLink);
903 :
904 0 : Link<> aCheckLink = LINK(this, ColorConfigCtrl_Impl, ClickHdl);
905 0 : Link<> aColorLink = LINK(this, ColorConfigCtrl_Impl, ColorHdl);
906 0 : Link<> aGetFocusLink = LINK(this, ColorConfigCtrl_Impl, ControlFocusHdl);
907 0 : m_pScrollWindow->SetLinks(aCheckLink, aColorLink, aGetFocusLink);
908 :
909 0 : m_pHeaderHB->Show();
910 0 : m_pVScroll->Show();
911 0 : m_pBody->Show();
912 0 : m_pScrollWindow->Show();
913 0 : }
914 :
915 0 : void ColorConfigCtrl_Impl::InitHeaderBar(const OUString &rOn, const OUString &rUIElems,
916 : const OUString &rColorSetting, const OUString &rPreview)
917 : {
918 : // filling
919 0 : const HeaderBarItemBits nHeadBits = HeaderBarItemBits::VCENTER | HeaderBarItemBits::FIXED | HeaderBarItemBits::FIXEDPOS;
920 0 : m_pHeaderHB->InsertItem(1, rOn, 0, nHeadBits | HeaderBarItemBits::CENTER);
921 0 : m_pHeaderHB->InsertItem(2, rUIElems, 0, nHeadBits | HeaderBarItemBits::LEFT);
922 0 : m_pHeaderHB->InsertItem(3, rColorSetting, 0, nHeadBits | HeaderBarItemBits::LEFT);
923 0 : m_pHeaderHB->InsertItem(4, rPreview, 0, nHeadBits | HeaderBarItemBits::LEFT);
924 0 : m_pHeaderHB->set_height_request(GetTextHeight() + 6);
925 0 : }
926 :
927 0 : ColorConfigCtrl_Impl::~ColorConfigCtrl_Impl()
928 : {
929 0 : disposeOnce();
930 0 : }
931 :
932 0 : void ColorConfigCtrl_Impl::dispose()
933 : {
934 0 : m_pVScroll.disposeAndClear();
935 0 : m_pScrollWindow.disposeAndClear();
936 0 : m_pBody.disposeAndClear();
937 0 : m_pHeaderHB.disposeAndClear();
938 0 : VclVBox::dispose();
939 0 : }
940 :
941 0 : VCL_BUILDER_DECL_FACTORY(ColorConfigCtrl)
942 : {
943 : (void)rMap;
944 0 : rRet = VclPtr<ColorConfigCtrl_Impl>::Create(pParent);
945 0 : }
946 :
947 0 : void ColorConfigCtrl_Impl::Update ()
948 : {
949 : DBG_ASSERT(pColorConfig, "Configuration not set");
950 0 : m_pScrollWindow->Update(pColorConfig, pExtColorConfig);
951 0 : }
952 :
953 0 : IMPL_LINK(ColorConfigCtrl_Impl, ScrollHdl, ScrollBar*, pScrollBar)
954 : {
955 0 : m_pScrollWindow->ScrollHdl(*pScrollBar);
956 0 : return 0;
957 : }
958 :
959 0 : bool ColorConfigCtrl_Impl::PreNotify( NotifyEvent& rNEvt )
960 : {
961 0 : if(rNEvt.GetType() == MouseNotifyEvent::COMMAND)
962 : {
963 0 : const CommandEvent* pCEvt = rNEvt.GetCommandEvent();
964 0 : if( pCEvt->GetCommand() == CommandEventId::Wheel )
965 : {
966 0 : Command(*pCEvt);
967 0 : return true;
968 : }
969 : }
970 0 : return VclVBox::PreNotify(rNEvt);
971 : }
972 :
973 0 : void ColorConfigCtrl_Impl::Command( const CommandEvent& rCEvt )
974 : {
975 0 : switch ( rCEvt.GetCommand() )
976 : {
977 :
978 : case CommandEventId::Wheel:
979 : case CommandEventId::StartAutoScroll:
980 : case CommandEventId::AutoScroll:
981 : {
982 0 : const CommandWheelData* pWheelData = rCEvt.GetWheelData();
983 0 : if(pWheelData && !pWheelData->IsHorz() && CommandWheelMode::ZOOM != pWheelData->GetMode())
984 : {
985 0 : HandleScrollCommand(rCEvt, 0, m_pVScroll);
986 : }
987 : }
988 0 : break;
989 : default:
990 0 : VclVBox::Command(rCEvt);
991 : }
992 0 : }
993 :
994 0 : void ColorConfigCtrl_Impl::DataChanged( const DataChangedEvent& rDCEvt )
995 : {
996 0 : Window::DataChanged( rDCEvt );
997 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
998 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
999 : {
1000 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1001 0 : SetBackground(Wallpaper(rStyleSettings.GetFieldColor()));
1002 : }
1003 0 : }
1004 :
1005 0 : IMPL_LINK(ColorConfigCtrl_Impl, ClickHdl, CheckBox*, pBox)
1006 : {
1007 : DBG_ASSERT(pColorConfig, "Configuration not set");
1008 0 : m_pScrollWindow->ClickHdl(pColorConfig, pBox);
1009 0 : return 0;
1010 : }
1011 :
1012 : // a color list has changed
1013 0 : IMPL_LINK(ColorConfigCtrl_Impl, ColorHdl, ColorListBox*, pBox)
1014 : {
1015 : DBG_ASSERT(pColorConfig, "Configuration not set" );
1016 0 : if (pBox)
1017 0 : m_pScrollWindow->ColorHdl(pColorConfig, pExtColorConfig, pBox);
1018 0 : return 0;
1019 : }
1020 0 : IMPL_LINK(ColorConfigCtrl_Impl, ControlFocusHdl, Control*, pCtrl)
1021 : {
1022 : // determine whether a control is completely visible
1023 : // and make it visible
1024 0 : long aCtrlPosY = pCtrl->GetPosPixel().Y();
1025 0 : unsigned const nWinHeight = m_pScrollWindow->GetSizePixel().Height();
1026 0 : unsigned const nEntryHeight = m_pScrollWindow->GetEntryHeight();
1027 0 : if ((GetFocusFlags::Tab & pCtrl->GetGetFocusFlags()) &&
1028 0 : (aCtrlPosY < 0 || nWinHeight < aCtrlPosY + nEntryHeight)
1029 : ) {
1030 0 : long nThumbPos = m_pVScroll->GetThumbPos();
1031 0 : if (nWinHeight < aCtrlPosY + nEntryHeight)
1032 : {
1033 : //scroll down
1034 0 : nThumbPos += 2;
1035 : }
1036 : else
1037 : {
1038 : //scroll up
1039 0 : nThumbPos -= 2;
1040 0 : if(nThumbPos < 0)
1041 0 : nThumbPos = 0;
1042 : }
1043 0 : m_pVScroll->SetThumbPos(nThumbPos);
1044 0 : ScrollHdl(m_pVScroll);
1045 : }
1046 0 : return 0;
1047 : };
1048 :
1049 :
1050 :
1051 : // SvxColorOptionsTabPage
1052 :
1053 :
1054 0 : SvxColorOptionsTabPage::SvxColorOptionsTabPage(
1055 : vcl::Window* pParent, const SfxItemSet& rCoreSet)
1056 : : SfxTabPage(pParent, "OptAppearancePage", "cui/ui/optappearancepage.ui", &rCoreSet)
1057 : , bFillItemSetCalled(false)
1058 : , pColorConfig(0)
1059 0 : , pExtColorConfig(0)
1060 : {
1061 0 : get(m_pColorSchemeLB, "colorschemelb");
1062 0 : m_pColorSchemeLB->SetStyle(m_pColorSchemeLB->GetStyle() | WB_SORT);
1063 0 : get(m_pSaveSchemePB, "save");
1064 0 : get(m_pDeleteSchemePB, "delete");
1065 0 : get(m_pColorConfigCT, "colorconfig");
1066 :
1067 : m_pColorConfigCT->InitHeaderBar(
1068 0 : get<vcl::Window>("on")->GetText(),
1069 0 : get<vcl::Window>("uielements")->GetText(),
1070 0 : get<vcl::Window>("colorsetting")->GetText(),
1071 0 : get<vcl::Window>("preview")->GetText());
1072 :
1073 0 : m_pColorSchemeLB->SetSelectHdl(LINK(this, SvxColorOptionsTabPage, SchemeChangedHdl_Impl));
1074 0 : Link<> aLk = LINK(this, SvxColorOptionsTabPage, SaveDeleteHdl_Impl );
1075 0 : m_pSaveSchemePB->SetClickHdl(aLk);
1076 0 : m_pDeleteSchemePB->SetClickHdl(aLk);
1077 0 : }
1078 :
1079 0 : SvxColorOptionsTabPage::~SvxColorOptionsTabPage()
1080 : {
1081 0 : disposeOnce();
1082 0 : }
1083 :
1084 0 : void SvxColorOptionsTabPage::dispose()
1085 : {
1086 0 : if (pColorConfig)
1087 : {
1088 : //when the dialog is cancelled but the color scheme ListBox has been changed these
1089 : //changes need to be undone
1090 0 : if(!bFillItemSetCalled && m_pColorSchemeLB->IsValueChangedFromSaved())
1091 : {
1092 0 : OUString sOldScheme = m_pColorSchemeLB->GetEntry(m_pColorSchemeLB->GetSavedValue());
1093 0 : if(!sOldScheme.isEmpty())
1094 : {
1095 0 : pColorConfig->SetCurrentSchemeName(sOldScheme);
1096 0 : pExtColorConfig->SetCurrentSchemeName(sOldScheme);
1097 0 : }
1098 : }
1099 0 : pColorConfig->ClearModified();
1100 0 : pColorConfig->EnableBroadcast();
1101 0 : delete pColorConfig;
1102 0 : pColorConfig = NULL;
1103 :
1104 0 : pExtColorConfig->ClearModified();
1105 0 : pExtColorConfig->EnableBroadcast();
1106 0 : delete pExtColorConfig;
1107 0 : pExtColorConfig = NULL;
1108 : }
1109 0 : m_pColorSchemeLB.clear();
1110 0 : m_pSaveSchemePB.clear();
1111 0 : m_pDeleteSchemePB.clear();
1112 0 : m_pColorConfigCT.clear();
1113 0 : SfxTabPage::dispose();
1114 0 : }
1115 :
1116 0 : VclPtr<SfxTabPage> SvxColorOptionsTabPage::Create( vcl::Window* pParent, const SfxItemSet* rAttrSet )
1117 : {
1118 0 : return VclPtr<SvxColorOptionsTabPage>::Create( pParent, *rAttrSet );
1119 : }
1120 :
1121 0 : bool SvxColorOptionsTabPage::FillItemSet( SfxItemSet* )
1122 : {
1123 0 : bFillItemSetCalled = true;
1124 0 : if(m_pColorSchemeLB->IsValueChangedFromSaved())
1125 : {
1126 0 : pColorConfig->SetModified();
1127 0 : pExtColorConfig->SetModified();
1128 : }
1129 0 : if(pColorConfig->IsModified())
1130 0 : pColorConfig->Commit();
1131 0 : if(pExtColorConfig->IsModified())
1132 0 : pExtColorConfig->Commit();
1133 0 : return true;
1134 : }
1135 :
1136 0 : void SvxColorOptionsTabPage::Reset( const SfxItemSet* )
1137 : {
1138 0 : if(pColorConfig)
1139 : {
1140 0 : pColorConfig->ClearModified();
1141 0 : pColorConfig->DisableBroadcast();
1142 0 : delete pColorConfig;
1143 : }
1144 0 : pColorConfig = new EditableColorConfig;
1145 0 : m_pColorConfigCT->SetConfig(*pColorConfig);
1146 :
1147 0 : if(pExtColorConfig)
1148 : {
1149 0 : pExtColorConfig->ClearModified();
1150 0 : pExtColorConfig->DisableBroadcast();
1151 0 : delete pExtColorConfig;
1152 : }
1153 0 : pExtColorConfig = new EditableExtendedColorConfig;
1154 0 : m_pColorConfigCT->SetExtendedConfig(*pExtColorConfig);
1155 :
1156 0 : OUString sUser = GetUserData();
1157 : //has to be called always to speed up accessibility tools
1158 0 : m_pColorConfigCT->SetScrollPosition(sUser.toInt32());
1159 0 : m_pColorSchemeLB->Clear();
1160 0 : uno::Sequence< OUString > aSchemes = pColorConfig->GetSchemeNames();
1161 0 : const OUString* pSchemes = aSchemes.getConstArray();
1162 0 : for(sal_Int32 i = 0; i < aSchemes.getLength(); i++)
1163 0 : m_pColorSchemeLB->InsertEntry(pSchemes[i]);
1164 0 : m_pColorSchemeLB->SelectEntry(pColorConfig->GetCurrentSchemeName());
1165 0 : m_pColorSchemeLB->SaveValue();
1166 0 : m_pDeleteSchemePB->Enable( aSchemes.getLength() > 1 );
1167 0 : UpdateColorConfig();
1168 0 : }
1169 :
1170 0 : SfxTabPage::sfxpg SvxColorOptionsTabPage::DeactivatePage( SfxItemSet* pSet_ )
1171 : {
1172 0 : if ( pSet_ )
1173 0 : FillItemSet( pSet_ );
1174 0 : return LEAVE_PAGE;
1175 : }
1176 :
1177 0 : void SvxColorOptionsTabPage::UpdateColorConfig()
1178 : {
1179 : //update the color config control
1180 0 : m_pColorConfigCT->Update();
1181 0 : }
1182 :
1183 0 : IMPL_LINK(SvxColorOptionsTabPage, SchemeChangedHdl_Impl, ListBox*, pBox)
1184 : {
1185 0 : pColorConfig->LoadScheme(pBox->GetSelectEntry());
1186 0 : pExtColorConfig->LoadScheme(pBox->GetSelectEntry());
1187 0 : UpdateColorConfig();
1188 0 : return 0;
1189 : }
1190 :
1191 0 : IMPL_LINK(SvxColorOptionsTabPage, SaveDeleteHdl_Impl, PushButton*, pButton )
1192 : {
1193 0 : if (m_pSaveSchemePB == pButton)
1194 : {
1195 0 : OUString sName;
1196 :
1197 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1198 : DBG_ASSERT(pFact, "Dialog creation failed!");
1199 : boost::scoped_ptr<AbstractSvxNameDialog> aNameDlg(pFact->CreateSvxNameDialog( pButton,
1200 0 : sName, CUI_RES(RID_SVXSTR_COLOR_CONFIG_SAVE2) ));
1201 : DBG_ASSERT(aNameDlg, "Dialog creation failed!");
1202 0 : aNameDlg->SetCheckNameHdl( LINK(this, SvxColorOptionsTabPage, CheckNameHdl_Impl));
1203 0 : aNameDlg->SetText(CUI_RES(RID_SVXSTR_COLOR_CONFIG_SAVE1));
1204 0 : aNameDlg->SetHelpId(HID_OPTIONS_COLORCONFIG_SAVE_SCHEME);
1205 0 : aNameDlg->SetCheckNameHdl( LINK(this, SvxColorOptionsTabPage, CheckNameHdl_Impl));
1206 0 : if(RET_OK == aNameDlg->Execute())
1207 : {
1208 0 : aNameDlg->GetName(sName);
1209 0 : pColorConfig->AddScheme(sName);
1210 0 : pExtColorConfig->AddScheme(sName);
1211 0 : m_pColorSchemeLB->InsertEntry(sName);
1212 0 : m_pColorSchemeLB->SelectEntry(sName);
1213 0 : m_pColorSchemeLB->GetSelectHdl().Call(m_pColorSchemeLB);
1214 0 : }
1215 : }
1216 : else
1217 : {
1218 : DBG_ASSERT(m_pColorSchemeLB->GetEntryCount() > 1, "don't delete the last scheme");
1219 0 : ScopedVclPtrInstance< MessageDialog > aQuery(pButton, CUI_RES(RID_SVXSTR_COLOR_CONFIG_DELETE), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
1220 0 : aQuery->SetText(CUI_RES(RID_SVXSTR_COLOR_CONFIG_DELETE_TITLE));
1221 0 : if(RET_YES == aQuery->Execute())
1222 : {
1223 0 : OUString sDeleteScheme(m_pColorSchemeLB->GetSelectEntry());
1224 0 : m_pColorSchemeLB->RemoveEntry(m_pColorSchemeLB->GetSelectEntryPos());
1225 0 : m_pColorSchemeLB->SelectEntryPos(0);
1226 0 : m_pColorSchemeLB->GetSelectHdl().Call(m_pColorSchemeLB);
1227 : //first select the new scheme and then delete the old one
1228 0 : pColorConfig->DeleteScheme(sDeleteScheme);
1229 0 : pExtColorConfig->DeleteScheme(sDeleteScheme);
1230 0 : }
1231 : }
1232 0 : m_pDeleteSchemePB->Enable( m_pColorSchemeLB->GetEntryCount() > 1 );
1233 0 : return 0;
1234 : }
1235 :
1236 0 : IMPL_LINK(SvxColorOptionsTabPage, CheckNameHdl_Impl, AbstractSvxNameDialog*, pDialog )
1237 : {
1238 0 : OUString sName;
1239 0 : pDialog->GetName(sName);
1240 0 : return long(!sName.isEmpty() && LISTBOX_ENTRY_NOTFOUND == m_pColorSchemeLB->GetEntryPos( sName ));
1241 : }
1242 :
1243 0 : void SvxColorOptionsTabPage::FillUserData()
1244 : {
1245 0 : SetUserData(OUString::number(m_pColorConfigCT->GetScrollPosition()));
1246 0 : }
1247 :
1248 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|