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 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_svx.hxx"
24 
25 #include <svx/SvxColorValueSet.hxx>
26 #include <svx/xtable.hxx>
27 #include <vcl/svapp.hxx>
28 
29 //////////////////////////////////////////////////////////////////////////////
30 
SvxColorValueSet(Window * _pParent,WinBits nWinStyle)31 SvxColorValueSet::SvxColorValueSet(Window* _pParent, WinBits nWinStyle)
32 :   ValueSet(_pParent, nWinStyle)
33 {
34     SetEdgeBlending(true);
35 }
36 
SvxColorValueSet(Window * _pParent,const ResId & rResId)37 SvxColorValueSet::SvxColorValueSet(Window* _pParent, const ResId& rResId)
38 :   ValueSet(_pParent, rResId)
39 {
40     SetEdgeBlending(true);
41 }
42 
getMaxRowCount() const43 sal_uInt32 SvxColorValueSet::getMaxRowCount() const
44 {
45     const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
46 
47     return rStyleSettings.GetColorValueSetMaximumRowCount();
48 }
49 
getEntryEdgeLength() const50 sal_uInt32 SvxColorValueSet::getEntryEdgeLength() const
51 {
52     const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
53 
54     return rStyleSettings.GetListBoxPreviewDefaultPixelSize().Height() + 1;
55 }
56 
getColumnCount() const57 sal_uInt32 SvxColorValueSet::getColumnCount() const
58 {
59     const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
60 
61     return rStyleSettings.GetColorValueSetColumnCount();
62 }
63 
addEntriesForXColorList(const XColorListSharedPtr aXColorList,sal_uInt32 nStartIndex)64 void SvxColorValueSet::addEntriesForXColorList(const XColorListSharedPtr aXColorList, sal_uInt32 nStartIndex)
65 {
66     const sal_uInt32 nColorCount(aXColorList ? aXColorList->Count() : 0);
67 
68     for(sal_uInt32 nIndex(0); nIndex < nColorCount; nIndex++, nStartIndex++)
69     {
70         const XColorEntry* pEntry = aXColorList->GetColor(nIndex);
71 
72         if(pEntry)
73         {
74             InsertItem(nStartIndex, pEntry->GetColor(), pEntry->GetName());
75         }
76         else
77         {
78             OSL_ENSURE(false, "OOps, XColorList with empty entries (!)");
79         }
80     }
81 }
82 
layoutAllVisible(sal_uInt32 nEntryCount)83 Size SvxColorValueSet::layoutAllVisible(sal_uInt32 nEntryCount)
84 {
85     if(!nEntryCount)
86     {
87         nEntryCount++;
88     }
89 
90     const sal_uInt32 nRowCount(ceil(double(nEntryCount)/getColumnCount()));
91     const Size aItemSize(getEntryEdgeLength() - 2, getEntryEdgeLength() - 2);
92     const WinBits aWinBits(GetStyle() & ~WB_VSCROLL);
93 
94     if(nRowCount > getMaxRowCount())
95     {
96         SetStyle(aWinBits|WB_VSCROLL);
97     }
98     else
99     {
100         SetStyle(aWinBits);
101     }
102 
103     SetColCount(getColumnCount());
104     SetLineCount(std::min(nRowCount, getMaxRowCount()));
105     SetItemWidth(aItemSize.Width());
106     SetItemHeight(aItemSize.Height());
107 
108     return CalcWindowSizePixel(aItemSize);
109 }
110 
layoutToGivenHeight(sal_uInt32 nHeight,sal_uInt32 nEntryCount)111 Size SvxColorValueSet::layoutToGivenHeight(sal_uInt32 nHeight, sal_uInt32 nEntryCount)
112 {
113     if(!nEntryCount)
114     {
115         nEntryCount++;
116     }
117 
118     const Size aItemSize(getEntryEdgeLength(), getEntryEdgeLength());
119     const WinBits aWinBits(GetStyle() & ~WB_VSCROLL);
120 
121     // get size with all fields disabled
122     const WinBits aWinBitsNoScrollNoFields(GetStyle() & ~(WB_VSCROLL|WB_NAMEFIELD|WB_NONEFIELD));
123     SetStyle(aWinBitsNoScrollNoFields);
124     const Size aSizeNoScrollNoFields(CalcWindowSizePixel(aItemSize, getColumnCount()));
125 
126     // get size with all needed fields
127     SetStyle(aWinBits);
128     Size aNewSize(CalcWindowSizePixel(aItemSize, getColumnCount()));
129 
130     // evtl. activate vertical scroll
131     const bool bAdaptHeight(static_cast< sal_uInt32 >(aNewSize.Height()) > nHeight);
132 
133     if(bAdaptHeight)
134     {
135         SetStyle(aWinBits|WB_VSCROLL);
136         aNewSize = CalcWindowSizePixel(aItemSize, getColumnCount());
137     }
138 
139     // calculate field height and available height for requested height
140     const sal_uInt32 nFieldHeight(aNewSize.Height() - aSizeNoScrollNoFields.Height());
141     const sal_uInt32 nAvailableHeight(nHeight >= nFieldHeight ? nHeight - nFieldHeight : 0);
142 
143     // calculate how many lines can be shown there
144     const Size aItemSizePixel(CalcItemSizePixel(aItemSize));
145     const sal_uInt32 nLineCount((nAvailableHeight + aItemSizePixel.Height() - 1) / aItemSizePixel.Height());
146 
147     // set height to wanted height
148     aNewSize.Height() = nHeight;
149 
150     SetItemWidth(aItemSize.Width());
151     SetItemHeight(aItemSize.Height());
152     SetColCount(getColumnCount());
153     SetLineCount(nLineCount);
154 
155     return aNewSize;
156 }
157 
158 //////////////////////////////////////////////////////////////////////////////
159 // eof
160