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 : // static ----------------------------------------------------------------
35 :
36 : #define SPECIAL_FACTOR ((sal_uInt16)0xFFFF)
37 :
38 : // class SvxZoomDialog ---------------------------------------------------
39 :
40 0 : sal_uInt16 SvxZoomDialog::GetFactor() const
41 : {
42 0 : if ( m_p100Btn->IsChecked() )
43 0 : return 100;
44 0 : if ( m_pUserBtn->IsChecked() )
45 0 : return (sal_uInt16)m_pUserEdit->GetValue();
46 : else
47 0 : return SPECIAL_FACTOR;
48 : }
49 :
50 :
51 :
52 0 : void SvxZoomDialog::SetFactor( sal_uInt16 nNewFactor, sal_uInt16 nBtnId )
53 : {
54 0 : m_pUserEdit->Disable();
55 :
56 0 : if ( !nBtnId )
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( (long)nNewFactor );
68 0 : m_pUserEdit->GrabFocus();
69 : }
70 : }
71 : else
72 : {
73 0 : m_pUserEdit->SetValue( (long)nNewFactor );
74 :
75 0 : if ( ZOOMBTN_OPTIMAL == nBtnId )
76 : {
77 0 : m_pOptimalBtn->Check();
78 0 : m_pOptimalBtn->GrabFocus();
79 : }
80 0 : else if ( ZOOMBTN_PAGEWIDTH == nBtnId )
81 : {
82 0 : m_pPageWidthBtn->Check();
83 0 : m_pPageWidthBtn->GrabFocus();
84 : }
85 0 : else if ( ZOOMBTN_WHOLEPAGE == nBtnId )
86 : {
87 0 : m_pWholePageBtn->Check();
88 0 : m_pWholePageBtn->GrabFocus();
89 : }
90 : }
91 0 : }
92 :
93 :
94 :
95 0 : void SvxZoomDialog::HideButton( sal_uInt16 nBtnId )
96 : {
97 0 : switch ( nBtnId )
98 : {
99 : case ZOOMBTN_OPTIMAL:
100 0 : m_pOptimalBtn->Hide();
101 0 : break;
102 :
103 : case ZOOMBTN_PAGEWIDTH:
104 0 : m_pPageWidthBtn->Hide();
105 0 : break;
106 :
107 : case ZOOMBTN_WHOLEPAGE:
108 0 : m_pWholePageBtn->Hide();
109 0 : break;
110 :
111 : default:
112 : OSL_FAIL( "Falsche Button-Nummer!!!" );
113 : }
114 0 : }
115 :
116 :
117 :
118 0 : void SvxZoomDialog::SetLimits( sal_uInt16 nMin, sal_uInt16 nMax )
119 : {
120 : DBG_ASSERT( nMin < nMax, "invalid limits" );
121 0 : m_pUserEdit->SetMin( nMin );
122 0 : m_pUserEdit->SetFirst( nMin );
123 0 : m_pUserEdit->SetMax( nMax );
124 0 : m_pUserEdit->SetLast( nMax );
125 0 : }
126 :
127 :
128 :
129 0 : SvxZoomDialog::SvxZoomDialog( vcl::Window* pParent, const SfxItemSet& rCoreSet )
130 : : SfxModalDialog(pParent, "ZoomDialog", "cui/ui/zoomdialog.ui")
131 : , rSet(rCoreSet)
132 : , pOutSet(NULL)
133 0 : , bModified(false)
134 :
135 : {
136 0 : get(m_pOptimalBtn, "optimal");
137 0 : get(m_pWholePageBtn, "fitwandh");
138 0 : get(m_pPageWidthBtn, "fitw");
139 0 : get(m_p100Btn, "100pc");
140 0 : get(m_pUserBtn, "variable");
141 0 : get(m_pUserEdit, "zoomsb");
142 0 : get(m_pViewFrame, "viewframe");
143 0 : get(m_pAutomaticBtn, "automatic");
144 0 : get(m_pSingleBtn, "singlepage");
145 0 : get(m_pColumnsBtn, "columns");
146 0 : get(m_pColumnsEdit, "columnssb");
147 0 : get(m_pBookModeChk, "bookmode");
148 0 : get(m_pOKBtn, "ok");
149 0 : Link aLink = LINK( this, SvxZoomDialog, UserHdl );
150 0 : m_p100Btn->SetClickHdl( aLink );
151 0 : m_pOptimalBtn->SetClickHdl( aLink );
152 0 : m_pPageWidthBtn->SetClickHdl( aLink );
153 0 : m_pWholePageBtn->SetClickHdl( aLink );
154 0 : m_pUserBtn->SetClickHdl( aLink );
155 :
156 0 : Link aViewLayoutLink = LINK( this, SvxZoomDialog, ViewLayoutUserHdl );
157 0 : m_pAutomaticBtn->SetClickHdl( aViewLayoutLink );
158 0 : m_pSingleBtn->SetClickHdl( aViewLayoutLink );
159 0 : m_pColumnsBtn->SetClickHdl( aViewLayoutLink );
160 :
161 0 : Link aViewLayoutSpinLink = LINK( this, SvxZoomDialog, ViewLayoutSpinHdl );
162 0 : m_pColumnsEdit->SetModifyHdl( aViewLayoutSpinLink );
163 :
164 0 : Link aViewLayoutCheckLink = LINK( this, SvxZoomDialog, ViewLayoutCheckHdl );
165 0 : m_pBookModeChk->SetClickHdl( aViewLayoutCheckLink );
166 :
167 0 : m_pOKBtn->SetClickHdl( LINK( this, SvxZoomDialog, OKHdl ) );
168 0 : m_pUserEdit->SetModifyHdl( LINK( this, SvxZoomDialog, SpinHdl ) );
169 :
170 : // default values
171 0 : sal_uInt16 nValue = 100;
172 0 : sal_uInt16 nMin = 10;
173 0 : sal_uInt16 nMax = 1000;
174 :
175 : // maybe get the old value first
176 0 : const SfxUInt16Item* pOldUserItem = 0;
177 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
178 :
179 0 : if ( pSh )
180 0 : pOldUserItem = static_cast<const SfxUInt16Item*>(pSh->GetItem( SID_ATTR_ZOOM_USER ));
181 :
182 0 : if ( pOldUserItem )
183 0 : nValue = pOldUserItem->GetValue();
184 :
185 : // initialize UserEdit
186 0 : if ( nMin > nValue )
187 0 : nMin = nValue;
188 0 : if ( nMax < nValue )
189 0 : nMax = nValue;
190 0 : m_pUserEdit->SetMin( nMin );
191 0 : m_pUserEdit->SetFirst( nMin );
192 0 : m_pUserEdit->SetMax( nMax );
193 0 : m_pUserEdit->SetLast( nMax );
194 0 : m_pUserEdit->SetValue( nValue );
195 :
196 0 : m_pUserEdit->SetAccessibleName(m_pUserBtn->GetText());
197 0 : m_pColumnsEdit->SetAccessibleName(m_pColumnsBtn->GetText());
198 0 : m_pColumnsEdit->SetAccessibleRelationMemberOf(m_pColumnsBtn);
199 0 : m_pBookModeChk->SetAccessibleRelationMemberOf(m_pColumnsBtn);
200 :
201 0 : const SfxPoolItem& rItem = rSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
202 :
203 0 : if ( rItem.ISA(SvxZoomItem) )
204 : {
205 0 : const SvxZoomItem& rZoomItem = static_cast<const SvxZoomItem&>(rItem);
206 0 : const sal_uInt16 nZoom = rZoomItem.GetValue();
207 0 : const SvxZoomType eType = rZoomItem.GetType();
208 0 : const sal_uInt16 nValSet = rZoomItem.GetValueSet();
209 0 : sal_uInt16 nBtnId = 0;
210 :
211 0 : switch ( eType )
212 : {
213 : case SVX_ZOOM_OPTIMAL:
214 0 : nBtnId = ZOOMBTN_OPTIMAL;
215 0 : break;
216 : case SVX_ZOOM_PAGEWIDTH:
217 0 : nBtnId = ZOOMBTN_PAGEWIDTH;
218 0 : break;
219 : case SVX_ZOOM_WHOLEPAGE:
220 0 : nBtnId = ZOOMBTN_WHOLEPAGE;
221 0 : break;
222 : case SVX_ZOOM_PERCENT:
223 0 : break;
224 : case SVX_ZOOM_PAGEWIDTH_NOBORDER:
225 0 : break;
226 : }
227 :
228 0 : if ( !(SVX_ZOOM_ENABLE_100 & nValSet) )
229 0 : m_p100Btn->Disable();
230 0 : if ( !(SVX_ZOOM_ENABLE_OPTIMAL & nValSet) )
231 0 : m_pOptimalBtn->Disable();
232 0 : if ( !(SVX_ZOOM_ENABLE_PAGEWIDTH & nValSet) )
233 0 : m_pPageWidthBtn->Disable();
234 0 : if ( !(SVX_ZOOM_ENABLE_WHOLEPAGE & nValSet) )
235 0 : m_pWholePageBtn->Disable();
236 0 : SetFactor( nZoom, nBtnId );
237 : }
238 : else
239 : {
240 0 : const sal_uInt16 nZoom = static_cast<const SfxUInt16Item&>(rItem).GetValue();
241 0 : SetFactor( nZoom );
242 : }
243 :
244 0 : const SfxPoolItem* pViewLayoutItem = 0;
245 0 : if ( SfxItemState::SET == rSet.GetItemState( SID_ATTR_VIEWLAYOUT, false, &pViewLayoutItem ) )
246 : {
247 0 : const sal_uInt16 nColumns = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->GetValue();
248 0 : const bool bBookMode = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->IsBookMode();
249 :
250 0 : if ( 0 == nColumns )
251 : {
252 0 : m_pAutomaticBtn->Check();
253 0 : m_pColumnsEdit->SetValue( 2 );
254 0 : m_pColumnsEdit->Disable();
255 0 : m_pBookModeChk->Disable();
256 : }
257 0 : else if ( 1 == nColumns)
258 : {
259 0 : m_pSingleBtn->Check();
260 0 : m_pColumnsEdit->SetValue( 2 );
261 0 : m_pColumnsEdit->Disable();
262 0 : m_pBookModeChk->Disable();
263 : }
264 : else
265 : {
266 0 : m_pColumnsBtn->Check();
267 0 : if ( !bBookMode )
268 : {
269 0 : m_pColumnsEdit->SetValue( nColumns );
270 0 : if ( 0 != nColumns % 2 )
271 0 : m_pBookModeChk->Disable();
272 : }
273 : else
274 : {
275 0 : m_pColumnsEdit->SetValue( nColumns );
276 0 : m_pBookModeChk->Check();
277 : }
278 : }
279 : }
280 : else
281 : {
282 : // hide view layout related controls:
283 0 : m_pViewFrame->Disable();
284 : }
285 0 : }
286 :
287 :
288 :
289 0 : SvxZoomDialog::~SvxZoomDialog()
290 : {
291 0 : delete pOutSet;
292 0 : pOutSet = 0;
293 0 : }
294 :
295 :
296 :
297 0 : IMPL_LINK( SvxZoomDialog, UserHdl, RadioButton *, pBtn )
298 : {
299 0 : bModified = true;
300 :
301 0 : if (pBtn == m_pUserBtn)
302 : {
303 0 : m_pUserEdit->Enable();
304 0 : m_pUserEdit->GrabFocus();
305 : }
306 : else
307 0 : m_pUserEdit->Disable();
308 0 : return 0;
309 : }
310 :
311 :
312 :
313 0 : IMPL_LINK_NOARG(SvxZoomDialog, SpinHdl)
314 : {
315 0 : if ( !m_pUserBtn->IsChecked() )
316 0 : return 0;
317 0 : bModified = true;
318 0 : return 0;
319 : }
320 :
321 :
322 :
323 0 : IMPL_LINK( SvxZoomDialog, ViewLayoutUserHdl, RadioButton *, pBtn )
324 : {
325 0 : bModified = true;
326 :
327 0 : if (pBtn == m_pAutomaticBtn)
328 : {
329 0 : m_pColumnsEdit->Disable();
330 0 : m_pBookModeChk->Disable();
331 : }
332 0 : else if (pBtn == m_pSingleBtn)
333 : {
334 0 : m_pColumnsEdit->Disable();
335 0 : m_pBookModeChk->Disable();
336 : }
337 0 : else if (pBtn == m_pColumnsBtn)
338 : {
339 0 : m_pColumnsEdit->Enable();
340 0 : m_pColumnsEdit->GrabFocus();
341 0 : if ( 0 == m_pColumnsEdit->GetValue() % 2 )
342 0 : m_pBookModeChk->Enable();
343 : }
344 : else
345 : {
346 : OSL_FAIL( "Wrong Button" );
347 0 : return 0;
348 : }
349 :
350 0 : return 0;
351 : }
352 :
353 :
354 :
355 0 : IMPL_LINK( SvxZoomDialog, ViewLayoutSpinHdl, NumericField *, pEdt )
356 : {
357 0 : if ( pEdt == m_pColumnsEdit && !m_pColumnsBtn->IsChecked() )
358 0 : return 0;
359 :
360 0 : if ( 0 == m_pColumnsEdit->GetValue() % 2 )
361 0 : m_pBookModeChk->Enable();
362 : else
363 : {
364 0 : m_pBookModeChk->Check( false );
365 0 : m_pBookModeChk->Disable();
366 : }
367 :
368 0 : bModified = true;
369 :
370 0 : return 0;
371 : }
372 :
373 :
374 :
375 0 : IMPL_LINK( SvxZoomDialog, ViewLayoutCheckHdl, CheckBox *, pChk )
376 : {
377 0 : if (pChk == m_pBookModeChk && !m_pColumnsBtn->IsChecked())
378 0 : return 0;
379 :
380 0 : bModified = true;
381 :
382 0 : return 0;
383 : }
384 :
385 :
386 :
387 0 : IMPL_LINK( SvxZoomDialog, OKHdl, Button *, pBtn )
388 : {
389 0 : if ( bModified || m_pOKBtn != pBtn )
390 : {
391 0 : SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, 0, rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
392 0 : SvxViewLayoutItem aViewLayoutItem( 0, false, rSet.GetPool()->GetWhich( SID_ATTR_VIEWLAYOUT ) );
393 :
394 0 : if ( m_pOKBtn == pBtn )
395 : {
396 0 : sal_uInt16 nFactor = GetFactor();
397 :
398 0 : if ( SPECIAL_FACTOR == nFactor )
399 : {
400 0 : if ( m_pOptimalBtn->IsChecked() )
401 0 : aZoomItem.SetType( SVX_ZOOM_OPTIMAL );
402 0 : else if ( m_pPageWidthBtn->IsChecked() )
403 0 : aZoomItem.SetType( SVX_ZOOM_PAGEWIDTH );
404 0 : else if ( m_pWholePageBtn->IsChecked() )
405 0 : aZoomItem.SetType( SVX_ZOOM_WHOLEPAGE );
406 : }
407 : else
408 0 : aZoomItem.SetValue( nFactor );
409 :
410 0 : if ( m_pAutomaticBtn->IsChecked() )
411 : {
412 0 : aViewLayoutItem.SetValue( 0 );
413 0 : aViewLayoutItem.SetBookMode( false );
414 : }
415 0 : if ( m_pSingleBtn->IsChecked() )
416 : {
417 0 : aViewLayoutItem.SetValue( 1 );
418 0 : aViewLayoutItem.SetBookMode( false );
419 : }
420 0 : else if ( m_pColumnsBtn->IsChecked() )
421 : {
422 0 : aViewLayoutItem.SetValue( static_cast<sal_uInt16>(m_pColumnsEdit->GetValue()) );
423 0 : aViewLayoutItem.SetBookMode( m_pBookModeChk->IsChecked() );
424 : }
425 : }
426 : else
427 : {
428 : OSL_FAIL( "Wrong Button" );
429 0 : return 0;
430 : }
431 0 : pOutSet = new SfxItemSet( rSet );
432 0 : pOutSet->Put( aZoomItem );
433 :
434 : // don't set attribute in case the whole viewlayout stuff is disabled:
435 0 : if (m_pViewFrame->IsEnabled())
436 0 : pOutSet->Put(aViewLayoutItem);
437 :
438 : // memorize value from the UserEdit beyond the dialog
439 0 : SfxObjectShell* pSh = SfxObjectShell::Current();
440 :
441 0 : if ( pSh )
442 : pSh->PutItem( SfxUInt16Item( SID_ATTR_ZOOM_USER,
443 0 : (sal_uInt16)m_pUserEdit->GetValue() ) );
444 0 : EndDialog( RET_OK );
445 : }
446 : else
447 0 : EndDialog( RET_CANCEL );
448 0 : return 0;
449 0 : }
450 :
451 :
452 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|