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 "condformatdlg.hrc"
12 :
13 : #include <vcl/vclevent.hxx>
14 : #include <svl/style.hxx>
15 : #include <sfx2/dispatch.hxx>
16 : #include <svl/stritem.hxx>
17 : #include <svl/intitem.hxx>
18 : #include <svx/xtable.hxx>
19 : #include <svx/drawitem.hxx>
20 : #include <vcl/msgbox.hxx>
21 : #include <vcl/settings.hxx>
22 : #include <vcl/builderfactory.hxx>
23 : #include <libxml/tree.h>
24 :
25 : #include "anyrefdg.hxx"
26 : #include "document.hxx"
27 : #include "conditio.hxx"
28 : #include "stlpool.hxx"
29 : #include "tabvwsh.hxx"
30 : #include "colorscale.hxx"
31 : #include "colorformat.hxx"
32 : #include "reffact.hxx"
33 : #include "docsh.hxx"
34 : #include "docfunc.hxx"
35 : #include "condformatdlgentry.hxx"
36 :
37 : #include "globstr.hrc"
38 :
39 0 : ScCondFormatList::ScCondFormatList(vcl::Window* pParent, WinBits nStyle)
40 : : Control(pParent, nStyle | WB_DIALOGCONTROL)
41 : , mbHasScrollBar(false)
42 : , mpScrollBar(VclPtr<ScrollBar>::Create(this, WB_VERT ))
43 : , mpDoc(NULL)
44 0 : , mpDialogParent(NULL)
45 : {
46 0 : mpScrollBar->SetScrollHdl( LINK( this, ScCondFormatList, ScrollHdl ) );
47 0 : mpScrollBar->EnableDrag();
48 0 : SetControlBackground( GetSettings().GetStyleSettings().GetWindowColor() );
49 0 : SetBackground(GetControlBackground());
50 0 : }
51 :
52 0 : ScCondFormatList::~ScCondFormatList()
53 : {
54 0 : disposeOnce();
55 0 : }
56 :
57 0 : void ScCondFormatList::dispose()
58 : {
59 0 : mpDialogParent.clear();
60 0 : mpScrollBar.disposeAndClear();
61 0 : for (auto it = maEntries.begin(); it != maEntries.end(); ++it)
62 0 : it->disposeAndClear();
63 0 : maEntries.clear();
64 0 : Control::dispose();
65 0 : }
66 :
67 0 : void ScCondFormatList::init(ScDocument* pDoc, ScCondFormatDlg* pDialogParent,
68 : const ScConditionalFormat* pFormat, const ScRangeList& rRanges,
69 : const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType)
70 : {
71 0 : mpDialogParent = pDialogParent;
72 0 : mpDoc = pDoc;
73 0 : maPos = rPos;
74 0 : maRanges = rRanges;
75 :
76 0 : if(pFormat)
77 : {
78 0 : size_t nCount = pFormat->size();
79 0 : for (size_t nIndex = 0; nIndex < nCount; ++nIndex)
80 : {
81 0 : const ScFormatEntry* pEntry = pFormat->GetEntry(nIndex);
82 0 : switch(pEntry->GetType())
83 : {
84 : case condformat::CONDITION:
85 : {
86 0 : const ScCondFormatEntry* pConditionEntry = static_cast<const ScCondFormatEntry*>( pEntry );
87 0 : if(pConditionEntry->GetOperation() != SC_COND_DIRECT)
88 0 : maEntries.push_back(VclPtr<ScConditionFrmtEntry>::Create( this, mpDoc, pDialogParent, maPos, pConditionEntry ) );
89 : else
90 0 : maEntries.push_back(VclPtr<ScFormulaFrmtEntry>::Create( this, mpDoc, pDialogParent, maPos, pConditionEntry ) );
91 :
92 : }
93 0 : break;
94 : case condformat::COLORSCALE:
95 : {
96 0 : const ScColorScaleFormat* pColorScale = static_cast<const ScColorScaleFormat*>( pEntry );
97 0 : if( pColorScale->size() == 2 )
98 0 : maEntries.push_back(VclPtr<ScColorScale2FrmtEntry>::Create( this, mpDoc, maPos, pColorScale ) );
99 : else
100 0 : maEntries.push_back(VclPtr<ScColorScale3FrmtEntry>::Create( this, mpDoc, maPos, pColorScale ) );
101 : }
102 0 : break;
103 : case condformat::DATABAR:
104 0 : maEntries.push_back(VclPtr<ScDataBarFrmtEntry>::Create( this, mpDoc, maPos, static_cast<const ScDataBarFormat*>( pEntry ) ) );
105 0 : break;
106 : case condformat::ICONSET:
107 0 : maEntries.push_back(VclPtr<ScIconSetFrmtEntry>::Create( this, mpDoc, maPos, static_cast<const ScIconSetFormat*>( pEntry ) ) );
108 0 : break;
109 : case condformat::DATE:
110 0 : maEntries.push_back(VclPtr<ScDateFrmtEntry>::Create( this, mpDoc, static_cast<const ScCondDateFormatEntry*>( pEntry ) ) );
111 0 : break;
112 : }
113 : }
114 0 : if(nCount)
115 0 : EntrySelectHdl(maEntries[0].get());
116 : }
117 : else
118 : {
119 0 : switch(eType)
120 : {
121 : case condformat::dialog::CONDITION:
122 0 : maEntries.push_back(VclPtr<ScConditionFrmtEntry>::Create( this, mpDoc, pDialogParent, maPos ));
123 0 : break;
124 : case condformat::dialog::COLORSCALE:
125 0 : maEntries.push_back(VclPtr<ScColorScale3FrmtEntry>::Create( this, mpDoc, maPos ));
126 0 : break;
127 : case condformat::dialog::DATABAR:
128 0 : maEntries.push_back(VclPtr<ScDataBarFrmtEntry>::Create( this, mpDoc, maPos ));
129 0 : break;
130 : case condformat::dialog::ICONSET:
131 0 : maEntries.push_back(VclPtr<ScIconSetFrmtEntry>::Create( this, mpDoc, maPos ));
132 0 : break;
133 : case condformat::dialog::DATE:
134 0 : maEntries.push_back(VclPtr<ScDateFrmtEntry>::Create( this, mpDoc ));
135 0 : break;
136 : case condformat::dialog::NONE:
137 0 : break;
138 : }
139 : }
140 0 : RecalcAll();
141 0 : if (!maEntries.empty())
142 0 : (*maEntries.begin())->SetActive();
143 :
144 0 : RecalcAll();
145 0 : }
146 :
147 0 : VCL_BUILDER_DECL_FACTORY(ScCondFormatList)
148 : {
149 0 : WinBits nWinBits = 0;
150 :
151 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
152 0 : if (!sBorder.isEmpty())
153 0 : nWinBits |= WB_BORDER;
154 :
155 0 : rRet = VclPtr<ScCondFormatList>::Create(pParent, nWinBits);
156 0 : }
157 :
158 0 : Size ScCondFormatList::GetOptimalSize() const
159 : {
160 0 : return LogicToPixel(Size(290, 185), MAP_APPFONT);
161 : }
162 :
163 0 : void ScCondFormatList::Resize()
164 : {
165 0 : Control::Resize();
166 0 : RecalcAll();
167 0 : }
168 :
169 0 : ScConditionalFormat* ScCondFormatList::GetConditionalFormat() const
170 : {
171 0 : if(maEntries.empty())
172 0 : return NULL;
173 :
174 0 : ScConditionalFormat* pFormat = new ScConditionalFormat(0, mpDoc);
175 0 : for(EntryContainer::const_iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
176 : {
177 0 : ScFormatEntry* pEntry = (*itr)->GetEntry();
178 0 : if(pEntry)
179 0 : pFormat->AddEntry(pEntry);
180 : }
181 :
182 0 : pFormat->SetRange(maRanges);
183 :
184 0 : return pFormat;
185 : }
186 :
187 0 : void ScCondFormatList::RecalcAll()
188 : {
189 0 : sal_Int32 nTotalHeight = 0;
190 0 : sal_Int32 nIndex = 1;
191 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
192 : {
193 0 : nTotalHeight += (*itr)->GetSizePixel().Height();
194 0 : (*itr)->SetIndex( nIndex );
195 0 : ++nIndex;
196 : }
197 :
198 0 : Size aCtrlSize = GetOutputSize();
199 0 : long nSrcBarSize = GetSettings().GetStyleSettings().GetScrollBarSize();
200 0 : if(nTotalHeight > GetSizePixel().Height())
201 : {
202 0 : mbHasScrollBar = true;
203 0 : mpScrollBar->SetPosSizePixel(Point(aCtrlSize.Width() -nSrcBarSize, 0),
204 0 : Size(nSrcBarSize, aCtrlSize.Height()) );
205 0 : mpScrollBar->SetRangeMax(nTotalHeight);
206 0 : mpScrollBar->SetVisibleSize(aCtrlSize.Height());
207 0 : mpScrollBar->Show();
208 : }
209 : else
210 : {
211 0 : mbHasScrollBar = false;
212 0 : mpScrollBar->Hide();
213 : }
214 :
215 0 : Point aPoint(0,-1*mpScrollBar->GetThumbPos());
216 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
217 : {
218 0 : (*itr)->SetPosPixel(aPoint);
219 0 : Size aSize = (*itr)->GetSizePixel();
220 0 : if(mbHasScrollBar)
221 0 : aSize.Width() = aCtrlSize.Width() - nSrcBarSize;
222 : else
223 0 : aSize.Width() = aCtrlSize.Width();
224 0 : (*itr)->SetSizePixel(aSize);
225 :
226 0 : aPoint.Y() += (*itr)->GetSizePixel().Height();
227 : }
228 0 : }
229 :
230 0 : void ScCondFormatList::DoScroll(long nDelta)
231 : {
232 0 : Point aNewPoint = mpScrollBar->GetPosPixel();
233 0 : Rectangle aRect(Point(), GetOutputSize());
234 0 : aRect.Right() -= mpScrollBar->GetSizePixel().Width();
235 0 : Scroll( 0, -nDelta, aRect );
236 0 : mpScrollBar->SetPosPixel(aNewPoint);
237 0 : }
238 :
239 0 : IMPL_LINK(ScCondFormatList, ColFormatTypeHdl, ListBox*, pBox)
240 : {
241 0 : EntryContainer::iterator itr = maEntries.begin();
242 0 : for(; itr != maEntries.end(); ++itr)
243 : {
244 0 : if((*itr)->IsSelected())
245 0 : break;
246 : }
247 0 : if(itr == maEntries.end())
248 0 : return 0;
249 :
250 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
251 0 : switch(nPos)
252 : {
253 : case 0:
254 0 : if((*itr)->GetType() == condformat::entry::COLORSCALE2)
255 0 : return 0;
256 :
257 0 : itr->disposeAndClear();
258 0 : *itr = VclPtr<ScColorScale2FrmtEntry>::Create( this, mpDoc, maPos );
259 0 : break;
260 : case 1:
261 0 : if((*itr)->GetType() == condformat::entry::COLORSCALE3)
262 0 : return 0;
263 :
264 0 : itr->disposeAndClear();
265 0 : *itr = VclPtr<ScColorScale3FrmtEntry>::Create( this, mpDoc, maPos );
266 0 : break;
267 : case 2:
268 0 : if((*itr)->GetType() == condformat::entry::DATABAR)
269 0 : return 0;
270 :
271 0 : itr->disposeAndClear();
272 0 : *itr = VclPtr<ScDataBarFrmtEntry>::Create( this, mpDoc, maPos );
273 0 : break;
274 : case 3:
275 0 : if((*itr)->GetType() == condformat::entry::ICONSET)
276 0 : return 0;
277 :
278 0 : itr->disposeAndClear();
279 0 : *itr = VclPtr<ScIconSetFrmtEntry>::Create( this, mpDoc, maPos );
280 0 : break;
281 : default:
282 0 : break;
283 : }
284 0 : mpDialogParent->InvalidateRefData();
285 0 : (*itr)->SetActive();
286 0 : RecalcAll();
287 0 : return 0;
288 : }
289 :
290 0 : IMPL_LINK(ScCondFormatList, TypeListHdl, ListBox*, pBox)
291 : {
292 : //Resolves: fdo#79021 At this point we are still inside the ListBox Select.
293 : //If we call maEntries.replace here then the pBox will be deleted before it
294 : //has finished Select and will crash on accessing its deleted this. So Post
295 : //to do the real work after the Select has completed
296 0 : Application::PostUserEvent(LINK(this, ScCondFormatList, AfterTypeListHdl), pBox, true);
297 0 : return 0;
298 : }
299 :
300 0 : IMPL_LINK(ScCondFormatList, AfterTypeListHdl, ListBox*, pBox)
301 : {
302 0 : EntryContainer::iterator itr = maEntries.begin();
303 0 : for(; itr != maEntries.end(); ++itr)
304 : {
305 0 : if((*itr)->IsSelected())
306 0 : break;
307 : }
308 0 : if(itr == maEntries.end())
309 0 : return 0;;
310 :
311 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
312 0 : switch(nPos)
313 : {
314 : case 0:
315 0 : switch((*itr)->GetType())
316 : {
317 : case condformat::entry::FORMULA:
318 : case condformat::entry::CONDITION:
319 : case condformat::entry::DATE:
320 0 : break;
321 : case condformat::entry::COLORSCALE2:
322 : case condformat::entry::COLORSCALE3:
323 : case condformat::entry::DATABAR:
324 : case condformat::entry::ICONSET:
325 0 : return 0;
326 : }
327 0 : itr->disposeAndClear();
328 0 : *itr = VclPtr<ScColorScale3FrmtEntry>::Create(this, mpDoc, maPos);
329 0 : mpDialogParent->InvalidateRefData();
330 0 : (*itr)->SetActive();
331 0 : break;
332 : case 1:
333 0 : if((*itr)->GetType() == condformat::entry::CONDITION)
334 0 : return 0;
335 :
336 0 : itr->disposeAndClear();
337 0 : *itr = VclPtr<ScConditionFrmtEntry>::Create(this, mpDoc, mpDialogParent, maPos);
338 0 : mpDialogParent->InvalidateRefData();
339 0 : (*itr)->SetActive();
340 0 : break;
341 : case 2:
342 0 : if((*itr)->GetType() == condformat::entry::FORMULA)
343 0 : return 0;
344 :
345 0 : itr->disposeAndClear();
346 0 : *itr = VclPtr<ScFormulaFrmtEntry>::Create(this, mpDoc, mpDialogParent, maPos);
347 0 : mpDialogParent->InvalidateRefData();
348 0 : (*itr)->SetActive();
349 0 : break;
350 : case 3:
351 0 : if((*itr)->GetType() == condformat::entry::DATE)
352 0 : return 0;
353 :
354 0 : itr->disposeAndClear();
355 0 : *itr = VclPtr<ScDateFrmtEntry>::Create( this, mpDoc );
356 0 : mpDialogParent->InvalidateRefData();
357 0 : (*itr)->SetActive();
358 0 : break;
359 :
360 : }
361 0 : RecalcAll();
362 0 : return 0;
363 : }
364 :
365 0 : IMPL_LINK_NOARG( ScCondFormatList, AddBtnHdl )
366 : {
367 0 : VclPtr<ScCondFrmtEntry> pNewEntry = VclPtr<ScConditionFrmtEntry>::Create(this, mpDoc, mpDialogParent, maPos);
368 0 : maEntries.push_back( pNewEntry );
369 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
370 : {
371 0 : (*itr)->SetInactive();
372 : }
373 0 : mpDialogParent->InvalidateRefData();
374 0 : pNewEntry->SetActive();
375 0 : RecalcAll();
376 0 : return 0;
377 : }
378 :
379 0 : IMPL_LINK_NOARG( ScCondFormatList, RemoveBtnHdl )
380 : {
381 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
382 : {
383 0 : if((*itr)->IsSelected())
384 : {
385 0 : itr->disposeAndClear();
386 0 : maEntries.erase(itr);
387 0 : break;
388 : }
389 : }
390 0 : mpDialogParent->InvalidateRefData();
391 0 : RecalcAll();
392 0 : return 0;
393 : }
394 :
395 0 : IMPL_LINK( ScCondFormatList, EntrySelectHdl, ScCondFrmtEntry*, pEntry )
396 : {
397 0 : if(pEntry->IsSelected())
398 0 : return 0;
399 :
400 : //A child has focus, but we will hide that, so regrab to whatever new thing gets
401 : //shown instead of leaving it stuck in the inaccessible hidden element
402 0 : bool bReGrabFocus = HasChildPathFocus();
403 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
404 : {
405 0 : (*itr)->SetInactive();
406 : }
407 0 : mpDialogParent->InvalidateRefData();
408 0 : pEntry->SetActive();
409 0 : RecalcAll();
410 0 : if (bReGrabFocus)
411 0 : GrabFocus();
412 0 : return 0;
413 : }
414 :
415 0 : IMPL_LINK_NOARG( ScCondFormatList, ScrollHdl )
416 : {
417 0 : DoScroll(mpScrollBar->GetDelta());
418 0 : return 0;
419 : }
420 :
421 : // -------------------------------------------------------------------
422 : // Conditional Format Dialog
423 : //
424 0 : ScCondFormatDlg::ScCondFormatDlg(SfxBindings* pB, SfxChildWindow* pCW,
425 : vcl::Window* pParent, ScViewData* pViewData,
426 : const ScConditionalFormat* pFormat, const ScRangeList& rRange,
427 : const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType,
428 : bool bManaged)
429 : : ScAnyRefDlg(pB, pCW, pParent, "ConditionalFormatDialog",
430 : "modules/scalc/ui/conditionalformatdialog.ui")
431 : , mbManaged(bManaged)
432 : , maPos(rPos)
433 : , mpViewData(pViewData)
434 0 : , mpLastEdit(NULL)
435 : {
436 0 : get(mpBtnOk, "ok");
437 0 : get(mpBtnAdd, "add");
438 0 : get(mpBtnRemove, "delete");
439 0 : get(mpBtnCancel, "cancel");
440 :
441 0 : get(mpFtRange, "ftassign");
442 0 : get(mpEdRange, "edassign");
443 0 : mpEdRange->SetReferences(this, mpFtRange);
444 :
445 0 : get(mpRbRange, "rbassign");
446 0 : mpRbRange->SetReferences(this, mpEdRange);
447 :
448 0 : maKey = pFormat ? pFormat->GetKey() : 0;
449 :
450 0 : get(mpCondFormList, "list");
451 0 : mpCondFormList->init(mpViewData->GetDocument(), this, pFormat, rRange, rPos, eType);
452 :
453 0 : OUStringBuffer aTitle( GetText() );
454 0 : aTitle.append(" ");
455 0 : OUString aRangeString;
456 : rRange.Format(aRangeString, SCA_VALID, pViewData->GetDocument(),
457 0 : pViewData->GetDocument()->GetAddressConvention());
458 0 : aTitle.append(aRangeString);
459 0 : SetText(aTitle.makeStringAndClear());
460 0 : mpBtnOk->SetClickHdl(LINK(this, ScCondFormatDlg, BtnPressedHdl ) );
461 0 : mpBtnAdd->SetClickHdl( LINK( mpCondFormList, ScCondFormatList, AddBtnHdl ) );
462 0 : mpBtnRemove->SetClickHdl( LINK( mpCondFormList, ScCondFormatList, RemoveBtnHdl ) );
463 0 : mpBtnCancel->SetClickHdl( LINK(this, ScCondFormatDlg, BtnPressedHdl ) );
464 0 : mpEdRange->SetModifyHdl( LINK( this, ScCondFormatDlg, EdRangeModifyHdl ) );
465 0 : mpEdRange->SetGetFocusHdl( LINK( this, ScCondFormatDlg, RangeGetFocusHdl ) );
466 :
467 0 : mpEdRange->SetText(aRangeString);
468 0 : }
469 :
470 0 : ScCondFormatDlg::~ScCondFormatDlg()
471 : {
472 0 : disposeOnce();
473 0 : }
474 :
475 0 : void ScCondFormatDlg::dispose()
476 : {
477 0 : mpBtnOk.clear();
478 0 : mpBtnAdd.clear();
479 0 : mpBtnRemove.clear();
480 0 : mpBtnCancel.clear();
481 0 : mpFtRange.clear();
482 0 : mpEdRange.clear();
483 0 : mpRbRange.clear();
484 0 : mpCondFormList.clear();
485 0 : mpLastEdit.clear();
486 :
487 0 : ScAnyRefDlg::dispose();
488 0 : }
489 :
490 0 : void ScCondFormatDlg::SetActive()
491 : {
492 0 : if(mpLastEdit)
493 0 : mpLastEdit->GrabFocus();
494 : else
495 0 : mpEdRange->GrabFocus();
496 :
497 0 : RefInputDone();
498 0 : }
499 :
500 0 : void ScCondFormatDlg::RefInputDone( bool bForced )
501 : {
502 0 : ScAnyRefDlg::RefInputDone(bForced);
503 0 : }
504 :
505 0 : bool ScCondFormatDlg::IsTableLocked() const
506 : {
507 0 : if (mpLastEdit && mpLastEdit != mpEdRange)
508 0 : return false;
509 :
510 0 : return true;
511 : }
512 :
513 0 : bool ScCondFormatDlg::IsRefInputMode() const
514 : {
515 0 : return mpEdRange->IsEnabled();
516 : }
517 :
518 : #define ABS_SREF SCA_VALID \
519 : | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE
520 : #define ABS_DREF ABS_SREF \
521 : | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE
522 : #define ABS_DREF3D ABS_DREF | SCA_TAB_3D
523 :
524 0 : void ScCondFormatDlg::SetReference(const ScRange& rRef, ScDocument*)
525 : {
526 0 : formula::RefEdit* pEdit = mpLastEdit;
527 0 : if (!mpLastEdit)
528 0 : pEdit = mpEdRange;
529 :
530 0 : if( pEdit->IsEnabled() )
531 : {
532 0 : if(rRef.aStart != rRef.aEnd)
533 0 : RefInputStart(pEdit);
534 :
535 0 : sal_uInt16 n = 0;
536 0 : if (mpLastEdit && mpLastEdit != mpEdRange)
537 0 : n = ABS_DREF3D;
538 : else
539 0 : n = ABS_DREF;
540 :
541 0 : OUString aRefStr(rRef.Format(n, mpViewData->GetDocument(),
542 0 : ScAddress::Details(mpViewData->GetDocument()->GetAddressConvention(), 0, 0)));
543 0 : pEdit->SetRefString( aRefStr );
544 : }
545 0 : }
546 :
547 0 : ScConditionalFormat* ScCondFormatDlg::GetConditionalFormat() const
548 : {
549 0 : OUString aRangeStr = mpEdRange->GetText();
550 0 : if(aRangeStr.isEmpty())
551 0 : return NULL;
552 :
553 0 : ScRangeList aRange;
554 : sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpViewData->GetDocument(),
555 0 : SCA_VALID, mpViewData->GetDocument()->GetAddressConvention(), maPos.Tab());
556 0 : ScConditionalFormat* pFormat = mpCondFormList->GetConditionalFormat();
557 :
558 0 : if(nFlags & SCA_VALID && !aRange.empty() && pFormat)
559 0 : pFormat->SetRange(aRange);
560 : else
561 : {
562 0 : delete pFormat;
563 0 : pFormat = NULL;
564 : }
565 :
566 0 : return pFormat;
567 : }
568 :
569 0 : void ScCondFormatDlg::InvalidateRefData()
570 : {
571 0 : mpLastEdit = NULL;
572 0 : }
573 :
574 : // -------------------------------------------------------------
575 : // Close the Conditional Format Dialog
576 : //
577 0 : bool ScCondFormatDlg::Close()
578 : {
579 0 : return DoClose( ScCondFormatDlgWrapper::GetChildWindowId() );
580 : }
581 :
582 : // ------------------------------------------------------------------------
583 : // Occurs when the Conditional Format Dialog the OK button is pressed.
584 : //
585 0 : void ScCondFormatDlg::OkPressed()
586 : {
587 0 : ScConditionalFormat* pFormat = GetConditionalFormat();
588 :
589 0 : if(pFormat)
590 0 : mpViewData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(maKey,
591 0 : pFormat, maPos.Tab(), pFormat->GetRange());
592 : else
593 0 : mpViewData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(maKey,
594 0 : NULL, maPos.Tab(), ScRangeList());
595 :
596 0 : if ( mbManaged )
597 : {
598 0 : SetDispatcherLock( false );
599 : // Queue message to open Conditional Format Manager Dialog
600 0 : GetBindings().GetDispatcher()->Execute( SID_OPENDLG_CONDFRMT_MANAGER,
601 0 : SfxCallMode::ASYNCHRON );
602 : }
603 0 : Close();
604 0 : }
605 :
606 : // ------------------------------------------------------------------------
607 : // Occurs when the Conditional Format Dialog is cancelled.
608 : //
609 0 : void ScCondFormatDlg::CancelPressed()
610 : {
611 0 : if ( mbManaged )
612 : {
613 0 : SetDispatcherLock( false );
614 : // Queue message to open Conditional Format Manager Dialog
615 0 : GetBindings().GetDispatcher()->Execute( SID_OPENDLG_CONDFRMT_MANAGER,
616 0 : SfxCallMode::ASYNCHRON );
617 : }
618 0 : Close();
619 0 : }
620 :
621 : // ------------------------------------------------------------------------------
622 : // Parse xml string parameters used to initialize the Conditional Format Dialog
623 : // when it is created.
624 : //
625 0 : bool ScCondFormatDlg::ParseXmlString(const OUString& sXMLString,
626 : sal_uInt32& nIndex,
627 : sal_uInt8& nType,
628 : bool& bManaged)
629 : {
630 0 : bool bRetVal = false;
631 0 : OString sTagName;
632 0 : OUString sTagValue;
633 :
634 0 : xmlNodePtr pXmlRoot = NULL;
635 0 : xmlNodePtr pXmlNode = NULL;
636 :
637 0 : OString sOString = OUStringToOString( sXMLString, RTL_TEXTENCODING_UTF8 );
638 0 : xmlDocPtr pXmlDoc = xmlParseMemory(sOString.getStr(), sOString.getLength());
639 :
640 0 : if( pXmlDoc )
641 : {
642 0 : bRetVal = true;
643 0 : pXmlRoot = xmlDocGetRootElement( pXmlDoc );
644 0 : pXmlNode = pXmlRoot->children;
645 :
646 0 : while (pXmlNode != NULL && bRetVal)
647 : {
648 0 : sTagName = OUStringToOString(OUString("Index"), RTL_TEXTENCODING_UTF8);
649 0 : if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0)
650 : {
651 0 : if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE)
652 : {
653 0 : sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content),
654 0 : strlen(reinterpret_cast<char*>(pXmlNode->children->content)),
655 0 : RTL_TEXTENCODING_UTF8);
656 0 : nIndex = sTagValue.toUInt32();
657 0 : pXmlNode = pXmlNode->next;
658 0 : continue;
659 : }
660 : }
661 :
662 0 : sTagName = OUStringToOString(OUString("Type"), RTL_TEXTENCODING_UTF8);
663 0 : if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0)
664 : {
665 0 : if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE)
666 : {
667 0 : sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content),
668 0 : strlen(reinterpret_cast<char*>(pXmlNode->children->content)),
669 0 : RTL_TEXTENCODING_UTF8);
670 0 : nType = sTagValue.toUInt32();
671 0 : pXmlNode = pXmlNode->next;
672 0 : continue;
673 : }
674 : }
675 :
676 0 : sTagName = OUStringToOString(OUString("Managed"), RTL_TEXTENCODING_UTF8);
677 0 : if (xmlStrcmp(pXmlNode->name, reinterpret_cast<xmlChar const *>(sTagName.getStr())) == 0)
678 : {
679 0 : if (pXmlNode->children != NULL && pXmlNode->children->type == XML_TEXT_NODE)
680 : {
681 0 : sTagValue = OUString(reinterpret_cast<char*>(pXmlNode->children->content),
682 0 : strlen(reinterpret_cast<char*>(pXmlNode->children->content)),
683 0 : RTL_TEXTENCODING_UTF8);
684 0 : bManaged = sTagValue.toBoolean();
685 0 : pXmlNode = pXmlNode->next;
686 0 : continue;
687 : }
688 : }
689 0 : bRetVal = false;
690 : }
691 : }
692 :
693 0 : xmlFreeDoc(pXmlDoc);
694 0 : return bRetVal;
695 : }
696 :
697 : // ---------------------------------------------------------------------------------------
698 : // Generate xml string parameters used to initialize the Conditional Format Dialog
699 : // when it is created.
700 : //
701 0 : OUString ScCondFormatDlg::GenerateXmlString(sal_uInt32 nIndex, sal_uInt8 nType, bool bManaged)
702 : {
703 0 : OUString sReturn;
704 :
705 0 : OString sTagName;
706 0 : OString sTagValue;
707 :
708 0 : xmlNodePtr pXmlRoot = NULL;
709 0 : xmlNodePtr pXmlNode = NULL;
710 :
711 0 : xmlChar* pBuffer = NULL;
712 0 : const xmlChar* pTagName = NULL;
713 0 : const xmlChar* pTagValue = NULL;
714 :
715 0 : xmlDocPtr pXmlDoc = xmlNewDoc(reinterpret_cast<const xmlChar*>("1.0"));
716 :
717 0 : sTagName = OUStringToOString(OUString("ScCondFormatDlg"), RTL_TEXTENCODING_UTF8);
718 0 : pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr());
719 0 : pXmlRoot = xmlNewDocNode(pXmlDoc, NULL, pTagName, NULL);
720 :
721 0 : xmlDocSetRootElement(pXmlDoc, pXmlRoot);
722 :
723 0 : sTagName = OUStringToOString(OUString("Index"), RTL_TEXTENCODING_UTF8);
724 0 : sTagValue = OUStringToOString(OUString::number(nIndex), RTL_TEXTENCODING_UTF8);
725 0 : pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr());
726 0 : pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr());
727 0 : pXmlNode = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue);
728 :
729 0 : xmlAddChild(pXmlRoot, pXmlNode);
730 :
731 0 : sTagName = OUStringToOString(OUString("Type"), RTL_TEXTENCODING_UTF8);
732 0 : sTagValue = OUStringToOString(OUString::number(nType), RTL_TEXTENCODING_UTF8);
733 0 : pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr());
734 0 : pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr());
735 0 : pXmlNode = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue);
736 :
737 0 : xmlAddChild(pXmlRoot, pXmlNode);
738 :
739 0 : sTagName = OUStringToOString(OUString("Managed"), RTL_TEXTENCODING_UTF8);
740 0 : sTagValue = OUStringToOString(OUString::boolean(bManaged), RTL_TEXTENCODING_UTF8);
741 0 : pTagName = reinterpret_cast<const xmlChar*>(sTagName.getStr());
742 0 : pTagValue = reinterpret_cast<const xmlChar*>(sTagValue.getStr());
743 0 : pXmlNode = xmlNewDocNode(pXmlDoc, NULL, pTagName, pTagValue);
744 :
745 0 : xmlAddChild(pXmlRoot, pXmlNode);
746 :
747 0 : int nSize = 0;
748 0 : xmlDocDumpMemory(pXmlDoc, &pBuffer, &nSize);
749 :
750 0 : sReturn = OUString(reinterpret_cast<char const *>(pBuffer), nSize, RTL_TEXTENCODING_UTF8);
751 :
752 0 : xmlFree(pBuffer);
753 0 : xmlFreeDoc(pXmlDoc);
754 :
755 0 : return sReturn;
756 : }
757 :
758 :
759 0 : IMPL_LINK( ScCondFormatDlg, EdRangeModifyHdl, Edit*, pEdit )
760 : {
761 0 : OUString aRangeStr = pEdit->GetText();
762 0 : ScRangeList aRange;
763 : sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpViewData->GetDocument(),
764 0 : SCA_VALID, mpViewData->GetDocument()->GetAddressConvention());
765 0 : if(nFlags & SCA_VALID)
766 0 : pEdit->SetControlBackground(GetSettings().GetStyleSettings().GetWindowColor());
767 : else
768 0 : pEdit->SetControlBackground(COL_LIGHTRED);
769 0 : return 0;
770 : }
771 :
772 0 : IMPL_LINK( ScCondFormatDlg, RangeGetFocusHdl, formula::RefEdit*, pEdit )
773 : {
774 0 : mpLastEdit = pEdit;
775 0 : return 0;
776 : }
777 :
778 : // ------------------------------------------------------
779 : // Conditional Format Dialog button click event handler.
780 : //
781 0 : IMPL_LINK( ScCondFormatDlg, BtnPressedHdl, Button*, pBtn)
782 : {
783 0 : if (pBtn == mpBtnOk)
784 0 : OkPressed();
785 0 : else if (pBtn == mpBtnCancel)
786 0 : CancelPressed();
787 0 : return 0;
788 156 : }
789 :
790 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|