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 <unotools/pathoptions.hxx>
21 : #include <cuires.hrc>
22 : #include "optchart.hxx"
23 : #include <dialmgr.hxx>
24 : #include <vcl/msgbox.hxx>
25 : #include <svx/svxids.hrc>
26 :
27 : namespace
28 : {
29 0 : void FillBoxChartColorLB(ColorLB *pLB, const SvxChartColorTable & rTab)
30 : {
31 0 : pLB->SetUpdateMode(false);
32 0 : pLB->Clear();
33 0 : long nCount = rTab.size();
34 0 : for(long i = 0; i < nCount; ++i)
35 : {
36 0 : pLB->Append(rTab[i]);
37 : }
38 0 : pLB->SetUpdateMode(true);
39 0 : }
40 : }
41 :
42 0 : SvxDefaultColorOptPage::SvxDefaultColorOptPage(vcl::Window* pParent, const SfxItemSet& rInAttrs)
43 0 : : SfxTabPage(pParent, "OptChartColorsPage","cui/ui/optchartcolorspage.ui", &rInAttrs)
44 : {
45 0 : get(m_pPBRemove, "delete");
46 0 : get(m_pPBAdd, "add");
47 0 : get(m_pPBDefault, "default");
48 0 : get(m_pValSetColorBox, "table");
49 0 : get(m_pLbChartColors, "colors");
50 0 : m_pLbChartColors->set_height_request(m_pLbChartColors->GetTextHeight()*16);
51 :
52 0 : m_pPBDefault->SetClickHdl( LINK( this, SvxDefaultColorOptPage, ResetToDefaults ) );
53 0 : m_pPBAdd->SetClickHdl( LINK( this, SvxDefaultColorOptPage, AddChartColor ) );
54 0 : m_pPBRemove->SetClickHdl( LINK( this, SvxDefaultColorOptPage, RemoveChartColor ) );
55 0 : m_pLbChartColors->SetSelectHdl( LINK( this, SvxDefaultColorOptPage, ListClickedHdl ) );
56 0 : m_pValSetColorBox->SetSelectHdl( LINK( this, SvxDefaultColorOptPage, BoxClickedHdl ) );
57 :
58 0 : m_pValSetColorBox->SetStyle( m_pValSetColorBox->GetStyle()
59 0 : | WB_ITEMBORDER | WB_NAMEFIELD );
60 0 : m_pValSetColorBox->SetColCount( 8 );
61 0 : m_pValSetColorBox->SetLineCount( 14 );
62 0 : m_pValSetColorBox->SetExtraSpacing( 0 );
63 0 : m_pValSetColorBox->Show();
64 :
65 0 : pChartOptions = new SvxChartOptions;
66 0 : pColorList = XColorList::CreateStdColorList();
67 :
68 0 : const SfxPoolItem* pItem = NULL;
69 0 : if ( rInAttrs.GetItemState( SID_SCH_EDITOPTIONS, false, &pItem ) == SfxItemState::SET )
70 : {
71 0 : pColorConfig = (static_cast< SvxChartColorTableItem* >(pItem->Clone()) );
72 : }
73 : else
74 : {
75 0 : SvxChartColorTable aTable;
76 0 : aTable.useDefault();
77 0 : pColorConfig = new SvxChartColorTableItem( SID_SCH_EDITOPTIONS, aTable );
78 0 : pColorConfig->SetOptions( pChartOptions );
79 : }
80 :
81 0 : Construct();
82 0 : }
83 :
84 0 : SvxDefaultColorOptPage::~SvxDefaultColorOptPage()
85 : {
86 0 : disposeOnce();
87 0 : }
88 :
89 0 : void SvxDefaultColorOptPage::dispose()
90 : {
91 : // save changes
92 0 : if (pChartOptions)
93 : {
94 0 : pChartOptions->SetDefaultColors( pColorConfig->GetColorList() );
95 0 : pChartOptions->Commit();
96 :
97 0 : delete pColorConfig;
98 0 : pColorConfig = NULL;
99 0 : delete pChartOptions;
100 0 : pChartOptions = NULL;
101 : }
102 0 : m_pLbChartColors.clear();
103 0 : m_pValSetColorBox.clear();
104 0 : m_pPBDefault.clear();
105 0 : m_pPBAdd.clear();
106 0 : m_pPBRemove.clear();
107 0 : SfxTabPage::dispose();
108 0 : }
109 :
110 0 : void SvxDefaultColorOptPage::Construct()
111 : {
112 0 : if( pColorConfig )
113 0 : FillBoxChartColorLB(m_pLbChartColors, pColorConfig->GetColorList());
114 :
115 0 : FillColorBox();
116 :
117 0 : m_pLbChartColors->SelectEntryPos( 0 );
118 0 : ListClickedHdl(m_pLbChartColors);
119 0 : }
120 :
121 :
122 0 : VclPtr<SfxTabPage> SvxDefaultColorOptPage::Create( vcl::Window* pParent, const SfxItemSet* rAttrs )
123 : {
124 0 : return VclPtr<SvxDefaultColorOptPage>::Create( pParent, *rAttrs );
125 : }
126 :
127 0 : bool SvxDefaultColorOptPage::FillItemSet( SfxItemSet* rOutAttrs )
128 : {
129 0 : if( pColorConfig )
130 0 : rOutAttrs->Put( *(static_cast< SfxPoolItem* >(pColorConfig)));
131 :
132 0 : return true;
133 : }
134 :
135 0 : void SvxDefaultColorOptPage::Reset( const SfxItemSet* )
136 : {
137 0 : m_pLbChartColors->SelectEntryPos( 0 );
138 0 : ListClickedHdl(m_pLbChartColors);
139 0 : }
140 :
141 0 : void SvxDefaultColorOptPage::FillColorBox()
142 : {
143 0 : if( !pColorList.is() ) return;
144 :
145 0 : long nCount = pColorList->Count();
146 :
147 0 : if( nCount > 104 )
148 0 : m_pValSetColorBox->SetStyle( m_pValSetColorBox->GetStyle() | WB_VSCROLL );
149 :
150 0 : for( long i = 0; i < nCount; i++ )
151 : {
152 0 : XColorEntry* pColorEntry = pColorList->GetColor( i );
153 0 : m_pValSetColorBox->InsertItem( i + 1, pColorEntry->GetColor(), pColorEntry->GetName() );
154 : }
155 : }
156 :
157 :
158 0 : long SvxDefaultColorOptPage::GetColorIndex( const Color& rCol )
159 : {
160 0 : if( pColorList.is() )
161 : {
162 0 : long nCount = pColorList->Count();
163 :
164 0 : for( long i = nCount - 1; i >= 0; i-- ) // default chart colors are at the end of the table
165 : {
166 0 : XColorEntry* pColorEntry = pColorList->GetColor( i );
167 0 : if( pColorEntry && pColorEntry->GetColor() == rCol )
168 0 : return pColorList->GetIndex( pColorEntry->GetName() );
169 : }
170 : }
171 0 : return -1L;
172 : }
173 :
174 :
175 :
176 :
177 : // event handlers
178 :
179 :
180 : // ResetToDefaults
181 :
182 :
183 0 : IMPL_LINK_NOARG(SvxDefaultColorOptPage, ResetToDefaults)
184 : {
185 0 : if( pColorConfig )
186 : {
187 0 : pColorConfig->GetColorList().useDefault();
188 :
189 0 : FillBoxChartColorLB(m_pLbChartColors, pColorConfig->GetColorList());
190 :
191 0 : m_pLbChartColors->GetFocus();
192 0 : m_pLbChartColors->SelectEntryPos( 0 );
193 0 : m_pPBRemove->Enable( true );
194 : }
195 :
196 0 : return 0L;
197 : }
198 :
199 : // AddChartColor
200 :
201 :
202 0 : IMPL_LINK_NOARG(SvxDefaultColorOptPage, AddChartColor)
203 : {
204 0 : if( pColorConfig )
205 : {
206 0 : ColorData black = RGB_COLORDATA( 0x00, 0x00, 0x00 );
207 :
208 0 : pColorConfig->GetColorList().append (XColorEntry ( black, pColorConfig->GetColorList().getDefaultName(pColorConfig->GetColorList().size())));
209 :
210 0 : FillBoxChartColorLB(m_pLbChartColors, pColorConfig->GetColorList());
211 :
212 0 : m_pLbChartColors->GetFocus();
213 0 : m_pLbChartColors->SelectEntryPos( pColorConfig->GetColorList().size() - 1 );
214 0 : m_pPBRemove->Enable( true );
215 : }
216 :
217 0 : return 0L;
218 : }
219 :
220 : // RemoveChartColor
221 :
222 :
223 0 : IMPL_LINK( SvxDefaultColorOptPage, RemoveChartColor, PushButton*, pButton )
224 : {
225 0 : sal_Int32 nIndex = m_pLbChartColors->GetSelectEntryPos();
226 :
227 0 : if (m_pLbChartColors->GetSelectEntryCount() == 0)
228 0 : return 0L;
229 :
230 0 : if( pColorConfig )
231 : {
232 : OSL_ENSURE(pColorConfig->GetColorList().size() > 1, "don't delete the last chart color");
233 :
234 : ScopedVclPtrInstance<MessageDialog> aQuery(pButton, "QueryDeleteChartColorDialog",
235 0 : "cui/ui/querydeletechartcolordialog.ui");
236 0 : if (RET_YES == aQuery->Execute())
237 : {
238 0 : pColorConfig->GetColorList().remove( nIndex );
239 :
240 0 : FillBoxChartColorLB(m_pLbChartColors, pColorConfig->GetColorList());
241 :
242 0 : m_pLbChartColors->GetFocus();
243 :
244 0 : if (nIndex == m_pLbChartColors->GetEntryCount() && m_pLbChartColors->GetEntryCount() > 0)
245 0 : m_pLbChartColors->SelectEntryPos( pColorConfig->GetColorList().size() - 1 );
246 0 : else if (m_pLbChartColors->GetEntryCount() > 0)
247 0 : m_pLbChartColors->SelectEntryPos( nIndex );
248 : else
249 0 : m_pPBRemove->Enable(true);
250 0 : }
251 : }
252 :
253 0 : return 0L;
254 : }
255 :
256 0 : IMPL_LINK( SvxDefaultColorOptPage, ListClickedHdl, ColorLB*, _pColorList )
257 : {
258 0 : Color aCol = _pColorList->GetSelectEntryColor();
259 :
260 0 : long nIndex = GetColorIndex( aCol );
261 :
262 0 : if( nIndex == -1 ) // not found
263 0 : m_pValSetColorBox->SetNoSelection();
264 : else
265 0 : m_pValSetColorBox->SelectItem( nIndex + 1 ); // ValueSet is 1-based
266 :
267 0 : return 0L;
268 : }
269 :
270 0 : IMPL_LINK_NOARG(SvxDefaultColorOptPage, BoxClickedHdl)
271 : {
272 0 : sal_Int32 nIdx = m_pLbChartColors->GetSelectEntryPos();
273 0 : if( nIdx != LISTBOX_ENTRY_NOTFOUND )
274 : {
275 0 : const XColorEntry aEntry( m_pValSetColorBox->GetItemColor( m_pValSetColorBox->GetSelectItemId() ), m_pLbChartColors->GetSelectEntry() );
276 :
277 0 : m_pLbChartColors->Modify( aEntry, nIdx );
278 0 : pColorConfig->ReplaceColorByIndex( nIdx, aEntry );
279 :
280 0 : m_pLbChartColors->SelectEntryPos( nIdx ); // reselect entry
281 : }
282 :
283 0 : return 0L;
284 0 : }
285 :
286 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|