Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * Version: MPL 1.1 / GPLv3+ / LGPLv3+
4 : *
5 : * The contents of this file are subject to the Mozilla Public License Version
6 : * 1.1 (the "License"); you may not use this file except in compliance with
7 : * the License or as specified alternatively below. You may obtain a copy of
8 : * the License at http://www.mozilla.org/MPL/
9 : *
10 : * Software distributed under the License is distributed on an "AS IS" basis,
11 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 : * for the specific language governing rights and limitations under the
13 : * License.
14 : *
15 : * Major Contributor(s):
16 : * Copyright (C) 2012 Markus Mohrhard <markus.mohrhard@googlemail.com> (initial developer)
17 : *
18 : * All Rights Reserved.
19 : *
20 : * For minor contributions see the git repository.
21 : *
22 : * Alternatively, the contents of this file may be used under the terms of
23 : * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
24 : * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
25 : * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
26 : * instead of those above.
27 : */
28 :
29 : #include "condformatdlg.hxx"
30 : #include "condformatdlg.hrc"
31 :
32 : #include <vcl/vclevent.hxx>
33 : #include <svl/style.hxx>
34 : #include <sfx2/dispatch.hxx>
35 : #include <svl/stritem.hxx>
36 : #include <svl/intitem.hxx>
37 : #include <svx/xtable.hxx>
38 : #include <svx/drawitem.hxx>
39 : #include <vcl/msgbox.hxx>
40 :
41 : #include "anyrefdg.hxx"
42 : #include "document.hxx"
43 : #include "conditio.hxx"
44 : #include "stlpool.hxx"
45 : #include "tabvwsh.hxx"
46 : #include "conditio.hxx"
47 : #include "colorscale.hxx"
48 : #include "colorformat.hxx"
49 : #include "reffact.hxx"
50 : #include "docsh.hxx"
51 : #include "docfunc.hxx"
52 : #include "condformatdlgentry.hxx"
53 :
54 : #include "globstr.hrc"
55 :
56 0 : ScCondFormatList::ScCondFormatList(Window* pParent, const ResId& rResId, ScDocument* pDoc, const ScConditionalFormat* pFormat,
57 : const ScRangeList& rRanges, const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType):
58 : Control(pParent, rResId),
59 : mbHasScrollBar(false),
60 0 : mpScrollBar(new ScrollBar(this, WB_VERT )),
61 : mpDoc(pDoc),
62 : maPos(rPos),
63 0 : maRanges(rRanges)
64 : {
65 0 : mpScrollBar->SetScrollHdl( LINK( this, ScCondFormatList, ScrollHdl ) );
66 0 : mpScrollBar->EnableDrag();
67 :
68 0 : if(pFormat)
69 : {
70 0 : size_t nCount = pFormat->size();
71 0 : for (size_t nIndex = 0; nIndex < nCount; ++nIndex)
72 : {
73 0 : const ScFormatEntry* pEntry = pFormat->GetEntry(nIndex);
74 0 : switch(pEntry->GetType())
75 : {
76 : case condformat::CONDITION:
77 : {
78 0 : const ScCondFormatEntry* pConditionEntry = static_cast<const ScCondFormatEntry*>( pEntry );
79 0 : if(pConditionEntry->GetOperation() != SC_COND_DIRECT)
80 0 : maEntries.push_back(new ScConditionFrmtEntry( this, mpDoc, maPos, pConditionEntry ) );
81 : else
82 0 : maEntries.push_back(new ScFormulaFrmtEntry( this, mpDoc, maPos, pConditionEntry ) );
83 :
84 : }
85 0 : break;
86 : case condformat::COLORSCALE:
87 : {
88 0 : const ScColorScaleFormat* pColorScale = static_cast<const ScColorScaleFormat*>( pEntry );
89 0 : if( pColorScale->size() == 2 )
90 0 : maEntries.push_back(new ScColorScale2FrmtEntry( this, mpDoc, maPos, pColorScale ) );
91 : else
92 0 : maEntries.push_back(new ScColorScale3FrmtEntry( this, mpDoc, maPos, pColorScale ) );
93 : }
94 0 : break;
95 : case condformat::DATABAR:
96 0 : maEntries.push_back(new ScDataBarFrmtEntry( this, mpDoc, maPos, static_cast<const ScDataBarFormat*>( pEntry ) ) );
97 0 : break;
98 : case condformat::ICONSET:
99 0 : maEntries.push_back(new ScIconSetFrmtEntry( this, mpDoc, maPos, static_cast<const ScIconSetFormat*>( pEntry ) ) );
100 0 : break;
101 : case condformat::DATE:
102 0 : maEntries.push_back(new ScDateFrmtEntry( this, mpDoc, static_cast<const ScCondDateFormatEntry*>( pEntry ) ) );
103 0 : break;
104 : }
105 : }
106 0 : if(nCount)
107 0 : EntrySelectHdl(&maEntries[0]);
108 : }
109 : else
110 : {
111 0 : switch(eType)
112 : {
113 : case condformat::dialog::CONDITION:
114 0 : maEntries.push_back(new ScConditionFrmtEntry( this, mpDoc, maPos ));
115 0 : break;
116 : case condformat::dialog::COLORSCALE:
117 0 : maEntries.push_back(new ScColorScale3FrmtEntry( this, mpDoc, maPos ));
118 0 : break;
119 : case condformat::dialog::DATABAR:
120 0 : maEntries.push_back(new ScDataBarFrmtEntry( this, mpDoc, maPos ));
121 0 : break;
122 : default:
123 0 : break;
124 : }
125 : }
126 0 : RecalcAll();
127 0 : if (!maEntries.empty())
128 0 : maEntries.begin()->SetActive();
129 :
130 0 : RecalcAll();
131 0 : FreeResource();
132 0 : }
133 :
134 0 : ScConditionalFormat* ScCondFormatList::GetConditionalFormat() const
135 : {
136 0 : if(maEntries.empty())
137 0 : return NULL;
138 :
139 0 : ScConditionalFormat* pFormat = new ScConditionalFormat(0, mpDoc);
140 0 : for(EntryContainer::const_iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
141 : {
142 0 : ScFormatEntry* pEntry = itr->GetEntry();
143 0 : if(pEntry)
144 0 : pFormat->AddEntry(pEntry);
145 : }
146 :
147 0 : pFormat->AddRange(maRanges);
148 :
149 0 : return pFormat;
150 : }
151 :
152 0 : void ScCondFormatList::RecalcAll()
153 : {
154 0 : sal_Int32 nTotalHeight = 0;
155 0 : sal_Int32 nIndex = 1;
156 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
157 : {
158 0 : nTotalHeight += itr->GetSizePixel().Height();
159 0 : itr->SetIndex( nIndex );
160 0 : ++nIndex;
161 : }
162 :
163 0 : Size aCtrlSize = GetOutputSize();
164 0 : long nSrcBarSize = GetSettings().GetStyleSettings().GetScrollBarSize();
165 0 : if(nTotalHeight > GetSizePixel().Height())
166 : {
167 0 : mbHasScrollBar = true;
168 0 : mpScrollBar->SetPosSizePixel(Point(aCtrlSize.Width() -nSrcBarSize, 0),
169 0 : Size(nSrcBarSize, aCtrlSize.Height()) );
170 0 : mpScrollBar->SetRangeMax(nTotalHeight);
171 0 : mpScrollBar->SetVisibleSize(aCtrlSize.Height());
172 0 : mpScrollBar->Show();
173 : }
174 : else
175 : {
176 0 : mbHasScrollBar = false;
177 0 : mpScrollBar->Hide();
178 : }
179 :
180 0 : Point aPoint(0,-1*mpScrollBar->GetThumbPos());
181 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
182 : {
183 0 : itr->SetPosPixel(aPoint);
184 0 : Size aSize = itr->GetSizePixel();
185 0 : if(mbHasScrollBar)
186 0 : aSize.Width() = aCtrlSize.Width() - nSrcBarSize;
187 : else
188 0 : aSize.Width() = aCtrlSize.Width();
189 0 : itr->SetSizePixel(aSize);
190 :
191 0 : aPoint.Y() += itr->GetSizePixel().Height();
192 : }
193 0 : }
194 :
195 0 : void ScCondFormatList::DoScroll(long nDelta)
196 : {
197 0 : Point aNewPoint = mpScrollBar->GetPosPixel();
198 0 : Rectangle aRect(Point(), GetOutputSize());
199 0 : aRect.Right() -= mpScrollBar->GetSizePixel().Width();
200 0 : Scroll( 0, -nDelta, aRect );
201 0 : mpScrollBar->SetPosPixel(aNewPoint);
202 0 : }
203 :
204 0 : IMPL_LINK(ScCondFormatList, ColFormatTypeHdl, ListBox*, pBox)
205 : {
206 0 : EntryContainer::iterator itr = maEntries.begin();
207 0 : for(; itr != maEntries.end(); ++itr)
208 : {
209 0 : if(itr->IsSelected())
210 0 : break;
211 : }
212 0 : if(itr == maEntries.end())
213 0 : return 0;
214 :
215 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
216 0 : switch(nPos)
217 : {
218 : case 0:
219 0 : if(itr->GetType() == condformat::entry::COLORSCALE2)
220 0 : return 0;
221 :
222 0 : maEntries.replace( itr, new ScColorScale2FrmtEntry( this, mpDoc, maPos ) );
223 0 : break;
224 : case 1:
225 0 : if(itr->GetType() == condformat::entry::COLORSCALE3)
226 0 : return 0;
227 :
228 0 : maEntries.replace( itr, new ScColorScale3FrmtEntry( this, mpDoc, maPos ) );
229 0 : break;
230 : case 2:
231 0 : if(itr->GetType() == condformat::entry::DATABAR)
232 0 : return 0;
233 :
234 0 : maEntries.replace( itr, new ScDataBarFrmtEntry( this, mpDoc, maPos ) );
235 0 : break;
236 : case 3:
237 0 : if(itr->GetType() == condformat::entry::ICONSET)
238 0 : return 0;
239 :
240 0 : maEntries.replace( itr, new ScIconSetFrmtEntry( this, mpDoc, maPos ) );
241 0 : break;
242 : default:
243 0 : break;
244 : }
245 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
246 0 : itr->SetActive();
247 0 : RecalcAll();
248 0 : return 0;
249 : }
250 :
251 0 : IMPL_LINK(ScCondFormatList, TypeListHdl, ListBox*, pBox)
252 : {
253 0 : EntryContainer::iterator itr = maEntries.begin();
254 0 : for(; itr != maEntries.end(); ++itr)
255 : {
256 0 : if(itr->IsSelected())
257 0 : break;
258 : }
259 0 : if(itr == maEntries.end())
260 0 : return 0;;
261 :
262 0 : sal_Int32 nPos = pBox->GetSelectEntryPos();
263 0 : switch(nPos)
264 : {
265 : case 0:
266 0 : switch(itr->GetType())
267 : {
268 : case condformat::entry::FORMULA:
269 : case condformat::entry::CONDITION:
270 : case condformat::entry::DATE:
271 0 : break;
272 : case condformat::entry::COLORSCALE2:
273 : case condformat::entry::COLORSCALE3:
274 : case condformat::entry::DATABAR:
275 : case condformat::entry::ICONSET:
276 0 : return 0;
277 : }
278 0 : maEntries.replace( itr, new ScColorScale3FrmtEntry(this, mpDoc, maPos));
279 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
280 0 : itr->SetActive();
281 0 : break;
282 : case 1:
283 0 : if(itr->GetType() == condformat::entry::CONDITION)
284 0 : return 0;
285 :
286 0 : maEntries.replace( itr, new ScConditionFrmtEntry(this, mpDoc, maPos));
287 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
288 0 : itr->SetActive();
289 0 : break;
290 : case 2:
291 0 : if(itr->GetType() == condformat::entry::FORMULA)
292 0 : return 0;
293 :
294 0 : maEntries.replace( itr, new ScFormulaFrmtEntry(this, mpDoc, maPos));
295 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
296 0 : itr->SetActive();
297 0 : break;
298 : case 3:
299 0 : if(itr->GetType() == condformat::entry::DATE)
300 0 : return 0;
301 :
302 0 : maEntries.replace( itr, new ScDateFrmtEntry( this, mpDoc ));
303 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
304 0 : itr->SetActive();
305 0 : break;
306 :
307 : }
308 0 : RecalcAll();
309 0 : return 0;
310 : }
311 :
312 0 : IMPL_LINK_NOARG( ScCondFormatList, AddBtnHdl )
313 : {
314 0 : ScCondFrmtEntry* pNewEntry = new ScConditionFrmtEntry(this, mpDoc, maPos);
315 0 : maEntries.push_back( pNewEntry );
316 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
317 : {
318 0 : itr->SetInactive();
319 : }
320 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
321 0 : pNewEntry->SetActive();
322 0 : RecalcAll();
323 0 : return 0;
324 : }
325 :
326 0 : IMPL_LINK_NOARG( ScCondFormatList, RemoveBtnHdl )
327 : {
328 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
329 : {
330 0 : if(itr->IsSelected())
331 : {
332 0 : maEntries.erase(itr);
333 0 : break;
334 : }
335 : }
336 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
337 0 : RecalcAll();
338 0 : return 0;
339 : }
340 :
341 0 : IMPL_LINK( ScCondFormatList, EntrySelectHdl, ScCondFrmtEntry*, pEntry )
342 : {
343 0 : if(pEntry->IsSelected())
344 0 : return 0;
345 :
346 0 : for(EntryContainer::iterator itr = maEntries.begin(); itr != maEntries.end(); ++itr)
347 : {
348 0 : itr->SetInactive();
349 : }
350 0 : static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
351 0 : pEntry->SetActive();
352 0 : RecalcAll();
353 0 : return 0;
354 : }
355 :
356 0 : IMPL_LINK_NOARG( ScCondFormatList, ScrollHdl )
357 : {
358 0 : DoScroll(mpScrollBar->GetDelta());
359 0 : return 0;
360 : }
361 :
362 : //---------------------------------------------------
363 : //ScCondFormatDlg
364 : //---------------------------------------------------
365 :
366 0 : ScCondFormatDlg::ScCondFormatDlg(Window* pParent, ScDocument* pDoc, const ScConditionalFormat* pFormat, const ScRangeList& rRange,
367 : const ScAddress& rPos, condformat::dialog::ScCondFormatDialogType eType):
368 : ScAnyRefModalDlg(pParent, ScResId(RID_SCDLG_CONDFORMAT) ),
369 : maBtnAdd( this, ScResId( BTN_ADD ) ),
370 : maBtnRemove( this, ScResId( BTN_REMOVE ) ),
371 : maBtnOk( this, ScResId( BTN_OK ) ),
372 : maBtnCancel( this, ScResId( BTN_CANCEL ) ),
373 : maFtRange( this, ScResId( FT_RANGE ) ),
374 : maEdRange( this, this, ScResId( ED_RANGE ) ),
375 : maRbRange( this, ScResId( RB_RANGE ), &maEdRange, this ),
376 : maCondFormList( this, ScResId( CTRL_LIST ), pDoc, pFormat, rRange, rPos, eType ),
377 : maPos(rPos),
378 : mpDoc(pDoc),
379 0 : mpLastEdit(NULL)
380 : {
381 0 : rtl::OUStringBuffer aTitle( GetText() );
382 0 : aTitle.append(rtl::OUString(" "));
383 0 : rtl::OUString aRangeString;
384 0 : rRange.Format(aRangeString, SCA_VALID, pDoc, pDoc->GetAddressConvention());
385 0 : aTitle.append(aRangeString);
386 0 : SetText(aTitle.makeStringAndClear());
387 0 : maBtnAdd.SetClickHdl( LINK( &maCondFormList, ScCondFormatList, AddBtnHdl ) );
388 0 : maBtnRemove.SetClickHdl( LINK( &maCondFormList, ScCondFormatList, RemoveBtnHdl ) );
389 0 : maEdRange.SetModifyHdl( LINK( this, ScCondFormatDlg, EdRangeModifyHdl ) );
390 0 : maEdRange.SetGetFocusHdl( LINK( this, ScCondFormatDlg, RangeGetFocusHdl ) );
391 0 : maEdRange.SetLoseFocusHdl( LINK( this, ScCondFormatDlg, RangeLoseFocusHdl ) );
392 0 : FreeResource();
393 :
394 0 : maEdRange.SetText(aRangeString);
395 :
396 0 : SC_MOD()->PushNewAnyRefDlg(this);
397 0 : }
398 :
399 0 : ScCondFormatDlg::~ScCondFormatDlg()
400 : {
401 0 : SC_MOD()->PopAnyRefDlg();
402 0 : }
403 :
404 0 : void ScCondFormatDlg::SetActive()
405 : {
406 0 : if(mpLastEdit)
407 0 : mpLastEdit->GrabFocus();
408 : else
409 0 : maEdRange.GrabFocus();
410 :
411 0 : RefInputDone();
412 0 : }
413 :
414 0 : void ScCondFormatDlg::RefInputDone( sal_Bool bForced )
415 : {
416 0 : ScAnyRefModalDlg::RefInputDone(bForced);
417 0 : }
418 :
419 0 : sal_Bool ScCondFormatDlg::IsTableLocked() const
420 : {
421 0 : if(mpLastEdit && mpLastEdit != &maEdRange)
422 0 : return sal_False;
423 :
424 0 : return sal_True;
425 : }
426 :
427 0 : sal_Bool ScCondFormatDlg::IsRefInputMode() const
428 : {
429 0 : return maEdRange.IsEnabled();
430 : }
431 :
432 : #define ABS_SREF SCA_VALID \
433 : | SCA_COL_ABSOLUTE | SCA_ROW_ABSOLUTE | SCA_TAB_ABSOLUTE
434 : #define ABS_DREF ABS_SREF \
435 : | SCA_COL2_ABSOLUTE | SCA_ROW2_ABSOLUTE | SCA_TAB2_ABSOLUTE
436 : #define ABS_DREF3D ABS_DREF | SCA_TAB_3D
437 :
438 0 : void ScCondFormatDlg::SetReference(const ScRange& rRef, ScDocument*)
439 : {
440 0 : formula::RefEdit* pEdit = mpLastEdit;
441 0 : if(!mpLastEdit)
442 0 : pEdit = &maEdRange;
443 :
444 0 : if( pEdit->IsEnabled() )
445 : {
446 0 : if(rRef.aStart != rRef.aEnd)
447 0 : RefInputStart(pEdit);
448 :
449 0 : rtl::OUString aRefStr;
450 0 : sal_uInt16 n = 0;
451 0 : if(mpLastEdit && mpLastEdit != &maEdRange)
452 0 : n = ABS_DREF3D;
453 : else
454 0 : n = ABS_DREF;
455 :
456 0 : rRef.Format( aRefStr, n, mpDoc, ScAddress::Details(mpDoc->GetAddressConvention(), 0, 0) );
457 0 : pEdit->SetRefString( aRefStr );
458 : }
459 0 : }
460 :
461 0 : ScConditionalFormat* ScCondFormatDlg::GetConditionalFormat() const
462 : {
463 0 : rtl::OUString aRangeStr = maEdRange.GetText();
464 0 : ScRangeList aRange;
465 0 : sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpDoc, SCA_VALID, mpDoc->GetAddressConvention(), maPos.Tab());
466 0 : ScConditionalFormat* pFormat = maCondFormList.GetConditionalFormat();
467 :
468 0 : if(nFlags & SCA_VALID && !aRange.empty() && pFormat)
469 0 : pFormat->AddRange(aRange);
470 :
471 0 : return pFormat;
472 : }
473 :
474 0 : void ScCondFormatDlg::InvalidateRefData()
475 : {
476 0 : mpLastEdit = NULL;
477 0 : }
478 :
479 0 : IMPL_LINK( ScCondFormatDlg, EdRangeModifyHdl, Edit*, pEdit )
480 : {
481 0 : rtl::OUString aRangeStr = pEdit->GetText();
482 0 : ScRangeList aRange;
483 0 : sal_uInt16 nFlags = aRange.Parse(aRangeStr, mpDoc, SCA_VALID, mpDoc->GetAddressConvention());
484 0 : if(nFlags & SCA_VALID)
485 0 : pEdit->SetControlBackground(GetSettings().GetStyleSettings().GetWindowColor());
486 : else
487 0 : pEdit->SetControlBackground(COL_LIGHTRED);
488 0 : return 0;
489 : }
490 :
491 0 : IMPL_LINK( ScCondFormatDlg, RangeGetFocusHdl, formula::RefEdit*, pEdit )
492 : {
493 0 : mpLastEdit = pEdit;
494 0 : return 0;
495 : }
496 :
497 0 : IMPL_LINK_NOARG( ScCondFormatDlg, RangeLoseFocusHdl )
498 : {
499 : //mpLastEdit = NULL;
500 0 : return 0;
501 15 : }
502 :
503 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|