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