Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <svl/itemset.hxx>
21 : #include <svl/itempool.hxx>
22 : #include <sfx2/objsh.hxx>
23 : #include <vcl/layout.hxx>
24 : #include <vcl/msgbox.hxx>
25 :
26 : #include <cuires.hrc>
27 :
28 : #include "zoom.hxx"
29 : #include <sfx2/zoomitem.hxx>
30 : #include <svx/viewlayoutitem.hxx>
31 : #include <dialmgr.hxx>
32 : #include <svx/zoom_def.hxx>
33 :
34 : namespace
35 : {
36 :
37 : const sal_uInt16 SPECIAL_FACTOR = 0xFFFF;
38 :
39 : } // anonymous namespace
40 :
41 0 : sal_uInt16 SvxZoomDialog::GetFactor() const
42 : {
43 0 : if (m_p100Btn->IsChecked())
44 0 : return 100;
45 :
46 0 : if (m_pUserBtn->IsChecked())
47 0 : return static_cast<sal_uInt16>(m_pUserEdit->GetValue());
48 : else
49 0 : return SPECIAL_FACTOR;
50 : }
51 :
52 0 : void SvxZoomDialog::SetFactor(sal_uInt16 nNewFactor, ZoomButtonId nButtonId)
53 : {
54 0 : m_pUserEdit->Disable();
55 :
56 0 : if (nButtonId == ZoomButtonId::NONE)
57 : {
58 0 : if ( nNewFactor == 100 )
59 : {
60 0 : m_p100Btn->Check();
61 0 : m_p100Btn->GrabFocus();
62 : }
63 : else
64 : {
65 0 : m_pUserBtn->Check();
66 0 : m_pUserEdit->Enable();
67 0 : m_pUserEdit->SetValue(static_cast<long>(nNewFactor));
68 0 : m_pUserEdit->GrabFocus();
69 : }
70 : }
71 : else
72 : {
73 0 : m_pUserEdit->SetValue(static_cast<long>(nNewFactor));
74 0 : switch(nButtonId)
75 : {
76 : case ZoomButtonId::OPTIMAL:
77 : {
78 0 : m_pOptimalBtn->Check();
79 0 : m_pOptimalBtn->GrabFocus();
80 0 : break;
81 : }
82 : case ZoomButtonId::PAGEWIDTH:
83 : {
84 0 : m_pPageWidthBtn->Check();
85 0 : m_pPageWidthBtn->GrabFocus();
86 0 : break;
87 : }
88 : case ZoomButtonId::WHOLEPAGE:
89 : {
90 0 : m_pWholePageBtn->Check();
91 0 : m_pWholePageBtn->GrabFocus();
92 0 : break;
93 : }
94 0 : default: break;
95 : }
96 : }
97 0 : }
98 :
99 0 : void SvxZoomDialog::HideButton(ZoomButtonId nButtonId)
100 : {
101 0 : switch (nButtonId)
102 : {
103 : case ZoomButtonId::OPTIMAL:
104 0 : m_pOptimalBtn->Hide();
105 0 : break;
106 :
107 : case ZoomButtonId::PAGEWIDTH:
108 0 : m_pPageWidthBtn->Hide();
109 0 : break;
110 :
111 : case ZoomButtonId::WHOLEPAGE:
112 0 : m_pWholePageBtn->Hide();
113 0 : break;
114 :
115 : default:
116 : OSL_FAIL("Wrong button number!" );
117 : }
118 0 : }
119 :
120 0 : void SvxZoomDialog::SetLimits(sal_uInt16 nMin, sal_uInt16 nMax)
121 : {
122 : DBG_ASSERT(nMin < nMax, "invalid limits");
123 0 : m_pUserEdit->SetMin(nMin);
124 0 : m_pUserEdit->SetFirst(nMin);
125 0 : m_pUserEdit->SetMax(nMax);
126 0 : m_pUserEdit->SetLast(nMax);
127 0 : }
128 :
129 0 : const SfxItemSet* SvxZoomDialog::GetOutputItemSet() const
130 : {
131 0 : return mpOutSet.get();
132 : }
133 :
134 0 : SvxZoomDialog::SvxZoomDialog( vcl::Window* pParent, const SfxItemSet& rCoreSet )
135 : : SfxModalDialog(pParent, "ZoomDialog", "cui/ui/zoomdialog.ui")
136 : , mrSet(rCoreSet)
137 : , mpOutSet()
138 0 : , mbModified(false)
139 :
140 : {
141 0 : get(m_pOptimalBtn, "optimal");
142 0 : get(m_pWholePageBtn, "fitwandh");
143 0 : get(m_pPageWidthBtn, "fitw");
144 0 : get(m_p100Btn, "100pc");
145 0 : get(m_pUserBtn, "variable");
146 0 : get(m_pUserEdit, "zoomsb");
147 0 : get(m_pViewFrame, "viewframe");
148 0 : get(m_pAutomaticBtn, "automatic");
149 0 : get(m_pSingleBtn, "singlepage");
150 0 : get(m_pColumnsBtn, "columns");
151 0 : get(m_pColumnsEdit, "columnssb");
152 0 : get(m_pBookModeChk, "bookmode");
153 0 : get(m_pOKBtn, "ok");
154 0 : Link<> aLink = LINK(this, SvxZoomDialog, UserHdl);
155 0 : m_p100Btn->SetClickHdl(aLink);
156 0 : m_pOptimalBtn->SetClickHdl(aLink);
157 0 : m_pPageWidthBtn->SetClickHdl(aLink);
158 0 : m_pWholePageBtn->SetClickHdl(aLink);
159 0 : m_pUserBtn->SetClickHdl(aLink);
160 :
161 0 : Link<> aViewLayoutLink = LINK(this, SvxZoomDialog, ViewLayoutUserHdl);
162 0 : m_pAutomaticBtn->SetClickHdl(aViewLayoutLink);
163 0 : m_pSingleBtn->SetClickHdl(aViewLayoutLink);
164 0 : m_pColumnsBtn->SetClickHdl(aViewLayoutLink);
165 :
166 0 : Link<> aViewLayoutSpinLink = LINK(this, SvxZoomDialog, ViewLayoutSpinHdl);
167 0 : m_pColumnsEdit->SetModifyHdl(aViewLayoutSpinLink);
168 :
169 0 : Link<> aViewLayoutCheckLink = LINK(this, SvxZoomDialog, ViewLayoutCheckHdl);
170 0 : m_pBookModeChk->SetClickHdl(aViewLayoutCheckLink);
171 :
172 0 : m_pOKBtn->SetClickHdl(LINK(this, SvxZoomDialog, OKHdl));
173 0 : m_pUserEdit->SetModifyHdl(LINK(this, SvxZoomDialog, SpinHdl));
174 :
175 : // default values
176 0 : sal_uInt16 nValue = 100;
177 0 : sal_uInt16 nMin = 10;
178 0 : sal_uInt16 nMax = 1000;
179 :
180 : // maybe get the old value first
181 0 : const SfxUInt16Item* pOldUserItem = 0;
182 0 : SfxObjectShell* pShell = SfxObjectShell::Current();
183 :
184 0 : if (pShell)
185 0 : pOldUserItem = static_cast<const SfxUInt16Item*>(pShell->GetItem(SID_ATTR_ZOOM_USER));
186 :
187 0 : if (pOldUserItem)
188 0 : nValue = pOldUserItem->GetValue();
189 :
190 : // initialize UserEdit
191 0 : if (nMin > nValue)
192 0 : nMin = nValue;
193 0 : if (nMax < nValue)
194 0 : nMax = nValue;
195 :
196 0 : SetLimits(nMin, nMax);
197 0 : m_pUserEdit->SetValue(nValue);
198 :
199 0 : m_pUserEdit->SetAccessibleName(m_pUserBtn->GetText());
200 0 : m_pColumnsEdit->SetAccessibleName(m_pColumnsBtn->GetText());
201 0 : m_pColumnsEdit->SetAccessibleRelationMemberOf(m_pColumnsBtn);
202 0 : m_pBookModeChk->SetAccessibleRelationMemberOf(m_pColumnsBtn);
203 :
204 0 : const SfxPoolItem& rItem = mrSet.Get(mrSet.GetPool()->GetWhich(SID_ATTR_ZOOM));
205 :
206 0 : if (rItem.ISA(SvxZoomItem))
207 : {
208 0 : const SvxZoomItem& rZoomItem = static_cast<const SvxZoomItem&>(rItem);
209 0 : const sal_uInt16 nZoom = rZoomItem.GetValue();
210 0 : const SvxZoomType eType = rZoomItem.GetType();
211 0 : const SvxZoomEnableFlags nValSet = rZoomItem.GetValueSet();
212 0 : ZoomButtonId nButtonId = ZoomButtonId::NONE;
213 :
214 0 : switch (eType)
215 : {
216 : case SvxZoomType::OPTIMAL:
217 0 : nButtonId = ZoomButtonId::OPTIMAL;
218 0 : break;
219 : case SvxZoomType::PAGEWIDTH:
220 0 : nButtonId = ZoomButtonId::PAGEWIDTH;
221 0 : break;
222 : case SvxZoomType::WHOLEPAGE:
223 0 : nButtonId = ZoomButtonId::WHOLEPAGE;
224 0 : break;
225 : case SvxZoomType::PERCENT:
226 0 : break;
227 : case SvxZoomType::PAGEWIDTH_NOBORDER:
228 0 : break;
229 : }
230 :
231 0 : if (!(SvxZoomEnableFlags::N100 & nValSet))
232 0 : m_p100Btn->Disable();
233 0 : if (!(SvxZoomEnableFlags::OPTIMAL & nValSet))
234 0 : m_pOptimalBtn->Disable();
235 0 : if (!(SvxZoomEnableFlags::PAGEWIDTH & nValSet))
236 0 : m_pPageWidthBtn->Disable();
237 0 : if (!(SvxZoomEnableFlags::WHOLEPAGE & nValSet))
238 0 : m_pWholePageBtn->Disable();
239 :
240 0 : SetFactor(nZoom, nButtonId);
241 : }
242 : else
243 : {
244 0 : const sal_uInt16 nZoom = static_cast<const SfxUInt16Item&>(rItem).GetValue();
245 0 : SetFactor(nZoom);
246 : }
247 :
248 0 : const SfxPoolItem* pPoolViewLayoutItem = NULL;
249 0 : if (SfxItemState::SET == mrSet.GetItemState(SID_ATTR_VIEWLAYOUT, false, &pPoolViewLayoutItem))
250 : {
251 0 : const SvxViewLayoutItem* pViewLayoutItem = static_cast<const SvxViewLayoutItem*>(pPoolViewLayoutItem);
252 0 : const sal_uInt16 nColumns = pViewLayoutItem->GetValue();
253 0 : const bool bBookMode = pViewLayoutItem->IsBookMode();
254 :
255 0 : if (0 == nColumns)
256 : {
257 0 : m_pAutomaticBtn->Check();
258 0 : m_pColumnsEdit->SetValue(2);
259 0 : m_pColumnsEdit->Disable();
260 0 : m_pBookModeChk->Disable();
261 : }
262 0 : else if (1 == nColumns)
263 : {
264 0 : m_pSingleBtn->Check();
265 0 : m_pColumnsEdit->SetValue(2);
266 0 : m_pColumnsEdit->Disable();
267 0 : m_pBookModeChk->Disable();
268 : }
269 : else
270 : {
271 0 : m_pColumnsBtn->Check();
272 0 : if (!bBookMode)
273 : {
274 0 : m_pColumnsEdit->SetValue(nColumns);
275 0 : if (nColumns % 2 != 0)
276 0 : m_pBookModeChk->Disable();
277 : }
278 : else
279 : {
280 0 : m_pColumnsEdit->SetValue(nColumns);
281 0 : m_pBookModeChk->Check();
282 : }
283 : }
284 : }
285 : else
286 : {
287 : // hide view layout related controls:
288 0 : m_pViewFrame->Disable();
289 : }
290 0 : }
291 :
292 0 : SvxZoomDialog::~SvxZoomDialog()
293 : {
294 0 : disposeOnce();
295 0 : }
296 :
297 0 : void SvxZoomDialog::dispose()
298 : {
299 0 : mpOutSet.reset();
300 0 : m_pOptimalBtn.clear();
301 0 : m_pWholePageBtn.clear();
302 0 : m_pPageWidthBtn.clear();
303 0 : m_p100Btn.clear();
304 0 : m_pUserBtn.clear();
305 0 : m_pUserEdit.clear();
306 0 : m_pViewFrame.clear();
307 0 : m_pAutomaticBtn.clear();
308 0 : m_pSingleBtn.clear();
309 0 : m_pColumnsBtn.clear();
310 0 : m_pColumnsEdit.clear();
311 0 : m_pBookModeChk.clear();
312 0 : m_pOKBtn.clear();
313 0 : SfxModalDialog::dispose();
314 0 : }
315 :
316 0 : IMPL_LINK(SvxZoomDialog, UserHdl, RadioButton *, pButton)
317 : {
318 0 : mbModified = true;
319 :
320 0 : if (pButton == m_pUserBtn)
321 : {
322 0 : m_pUserEdit->Enable();
323 0 : m_pUserEdit->GrabFocus();
324 : }
325 : else
326 : {
327 0 : m_pUserEdit->Disable();
328 : }
329 0 : return 0;
330 : }
331 :
332 0 : IMPL_LINK_NOARG(SvxZoomDialog, SpinHdl)
333 : {
334 0 : if (!m_pUserBtn->IsChecked())
335 0 : return 0;
336 :
337 0 : mbModified = true;
338 0 : return 0;
339 : }
340 :
341 0 : IMPL_LINK(SvxZoomDialog, ViewLayoutUserHdl, RadioButton*, pButton)
342 : {
343 0 : mbModified = true;
344 :
345 0 : if (pButton == m_pAutomaticBtn)
346 : {
347 0 : m_pColumnsEdit->Disable();
348 0 : m_pBookModeChk->Disable();
349 : }
350 0 : else if (pButton == m_pSingleBtn)
351 : {
352 0 : m_pColumnsEdit->Disable();
353 0 : m_pBookModeChk->Disable();
354 : }
355 0 : else if (pButton == m_pColumnsBtn)
356 : {
357 0 : m_pColumnsEdit->Enable();
358 0 : m_pColumnsEdit->GrabFocus();
359 0 : if (m_pColumnsEdit->GetValue() % 2 == 0)
360 0 : m_pBookModeChk->Enable();
361 : }
362 : else
363 : {
364 : OSL_FAIL("Wrong Button");
365 0 : return 0;
366 : }
367 :
368 0 : return 0;
369 : }
370 :
371 0 : IMPL_LINK(SvxZoomDialog, ViewLayoutSpinHdl, NumericField*, pEdit)
372 : {
373 0 : if (pEdit == m_pColumnsEdit && !m_pColumnsBtn->IsChecked())
374 0 : return 0;
375 :
376 0 : if (m_pColumnsEdit->GetValue() % 2 == 0)
377 : {
378 0 : m_pBookModeChk->Enable();
379 : }
380 : else
381 : {
382 0 : m_pBookModeChk->Check(false);
383 0 : m_pBookModeChk->Disable();
384 : }
385 :
386 0 : mbModified = true;
387 :
388 0 : return 0;
389 : }
390 :
391 0 : IMPL_LINK(SvxZoomDialog, ViewLayoutCheckHdl, CheckBox*, pCheckBox)
392 : {
393 0 : if (pCheckBox == m_pBookModeChk && !m_pColumnsBtn->IsChecked())
394 0 : return 0;
395 :
396 0 : mbModified = true;
397 :
398 0 : return 0;
399 : }
400 :
401 0 : IMPL_LINK(SvxZoomDialog, OKHdl, Button*, pButton)
402 : {
403 0 : if (mbModified || m_pOKBtn != pButton)
404 : {
405 0 : SvxZoomItem aZoomItem(SvxZoomType::PERCENT, 0, mrSet.GetPool()->GetWhich(SID_ATTR_ZOOM));
406 0 : SvxViewLayoutItem aViewLayoutItem(0, false, mrSet.GetPool()->GetWhich(SID_ATTR_VIEWLAYOUT));
407 :
408 0 : if (m_pOKBtn == pButton)
409 : {
410 0 : sal_uInt16 nFactor = GetFactor();
411 :
412 0 : if (SPECIAL_FACTOR == nFactor)
413 : {
414 0 : if (m_pOptimalBtn->IsChecked())
415 0 : aZoomItem.SetType(SvxZoomType::OPTIMAL);
416 0 : else if (m_pPageWidthBtn->IsChecked())
417 0 : aZoomItem.SetType(SvxZoomType::PAGEWIDTH);
418 0 : else if (m_pWholePageBtn->IsChecked())
419 0 : aZoomItem.SetType(SvxZoomType::WHOLEPAGE);
420 : }
421 : else
422 : {
423 0 : aZoomItem.SetValue(nFactor);
424 : }
425 :
426 0 : if (m_pAutomaticBtn->IsChecked())
427 : {
428 0 : aViewLayoutItem.SetValue(0);
429 0 : aViewLayoutItem.SetBookMode(false);
430 : }
431 0 : if (m_pSingleBtn->IsChecked())
432 : {
433 0 : aViewLayoutItem.SetValue(1);
434 0 : aViewLayoutItem.SetBookMode(false);
435 : }
436 0 : else if (m_pColumnsBtn->IsChecked())
437 : {
438 0 : aViewLayoutItem.SetValue(static_cast<sal_uInt16>(m_pColumnsEdit->GetValue()));
439 0 : aViewLayoutItem.SetBookMode(m_pBookModeChk->IsChecked());
440 : }
441 : }
442 : else
443 : {
444 : OSL_FAIL("Wrong Button");
445 0 : return 0;
446 : }
447 0 : mpOutSet.reset(new SfxItemSet(mrSet));
448 0 : mpOutSet->Put(aZoomItem);
449 :
450 : // don't set attribute in case the whole viewlayout stuff is disabled:
451 0 : if (m_pViewFrame->IsEnabled())
452 0 : mpOutSet->Put(aViewLayoutItem);
453 :
454 : // memorize value from the UserEdit beyond the dialog
455 0 : SfxObjectShell* pShell = SfxObjectShell::Current();
456 :
457 0 : if (pShell)
458 : {
459 0 : sal_uInt16 nZoomValue = static_cast<sal_uInt16>(m_pUserEdit->GetValue());
460 0 : pShell->PutItem(SfxUInt16Item(SID_ATTR_ZOOM_USER, nZoomValue));
461 : }
462 0 : EndDialog( RET_OK );
463 : }
464 : else
465 : {
466 0 : EndDialog( RET_CANCEL );
467 : }
468 0 : return 0;
469 0 : }
470 :
471 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|