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 :
10 : #include "condformatdlg.hxx"
11 : #include "condformatdlgentry.hxx"
12 : #include "condformatdlg.hrc"
13 : #include "conditio.hxx"
14 :
15 : #include "document.hxx"
16 :
17 : #include <vcl/vclevent.hxx>
18 : #include <svl/style.hxx>
19 : #include <sfx2/dispatch.hxx>
20 : #include <svl/stritem.hxx>
21 : #include <svl/intitem.hxx>
22 : #include <svx/xtable.hxx>
23 : #include <svx/drawitem.hxx>
24 : #include <vcl/msgbox.hxx>
25 : #include <vcl/settings.hxx>
26 : #include <formula/token.hxx>
27 : #include "tokenarray.hxx"
28 : #include "stlpool.hxx"
29 : #include "tabvwsh.hxx"
30 : #include "simpleformulacalc.hxx"
31 :
32 : #include "colorformat.hxx"
33 :
34 : #include "globstr.hrc"
35 :
36 : #include <set>
37 :
38 0 : ScCondFrmtEntry::ScCondFrmtEntry(vcl::Window* pParent, ScDocument* pDoc, const ScAddress& rPos):
39 : Control(pParent, ScResId( RID_COND_ENTRY ) ),
40 : mbActive(false),
41 : maFtCondNr( VclPtr<FixedText>::Create( this, ScResId( FT_COND_NR ) ) ),
42 : maFtCondition( VclPtr<FixedText>::Create( this, ScResId( FT_CONDITION ) ) ),
43 : mnIndex(0),
44 : maStrCondition(ScResId( STR_CONDITION ).toString()),
45 : maLbType( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE ) ) ),
46 : mpDoc(pDoc),
47 0 : maPos(rPos)
48 : {
49 0 : Color aBack(GetSettings().GetStyleSettings().GetWindowColor());
50 :
51 0 : SetControlBackground(aBack);
52 0 : SetBackground(GetControlBackground());
53 :
54 0 : maFtCondNr->SetControlBackground(aBack);
55 0 : maFtCondNr->SetBackground(maFtCondNr->GetControlBackground());
56 :
57 0 : maFtCondition->SetControlBackground(aBack);
58 0 : maFtCondition->SetBackground(maFtCondition->GetControlBackground());
59 :
60 0 : maLbType->SetSelectHdl( LINK( pParent, ScCondFormatList, TypeListHdl ) );
61 0 : maClickHdl = LINK( pParent, ScCondFormatList, EntrySelectHdl );
62 0 : }
63 :
64 0 : ScCondFrmtEntry::~ScCondFrmtEntry()
65 : {
66 0 : disposeOnce();
67 0 : }
68 :
69 0 : void ScCondFrmtEntry::dispose()
70 : {
71 0 : maFtCondNr.disposeAndClear();
72 0 : maFtCondition.disposeAndClear();
73 0 : maLbType.disposeAndClear();
74 0 : Control::dispose();
75 0 : }
76 :
77 0 : bool ScCondFrmtEntry::Notify( NotifyEvent& rNEvt )
78 : {
79 0 : if( rNEvt.GetType() == MouseNotifyEvent::MOUSEBUTTONDOWN )
80 : {
81 0 : ImplCallEventListenersAndHandler( VCLEVENT_WINDOW_MOUSEBUTTONDOWN, maClickHdl, this );
82 : }
83 0 : return Control::Notify(rNEvt);
84 : }
85 :
86 0 : void ScCondFrmtEntry::SetIndex(sal_Int32 nIndex)
87 : {
88 0 : mnIndex = nIndex;
89 0 : OUStringBuffer aBuffer(maStrCondition);
90 0 : aBuffer.append(OUString::number(nIndex));
91 0 : maFtCondNr->SetText(aBuffer.makeStringAndClear());
92 0 : }
93 :
94 0 : void ScCondFrmtEntry::SetHeight()
95 : {
96 0 : long nPad = LogicToPixel(Size(42,2), MapMode(MAP_APPFONT)).getHeight();
97 :
98 : // Calculate maximum height we need from visible widgets
99 0 : sal_uInt16 nChildren = GetChildCount();
100 :
101 0 : long nMaxHeight = 0;
102 0 : for(sal_uInt16 i = 0; i < nChildren; i++)
103 : {
104 0 : vcl::Window *pChild = GetChild(i);
105 0 : if(!pChild || !pChild->IsVisible())
106 0 : continue;
107 0 : Point aPos = pChild->GetPosPixel();
108 0 : Size aSize = pChild->GetSizePixel();
109 0 : nMaxHeight = std::max(aPos.Y() + aSize.Height(), nMaxHeight);
110 : }
111 0 : Size aSize = GetSizePixel();
112 0 : if(nMaxHeight > 0)
113 : {
114 0 : aSize.Height() = nMaxHeight + nPad;
115 0 : SetSizePixel(aSize);
116 : }
117 0 : }
118 :
119 0 : void ScCondFrmtEntry::Select()
120 : {
121 0 : maFtCondition->SetText(OUString());
122 0 : maFtCondition->Hide();
123 0 : maLbType->Show();
124 0 : mbActive = true;
125 0 : SetHeight();
126 0 : }
127 :
128 0 : void ScCondFrmtEntry::Deselect()
129 : {
130 0 : OUString maCondText = GetExpressionString();
131 0 : maFtCondition->SetText(maCondText);
132 0 : maFtCondition->Show();
133 0 : maLbType->Hide();
134 0 : mbActive = false;
135 0 : SetHeight();
136 0 : }
137 :
138 : //condition
139 :
140 : namespace {
141 :
142 0 : void FillStyleListBox( ScDocument* pDoc, ListBox& rLbStyle )
143 : {
144 0 : rLbStyle.SetSeparatorPos(0);
145 0 : std::set<OUString> aStyleNames;
146 0 : SfxStyleSheetIterator aStyleIter( pDoc->GetStyleSheetPool(), SFX_STYLE_FAMILY_PARA );
147 0 : for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = aStyleIter.Next() )
148 : {
149 0 : OUString aName = pStyle->GetName();
150 0 : aStyleNames.insert(aName);
151 0 : }
152 0 : for(std::set<OUString>::const_iterator itr = aStyleNames.begin(), itrEnd = aStyleNames.end();
153 : itr != itrEnd; ++itr)
154 : {
155 0 : rLbStyle.InsertEntry( *itr );
156 0 : }
157 0 : }
158 :
159 : }
160 :
161 : const ScConditionMode ScConditionFrmtEntry::mpEntryToCond[ScConditionFrmtEntry::NUM_COND_ENTRIES] = {
162 : SC_COND_EQUAL,
163 : SC_COND_LESS,
164 : SC_COND_GREATER,
165 : SC_COND_EQLESS,
166 : SC_COND_EQGREATER,
167 : SC_COND_NOTEQUAL,
168 : SC_COND_BETWEEN,
169 : SC_COND_NOTBETWEEN,
170 : SC_COND_DUPLICATE,
171 : SC_COND_NOTDUPLICATE,
172 : SC_COND_TOP10,
173 : SC_COND_BOTTOM10,
174 : SC_COND_TOP_PERCENT,
175 : SC_COND_BOTTOM_PERCENT,
176 : SC_COND_ABOVE_AVERAGE,
177 : SC_COND_BELOW_AVERAGE,
178 : SC_COND_ABOVE_EQUAL_AVERAGE,
179 : SC_COND_BELOW_EQUAL_AVERAGE,
180 : SC_COND_ERROR,
181 : SC_COND_NOERROR,
182 : SC_COND_BEGINS_WITH,
183 : SC_COND_ENDS_WITH,
184 : SC_COND_CONTAINS_TEXT,
185 : SC_COND_NOT_CONTAINS_TEXT
186 : };
187 :
188 0 : ScConditionFrmtEntry::ScConditionFrmtEntry( vcl::Window* pParent, ScDocument* pDoc, ScCondFormatDlg* pDialogParent,
189 : const ScAddress& rPos, const ScCondFormatEntry* pFormatEntry ):
190 : ScCondFrmtEntry( pParent, pDoc, rPos ),
191 : maLbCondType( VclPtr<ListBox>::Create( this, ScResId( LB_CELLIS_TYPE ) ) ),
192 : maEdVal1( VclPtr<formula::RefEdit>::Create( this, nullptr, nullptr, ScResId( ED_VAL1 ) ) ),
193 : maEdVal2( VclPtr<formula::RefEdit>::Create( this, nullptr, nullptr, ScResId( ED_VAL2 ) ) ),
194 : maFtVal( VclPtr<FixedText>::Create( this, ScResId( FT_VAL ) ) ),
195 : maFtStyle( VclPtr<FixedText>::Create( this, ScResId( FT_STYLE ) ) ),
196 : maLbStyle( VclPtr<ListBox>::Create( this, ScResId( LB_STYLE ) ) ),
197 : maWdPreview( VclPtr<SvxFontPrevWindow>::Create( this, ScResId( WD_PREVIEW ) ) ),
198 0 : mbIsInStyleCreate(false)
199 : {
200 :
201 0 : FreeResource();
202 0 : maLbType->SelectEntryPos(1);
203 :
204 0 : Init(pDialogParent);
205 :
206 0 : StartListening(*pDoc->GetStyleSheetPool(), true);
207 :
208 0 : if(pFormatEntry)
209 : {
210 0 : OUString aStyleName = pFormatEntry->GetStyle();
211 0 : maLbStyle->SelectEntry(aStyleName);
212 0 : StyleSelectHdl(NULL);
213 0 : ScConditionMode eMode = pFormatEntry->GetOperation();
214 :
215 0 : maLbCondType->SelectEntryPos(ConditionModeToEntryPos(eMode));
216 :
217 0 : switch(GetNumberEditFields(eMode))
218 : {
219 : case 0:
220 0 : maEdVal1->Hide();
221 0 : maEdVal2->Hide();
222 0 : break;
223 : case 1:
224 0 : maEdVal1->Show();
225 0 : maEdVal1->SetText(pFormatEntry->GetExpression(maPos, 0));
226 0 : maEdVal2->Hide();
227 0 : OnEdChanged(maEdVal1);
228 0 : break;
229 : case 2:
230 0 : maEdVal1->Show();
231 0 : maEdVal1->SetText(pFormatEntry->GetExpression(maPos, 0));
232 0 : OnEdChanged(maEdVal1);
233 0 : maEdVal2->Show();
234 0 : maEdVal2->SetText(pFormatEntry->GetExpression(maPos, 1));
235 0 : OnEdChanged(maEdVal2);
236 0 : break;
237 0 : }
238 : }
239 : else
240 : {
241 0 : maLbCondType->SelectEntryPos(0);
242 0 : maEdVal2->Hide();
243 0 : maLbStyle->SelectEntryPos(1);
244 : }
245 0 : }
246 :
247 0 : ScConditionFrmtEntry::~ScConditionFrmtEntry()
248 : {
249 0 : disposeOnce();
250 0 : }
251 :
252 0 : void ScConditionFrmtEntry::dispose()
253 : {
254 0 : maLbCondType.disposeAndClear();
255 0 : maEdVal1.disposeAndClear();
256 0 : maEdVal2.disposeAndClear();
257 0 : maFtVal.disposeAndClear();
258 0 : maFtStyle.disposeAndClear();
259 0 : maLbStyle.disposeAndClear();
260 0 : maWdPreview.disposeAndClear();
261 0 : ScCondFrmtEntry::dispose();
262 0 : }
263 :
264 0 : void ScConditionFrmtEntry::Init(ScCondFormatDlg* pDialogParent)
265 : {
266 0 : maEdVal1->SetGetFocusHdl( LINK( pDialogParent, ScCondFormatDlg, RangeGetFocusHdl ) );
267 0 : maEdVal2->SetGetFocusHdl( LINK( pDialogParent, ScCondFormatDlg, RangeGetFocusHdl ) );
268 :
269 0 : maEdVal1->SetStyle( maEdVal1->GetStyle() | WB_FORCECTRLBACKGROUND );
270 0 : maEdVal2->SetStyle( maEdVal2->GetStyle() | WB_FORCECTRLBACKGROUND );
271 :
272 0 : maEdVal1->SetModifyHdl( LINK( this, ScConditionFrmtEntry, OnEdChanged ) );
273 0 : maEdVal2->SetModifyHdl( LINK( this, ScConditionFrmtEntry, OnEdChanged ) );
274 :
275 0 : FillStyleListBox( mpDoc, *maLbStyle.get() );
276 0 : maLbStyle->SetSelectHdl( LINK( this, ScConditionFrmtEntry, StyleSelectHdl ) );
277 :
278 0 : maLbCondType->SetSelectHdl( LINK( this, ScConditionFrmtEntry, ConditionTypeSelectHdl ) );
279 0 : }
280 :
281 0 : ScFormatEntry* ScConditionFrmtEntry::createConditionEntry() const
282 : {
283 0 : ScConditionMode eMode = EntryPosToConditionMode(maLbCondType->GetSelectEntryPos());
284 0 : OUString aExpr1 = maEdVal1->GetText();
285 0 : OUString aExpr2;
286 0 : if (GetNumberEditFields(eMode) == 2)
287 : {
288 0 : aExpr2 = maEdVal2->GetText();
289 0 : if (aExpr2.isEmpty())
290 : {
291 0 : return NULL;
292 : }
293 : }
294 :
295 0 : ScFormatEntry* pEntry = new ScCondFormatEntry(eMode, aExpr1, aExpr2, mpDoc, maPos, maLbStyle->GetSelectEntry());
296 0 : return pEntry;
297 : }
298 :
299 0 : IMPL_LINK(ScConditionFrmtEntry, OnEdChanged, Edit*, pEdit)
300 : {
301 0 : OUString aFormula = pEdit->GetText();
302 :
303 0 : if( aFormula.isEmpty() )
304 : {
305 0 : maFtVal->SetText(ScGlobal::GetRscString(STR_ENTER_VALUE));
306 0 : return 0;
307 : }
308 :
309 0 : ScCompiler aComp( mpDoc, maPos );
310 0 : aComp.SetGrammar( mpDoc->GetGrammar() );
311 0 : boost::scoped_ptr<ScTokenArray> ta(aComp.CompileString(aFormula));
312 :
313 : // Error, warn the user
314 0 : if( ta->GetCodeError() )
315 : {
316 0 : pEdit->SetControlBackground(COL_LIGHTRED);
317 0 : maFtVal->SetText(ScGlobal::GetRscString(STR_VALID_DEFERROR));
318 0 : return 0;
319 : }
320 :
321 : // Recognized col/row name or string token, warn the user
322 0 : formula::FormulaToken* token = ta->First();
323 0 : formula::StackVar t = token->GetType();
324 0 : OpCode op = token->GetOpCode();
325 0 : if( ( op == ocColRowName ) ||
326 0 : ( ( op == ocBad ) && ( t == formula::svString ) )
327 : )
328 : {
329 0 : pEdit->SetControlBackground(COL_YELLOW);
330 0 : maFtVal->SetText(ScGlobal::GetRscString(STR_UNQUOTED_STRING));
331 0 : return 0;
332 : }
333 :
334 0 : pEdit->SetControlBackground(GetSettings().GetStyleSettings().GetWindowColor());
335 0 : maFtVal->SetText("");
336 0 : return 0;
337 : }
338 :
339 0 : void ScConditionFrmtEntry::Select()
340 : {
341 0 : maFtVal->Show();
342 0 : ScCondFrmtEntry::Select();
343 0 : }
344 :
345 0 : void ScConditionFrmtEntry::Deselect()
346 : {
347 0 : maFtVal->Hide();
348 0 : ScCondFrmtEntry::Deselect();
349 0 : }
350 :
351 :
352 0 : sal_Int32 ScConditionFrmtEntry::ConditionModeToEntryPos( ScConditionMode eMode )
353 : {
354 0 : for ( sal_Int32 i = 0; i < NUM_COND_ENTRIES; ++i )
355 : {
356 0 : if (mpEntryToCond[i] == eMode)
357 : {
358 0 : return i;
359 : }
360 : }
361 : assert(false); // should never get here
362 0 : return 0;
363 : }
364 :
365 0 : ScConditionMode ScConditionFrmtEntry::EntryPosToConditionMode( sal_Int32 aEntryPos )
366 : {
367 : assert( 0 <= aEntryPos && aEntryPos < NUM_COND_ENTRIES );
368 0 : return mpEntryToCond[aEntryPos];
369 : }
370 :
371 0 : sal_Int32 ScConditionFrmtEntry::GetNumberEditFields( ScConditionMode eMode )
372 : {
373 0 : switch(eMode)
374 : {
375 : case SC_COND_EQUAL:
376 : case SC_COND_LESS:
377 : case SC_COND_GREATER:
378 : case SC_COND_EQLESS:
379 : case SC_COND_EQGREATER:
380 : case SC_COND_NOTEQUAL:
381 : case SC_COND_TOP10:
382 : case SC_COND_BOTTOM10:
383 : case SC_COND_TOP_PERCENT:
384 : case SC_COND_BOTTOM_PERCENT:
385 : case SC_COND_BEGINS_WITH:
386 : case SC_COND_ENDS_WITH:
387 : case SC_COND_CONTAINS_TEXT:
388 : case SC_COND_NOT_CONTAINS_TEXT:
389 : case SC_COND_ERROR:
390 : case SC_COND_NOERROR:
391 0 : return 1;
392 : case SC_COND_ABOVE_AVERAGE:
393 : case SC_COND_BELOW_AVERAGE:
394 : case SC_COND_ABOVE_EQUAL_AVERAGE:
395 : case SC_COND_BELOW_EQUAL_AVERAGE:
396 : case SC_COND_DUPLICATE:
397 : case SC_COND_NOTDUPLICATE:
398 0 : return 0;
399 : case SC_COND_BETWEEN:
400 : case SC_COND_NOTBETWEEN:
401 0 : return 2;
402 : default:
403 : assert(false); // should never get here
404 0 : return 0;
405 : }
406 : }
407 :
408 0 : OUString ScConditionFrmtEntry::GetExpressionString()
409 : {
410 0 : return ScCondFormatHelper::GetExpression(CONDITION, maLbCondType->GetSelectEntryPos(), maEdVal1->GetText(), maEdVal2->GetText());
411 : }
412 :
413 0 : ScFormatEntry* ScConditionFrmtEntry::GetEntry() const
414 : {
415 0 : return createConditionEntry();
416 : }
417 :
418 0 : void ScConditionFrmtEntry::SetActive()
419 : {
420 0 : ScConditionMode eMode = EntryPosToConditionMode(maLbCondType->GetSelectEntryPos());
421 0 : maLbCondType->Show();
422 0 : switch(GetNumberEditFields(eMode))
423 : {
424 : case 1:
425 0 : maEdVal1->Show();
426 0 : break;
427 : case 2:
428 0 : maEdVal1->Show();
429 0 : maEdVal2->Show();
430 0 : break;
431 : }
432 0 : maFtStyle->Show();
433 0 : maLbStyle->Show();
434 0 : maWdPreview->Show();
435 :
436 0 : Select();
437 0 : }
438 :
439 0 : void ScConditionFrmtEntry::SetInactive()
440 : {
441 0 : maLbCondType->Hide();
442 0 : maEdVal1->Hide();
443 0 : maEdVal2->Hide();
444 0 : maFtStyle->Hide();
445 0 : maLbStyle->Hide();
446 0 : maWdPreview->Hide();
447 :
448 0 : Deselect();
449 0 : }
450 :
451 : namespace {
452 :
453 0 : void UpdateStyleList(ListBox& rLbStyle, ScDocument* pDoc)
454 : {
455 0 : OUString aSelectedStyle = rLbStyle.GetSelectEntry();
456 0 : for(sal_Int32 i = rLbStyle.GetEntryCount(); i >= 1; --i)
457 : {
458 0 : rLbStyle.RemoveEntry(i);
459 : }
460 0 : FillStyleListBox(pDoc, rLbStyle);
461 0 : rLbStyle.SelectEntry(aSelectedStyle);
462 0 : }
463 :
464 : }
465 :
466 0 : void ScConditionFrmtEntry::Notify(SfxBroadcaster&, const SfxHint& rHint)
467 : {
468 0 : const SfxStyleSheetHint* pHint = dynamic_cast<const SfxStyleSheetHint*>(&rHint);
469 0 : if(!pHint)
470 0 : return;
471 :
472 0 : sal_uInt16 nHint = pHint->GetHint();
473 0 : if(nHint == SfxStyleSheetHintId::MODIFIED)
474 : {
475 0 : if(!mbIsInStyleCreate)
476 0 : UpdateStyleList(*maLbStyle.get(), mpDoc);
477 : }
478 : }
479 :
480 : namespace {
481 :
482 0 : void StyleSelect( ListBox& rLbStyle, ScDocument* pDoc, SvxFontPrevWindow& rWdPreview )
483 : {
484 0 : if(rLbStyle.GetSelectEntryPos() == 0)
485 : {
486 : // call new style dialog
487 0 : SfxUInt16Item aFamilyItem( SID_STYLE_FAMILY, SFX_STYLE_FAMILY_PARA );
488 0 : SfxStringItem aRefItem( SID_STYLE_REFERENCE, ScGlobal::GetRscString(STR_STYLENAME_STANDARD) );
489 :
490 : // unlock the dispatcher so SID_STYLE_NEW can be executed
491 : // (SetDispatcherLock would affect all Calc documents)
492 0 : ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
493 0 : SfxDispatcher* pDisp = pViewShell->GetDispatcher();
494 0 : bool bLocked = pDisp->IsLocked();
495 0 : if (bLocked)
496 0 : pDisp->Lock(false);
497 :
498 : // Execute the "new style" slot, complete with undo and all necessary updates.
499 : // The return value (SfxUInt16Item) is ignored, look for new styles instead.
500 : pDisp->Execute( SID_STYLE_NEW, SfxCallMode::SYNCHRON | SfxCallMode::RECORD | SfxCallMode::MODAL,
501 : &aFamilyItem,
502 : &aRefItem,
503 0 : 0L );
504 :
505 0 : if (bLocked)
506 0 : pDisp->Lock(true);
507 :
508 : // Find the new style and add it into the style list boxes
509 0 : SfxStyleSheetIterator aStyleIter( pDoc->GetStyleSheetPool(), SFX_STYLE_FAMILY_PARA );
510 0 : bool bFound = false;
511 0 : for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle && !bFound; pStyle = aStyleIter.Next() )
512 : {
513 0 : OUString aName = pStyle->GetName();
514 0 : if ( rLbStyle.GetEntryPos(aName) == LISTBOX_ENTRY_NOTFOUND ) // all lists contain the same entries
515 : {
516 0 : for( sal_uInt16 i = 1, n = rLbStyle.GetEntryCount(); i <= n && !bFound; ++i)
517 : {
518 0 : OUString aStyleName = ScGlobal::pCharClass->uppercase(OUString(rLbStyle.GetEntry(i)));
519 0 : if( i == n )
520 : {
521 0 : rLbStyle.InsertEntry(aName);
522 0 : rLbStyle.SelectEntry(aName);
523 0 : bFound = true;
524 : }
525 0 : else if( aStyleName > ScGlobal::pCharClass->uppercase(aName) )
526 : {
527 0 : rLbStyle.InsertEntry(aName, i);
528 0 : rLbStyle.SelectEntry(aName);
529 0 : bFound = true;
530 : }
531 0 : }
532 : }
533 0 : }
534 : }
535 :
536 0 : OUString aStyleName = rLbStyle.GetSelectEntry();
537 0 : SfxStyleSheetBase* pStyleSheet = pDoc->GetStyleSheetPool()->Find( aStyleName, SFX_STYLE_FAMILY_PARA );
538 0 : if(pStyleSheet)
539 : {
540 0 : const SfxItemSet& rSet = pStyleSheet->GetItemSet();
541 0 : rWdPreview.Init( rSet );
542 0 : }
543 0 : }
544 :
545 : }
546 :
547 0 : IMPL_LINK_NOARG(ScConditionFrmtEntry, StyleSelectHdl)
548 : {
549 0 : mbIsInStyleCreate = true;
550 0 : StyleSelect( *maLbStyle.get(), mpDoc, *maWdPreview.get() );
551 0 : mbIsInStyleCreate = false;
552 0 : return 0;
553 : }
554 :
555 : // formula
556 :
557 0 : ScFormulaFrmtEntry::ScFormulaFrmtEntry( vcl::Window* pParent, ScDocument* pDoc, ScCondFormatDlg* pDialogParent, const ScAddress& rPos, const ScCondFormatEntry* pFormat ):
558 : ScCondFrmtEntry( pParent, pDoc, rPos ),
559 : maFtStyle( VclPtr<FixedText>::Create( this, ScResId( FT_STYLE ) ) ),
560 : maLbStyle( VclPtr<ListBox>::Create( this, ScResId( LB_STYLE ) ) ),
561 : maWdPreview( VclPtr<SvxFontPrevWindow>::Create( this, ScResId( WD_PREVIEW ) ) ),
562 0 : maEdFormula( VclPtr<formula::RefEdit>::Create(this, nullptr, nullptr, ScResId( ED_FORMULA ) ) )
563 : {
564 0 : Init(pDialogParent);
565 :
566 0 : FreeResource();
567 0 : maLbType->SelectEntryPos(2);
568 :
569 0 : if(pFormat)
570 : {
571 0 : maEdFormula->SetText(pFormat->GetExpression(rPos, 0, 0, pDoc->GetGrammar()));
572 0 : maLbStyle->SelectEntry(pFormat->GetStyle());
573 : }
574 : else
575 : {
576 0 : maLbStyle->SelectEntryPos(1);
577 : }
578 :
579 0 : StyleSelectHdl(NULL);
580 0 : }
581 :
582 0 : ScFormulaFrmtEntry::~ScFormulaFrmtEntry()
583 : {
584 0 : disposeOnce();
585 0 : }
586 :
587 0 : void ScFormulaFrmtEntry::dispose()
588 : {
589 0 : maFtStyle.disposeAndClear();
590 0 : maLbStyle.disposeAndClear();
591 0 : maWdPreview.disposeAndClear();
592 0 : maEdFormula.disposeAndClear();
593 0 : ScCondFrmtEntry::dispose();
594 0 : }
595 :
596 0 : void ScFormulaFrmtEntry::Init(ScCondFormatDlg* pDialogParent)
597 : {
598 0 : maEdFormula->SetGetFocusHdl( LINK( pDialogParent, ScCondFormatDlg, RangeGetFocusHdl ) );
599 :
600 0 : FillStyleListBox( mpDoc, *maLbStyle.get() );
601 0 : maLbStyle->SetSelectHdl( LINK( this, ScFormulaFrmtEntry, StyleSelectHdl ) );
602 0 : }
603 :
604 0 : IMPL_LINK_NOARG(ScFormulaFrmtEntry, StyleSelectHdl)
605 : {
606 0 : StyleSelect( *maLbStyle.get(), mpDoc, *maWdPreview.get() );
607 :
608 0 : return 0;
609 : }
610 :
611 0 : ScFormatEntry* ScFormulaFrmtEntry::createFormulaEntry() const
612 : {
613 0 : ScConditionMode eMode = SC_COND_DIRECT;
614 0 : OUString aFormula = maEdFormula->GetText();
615 0 : if(aFormula.isEmpty())
616 0 : return NULL;
617 :
618 0 : OUString aExpr2;
619 0 : ScFormatEntry* pEntry = new ScCondFormatEntry(eMode, aFormula, aExpr2, mpDoc, maPos, maLbStyle->GetSelectEntry());
620 0 : return pEntry;
621 : }
622 :
623 0 : ScFormatEntry* ScFormulaFrmtEntry::GetEntry() const
624 : {
625 0 : return createFormulaEntry();
626 : }
627 :
628 0 : OUString ScFormulaFrmtEntry::GetExpressionString()
629 : {
630 0 : return ScCondFormatHelper::GetExpression(FORMULA, 0, maEdFormula->GetText());
631 : }
632 :
633 0 : void ScFormulaFrmtEntry::SetActive()
634 : {
635 0 : maWdPreview->Show();
636 0 : maFtStyle->Show();
637 0 : maLbStyle->Show();
638 0 : maEdFormula->Show();
639 :
640 0 : Select();
641 0 : }
642 :
643 0 : void ScFormulaFrmtEntry::SetInactive()
644 : {
645 0 : maWdPreview->Hide();
646 0 : maFtStyle->Hide();
647 0 : maLbStyle->Hide();
648 0 : maEdFormula->Hide();
649 :
650 0 : Deselect();
651 0 : }
652 :
653 : //color scale
654 :
655 : namespace {
656 :
657 0 : OUString convertNumberToString(double nVal, ScDocument* pDoc)
658 : {
659 0 : SvNumberFormatter* pNumberFormatter = pDoc->GetFormatTable();
660 0 : OUString aText;
661 0 : pNumberFormatter->GetInputLineString(nVal, 0, aText);
662 0 : return aText;
663 : }
664 :
665 0 : void SetColorScaleEntryTypes( const ScColorScaleEntry& rEntry, ListBox& rLbType, Edit& rEdit, ColorListBox& rLbCol, ScDocument* pDoc )
666 : {
667 : // entry Automatic is not available for color scales
668 0 : sal_Int32 nIndex = static_cast<sal_Int32>(rEntry.GetType());
669 : assert(nIndex > 0);
670 0 : rLbType.SelectEntryPos(nIndex - 1);
671 0 : switch(rEntry.GetType())
672 : {
673 : case COLORSCALE_MIN:
674 : case COLORSCALE_MAX:
675 0 : break;
676 : case COLORSCALE_PERCENTILE:
677 : case COLORSCALE_VALUE:
678 : case COLORSCALE_PERCENT:
679 : {
680 0 : double nVal = rEntry.GetValue();
681 0 : rEdit.SetText(convertNumberToString(nVal, pDoc));
682 : }
683 0 : break;
684 : case COLORSCALE_FORMULA:
685 0 : rEdit.SetText(rEntry.GetFormula(formula::FormulaGrammar::GRAM_DEFAULT));
686 0 : break;
687 : case COLORSCALE_AUTO:
688 0 : abort();
689 : break;
690 : }
691 0 : rLbCol.SelectEntry(rEntry.GetColor());
692 0 : }
693 :
694 0 : void SetColorScaleEntry( ScColorScaleEntry* pEntry, const ListBox& rType, const Edit& rValue, ScDocument* pDoc, const ScAddress& rPos, bool bDataBar )
695 : {
696 :
697 : // color scale does not have the automatic entry
698 0 : sal_Int32 nPos = rType.GetSelectEntryPos();
699 0 : if(!bDataBar)
700 0 : ++nPos;
701 :
702 0 : pEntry->SetType(static_cast<ScColorScaleEntryType>(nPos));
703 0 : switch(nPos)
704 : {
705 : case COLORSCALE_AUTO:
706 : case COLORSCALE_MIN:
707 : case COLORSCALE_MAX:
708 0 : break;
709 : case COLORSCALE_PERCENTILE:
710 : case COLORSCALE_VALUE:
711 : case COLORSCALE_PERCENT:
712 : {
713 0 : sal_uInt32 nIndex = 0;
714 0 : double nVal = 0;
715 0 : SvNumberFormatter* pNumberFormatter = pDoc->GetFormatTable();
716 0 : (void)pNumberFormatter->IsNumberFormat(rValue.GetText(), nIndex, nVal);
717 0 : pEntry->SetValue(nVal);
718 : }
719 0 : break;
720 : case COLORSCALE_FORMULA:
721 0 : pEntry->SetFormula(rValue.GetText(), pDoc, rPos);
722 0 : break;
723 : default:
724 0 : break;
725 : }
726 0 : }
727 :
728 0 : ScColorScaleEntry* createColorScaleEntry( const ListBox& rType, const ColorListBox& rColor, const Edit& rValue, ScDocument* pDoc, const ScAddress& rPos )
729 : {
730 0 : ScColorScaleEntry* pEntry = new ScColorScaleEntry();
731 :
732 0 : SetColorScaleEntry( pEntry, rType, rValue, pDoc, rPos, false );
733 0 : Color aColor = rColor.GetSelectEntryColor();
734 0 : pEntry->SetColor(aColor);
735 0 : return pEntry;
736 : }
737 :
738 : }
739 :
740 0 : ScColorScale2FrmtEntry::ScColorScale2FrmtEntry( vcl::Window* pParent, ScDocument* pDoc, const ScAddress& rPos, const ScColorScaleFormat* pFormat ):
741 : ScCondFrmtEntry( pParent, pDoc, rPos ),
742 : maLbColorFormat( VclPtr<ListBox>::Create( this, ScResId( LB_COLOR_FORMAT ) ) ),
743 : maLbEntryTypeMin( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE_COL_SCALE_MIN ) ) ),
744 : maLbEntryTypeMax( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE_COL_SCALE_MAX ) ) ),
745 : maEdMin( VclPtr<Edit>::Create( this, ScResId( ED_COL_SCALE_MIN ) ) ),
746 : maEdMax( VclPtr<Edit>::Create( this, ScResId( ED_COL_SCALE_MAX ) ) ),
747 : maLbColMin( VclPtr<ColorListBox>::Create( this, ScResId( LB_COL_MIN ) ) ),
748 0 : maLbColMax( VclPtr<ColorListBox>::Create( this, ScResId( LB_COL_MAX ) ) )
749 : {
750 : // remove the automatic entry from color scales
751 0 : maLbEntryTypeMin->RemoveEntry(0);
752 0 : maLbEntryTypeMax->RemoveEntry(0);
753 :
754 0 : maLbType->SelectEntryPos(0);
755 0 : maLbColorFormat->SelectEntryPos(0);
756 0 : Init();
757 0 : if(pFormat)
758 : {
759 0 : ScColorScaleFormat::const_iterator itr = pFormat->begin();
760 0 : SetColorScaleEntryTypes(*itr, *maLbEntryTypeMin.get(), *maEdMin.get(), *maLbColMin.get(), pDoc);
761 0 : ++itr;
762 0 : SetColorScaleEntryTypes(*itr, *maLbEntryTypeMax.get(), *maEdMax.get(), *maLbColMax.get(), pDoc);
763 : }
764 : else
765 : {
766 0 : maLbEntryTypeMin->SelectEntryPos(0);
767 0 : maLbEntryTypeMax->SelectEntryPos(1);
768 : }
769 0 : FreeResource();
770 :
771 0 : maLbColorFormat->SetSelectHdl( LINK( pParent, ScCondFormatList, ColFormatTypeHdl ) );
772 :
773 0 : EntryTypeHdl(maLbEntryTypeMin.get());
774 0 : EntryTypeHdl(maLbEntryTypeMax.get());
775 0 : }
776 :
777 0 : ScColorScale2FrmtEntry::~ScColorScale2FrmtEntry()
778 : {
779 0 : disposeOnce();
780 0 : }
781 :
782 0 : void ScColorScale2FrmtEntry::dispose()
783 : {
784 0 : maLbColorFormat.disposeAndClear();
785 0 : maLbEntryTypeMin.disposeAndClear();
786 0 : maLbEntryTypeMax.disposeAndClear();
787 0 : maEdMin.disposeAndClear();
788 0 : maEdMax.disposeAndClear();
789 0 : maLbColMin.disposeAndClear();
790 0 : maLbColMax.disposeAndClear();
791 0 : ScCondFrmtEntry::dispose();
792 0 : }
793 :
794 0 : void ScColorScale2FrmtEntry::Init()
795 : {
796 0 : maLbEntryTypeMin->SetSelectHdl( LINK( this, ScColorScale2FrmtEntry, EntryTypeHdl ) );
797 0 : maLbEntryTypeMax->SetSelectHdl( LINK( this, ScColorScale2FrmtEntry, EntryTypeHdl ) );
798 :
799 0 : SfxObjectShell* pDocSh = SfxObjectShell::Current();
800 0 : XColorListRef pColorTable;
801 :
802 : DBG_ASSERT( pDocSh, "DocShell not found!" );
803 :
804 0 : if ( pDocSh )
805 : {
806 0 : const SfxPoolItem* pItem = pDocSh->GetItem( SID_COLOR_TABLE );
807 0 : if ( pItem != NULL )
808 0 : pColorTable = static_cast<const SvxColorListItem*>(pItem) ->GetColorList();
809 : }
810 0 : if ( pColorTable.is() )
811 : {
812 : // filling the line color box
813 0 : maLbColMin->SetUpdateMode( false );
814 0 : maLbColMax->SetUpdateMode( false );
815 :
816 0 : for ( long i = 0; i < pColorTable->Count(); ++i )
817 : {
818 0 : XColorEntry* pEntry = pColorTable->GetColor(i);
819 0 : maLbColMin->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
820 0 : maLbColMax->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
821 :
822 0 : if(pEntry->GetColor() == Color(COL_LIGHTRED))
823 0 : maLbColMin->SelectEntryPos(i);
824 0 : if(pEntry->GetColor() == Color(COL_LIGHTBLUE))
825 0 : maLbColMax->SelectEntryPos(i);
826 : }
827 0 : maLbColMin->SetUpdateMode( true );
828 0 : maLbColMax->SetUpdateMode( true );
829 0 : }
830 0 : }
831 :
832 0 : ScFormatEntry* ScColorScale2FrmtEntry::createColorscaleEntry() const
833 : {
834 0 : ScColorScaleFormat* pColorScale = new ScColorScaleFormat(mpDoc);
835 0 : pColorScale->AddEntry(createColorScaleEntry(*maLbEntryTypeMin.get(), *maLbColMin.get(), *maEdMin.get(), mpDoc, maPos));
836 0 : pColorScale->AddEntry(createColorScaleEntry(*maLbEntryTypeMax.get(), *maLbColMax.get(), *maEdMax.get(), mpDoc, maPos));
837 0 : return pColorScale;
838 : }
839 :
840 0 : OUString ScColorScale2FrmtEntry::GetExpressionString()
841 : {
842 0 : return ScCondFormatHelper::GetExpression( COLORSCALE, 0 );
843 : }
844 :
845 0 : ScFormatEntry* ScColorScale2FrmtEntry::GetEntry() const
846 : {
847 0 : return createColorscaleEntry();
848 : }
849 :
850 0 : void ScColorScale2FrmtEntry::SetActive()
851 : {
852 0 : maLbColorFormat->Show();
853 :
854 0 : maLbEntryTypeMin->Show();
855 0 : maLbEntryTypeMax->Show();
856 :
857 0 : maEdMin->Show();
858 0 : maEdMax->Show();
859 :
860 0 : maLbColMin->Show();
861 0 : maLbColMax->Show();
862 :
863 0 : Select();
864 0 : }
865 :
866 0 : void ScColorScale2FrmtEntry::SetInactive()
867 : {
868 0 : maLbColorFormat->Hide();
869 :
870 0 : maLbEntryTypeMin->Hide();
871 0 : maLbEntryTypeMax->Hide();
872 :
873 0 : maEdMin->Hide();
874 0 : maEdMax->Hide();
875 :
876 0 : maLbColMin->Hide();
877 0 : maLbColMax->Hide();
878 :
879 0 : Deselect();
880 0 : }
881 :
882 0 : IMPL_LINK( ScColorScale2FrmtEntry, EntryTypeHdl, ListBox*, pBox )
883 : {
884 0 : Edit* pEd = NULL;
885 0 : if (pBox == maLbEntryTypeMin.get())
886 0 : pEd = maEdMin;
887 0 : else if (pBox == maLbEntryTypeMax.get())
888 0 : pEd = maEdMax.get();
889 :
890 0 : if (!pEd)
891 0 : return 0;
892 :
893 0 : bool bEnableEdit = true;
894 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
895 0 : if(nPos < 2)
896 : {
897 0 : bEnableEdit = false;
898 : }
899 :
900 0 : if (bEnableEdit)
901 0 : pEd->Enable();
902 : else
903 0 : pEd->Disable();
904 :
905 0 : return 0;
906 : }
907 :
908 0 : ScColorScale3FrmtEntry::ScColorScale3FrmtEntry( vcl::Window* pParent, ScDocument* pDoc, const ScAddress& rPos, const ScColorScaleFormat* pFormat ):
909 : ScCondFrmtEntry( pParent, pDoc, rPos ),
910 : maLbColorFormat( VclPtr<ListBox>::Create( this, ScResId( LB_COLOR_FORMAT ) ) ),
911 : maLbEntryTypeMin( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE_COL_SCALE_MIN ) ) ),
912 : maLbEntryTypeMiddle( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE_COL_SCALE_MIDDLE ) ) ),
913 : maLbEntryTypeMax( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE_COL_SCALE_MAX ) ) ),
914 : maEdMin( VclPtr<Edit>::Create( this, ScResId( ED_COL_SCALE_MIN ) ) ),
915 : maEdMiddle( VclPtr<Edit>::Create( this, ScResId( ED_COL_SCALE_MIDDLE ) ) ),
916 : maEdMax( VclPtr<Edit>::Create( this, ScResId( ED_COL_SCALE_MAX ) ) ),
917 : maLbColMin( VclPtr<ColorListBox>::Create( this, ScResId( LB_COL_MIN ) ) ),
918 : maLbColMiddle( VclPtr<ColorListBox>::Create( this, ScResId( LB_COL_MIDDLE ) ) ),
919 0 : maLbColMax( VclPtr<ColorListBox>::Create( this, ScResId( LB_COL_MAX ) ) )
920 : {
921 : // remove the automatic entry from color scales
922 0 : maLbEntryTypeMin->RemoveEntry(0);
923 0 : maLbEntryTypeMiddle->RemoveEntry(0);
924 0 : maLbEntryTypeMax->RemoveEntry(0);
925 0 : maLbColorFormat->SelectEntryPos(1);
926 :
927 0 : Init();
928 0 : maLbType->SelectEntryPos(0);
929 0 : if(pFormat)
930 : {
931 0 : ScColorScaleFormat::const_iterator itr = pFormat->begin();
932 0 : SetColorScaleEntryTypes(*itr, *maLbEntryTypeMin.get(), *maEdMin.get(), *maLbColMin.get(), pDoc);
933 : assert(pFormat->size() == 3);
934 0 : ++itr;
935 0 : SetColorScaleEntryTypes(*itr, *maLbEntryTypeMiddle.get(), *maEdMiddle.get(), *maLbColMiddle.get(), pDoc);
936 0 : ++itr;
937 0 : SetColorScaleEntryTypes(*itr, *maLbEntryTypeMax.get(), *maEdMax.get(), *maLbColMax.get(), pDoc);
938 : }
939 : else
940 : {
941 0 : maLbColorFormat->SelectEntryPos(1);
942 0 : maLbEntryTypeMin->SelectEntryPos(0);
943 0 : maLbEntryTypeMiddle->SelectEntryPos(2);
944 0 : maLbEntryTypeMax->SelectEntryPos(1);
945 0 : maEdMiddle->SetText(OUString::number(50));
946 : }
947 0 : FreeResource();
948 :
949 0 : maLbColorFormat->SetSelectHdl( LINK( pParent, ScCondFormatList, ColFormatTypeHdl ) );
950 0 : EntryTypeHdl(maLbEntryTypeMin.get());
951 0 : EntryTypeHdl(maLbEntryTypeMiddle.get());
952 0 : EntryTypeHdl(maLbEntryTypeMax.get());
953 0 : }
954 :
955 0 : ScColorScale3FrmtEntry::~ScColorScale3FrmtEntry()
956 : {
957 0 : disposeOnce();
958 0 : }
959 :
960 0 : void ScColorScale3FrmtEntry::dispose()
961 : {
962 0 : maLbColorFormat.disposeAndClear();
963 0 : maLbEntryTypeMin.disposeAndClear();
964 0 : maLbEntryTypeMiddle.disposeAndClear();
965 0 : maLbEntryTypeMax.disposeAndClear();
966 0 : maEdMin.disposeAndClear();
967 0 : maEdMiddle.disposeAndClear();
968 0 : maEdMax.disposeAndClear();
969 0 : maLbColMin.disposeAndClear();
970 0 : maLbColMiddle.disposeAndClear();
971 0 : maLbColMax.disposeAndClear();
972 0 : ScCondFrmtEntry::dispose();
973 0 : }
974 :
975 0 : void ScColorScale3FrmtEntry::Init()
976 : {
977 0 : maLbEntryTypeMin->SetSelectHdl( LINK( this, ScColorScale3FrmtEntry, EntryTypeHdl ) );
978 0 : maLbEntryTypeMax->SetSelectHdl( LINK( this, ScColorScale3FrmtEntry, EntryTypeHdl ) );
979 0 : maLbEntryTypeMiddle->SetSelectHdl( LINK( this, ScColorScale3FrmtEntry, EntryTypeHdl ) );
980 :
981 0 : SfxObjectShell* pDocSh = SfxObjectShell::Current();
982 0 : XColorListRef pColorTable;
983 :
984 : DBG_ASSERT( pDocSh, "DocShell not found!" );
985 :
986 0 : if ( pDocSh )
987 : {
988 0 : const SfxPoolItem* pItem = pDocSh->GetItem( SID_COLOR_TABLE );
989 0 : if ( pItem != NULL )
990 0 : pColorTable = static_cast<const SvxColorListItem*>(pItem)->GetColorList();
991 : }
992 0 : if ( pColorTable.is() )
993 : {
994 : // filling the line color box
995 0 : maLbColMin->SetUpdateMode( false );
996 0 : maLbColMiddle->SetUpdateMode( false );
997 0 : maLbColMax->SetUpdateMode( false );
998 :
999 0 : for ( long i = 0; i < pColorTable->Count(); ++i )
1000 : {
1001 0 : XColorEntry* pEntry = pColorTable->GetColor(i);
1002 0 : maLbColMin->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1003 0 : maLbColMiddle->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1004 0 : maLbColMax->InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1005 :
1006 0 : if(pEntry->GetColor() == Color(COL_LIGHTRED))
1007 0 : maLbColMin->SelectEntryPos(i);
1008 0 : if(pEntry->GetColor() == Color(COL_GREEN))
1009 0 : maLbColMiddle->SelectEntryPos(i);
1010 0 : if(pEntry->GetColor() == Color(COL_LIGHTBLUE))
1011 0 : maLbColMax->SelectEntryPos(i);
1012 : }
1013 0 : maLbColMin->SetUpdateMode( true );
1014 0 : maLbColMiddle->SetUpdateMode( true );
1015 0 : maLbColMax->SetUpdateMode( true );
1016 0 : }
1017 0 : }
1018 :
1019 0 : ScFormatEntry* ScColorScale3FrmtEntry::createColorscaleEntry() const
1020 : {
1021 0 : ScColorScaleFormat* pColorScale = new ScColorScaleFormat(mpDoc);
1022 0 : pColorScale->AddEntry(createColorScaleEntry(*maLbEntryTypeMin.get(), *maLbColMin.get(), *maEdMin.get(), mpDoc, maPos));
1023 0 : if(maLbColorFormat->GetSelectEntryPos() == 1)
1024 0 : pColorScale->AddEntry(createColorScaleEntry(*maLbEntryTypeMiddle.get(), *maLbColMiddle.get(), *maEdMiddle.get(), mpDoc, maPos));
1025 0 : pColorScale->AddEntry(createColorScaleEntry(*maLbEntryTypeMax.get(), *maLbColMax.get(), *maEdMax.get(), mpDoc, maPos));
1026 0 : return pColorScale;
1027 : }
1028 :
1029 0 : OUString ScColorScale3FrmtEntry::GetExpressionString()
1030 : {
1031 0 : return ScCondFormatHelper::GetExpression( COLORSCALE, 0 );
1032 : }
1033 :
1034 0 : ScFormatEntry* ScColorScale3FrmtEntry::GetEntry() const
1035 : {
1036 0 : return createColorscaleEntry();
1037 : }
1038 :
1039 0 : void ScColorScale3FrmtEntry::SetActive()
1040 : {
1041 0 : maLbColorFormat->Show();
1042 0 : maLbEntryTypeMin->Show();
1043 0 : maLbEntryTypeMiddle->Show();
1044 0 : maLbEntryTypeMax->Show();
1045 :
1046 0 : maEdMin->Show();
1047 0 : maEdMiddle->Show();
1048 0 : maEdMax->Show();
1049 :
1050 0 : maLbColMin->Show();
1051 0 : maLbColMiddle->Show();
1052 0 : maLbColMax->Show();
1053 :
1054 0 : Select();
1055 0 : }
1056 :
1057 0 : void ScColorScale3FrmtEntry::SetInactive()
1058 : {
1059 0 : maLbColorFormat->Hide();
1060 :
1061 0 : maLbEntryTypeMin->Hide();
1062 0 : maLbEntryTypeMiddle->Hide();
1063 0 : maLbEntryTypeMax->Hide();
1064 :
1065 0 : maEdMin->Hide();
1066 0 : maEdMiddle->Hide();
1067 0 : maEdMax->Hide();
1068 :
1069 0 : maLbColMin->Hide();
1070 0 : maLbColMiddle->Hide();
1071 0 : maLbColMax->Hide();
1072 :
1073 0 : Deselect();
1074 0 : }
1075 :
1076 0 : IMPL_LINK( ScColorScale3FrmtEntry, EntryTypeHdl, ListBox*, pBox )
1077 : {
1078 0 : Edit* pEd = NULL;
1079 0 : if(pBox == maLbEntryTypeMin.get())
1080 0 : pEd = maEdMin.get();
1081 0 : else if(pBox == maLbEntryTypeMiddle.get())
1082 0 : pEd = maEdMiddle.get();
1083 0 : else if(pBox == maLbEntryTypeMax.get())
1084 0 : pEd = maEdMax.get();
1085 :
1086 0 : if (!pEd)
1087 0 : return 0;
1088 :
1089 0 : bool bEnableEdit = true;
1090 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
1091 0 : if(nPos < 2)
1092 : {
1093 0 : bEnableEdit = false;
1094 : }
1095 :
1096 0 : if(bEnableEdit)
1097 0 : pEd->Enable();
1098 : else
1099 0 : pEd->Disable();
1100 :
1101 0 : return 0;
1102 : }
1103 :
1104 0 : IMPL_LINK_NOARG( ScConditionFrmtEntry, ConditionTypeSelectHdl )
1105 : {
1106 0 : sal_Int32 nSelectPos = maLbCondType->GetSelectEntryPos();
1107 0 : ScConditionMode eMode = EntryPosToConditionMode(nSelectPos);
1108 0 : switch(GetNumberEditFields(eMode))
1109 : {
1110 : case 0:
1111 0 : maEdVal1->Hide();
1112 0 : maEdVal2->Hide();
1113 0 : maFtVal->Hide();
1114 0 : break;
1115 : case 1:
1116 0 : maEdVal1->Show();
1117 0 : maEdVal2->Hide();
1118 0 : maFtVal->Show();
1119 0 : break;
1120 : case 2:
1121 0 : maEdVal1->Show();
1122 0 : maEdVal2->Show();
1123 0 : maFtVal->Show();
1124 0 : break;
1125 : }
1126 :
1127 0 : return 0;
1128 : }
1129 :
1130 : //databar
1131 :
1132 : namespace {
1133 :
1134 0 : void SetDataBarEntryTypes( const ScColorScaleEntry& rEntry, ListBox& rLbType, Edit& rEdit, ScDocument* pDoc )
1135 : {
1136 0 : rLbType.SelectEntryPos(rEntry.GetType());
1137 0 : switch(rEntry.GetType())
1138 : {
1139 : case COLORSCALE_AUTO:
1140 : case COLORSCALE_MIN:
1141 : case COLORSCALE_MAX:
1142 0 : break;
1143 : case COLORSCALE_VALUE:
1144 : case COLORSCALE_PERCENT:
1145 : case COLORSCALE_PERCENTILE:
1146 : {
1147 0 : double nVal = rEntry.GetValue();
1148 0 : SvNumberFormatter* pNumberFormatter = pDoc->GetFormatTable();
1149 0 : OUString aText;
1150 0 : pNumberFormatter->GetInputLineString(nVal, 0, aText);
1151 0 : rEdit.SetText(aText);
1152 : }
1153 0 : break;
1154 : case COLORSCALE_FORMULA:
1155 0 : rEdit.SetText(rEntry.GetFormula(formula::FormulaGrammar::GRAM_DEFAULT));
1156 0 : break;
1157 : }
1158 0 : }
1159 :
1160 : }
1161 :
1162 0 : ScDataBarFrmtEntry::ScDataBarFrmtEntry( vcl::Window* pParent, ScDocument* pDoc, const ScAddress& rPos, const ScDataBarFormat* pFormat ):
1163 : ScCondFrmtEntry( pParent, pDoc, rPos ),
1164 : maLbColorFormat( VclPtr<ListBox>::Create( this, ScResId( LB_COLOR_FORMAT ) ) ),
1165 : maLbDataBarMinType( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE_COL_SCALE_MIN ) ) ),
1166 : maLbDataBarMaxType( VclPtr<ListBox>::Create( this, ScResId( LB_TYPE_COL_SCALE_MAX ) ) ),
1167 : maEdDataBarMin( VclPtr<Edit>::Create( this, ScResId( ED_COL_SCALE_MIN ) ) ),
1168 : maEdDataBarMax( VclPtr<Edit>::Create( this, ScResId( ED_COL_SCALE_MAX ) ) ),
1169 0 : maBtOptions( VclPtr<PushButton>::Create( this, ScResId( BTN_OPTIONS ) ) )
1170 : {
1171 0 : maLbColorFormat->SelectEntryPos(2);
1172 0 : maLbType->SelectEntryPos(0);
1173 0 : if(pFormat)
1174 : {
1175 0 : mpDataBarData.reset(new ScDataBarFormatData(*pFormat->GetDataBarData()));
1176 0 : SetDataBarEntryTypes(*mpDataBarData->mpLowerLimit, *maLbDataBarMinType.get(), *maEdDataBarMin.get(), pDoc);
1177 0 : SetDataBarEntryTypes(*mpDataBarData->mpUpperLimit, *maLbDataBarMaxType.get(), *maEdDataBarMax.get(), pDoc);
1178 0 : DataBarTypeSelectHdl(NULL);
1179 : }
1180 : else
1181 : {
1182 0 : maLbDataBarMinType->SelectEntryPos(0);
1183 0 : maLbDataBarMaxType->SelectEntryPos(0);
1184 0 : DataBarTypeSelectHdl(NULL);
1185 : }
1186 0 : Init();
1187 :
1188 0 : maLbColorFormat->SetSelectHdl( LINK( pParent, ScCondFormatList, ColFormatTypeHdl ) );
1189 :
1190 0 : FreeResource();
1191 0 : }
1192 :
1193 0 : ScDataBarFrmtEntry::~ScDataBarFrmtEntry()
1194 : {
1195 0 : disposeOnce();
1196 0 : }
1197 :
1198 0 : void ScDataBarFrmtEntry::dispose()
1199 : {
1200 0 : maLbColorFormat.disposeAndClear();
1201 0 : maLbDataBarMinType.disposeAndClear();
1202 0 : maLbDataBarMaxType.disposeAndClear();
1203 0 : maEdDataBarMin.disposeAndClear();
1204 0 : maEdDataBarMax.disposeAndClear();
1205 0 : maBtOptions.disposeAndClear();
1206 0 : ScCondFrmtEntry::dispose();
1207 0 : }
1208 :
1209 0 : ScFormatEntry* ScDataBarFrmtEntry::GetEntry() const
1210 : {
1211 0 : return createDatabarEntry();
1212 : }
1213 :
1214 0 : void ScDataBarFrmtEntry::Init()
1215 : {
1216 0 : maLbDataBarMinType->SetSelectHdl( LINK( this, ScDataBarFrmtEntry, DataBarTypeSelectHdl ) );
1217 0 : maLbDataBarMaxType->SetSelectHdl( LINK( this, ScDataBarFrmtEntry, DataBarTypeSelectHdl ) );
1218 :
1219 0 : maBtOptions->SetClickHdl( LINK( this, ScDataBarFrmtEntry, OptionBtnHdl ) );
1220 :
1221 0 : if(!mpDataBarData)
1222 : {
1223 0 : mpDataBarData.reset(new ScDataBarFormatData());
1224 0 : mpDataBarData->mpUpperLimit.reset(new ScColorScaleEntry());
1225 0 : mpDataBarData->mpLowerLimit.reset(new ScColorScaleEntry());
1226 0 : mpDataBarData->mpLowerLimit->SetType(COLORSCALE_AUTO);
1227 0 : mpDataBarData->mpUpperLimit->SetType(COLORSCALE_AUTO);
1228 0 : mpDataBarData->maPositiveColor = COL_LIGHTBLUE;
1229 : }
1230 0 : }
1231 :
1232 0 : ScFormatEntry* ScDataBarFrmtEntry::createDatabarEntry() const
1233 : {
1234 0 : SetColorScaleEntry(mpDataBarData->mpLowerLimit.get(), *maLbDataBarMinType.get(), *maEdDataBarMin.get(), mpDoc, maPos, true);
1235 0 : SetColorScaleEntry(mpDataBarData->mpUpperLimit.get(), *maLbDataBarMaxType.get(), *maEdDataBarMax.get(), mpDoc, maPos, true);
1236 0 : ScDataBarFormat* pDataBar = new ScDataBarFormat(mpDoc);
1237 0 : pDataBar->SetDataBarData(new ScDataBarFormatData(*mpDataBarData.get()));
1238 0 : return pDataBar;
1239 : }
1240 :
1241 0 : OUString ScDataBarFrmtEntry::GetExpressionString()
1242 : {
1243 0 : return ScCondFormatHelper::GetExpression( DATABAR, 0 );
1244 : }
1245 :
1246 0 : void ScDataBarFrmtEntry::SetActive()
1247 : {
1248 0 : maLbColorFormat->Show();
1249 :
1250 0 : maLbDataBarMinType->Show();
1251 0 : maLbDataBarMaxType->Show();
1252 0 : maEdDataBarMin->Show();
1253 0 : maEdDataBarMax->Show();
1254 0 : maBtOptions->Show();
1255 :
1256 0 : Select();
1257 0 : }
1258 :
1259 0 : void ScDataBarFrmtEntry::SetInactive()
1260 : {
1261 0 : maLbColorFormat->Hide();
1262 :
1263 0 : maLbDataBarMinType->Hide();
1264 0 : maLbDataBarMaxType->Hide();
1265 0 : maEdDataBarMin->Hide();
1266 0 : maEdDataBarMax->Hide();
1267 0 : maBtOptions->Hide();
1268 :
1269 0 : Deselect();
1270 0 : }
1271 :
1272 0 : IMPL_LINK_NOARG( ScDataBarFrmtEntry, DataBarTypeSelectHdl )
1273 : {
1274 0 : sal_Int32 nSelectPos = maLbDataBarMinType->GetSelectEntryPos();
1275 0 : if(nSelectPos <= COLORSCALE_MAX)
1276 0 : maEdDataBarMin->Disable();
1277 : else
1278 0 : maEdDataBarMin->Enable();
1279 :
1280 0 : nSelectPos = maLbDataBarMaxType->GetSelectEntryPos();
1281 0 : if(nSelectPos <= COLORSCALE_MAX)
1282 0 : maEdDataBarMax->Disable();
1283 : else
1284 0 : maEdDataBarMax->Enable();
1285 :
1286 0 : return 0;
1287 : }
1288 :
1289 0 : IMPL_LINK_NOARG( ScDataBarFrmtEntry, OptionBtnHdl )
1290 : {
1291 0 : SetColorScaleEntry(mpDataBarData->mpLowerLimit.get(), *maLbDataBarMinType.get(), *maEdDataBarMin.get(), mpDoc, maPos, true);
1292 0 : SetColorScaleEntry(mpDataBarData->mpUpperLimit.get(), *maLbDataBarMaxType.get(), *maEdDataBarMax.get(), mpDoc, maPos, true);
1293 0 : ScopedVclPtrInstance<ScDataBarSettingsDlg> pDlg(this, *mpDataBarData, mpDoc, maPos);
1294 0 : if( pDlg->Execute() == RET_OK)
1295 : {
1296 0 : mpDataBarData.reset(pDlg->GetData());
1297 0 : SetDataBarEntryTypes(*mpDataBarData->mpLowerLimit, *maLbDataBarMinType, *maEdDataBarMin.get(), mpDoc);
1298 0 : SetDataBarEntryTypes(*mpDataBarData->mpUpperLimit, *maLbDataBarMaxType.get(), *maEdDataBarMax.get(), mpDoc);
1299 0 : DataBarTypeSelectHdl(NULL);
1300 : }
1301 0 : return 0;
1302 : }
1303 :
1304 0 : ScDateFrmtEntry::ScDateFrmtEntry( vcl::Window* pParent, ScDocument* pDoc, const ScCondDateFormatEntry* pFormat ):
1305 : ScCondFrmtEntry( pParent, pDoc, ScAddress() ),
1306 : maLbDateEntry( VclPtr<ListBox>::Create( this, ScResId( LB_DATE_TYPE ) ) ),
1307 : maFtStyle( VclPtr<FixedText>::Create( this, ScResId( FT_STYLE ) ) ),
1308 : maLbStyle( VclPtr<ListBox>::Create( this, ScResId( LB_STYLE ) ) ),
1309 : maWdPreview( VclPtr<SvxFontPrevWindow>::Create( this, ScResId( WD_PREVIEW ) ) ),
1310 0 : mbIsInStyleCreate(false)
1311 : {
1312 0 : Init();
1313 0 : FreeResource();
1314 :
1315 0 : StartListening(*pDoc->GetStyleSheetPool(), true);
1316 :
1317 0 : if(pFormat)
1318 : {
1319 0 : sal_Int32 nPos = static_cast<sal_Int32>(pFormat->GetDateType());
1320 0 : maLbDateEntry->SelectEntryPos(nPos);
1321 :
1322 0 : OUString aStyleName = pFormat->GetStyleName();
1323 0 : maLbStyle->SelectEntry(aStyleName);
1324 : }
1325 :
1326 0 : StyleSelectHdl(NULL);
1327 0 : }
1328 :
1329 0 : ScDateFrmtEntry::~ScDateFrmtEntry()
1330 : {
1331 0 : disposeOnce();
1332 0 : }
1333 :
1334 0 : void ScDateFrmtEntry::dispose()
1335 : {
1336 0 : maLbDateEntry.disposeAndClear();
1337 0 : maFtStyle.disposeAndClear();
1338 0 : maLbStyle.disposeAndClear();
1339 0 : maWdPreview.disposeAndClear();
1340 0 : ScCondFrmtEntry::dispose();
1341 0 : }
1342 :
1343 0 : void ScDateFrmtEntry::Init()
1344 : {
1345 0 : maLbDateEntry->SelectEntryPos(0);
1346 0 : maLbType->SelectEntryPos(3);
1347 :
1348 0 : FillStyleListBox( mpDoc, *maLbStyle.get() );
1349 0 : maLbStyle->SetSelectHdl( LINK( this, ScDateFrmtEntry, StyleSelectHdl ) );
1350 0 : maLbStyle->SelectEntryPos(1);
1351 0 : }
1352 :
1353 0 : void ScDateFrmtEntry::SetActive()
1354 : {
1355 0 : maLbDateEntry->Show();
1356 0 : maFtStyle->Show();
1357 0 : maWdPreview->Show();
1358 0 : maLbStyle->Show();
1359 :
1360 0 : Select();
1361 0 : }
1362 :
1363 0 : void ScDateFrmtEntry::SetInactive()
1364 : {
1365 0 : maLbDateEntry->Hide();
1366 0 : maFtStyle->Hide();
1367 0 : maWdPreview->Hide();
1368 0 : maLbStyle->Hide();
1369 :
1370 0 : Deselect();
1371 0 : }
1372 :
1373 0 : void ScDateFrmtEntry::Notify( SfxBroadcaster&, const SfxHint& rHint )
1374 : {
1375 0 : const SfxStyleSheetHint* pHint = dynamic_cast<const SfxStyleSheetHint*>(&rHint);
1376 0 : if(!pHint)
1377 0 : return;
1378 :
1379 0 : sal_uInt16 nHint = pHint->GetHint();
1380 0 : if(nHint == SfxStyleSheetHintId::MODIFIED)
1381 : {
1382 0 : if(!mbIsInStyleCreate)
1383 0 : UpdateStyleList(*maLbStyle.get(), mpDoc);
1384 : }
1385 : }
1386 :
1387 0 : ScFormatEntry* ScDateFrmtEntry::GetEntry() const
1388 : {
1389 0 : ScCondDateFormatEntry* pNewEntry = new ScCondDateFormatEntry(mpDoc);
1390 0 : condformat::ScCondFormatDateType eType = static_cast<condformat::ScCondFormatDateType>(maLbDateEntry->GetSelectEntryPos());
1391 0 : pNewEntry->SetDateType(eType);
1392 0 : pNewEntry->SetStyleName(maLbStyle->GetSelectEntry());
1393 0 : return pNewEntry;
1394 : }
1395 :
1396 0 : OUString ScDateFrmtEntry::GetExpressionString()
1397 : {
1398 0 : return ScCondFormatHelper::GetExpression(DATE, 0);
1399 : }
1400 :
1401 0 : IMPL_LINK_NOARG( ScDateFrmtEntry, StyleSelectHdl )
1402 : {
1403 0 : mbIsInStyleCreate = true;
1404 0 : StyleSelect( *maLbStyle.get(), mpDoc, *maWdPreview.get() );
1405 0 : mbIsInStyleCreate = false;
1406 :
1407 0 : return 0;
1408 : }
1409 :
1410 : class ScIconSetFrmtDataEntry : public Control
1411 : {
1412 : private:
1413 : VclPtr<FixedImage> maImgIcon;
1414 : VclPtr<FixedText> maFtEntry;
1415 : VclPtr<Edit> maEdEntry;
1416 : VclPtr<ListBox> maLbEntryType;
1417 :
1418 : public:
1419 : ScIconSetFrmtDataEntry( vcl::Window* pParent, ScIconSetType eType, ScDocument* pDoc,
1420 : sal_Int32 i, const ScColorScaleEntry* pEntry = NULL );
1421 : virtual ~ScIconSetFrmtDataEntry();
1422 : virtual void dispose() SAL_OVERRIDE;
1423 :
1424 : ScColorScaleEntry* CreateEntry(ScDocument* pDoc, const ScAddress& rPos) const;
1425 :
1426 : void SetFirstEntry();
1427 : };
1428 :
1429 0 : ScIconSetFrmtDataEntry::ScIconSetFrmtDataEntry( vcl::Window* pParent, ScIconSetType eType, ScDocument* pDoc, sal_Int32 i, const ScColorScaleEntry* pEntry ):
1430 : Control( pParent, ScResId( RID_ICON_SET_ENTRY ) ),
1431 : maImgIcon( VclPtr<FixedImage>::Create( this, ScResId( IMG_ICON ) ) ),
1432 : maFtEntry( VclPtr<FixedText>::Create( this, ScResId( FT_ICON_SET_ENTRY_TEXT ) ) ),
1433 : maEdEntry( VclPtr<Edit>::Create( this, ScResId( ED_ICON_SET_ENTRY_VALUE ) ) ),
1434 0 : maLbEntryType( VclPtr<ListBox>::Create( this, ScResId( LB_ICON_SET_ENTRY_TYPE ) ) )
1435 : {
1436 0 : maImgIcon->SetImage(Image(ScIconSetFormat::getBitmap(eType, i)));
1437 0 : if(pEntry)
1438 : {
1439 0 : switch(pEntry->GetType())
1440 : {
1441 : case COLORSCALE_VALUE:
1442 0 : maLbEntryType->SelectEntryPos(0);
1443 0 : maEdEntry->SetText(convertNumberToString(pEntry->GetValue(), pDoc));
1444 0 : break;
1445 : case COLORSCALE_PERCENTILE:
1446 0 : maLbEntryType->SelectEntryPos(2);
1447 0 : maEdEntry->SetText(convertNumberToString(pEntry->GetValue(), pDoc));
1448 0 : break;
1449 : case COLORSCALE_PERCENT:
1450 0 : maLbEntryType->SelectEntryPos(1);
1451 0 : maEdEntry->SetText(convertNumberToString(pEntry->GetValue(), pDoc));
1452 0 : break;
1453 : case COLORSCALE_FORMULA:
1454 0 : maLbEntryType->SelectEntryPos(3);
1455 0 : maEdEntry->SetText(pEntry->GetFormula(formula::FormulaGrammar::GRAM_DEFAULT));
1456 0 : break;
1457 : default:
1458 : assert(false);
1459 : }
1460 : }
1461 : else
1462 : {
1463 0 : maLbEntryType->SelectEntryPos(1);
1464 : }
1465 0 : FreeResource();
1466 0 : }
1467 :
1468 0 : ScIconSetFrmtDataEntry::~ScIconSetFrmtDataEntry()
1469 : {
1470 0 : disposeOnce();
1471 0 : }
1472 :
1473 0 : void ScIconSetFrmtDataEntry::dispose()
1474 : {
1475 0 : maImgIcon.disposeAndClear();
1476 0 : maFtEntry.disposeAndClear();
1477 0 : maEdEntry.disposeAndClear();
1478 0 : maLbEntryType.disposeAndClear();
1479 0 : Control::dispose();
1480 0 : }
1481 :
1482 0 : ScColorScaleEntry* ScIconSetFrmtDataEntry::CreateEntry(ScDocument* pDoc, const ScAddress& rPos) const
1483 : {
1484 0 : sal_Int32 nPos = maLbEntryType->GetSelectEntryPos();
1485 0 : OUString aText = maEdEntry->GetText();
1486 0 : ScColorScaleEntry* pEntry = new ScColorScaleEntry();
1487 :
1488 0 : sal_uInt32 nIndex = 0;
1489 0 : double nVal = 0;
1490 0 : SvNumberFormatter* pNumberFormatter = pDoc->GetFormatTable();
1491 0 : (void)pNumberFormatter->IsNumberFormat(aText, nIndex, nVal);
1492 0 : pEntry->SetValue(nVal);
1493 :
1494 0 : switch(nPos)
1495 : {
1496 : case 0:
1497 0 : pEntry->SetType(COLORSCALE_VALUE);
1498 0 : break;
1499 : case 1:
1500 0 : pEntry->SetType(COLORSCALE_PERCENT);
1501 0 : break;
1502 : case 2:
1503 0 : pEntry->SetType(COLORSCALE_PERCENTILE);
1504 0 : break;
1505 : case 3:
1506 0 : pEntry->SetType(COLORSCALE_FORMULA);
1507 0 : pEntry->SetFormula(aText, pDoc, rPos, pDoc->GetGrammar());
1508 0 : break;
1509 : default:
1510 : assert(false);
1511 : }
1512 :
1513 0 : return pEntry;
1514 : }
1515 :
1516 0 : void ScIconSetFrmtDataEntry::SetFirstEntry()
1517 : {
1518 0 : maEdEntry->Hide();
1519 0 : maLbEntryType->Hide();
1520 0 : maFtEntry->Hide();
1521 0 : maEdEntry->SetText(OUString("0"));
1522 0 : maLbEntryType->SelectEntryPos(1);
1523 0 : }
1524 :
1525 0 : ScIconSetFrmtEntry::ScIconSetFrmtEntry( vcl::Window* pParent, ScDocument* pDoc, const ScAddress& rPos, const ScIconSetFormat* pFormat ):
1526 : ScCondFrmtEntry( pParent, pDoc, rPos ),
1527 : maLbColorFormat( VclPtr<ListBox>::Create( this, ScResId( LB_COLOR_FORMAT ) ) ),
1528 0 : maLbIconSetType( VclPtr<ListBox>::Create( this, ScResId( LB_ICONSET_TYPE ) ) )
1529 : {
1530 0 : Init();
1531 0 : FreeResource();
1532 0 : maLbColorFormat->SetSelectHdl( LINK( pParent, ScCondFormatList, ColFormatTypeHdl ) );
1533 :
1534 0 : if(pFormat)
1535 : {
1536 0 : const ScIconSetFormatData* pIconSetFormatData = pFormat->GetIconSetData();
1537 0 : ScIconSetType eType = pIconSetFormatData->eIconSetType;
1538 0 : sal_Int32 nType = static_cast<sal_Int32>(eType);
1539 0 : maLbIconSetType->SelectEntryPos(nType);
1540 :
1541 0 : for(size_t i = 0, n = pIconSetFormatData->maEntries.size();
1542 0 : i < n; ++i)
1543 : {
1544 0 : maEntries.push_back( VclPtr<ScIconSetFrmtDataEntry>::Create( this, eType, pDoc, i, &pIconSetFormatData->maEntries[i] ) );
1545 0 : Point aPos = maEntries[0]->GetPosPixel();
1546 0 : aPos.Y() += maEntries[0]->GetSizePixel().Height() * i * 1.2;
1547 0 : maEntries[i]->SetPosPixel( aPos );
1548 : }
1549 0 : maEntries[0]->SetFirstEntry();
1550 : }
1551 : else
1552 0 : IconSetTypeHdl(NULL);
1553 0 : }
1554 :
1555 0 : ScIconSetFrmtEntry::~ScIconSetFrmtEntry()
1556 : {
1557 0 : disposeOnce();
1558 0 : }
1559 :
1560 0 : void ScIconSetFrmtEntry::dispose()
1561 : {
1562 0 : for (auto it = maEntries.begin(); it != maEntries.end(); ++it)
1563 0 : it->disposeAndClear();
1564 0 : maEntries.clear();
1565 0 : maLbColorFormat.disposeAndClear();
1566 0 : maLbIconSetType.disposeAndClear();
1567 0 : ScCondFrmtEntry::dispose();
1568 0 : }
1569 :
1570 0 : void ScIconSetFrmtEntry::Init()
1571 : {
1572 0 : maLbColorFormat->SelectEntryPos(3);
1573 0 : maLbType->SelectEntryPos(0);
1574 0 : maLbIconSetType->SelectEntryPos(0);
1575 :
1576 0 : maLbIconSetType->SetSelectHdl( LINK( this, ScIconSetFrmtEntry, IconSetTypeHdl ) );
1577 0 : }
1578 :
1579 0 : IMPL_LINK_NOARG( ScIconSetFrmtEntry, IconSetTypeHdl )
1580 : {
1581 0 : ScIconSetMap* pMap = ScIconSetFormat::getIconSetMap();
1582 :
1583 0 : sal_Int32 nPos = maLbIconSetType->GetSelectEntryPos();
1584 0 : sal_uInt32 nElements = pMap[nPos].nElements;
1585 :
1586 0 : for (auto it = maEntries.begin(); it != maEntries.end(); ++it)
1587 0 : it->disposeAndClear();
1588 0 : maEntries.clear();
1589 :
1590 0 : for(size_t i = 0; i < nElements; ++i)
1591 : {
1592 0 : maEntries.push_back( VclPtr<ScIconSetFrmtDataEntry>::Create( this, static_cast<ScIconSetType>(nPos), mpDoc, i ) );
1593 0 : Point aPos = maEntries[0]->GetPosPixel();
1594 0 : aPos.Y() += maEntries[0]->GetSizePixel().Height() * i * 1.2;
1595 0 : maEntries[i]->SetPosPixel( aPos );
1596 0 : maEntries[i]->Show();
1597 : }
1598 0 : maEntries[0]->SetFirstEntry();
1599 :
1600 0 : SetHeight();
1601 :
1602 0 : return 0;
1603 : }
1604 :
1605 0 : OUString ScIconSetFrmtEntry::GetExpressionString()
1606 : {
1607 0 : return ScCondFormatHelper::GetExpression(ICONSET, 0);
1608 : }
1609 :
1610 0 : void ScIconSetFrmtEntry::SetActive()
1611 : {
1612 0 : maLbColorFormat->Show();
1613 0 : maLbIconSetType->Show();
1614 0 : for(ScIconSetFrmtDataEntriesType::iterator itr = maEntries.begin(),
1615 0 : itrEnd = maEntries.end(); itr != itrEnd; ++itr)
1616 : {
1617 0 : (*itr)->Show();
1618 : }
1619 :
1620 0 : Select();
1621 0 : }
1622 :
1623 0 : void ScIconSetFrmtEntry::SetInactive()
1624 : {
1625 0 : maLbColorFormat->Hide();
1626 0 : maLbIconSetType->Hide();
1627 0 : for(ScIconSetFrmtDataEntriesType::iterator itr = maEntries.begin(),
1628 0 : itrEnd = maEntries.end(); itr != itrEnd; ++itr)
1629 : {
1630 0 : (*itr)->Hide();
1631 : }
1632 :
1633 0 : Deselect();
1634 0 : }
1635 :
1636 0 : ScFormatEntry* ScIconSetFrmtEntry::GetEntry() const
1637 : {
1638 0 : ScIconSetFormat* pFormat = new ScIconSetFormat(mpDoc);
1639 :
1640 0 : ScIconSetFormatData* pData = new ScIconSetFormatData;
1641 0 : pData->eIconSetType = static_cast<ScIconSetType>(maLbIconSetType->GetSelectEntryPos());
1642 0 : for(ScIconSetFrmtDataEntriesType::const_iterator itr = maEntries.begin(),
1643 0 : itrEnd = maEntries.end(); itr != itrEnd; ++itr)
1644 : {
1645 0 : pData->maEntries.push_back((*itr)->CreateEntry(mpDoc, maPos));
1646 : }
1647 0 : pFormat->SetIconSetData(pData);
1648 :
1649 0 : return pFormat;
1650 156 : }
1651 :
1652 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|