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 "scitems.hxx"
21 : #include <editeng/eeitem.hxx>
22 :
23 : #include <svtools/colorcfg.hxx>
24 : #include <svx/fmview.hxx>
25 : #include <editeng/sizeitem.hxx>
26 : #include <svx/svdpagv.hxx>
27 : #include <sfx2/bindings.hxx>
28 : #include <sfx2/viewfrm.hxx>
29 : #include <sfx2/dispatch.hxx>
30 : #include <svtools/accessibilityoptions.hxx>
31 : #include <svl/itemset.hxx>
32 : #include <tools/multisel.hxx>
33 : #include <vcl/waitobj.hxx>
34 : #include <vcl/settings.hxx>
35 :
36 : #include "preview.hxx"
37 : #include "prevwsh.hxx"
38 : #include "prevloc.hxx"
39 : #include "docsh.hxx"
40 : #include "docfunc.hxx"
41 : #include "printfun.hxx"
42 : #include "printopt.hxx"
43 : #include "stlpool.hxx"
44 : #include "undostyl.hxx"
45 : #include "drwlayer.hxx"
46 : #include "scmod.hxx"
47 : #include "markdata.hxx"
48 : #include "globstr.hrc"
49 : #include "sc.hrc"
50 : #include "AccessibleDocumentPagePreview.hxx"
51 : #include <vcl/lineinfo.hxx>
52 : #include <svx/algitem.hxx>
53 : #include <editeng/lrspitem.hxx>
54 : #include <editeng/ulspitem.hxx>
55 : #include <editeng/colritem.hxx>
56 : #include <editeng/fhgtitem.hxx>
57 : #include "attrib.hxx"
58 : #include "pagepar.hxx"
59 : #include <com/sun/star/accessibility/XAccessible.hpp>
60 : #include "AccessibilityHints.hxx"
61 : #include <vcl/svapp.hxx>
62 : #include "viewutil.hxx"
63 : #include <columnspanset.hxx>
64 : #include <docpool.hxx>
65 : #include <patattr.hxx>
66 :
67 : #include <boost/scoped_ptr.hpp>
68 :
69 : // STATIC DATA -----------------------------------------------------------
70 :
71 : #define SC_PREVIEW_SHADOWSIZE 2
72 :
73 64 : static long lcl_GetDisplayStart( SCTAB nTab, ScDocument* pDoc, std::vector<long>& nPages )
74 : {
75 64 : long nDisplayStart = 0;
76 64 : for (SCTAB i=0; i<nTab; i++)
77 : {
78 0 : if ( pDoc->NeedPageResetAfterTab(i) )
79 0 : nDisplayStart = 0;
80 : else
81 0 : nDisplayStart += nPages[i];
82 : }
83 64 : return nDisplayStart;
84 : }
85 :
86 16 : ScPreview::ScPreview( vcl::Window* pParent, ScDocShell* pDocSh, ScPreviewShell* pViewSh ) :
87 : Window( pParent ),
88 : nPageNo( 0 ),
89 : nZoom( 100 ),
90 : nTabCount( 0 ),
91 : nTabsTested( 0 ),
92 : nPages(),
93 : nFirstAttr(),
94 : nTab( 0 ),
95 : nTabPage( 0 ),
96 : nTabStart( 0 ),
97 : nDisplayStart( 0 ),
98 : aDate( Date::SYSTEM ),
99 : aTime( tools::Time::SYSTEM ),
100 : nTotalPages( 0 ),
101 : pLocationData( NULL ),
102 : pDrawView( NULL ),
103 : pDocShell( pDocSh ),
104 : pViewShell( pViewSh ),
105 : bInGetState( false ),
106 : bValid( false ),
107 : bStateValid( false ),
108 : bLocationValid( false ),
109 : bInPaint( false ),
110 : bInSetZoom( false ),
111 : bLeftRulerMove( false ),
112 : bRightRulerMove( false ),
113 : bTopRulerMove( false ),
114 : bBottomRulerMove( false ),
115 : bHeaderRulerMove( false ),
116 : bFooterRulerMove( false ),
117 : bLeftRulerChange( false ),
118 : bRightRulerChange( false ),
119 : bTopRulerChange( false ),
120 : bBottomRulerChange( false ),
121 : bHeaderRulerChange( false ),
122 : bFooterRulerChange( false ),
123 : bPageMargin ( false ),
124 : bColRulerMove( false ),
125 : mbHasEmptyRangeTable(false),
126 : nLeftPosition( 0 ),
127 : mnScale( 0 ),
128 : nColNumberButttonDown( 0 ),
129 : nHeaderHeight ( 0 ),
130 16 : nFooterHeight ( 0 )
131 : {
132 16 : SetOutDevViewType( OUTDEV_VIEWTYPE_PRINTPREVIEW ); //#106611#
133 16 : SetBackground();
134 :
135 16 : SetHelpId( HID_SC_WIN_PREVIEW );
136 16 : SetUniqueId( HID_SC_WIN_PREVIEW );
137 :
138 16 : SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() );
139 :
140 16400 : for (SCCOL i=0; i<=MAXCOL; i++)
141 16384 : nRight[i] = 0; // initialized with actual positions when markers are drawn
142 16 : }
143 :
144 48 : ScPreview::~ScPreview()
145 : {
146 16 : delete pDrawView;
147 16 : delete pLocationData;
148 32 : }
149 :
150 32 : void ScPreview::UpdateDrawView() // nTab must be right
151 : {
152 32 : ScDocument& rDoc = pDocShell->GetDocument();
153 32 : ScDrawLayer* pModel = rDoc.GetDrawLayer(); // is not 0
154 :
155 : // #114135#
156 32 : if ( pModel )
157 : {
158 32 : SdrPage* pPage = pModel->GetPage(nTab);
159 32 : if ( pDrawView && ( !pDrawView->GetSdrPageView() || pDrawView->GetSdrPageView()->GetPage() != pPage ) )
160 : {
161 : // die angezeigte Page der DrawView umzustellen (s.u.) funktioniert nicht ?!?
162 0 : delete pDrawView;
163 0 : pDrawView = NULL;
164 : }
165 :
166 32 : if ( !pDrawView ) // New Drawing?
167 : {
168 16 : pDrawView = new FmFormView( pModel, this );
169 :
170 : // The DrawView takes over the Design-Mode from the Model
171 : // (Settings "In opening Draftmode"), therefore to restore here
172 16 : pDrawView->SetDesignMode( true );
173 16 : pDrawView->SetPrintPreview( true );
174 16 : pDrawView->ShowSdrPage(pPage);
175 : }
176 : }
177 0 : else if ( pDrawView )
178 : {
179 0 : delete pDrawView; // for this Chart is not needed
180 0 : pDrawView = NULL;
181 : }
182 32 : }
183 :
184 64 : void ScPreview::TestLastPage()
185 : {
186 64 : if (nPageNo >= nTotalPages)
187 : {
188 0 : if (nTotalPages)
189 : {
190 0 : nPageNo = nTotalPages - 1;
191 0 : nTab = static_cast<SCTAB>(nPages.size()) -1;
192 0 : while (nTab > 0 && !nPages[nTab]) // not the last empty Table
193 0 : --nTab;
194 : OSL_ENSURE(0 < static_cast<SCTAB>(nPages.size()),"are all tables empty?");
195 0 : nTabPage = nPages[nTab] - 1;
196 0 : nTabStart = 0;
197 0 : for (sal_uInt16 i=0; i<nTab; i++)
198 0 : nTabStart += nPages[i];
199 :
200 0 : ScDocument& rDoc = pDocShell->GetDocument();
201 0 : nDisplayStart = lcl_GetDisplayStart( nTab, &rDoc, nPages );
202 : }
203 : else // empty Document
204 : {
205 0 : nTab = 0;
206 0 : nPageNo = nTabPage = nTabStart = nDisplayStart = 0;
207 0 : aState.nPrintTab = 0;
208 0 : aState.nStartCol = aState.nEndCol = 0;
209 0 : aState.nStartRow = aState.nEndRow = 0;
210 0 : aState.nZoom = 0;
211 0 : aState.nPagesX = aState.nPagesY = 0;
212 : aState.nTabPages = aState.nTotalPages =
213 0 : aState.nPageStart = aState.nDocPages = 0;
214 : }
215 : }
216 64 : }
217 :
218 32 : void ScPreview::CalcPages()
219 : {
220 32 : WaitObject aWait( this );
221 :
222 32 : ScDocument& rDoc = pDocShell->GetDocument();
223 32 : nTabCount = rDoc.GetTableCount();
224 :
225 32 : SCTAB nStart = nTabsTested;
226 32 : if (!bValid)
227 : {
228 32 : nStart = 0;
229 32 : nTotalPages = 0;
230 32 : nTabsTested = 0;
231 : }
232 :
233 : // update all pending row heights with a single progress bar,
234 : // instead of a separate progress for each sheet from ScPrintFunc
235 32 : pDocShell->UpdatePendingRowHeights( nTabCount-1, true );
236 :
237 : // PrintOptions is passed to PrintFunc for SkipEmpty flag,
238 : // but always all sheets are used (there is no selected sheet)
239 64 : ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
240 :
241 64 : while (nStart > static_cast<SCTAB>(nPages.size()))
242 0 : nPages.push_back(0);
243 64 : while (nStart > static_cast<SCTAB>(nFirstAttr.size()))
244 0 : nFirstAttr.push_back(0);
245 :
246 64 : for (SCTAB i=nStart; i<nTabCount; i++)
247 : {
248 32 : if ( i == static_cast<SCTAB>(nPages.size()))
249 16 : nPages.push_back(0);
250 32 : if ( i == static_cast<SCTAB>(nFirstAttr.size()))
251 16 : nFirstAttr.push_back(0);
252 32 : if (!aOptions.GetAllSheets() && maSelectedTabs.count(i) == 0)
253 : {
254 0 : nPages[i] = 0;
255 0 : nFirstAttr[i] = 0;
256 0 : continue;
257 : }
258 :
259 32 : long nAttrPage = i > 0 ? nFirstAttr[i-1] : 1;
260 :
261 32 : long nThisStart = nTotalPages;
262 32 : ScPrintFunc aPrintFunc( this, pDocShell, i, nAttrPage, 0, NULL, &aOptions );
263 32 : long nThisTab = aPrintFunc.GetTotalPages();
264 32 : if (!aPrintFunc.HasPrintRange())
265 0 : mbHasEmptyRangeTable = true;
266 :
267 32 : nPages[i] = nThisTab;
268 32 : nTotalPages += nThisTab;
269 32 : nFirstAttr[i] = aPrintFunc.GetFirstPageNo(); // to keep or from template
270 :
271 32 : if (nPageNo>=nThisStart && nPageNo<nTotalPages)
272 : {
273 32 : nTab = i;
274 32 : nTabPage = nPageNo - nThisStart;
275 32 : nTabStart = nThisStart;
276 :
277 32 : aPrintFunc.GetPrintState( aState );
278 32 : aPageSize = aPrintFunc.GetPageSize();
279 : }
280 32 : }
281 :
282 32 : nDisplayStart = lcl_GetDisplayStart( nTab, &rDoc, nPages );
283 :
284 32 : if (nTabCount > nTabsTested)
285 32 : nTabsTested = nTabCount;
286 :
287 32 : TestLastPage();
288 :
289 32 : aState.nDocPages = nTotalPages;
290 :
291 32 : bValid = true;
292 32 : bStateValid = true;
293 64 : DoInvalidate();
294 32 : }
295 :
296 48 : void ScPreview::RecalcPages() // only nPageNo is changed
297 : {
298 48 : if (!bValid)
299 64 : return; // then CalcPages is called
300 :
301 32 : SCTAB nOldTab = nTab;
302 :
303 32 : bool bDone = false;
304 64 : while (nPageNo >= nTotalPages && nTabsTested < nTabCount)
305 : {
306 0 : CalcPages();
307 0 : bDone = true;
308 : }
309 :
310 32 : if (!bDone)
311 : {
312 32 : long nPartPages = 0;
313 64 : for (SCTAB i=0; i<nTabsTested && nTab < static_cast<SCTAB>(nPages.size()); i++)
314 : {
315 32 : long nThisStart = nPartPages;
316 32 : nPartPages += nPages[i];
317 :
318 32 : if (nPageNo>=nThisStart && nPageNo<nPartPages)
319 : {
320 32 : nTab = i;
321 32 : nTabPage = nPageNo - nThisStart;
322 32 : nTabStart = nThisStart;
323 : }
324 : }
325 :
326 32 : ScDocument& rDoc = pDocShell->GetDocument();
327 32 : nDisplayStart = lcl_GetDisplayStart( nTab, &rDoc, nPages );
328 : }
329 :
330 32 : TestLastPage(); // to test, if after last page
331 :
332 32 : if ( nTab != nOldTab )
333 0 : bStateValid = false;
334 :
335 32 : DoInvalidate();
336 : }
337 :
338 108 : void ScPreview::DoPrint( ScPreviewLocationData* pFillLocation )
339 : {
340 108 : if (!bValid)
341 : {
342 16 : CalcPages();
343 16 : RecalcPages();
344 16 : UpdateDrawView(); // Spreedsheet eventually changes
345 : }
346 :
347 108 : Fraction aPreviewZoom( nZoom, 100 );
348 108 : Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
349 108 : MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
350 :
351 108 : bool bDoPrint = ( pFillLocation == NULL );
352 108 : bool bValidPage = ( nPageNo < nTotalPages );
353 :
354 108 : ScModule* pScMod = SC_MOD();
355 108 : const svtools::ColorConfig& rColorCfg = pScMod->GetColorConfig();
356 108 : Color aBackColor( rColorCfg.GetColorValue(svtools::APPBACKGROUND).nColor );
357 :
358 108 : if ( bDoPrint && ( aOffset.X() < 0 || aOffset.Y() < 0 ) && bValidPage )
359 : {
360 66 : SetMapMode( aMMMode );
361 66 : SetLineColor();
362 66 : SetFillColor(aBackColor);
363 :
364 66 : Size aWinSize = GetOutputSize();
365 66 : if ( aOffset.X() < 0 )
366 66 : DrawRect(Rectangle( 0, 0, -aOffset.X(), aWinSize.Height() ));
367 66 : if ( aOffset.Y() < 0 )
368 42 : DrawRect(Rectangle( 0, 0, aWinSize.Width(), -aOffset.Y() ));
369 : }
370 :
371 108 : long nLeftMargin = 0;
372 108 : long nRightMargin = 0;
373 108 : long nTopMargin = 0;
374 108 : long nBottomMargin = 0;
375 108 : bool bHeaderOn = false;
376 108 : bool bFooterOn = false;
377 :
378 108 : ScDocument& rDoc = pDocShell->GetDocument();
379 108 : bool bLayoutRTL = rDoc.IsLayoutRTL( nTab );
380 :
381 108 : Size aLocalPageSize;
382 108 : if ( bValidPage )
383 : {
384 108 : ScPrintOptions aOptions = pScMod->GetPrintOptions();
385 :
386 : ScPrintFunc* pPrintFunc;
387 108 : if (bStateValid)
388 88 : pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
389 : else
390 20 : pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
391 :
392 108 : pPrintFunc->SetOffset(aOffset);
393 108 : pPrintFunc->SetManualZoom(nZoom);
394 108 : pPrintFunc->SetDateTime(aDate,aTime);
395 108 : pPrintFunc->SetClearFlag(true);
396 108 : pPrintFunc->SetUseStyleColor( pScMod->GetAccessOptions().GetIsForPagePreviews() );
397 :
398 108 : pPrintFunc->SetDrawView( pDrawView );
399 :
400 : // MultiSelection for the one Page must produce something inconvenient
401 108 : Range aPageRange( nPageNo+1, nPageNo+1 );
402 216 : MultiSelection aPage( aPageRange );
403 108 : aPage.SetTotalRange( Range(0,RANGE_MAX) );
404 108 : aPage.Select( aPageRange );
405 :
406 108 : long nPrinted = pPrintFunc->DoPrint( aPage, nTabStart, nDisplayStart, bDoPrint, pFillLocation );
407 : OSL_ENSURE(nPrinted<=1, "was'n nu los?");
408 :
409 108 : SetMapMode(aMMMode);
410 :
411 : //init nLeftMargin ... in the ScPrintFunc::InitParam!!!
412 108 : nLeftMargin = pPrintFunc->GetLeftMargin();
413 108 : nRightMargin = pPrintFunc->GetRightMargin();
414 108 : nTopMargin = pPrintFunc->GetTopMargin();
415 108 : nBottomMargin = pPrintFunc->GetBottomMargin();
416 108 : nHeaderHeight = pPrintFunc->GetHeader().nHeight;
417 108 : nFooterHeight = pPrintFunc->GetFooter().nHeight;
418 108 : bHeaderOn = pPrintFunc->GetHeader().bEnable;
419 108 : bFooterOn = pPrintFunc->GetFooter().bEnable;
420 108 : mnScale = pPrintFunc->GetZoom();
421 :
422 108 : if ( bDoPrint && bPageMargin && pLocationData ) // don't make use of pLocationData while filling it
423 : {
424 0 : Rectangle aPixRect;
425 0 : Rectangle aRectCellPosition;
426 0 : Rectangle aRectPosition;
427 0 : pLocationData->GetMainCellRange( aPageArea, aPixRect );
428 0 : if( !bLayoutRTL )
429 : {
430 0 : pLocationData->GetCellPosition( aPageArea.aStart, aRectPosition );
431 0 : nLeftPosition = aRectPosition.Left();
432 0 : for( SCCOL i = aPageArea.aStart.Col(); i <= aPageArea.aEnd.Col(); i++ )
433 : {
434 0 : pLocationData->GetCellPosition( ScAddress( i,aPageArea.aStart.Row(),aPageArea.aStart.Tab()),aRectCellPosition );
435 0 : nRight[i] = aRectCellPosition.Right();
436 : }
437 : }
438 : else
439 : {
440 0 : pLocationData->GetCellPosition( aPageArea.aEnd, aRectPosition );
441 0 : nLeftPosition = aRectPosition.Right()+1;
442 :
443 0 : pLocationData->GetCellPosition( aPageArea.aStart,aRectCellPosition );
444 0 : nRight[ aPageArea.aEnd.Col() ] = aRectCellPosition.Left();
445 0 : for( SCCOL i = aPageArea.aEnd.Col(); i > aPageArea.aStart.Col(); i-- )
446 : {
447 0 : pLocationData->GetCellPosition( ScAddress( i,aPageArea.aEnd.Row(),aPageArea.aEnd.Tab()),aRectCellPosition );
448 0 : nRight[ i-1 ] = nRight[ i ] + aRectCellPosition.Right() - aRectCellPosition.Left() + 1;
449 : }
450 : }
451 : }
452 :
453 108 : if (nPrinted) // if not, draw everything grey
454 : {
455 108 : aLocalPageSize = pPrintFunc->GetPageSize();
456 108 : aLocalPageSize.Width() = (long) (aLocalPageSize.Width() * HMM_PER_TWIPS );
457 108 : aLocalPageSize.Height() = (long) (aLocalPageSize.Height() * HMM_PER_TWIPS );
458 :
459 108 : nLeftMargin = (long) ( nLeftMargin * HMM_PER_TWIPS );
460 108 : nRightMargin = (long) ( nRightMargin * HMM_PER_TWIPS );
461 108 : nTopMargin = (long) ( nTopMargin * HMM_PER_TWIPS );
462 108 : nBottomMargin = (long) ( nBottomMargin * HMM_PER_TWIPS );
463 108 : nHeaderHeight = (long) ( nHeaderHeight * HMM_PER_TWIPS * mnScale / 100 + nTopMargin );
464 108 : nFooterHeight = (long) ( nFooterHeight * HMM_PER_TWIPS * mnScale / 100 + nBottomMargin );
465 : }
466 :
467 108 : if (!bStateValid)
468 : {
469 20 : pPrintFunc->GetPrintState( aState );
470 20 : aState.nDocPages = nTotalPages;
471 20 : bStateValid = true;
472 : }
473 216 : delete pPrintFunc;
474 : }
475 :
476 108 : if ( bDoPrint )
477 : {
478 66 : long nPageEndX = aLocalPageSize.Width() - aOffset.X();
479 66 : long nPageEndY = aLocalPageSize.Height() - aOffset.Y();
480 66 : if ( !bValidPage )
481 0 : nPageEndX = nPageEndY = 0;
482 :
483 66 : Size aWinSize = GetOutputSize();
484 66 : Point aWinEnd( aWinSize.Width(), aWinSize.Height() );
485 66 : bool bRight = nPageEndX <= aWinEnd.X();
486 66 : bool bBottom = nPageEndY <= aWinEnd.Y();
487 :
488 66 : if (!nTotalPages)
489 : {
490 : // There is no data to print. Print a friendly warning message and
491 : // bail out.
492 :
493 0 : SetMapMode(aMMMode);
494 :
495 : // Draw background first.
496 0 : SetLineColor();
497 0 : SetFillColor(aBackColor);
498 0 : DrawRect(Rectangle(0, 0, aWinEnd.X(), aWinEnd.Y()));
499 :
500 : const ScPatternAttr& rDefPattern =
501 : static_cast<const ScPatternAttr&>(
502 0 : rDoc.GetPool()->GetDefaultItem(ATTR_PATTERN));
503 :
504 : boost::scoped_ptr<ScEditEngineDefaulter> pEditEng(
505 0 : new ScEditEngineDefaulter(EditEngine::CreatePool(), true));
506 :
507 0 : pEditEng->SetRefMapMode(aMMMode);
508 0 : SfxItemSet* pEditDefaults = new SfxItemSet( pEditEng->GetEmptyItemSet() );
509 0 : rDefPattern.FillEditItemSet(pEditDefaults);
510 0 : pEditEng->SetDefaults(pEditDefaults, true);
511 :
512 0 : Color aTextColor(COL_LIGHTGRAY);
513 0 : pEditDefaults->Put(SvxColorItem(aTextColor, EE_CHAR_COLOR));
514 :
515 0 : OUString aEmptyMsg;
516 0 : if (mbHasEmptyRangeTable)
517 0 : aEmptyMsg = ScGlobal::GetRscString(STR_PRINT_PREVIEW_EMPTY_RANGE);
518 : else
519 0 : aEmptyMsg = ScGlobal::GetRscString(STR_PRINT_PREVIEW_NODATA);
520 :
521 0 : long nHeight = 3000;
522 0 : pEditEng->SetDefaultItem(SvxFontHeightItem(nHeight, 100, EE_CHAR_FONTHEIGHT));
523 0 : pEditEng->SetDefaultItem(SvxFontHeightItem(nHeight, 100, EE_CHAR_FONTHEIGHT_CJK));
524 0 : pEditEng->SetDefaultItem(SvxFontHeightItem(nHeight, 100, EE_CHAR_FONTHEIGHT_CTL));
525 :
526 0 : pEditEng->SetText(aEmptyMsg);
527 :
528 : Point aCenter(
529 0 : (aWinEnd.X() - pEditEng->CalcTextWidth())/2,
530 0 : (aWinEnd.Y() - pEditEng->GetTextHeight())/2);
531 :
532 0 : pEditEng->Draw(this, aCenter);
533 :
534 108 : return;
535 : }
536 :
537 66 : if( bPageMargin && bValidPage )
538 : {
539 0 : SetMapMode(aMMMode);
540 0 : SetLineColor( COL_BLACK );
541 0 : DrawInvert( (long)( nTopMargin - aOffset.Y() ), POINTER_VSIZEBAR );
542 0 : DrawInvert( (long)(nPageEndY - nBottomMargin ), POINTER_VSIZEBAR );
543 0 : DrawInvert( (long)( nLeftMargin - aOffset.X() ), POINTER_HSIZEBAR );
544 0 : DrawInvert( (long)( nPageEndX - nRightMargin ) , POINTER_HSIZEBAR );
545 0 : if( bHeaderOn )
546 : {
547 0 : DrawInvert( nHeaderHeight - aOffset.Y(), POINTER_VSIZEBAR );
548 : }
549 0 : if( bFooterOn )
550 : {
551 0 : DrawInvert( nPageEndY - nFooterHeight, POINTER_VSIZEBAR );
552 : }
553 :
554 0 : SetMapMode( MapMode( MAP_PIXEL ) );
555 0 : for( int i= aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
556 : {
557 0 : Point aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
558 0 : SetLineColor( COL_BLACK );
559 0 : SetFillColor( COL_BLACK );
560 0 : DrawRect( Rectangle( Point( nRight[i] - 2, aColumnTop.Y() ),Point( nRight[i] + 2 , 4 + aColumnTop.Y()) ));
561 0 : DrawLine( Point( nRight[i], aColumnTop.Y() ), Point( nRight[i], 10 + aColumnTop.Y()) );
562 : }
563 0 : SetMapMode( aMMMode );
564 : }
565 :
566 66 : if (bRight || bBottom)
567 : {
568 66 : SetMapMode(aMMMode);
569 66 : SetLineColor();
570 66 : SetFillColor(aBackColor);
571 66 : if (bRight)
572 66 : DrawRect(Rectangle(nPageEndX,0, aWinEnd.X(),aWinEnd.Y()));
573 66 : if (bBottom)
574 : {
575 56 : if (bRight)
576 56 : DrawRect(Rectangle(0,nPageEndY, nPageEndX,aWinEnd.Y())); // Corner not duplicated
577 : else
578 0 : DrawRect(Rectangle(0,nPageEndY, aWinEnd.X(),aWinEnd.Y()));
579 : }
580 : }
581 :
582 66 : if ( bValidPage )
583 : {
584 66 : Color aBorderColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
585 :
586 : // draw border
587 :
588 66 : if ( aOffset.X() <= 0 || aOffset.Y() <= 0 || bRight || bBottom )
589 : {
590 66 : SetLineColor( aBorderColor );
591 66 : SetFillColor();
592 :
593 66 : Rectangle aPixel( LogicToPixel( Rectangle( -aOffset.X(), -aOffset.Y(), nPageEndX, nPageEndY ) ) );
594 66 : --aPixel.Right();
595 66 : --aPixel.Bottom();
596 66 : DrawRect( PixelToLogic( aPixel ) );
597 : }
598 :
599 : // draw shadow
600 :
601 66 : SetLineColor();
602 66 : SetFillColor( aBorderColor );
603 :
604 66 : Rectangle aPixel;
605 :
606 66 : aPixel = LogicToPixel( Rectangle( nPageEndX, -aOffset.Y(), nPageEndX, nPageEndY ) );
607 66 : aPixel.Top() += SC_PREVIEW_SHADOWSIZE;
608 66 : aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
609 66 : aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
610 66 : DrawRect( PixelToLogic( aPixel ) );
611 :
612 66 : aPixel = LogicToPixel( Rectangle( -aOffset.X(), nPageEndY, nPageEndX, nPageEndY ) );
613 66 : aPixel.Left() += SC_PREVIEW_SHADOWSIZE;
614 66 : aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
615 66 : aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
616 66 : DrawRect( PixelToLogic( aPixel ) );
617 : }
618 108 : }
619 : }
620 :
621 66 : void ScPreview::Paint( const Rectangle& /* rRect */ )
622 : {
623 66 : bool bWasInPaint = bInPaint; // nested calls shouldn't be necessary, but allow for now
624 66 : bInPaint = true;
625 :
626 66 : if (bPageMargin)
627 0 : GetLocationData(); // fill location data for column positions
628 66 : DoPrint( NULL );
629 66 : pViewShell->UpdateScrollBars();
630 :
631 66 : bInPaint = bWasInPaint;
632 66 : }
633 :
634 0 : void ScPreview::Command( const CommandEvent& rCEvt )
635 : {
636 0 : sal_uInt16 nCmd = rCEvt.GetCommand();
637 0 : if ( nCmd == COMMAND_WHEEL || nCmd == COMMAND_STARTAUTOSCROLL || nCmd == COMMAND_AUTOSCROLL )
638 : {
639 0 : bool bDone = pViewShell->ScrollCommand( rCEvt );
640 0 : if (!bDone)
641 0 : Window::Command(rCEvt);
642 : }
643 0 : else if ( nCmd == COMMAND_CONTEXTMENU )
644 0 : SfxDispatcher::ExecutePopup();
645 : else
646 0 : Window::Command( rCEvt );
647 0 : }
648 :
649 0 : void ScPreview::KeyInput( const KeyEvent& rKEvt )
650 : {
651 : // The + and - keys can't be configured as accelerator entries, so they must be handled directly
652 : // (in ScPreview, not ScPreviewShell -> only if the preview window has the focus)
653 :
654 0 : const vcl::KeyCode& rKeyCode = rKEvt.GetKeyCode();
655 0 : sal_uInt16 nKey = rKeyCode.GetCode();
656 0 : bool bHandled = false;
657 0 : if(!rKeyCode.GetModifier())
658 : {
659 0 : sal_uInt16 nSlot = 0;
660 0 : switch(nKey)
661 : {
662 0 : case KEY_ADD: nSlot = SID_PREVIEW_ZOOMIN; break;
663 0 : case KEY_ESCAPE: nSlot = ScViewUtil::IsFullScreen( *pViewShell ) ? SID_CANCEL : SID_PREVIEW_CLOSE; break;
664 0 : case KEY_SUBTRACT: nSlot = SID_PREVIEW_ZOOMOUT; break;
665 : }
666 0 : if(nSlot)
667 : {
668 0 : bHandled = true;
669 0 : pViewShell->GetViewFrame()->GetDispatcher()->Execute( nSlot, SfxCallMode::ASYNCHRON );
670 : }
671 : }
672 :
673 0 : if ( !bHandled && !pViewShell->KeyInput(rKEvt) )
674 0 : Window::KeyInput(rKEvt);
675 0 : }
676 :
677 1876 : const ScPreviewLocationData& ScPreview::GetLocationData()
678 : {
679 1876 : if ( !pLocationData )
680 : {
681 16 : pLocationData = new ScPreviewLocationData( &pDocShell->GetDocument(), this );
682 16 : bLocationValid = false;
683 : }
684 1876 : if ( !bLocationValid )
685 : {
686 42 : pLocationData->Clear();
687 42 : DoPrint( pLocationData );
688 42 : bLocationValid = true;
689 : }
690 1876 : return *pLocationData;
691 : }
692 :
693 16 : void ScPreview::DataChanged(bool bNewTime)
694 : {
695 16 : if (bNewTime)
696 : {
697 16 : aDate = Date( Date::SYSTEM );
698 16 : aTime = tools::Time( tools::Time::SYSTEM );
699 : }
700 :
701 16 : bValid = false;
702 16 : InvalidateLocationData( SC_HINT_DATACHANGED );
703 16 : Invalidate();
704 16 : }
705 :
706 34 : OUString ScPreview::GetPosString()
707 : {
708 34 : if (!bValid)
709 : {
710 0 : CalcPages();
711 0 : UpdateDrawView(); // The table eventually changes
712 : }
713 :
714 68 : OUString aString = ScGlobal::GetRscString( STR_PAGE ) +
715 102 : " " + OUString::number(nPageNo+1);
716 :
717 34 : if (nTabsTested >= nTabCount)
718 34 : aString += " / " + OUString::number(nTotalPages);
719 :
720 34 : return aString;
721 : }
722 :
723 36 : void ScPreview::SetZoom(sal_uInt16 nNewZoom)
724 : {
725 36 : if (nNewZoom < 20)
726 0 : nNewZoom = 20;
727 36 : if (nNewZoom > 400)
728 0 : nNewZoom = 400;
729 36 : if (nNewZoom != nZoom)
730 : {
731 20 : nZoom = nNewZoom;
732 :
733 : // apply new MapMode and call UpdateScrollBars to update aOffset
734 :
735 20 : Fraction aPreviewZoom( nZoom, 100 );
736 20 : Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
737 20 : MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
738 20 : SetMapMode( aMMMode );
739 :
740 20 : bInSetZoom = true; // don't scroll during SetYOffset in UpdateScrollBars
741 20 : pViewShell->UpdateNeededScrollBars(true);
742 20 : bInSetZoom = false;
743 :
744 20 : bStateValid = false;
745 20 : InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
746 20 : DoInvalidate();
747 20 : Invalidate();
748 : }
749 36 : }
750 :
751 16 : void ScPreview::SetPageNo( long nPage )
752 : {
753 16 : nPageNo = nPage;
754 16 : RecalcPages();
755 16 : UpdateDrawView(); // The table eventually changes
756 16 : InvalidateLocationData( SC_HINT_DATACHANGED );
757 16 : Invalidate();
758 16 : }
759 :
760 16 : long ScPreview::GetFirstPage(SCTAB nTabP)
761 : {
762 16 : SCTAB nDocTabCount = pDocShell->GetDocument().GetTableCount();
763 16 : if (nTabP >= nDocTabCount)
764 0 : nTabP = nDocTabCount-1;
765 :
766 16 : long nPage = 0;
767 16 : if (nTabP>0)
768 : {
769 0 : CalcPages();
770 0 : if (nTabP >= static_cast<SCTAB>(nPages.size()) )
771 : OSL_FAIL("nPages out ouf bounds, FIX IT");
772 0 : UpdateDrawView(); // The table eventually changes
773 :
774 0 : for (SCTAB i=0; i<nTabP; i++)
775 0 : nPage += nPages[i];
776 :
777 : // An empty Table on the previous Page
778 :
779 0 : if ( nPages[nTabP]==0 && nPage > 0 )
780 0 : --nPage;
781 : }
782 :
783 16 : return nPage;
784 : }
785 :
786 16 : static Size lcl_GetDocPageSize( ScDocument* pDoc, SCTAB nTab )
787 : {
788 16 : OUString aName = pDoc->GetPageStyle( nTab );
789 16 : ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
790 16 : SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aName, SFX_STYLE_FAMILY_PAGE );
791 16 : if ( pStyleSheet )
792 : {
793 16 : SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
794 16 : return static_cast<const SvxSizeItem&>( rStyleSet.Get(ATTR_PAGE_SIZE)).GetSize();
795 : }
796 : else
797 : {
798 : OSL_FAIL( "PageStyle not found" );
799 0 : return Size();
800 16 : }
801 : }
802 :
803 16 : sal_uInt16 ScPreview::GetOptimalZoom(bool bWidthOnly)
804 : {
805 16 : double nWinScaleX = ScGlobal::nScreenPPTX / pDocShell->GetOutputFactor();
806 16 : double nWinScaleY = ScGlobal::nScreenPPTY;
807 16 : Size aWinSize = GetOutputSizePixel();
808 :
809 : // desired margin is 0.25cm in default MapMode (like Writer),
810 : // but some additional margin is introduced by integer scale values
811 : // -> add only 0.10cm, so there is some margin in all cases.
812 16 : Size aMarginSize( LogicToPixel( Size( 100, 100 ), MAP_100TH_MM ) );
813 16 : aWinSize.Width() -= 2 * aMarginSize.Width();
814 16 : aWinSize.Height() -= 2 * aMarginSize.Height();
815 :
816 16 : Size aLocalPageSize = lcl_GetDocPageSize( &pDocShell->GetDocument(), nTab );
817 16 : if ( aLocalPageSize.Width() && aLocalPageSize.Height() )
818 : {
819 16 : long nZoomX = (long) ( aWinSize.Width() * 100 / ( aLocalPageSize.Width() * nWinScaleX ));
820 16 : long nZoomY = (long) ( aWinSize.Height() * 100 / ( aLocalPageSize.Height() * nWinScaleY ));
821 :
822 16 : long nOptimal = nZoomX;
823 16 : if (!bWidthOnly && nZoomY<nOptimal)
824 16 : nOptimal = nZoomY;
825 :
826 16 : if (nOptimal<20)
827 0 : nOptimal = 20;
828 16 : if (nOptimal>400)
829 0 : nOptimal = 400;
830 :
831 16 : return (sal_uInt16) nOptimal;
832 : }
833 : else
834 0 : return nZoom;
835 : }
836 :
837 102 : void ScPreview::SetXOffset( long nX )
838 : {
839 102 : if ( aOffset.X() == nX )
840 184 : return;
841 :
842 20 : if (bValid)
843 : {
844 20 : long nDif = LogicToPixel(aOffset).X() - LogicToPixel(Point(nX,0)).X();
845 20 : aOffset.X() = nX;
846 20 : if (nDif && !bInSetZoom)
847 : {
848 0 : MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
849 0 : Scroll( nDif, 0 );
850 0 : SetMapMode(aOldMode);
851 : }
852 : }
853 : else
854 : {
855 0 : aOffset.X() = nX;
856 0 : if (!bInSetZoom)
857 0 : Invalidate();
858 : }
859 20 : InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
860 20 : Paint(Rectangle());
861 : }
862 :
863 92 : void ScPreview::SetYOffset( long nY )
864 : {
865 92 : if ( aOffset.Y() == nY )
866 166 : return;
867 :
868 18 : if (bValid)
869 : {
870 18 : long nDif = LogicToPixel(aOffset).Y() - LogicToPixel(Point(0,nY)).Y();
871 18 : aOffset.Y() = nY;
872 18 : if (nDif && !bInSetZoom)
873 : {
874 0 : MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
875 0 : Scroll( 0, nDif );
876 0 : SetMapMode(aOldMode);
877 : }
878 : }
879 : else
880 : {
881 0 : aOffset.Y() = nY;
882 0 : if (!bInSetZoom)
883 0 : Invalidate();
884 : }
885 18 : InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
886 18 : Paint(Rectangle());
887 : }
888 :
889 84 : void ScPreview::DoInvalidate()
890 : {
891 : // If the whole GetState of the shell is called
892 : // The Invalidate must come behind asynchronously
893 :
894 84 : if (bInGetState)
895 32 : Application::PostUserEvent( STATIC_LINK( this, ScPreview, InvalidateHdl ) );
896 : else
897 52 : StaticInvalidate(); // Immediately
898 84 : }
899 :
900 84 : void ScPreview::StaticInvalidate()
901 : {
902 : // static method, because it's called asynchronously
903 : // -> must use current viewframe
904 :
905 84 : SfxViewFrame* pViewFrm = SfxViewFrame::Current();
906 84 : if (!pViewFrm)
907 84 : return;
908 :
909 84 : SfxBindings& rBindings = pViewFrm->GetBindings();
910 84 : rBindings.Invalidate(SID_STATUS_DOCPOS);
911 84 : rBindings.Invalidate(SID_ROWCOL_SELCOUNT);
912 84 : rBindings.Invalidate(SID_STATUS_PAGESTYLE);
913 84 : rBindings.Invalidate(SID_PREVIEW_PREVIOUS);
914 84 : rBindings.Invalidate(SID_PREVIEW_NEXT);
915 84 : rBindings.Invalidate(SID_PREVIEW_FIRST);
916 84 : rBindings.Invalidate(SID_PREVIEW_LAST);
917 84 : rBindings.Invalidate(SID_ATTR_ZOOM);
918 84 : rBindings.Invalidate(SID_PREVIEW_ZOOMIN);
919 84 : rBindings.Invalidate(SID_PREVIEW_ZOOMOUT);
920 84 : rBindings.Invalidate(SID_PREVIEW_SCALINGFACTOR);
921 84 : rBindings.Invalidate(SID_ATTR_ZOOMSLIDER);
922 : }
923 :
924 64 : IMPL_STATIC_LINK( ScPreview, InvalidateHdl, void*, EMPTYARG )
925 : {
926 : (void)pThis; // avoid warning
927 :
928 32 : StaticInvalidate();
929 32 : return 0;
930 : }
931 :
932 0 : void ScPreview::DataChanged( const DataChangedEvent& rDCEvt )
933 : {
934 0 : Window::DataChanged(rDCEvt);
935 :
936 0 : if ( (rDCEvt.GetType() == DATACHANGED_PRINTER) ||
937 0 : (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
938 0 : (rDCEvt.GetType() == DATACHANGED_FONTS) ||
939 0 : (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
940 0 : ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
941 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
942 : {
943 0 : if ( rDCEvt.GetType() == DATACHANGED_FONTS )
944 0 : pDocShell->UpdateFontList();
945 :
946 : // #i114518# Paint of form controls may modify the window's settings.
947 : // Ignore the event if it is called from within Paint.
948 0 : if ( !bInPaint )
949 : {
950 0 : if ( rDCEvt.GetType() == DATACHANGED_SETTINGS &&
951 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
952 : {
953 : // scroll bar size may have changed
954 0 : pViewShell->InvalidateBorder(); // calls OuterResizePixel
955 : }
956 0 : Invalidate();
957 0 : InvalidateLocationData( SC_HINT_DATACHANGED );
958 : }
959 : }
960 0 : }
961 :
962 0 : void ScPreview::MouseButtonDown( const MouseEvent& rMEvt )
963 : {
964 0 : Fraction aPreviewZoom( nZoom, 100 );
965 0 : Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
966 0 : MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
967 :
968 0 : aButtonDownChangePoint = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
969 0 : aButtonDownPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
970 :
971 0 : CaptureMouse();
972 :
973 0 : if( rMEvt.IsLeft() && GetPointer() == POINTER_HSIZEBAR )
974 : {
975 0 : SetMapMode( aMMMode );
976 0 : if( bLeftRulerChange )
977 : {
978 0 : DrawInvert( aButtonDownChangePoint.X(), POINTER_HSIZEBAR );
979 0 : bLeftRulerMove = true;
980 0 : bRightRulerMove = false;
981 : }
982 0 : else if( bRightRulerChange )
983 : {
984 0 : DrawInvert( aButtonDownChangePoint.X(), POINTER_HSIZEBAR );
985 0 : bLeftRulerMove = false;
986 0 : bRightRulerMove = true;
987 : }
988 : }
989 :
990 0 : if( rMEvt.IsLeft() && GetPointer() == POINTER_VSIZEBAR )
991 : {
992 0 : SetMapMode( aMMMode );
993 0 : if( bTopRulerChange )
994 : {
995 0 : DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
996 0 : bTopRulerMove = true;
997 0 : bBottomRulerMove = false;
998 : }
999 0 : else if( bBottomRulerChange )
1000 : {
1001 0 : DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
1002 0 : bTopRulerMove = false;
1003 0 : bBottomRulerMove = true;
1004 : }
1005 0 : else if( bHeaderRulerChange )
1006 : {
1007 0 : DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
1008 0 : bHeaderRulerMove = true;
1009 0 : bFooterRulerMove = false;
1010 : }
1011 0 : else if( bFooterRulerChange )
1012 : {
1013 0 : DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
1014 0 : bHeaderRulerMove = false;
1015 0 : bFooterRulerMove = true;
1016 : }
1017 : }
1018 :
1019 0 : if( rMEvt.IsLeft() && GetPointer() == POINTER_HSPLIT )
1020 : {
1021 0 : Point aNowPt = rMEvt.GetPosPixel();
1022 0 : SCCOL i = 0;
1023 0 : for( i = aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
1024 : {
1025 0 : if( aNowPt.X() < nRight[i] + 2 && aNowPt.X() > nRight[i] - 2 )
1026 : {
1027 0 : nColNumberButttonDown = i;
1028 0 : break;
1029 : }
1030 : }
1031 0 : if( i == aPageArea.aEnd.Col()+1 )
1032 0 : return;
1033 :
1034 0 : SetMapMode( aMMMode );
1035 0 : if( nColNumberButttonDown == aPageArea.aStart.Col() )
1036 0 : DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1037 : else
1038 0 : DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1039 :
1040 0 : DrawInvert( aButtonDownChangePoint.X(), POINTER_HSPLIT );
1041 0 : bColRulerMove = true;
1042 0 : }
1043 : }
1044 :
1045 0 : void ScPreview::MouseButtonUp( const MouseEvent& rMEvt )
1046 : {
1047 0 : Fraction aPreviewZoom( nZoom, 100 );
1048 0 : Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
1049 0 : MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
1050 :
1051 0 : aButtonUpPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
1052 :
1053 0 : long nWidth = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Width();
1054 0 : long nHeight = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Height();
1055 :
1056 0 : if( rMEvt.IsLeft() && GetPointer() == POINTER_HSIZEBAR )
1057 : {
1058 0 : SetPointer( Pointer( POINTER_ARROW ) );
1059 :
1060 0 : ScDocument& rDoc = pDocShell->GetDocument();
1061 0 : OUString aOldName = rDoc.GetPageStyle( nTab );
1062 0 : bool bUndo = rDoc.IsUndoEnabled();
1063 0 : ScStyleSheetPool* pStylePool = rDoc.GetStyleSheetPool();
1064 0 : SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE );
1065 :
1066 0 : if ( pStyleSheet )
1067 : {
1068 0 : bool bMoveRulerAction= true;
1069 0 : ScStyleSaveData aOldData;
1070 0 : if( bUndo )
1071 0 : aOldData.InitFromStyle( pStyleSheet );
1072 :
1073 0 : SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
1074 :
1075 0 : SvxLRSpaceItem aLRItem = static_cast<const SvxLRSpaceItem&>( rStyleSet.Get( ATTR_LRSPACE ) );
1076 :
1077 0 : if(( bLeftRulerChange || bRightRulerChange ) && ( aButtonUpPt.X() <= ( 0 - aOffset.X() ) || aButtonUpPt.X() > nWidth * HMM_PER_TWIPS - aOffset.X() ) )
1078 : {
1079 0 : bMoveRulerAction = false;
1080 0 : Paint(Rectangle(0,0,10000,10000));
1081 : }
1082 0 : else if( bLeftRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS > nWidth - aLRItem.GetRight() - aOffset.X() / HMM_PER_TWIPS ) )
1083 : {
1084 0 : bMoveRulerAction = false;
1085 0 : Paint(Rectangle(0,0,10000,10000));
1086 : }
1087 0 : else if( bRightRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS < aLRItem.GetLeft() - aOffset.X() / HMM_PER_TWIPS ) )
1088 : {
1089 0 : bMoveRulerAction = false;
1090 0 : Paint(Rectangle(0,0,10000,10000));
1091 : }
1092 0 : else if( aButtonDownPt.X() == aButtonUpPt.X() )
1093 : {
1094 0 : bMoveRulerAction = false;
1095 0 : DrawInvert( aButtonUpPt.X(), POINTER_HSIZEBAR );
1096 : }
1097 0 : if( bMoveRulerAction )
1098 : {
1099 0 : ScDocShellModificator aModificator( *pDocShell );
1100 0 : if( bLeftRulerChange && bLeftRulerMove )
1101 : {
1102 0 : aLRItem.SetLeft( (long)( aButtonUpPt.X() / HMM_PER_TWIPS + aOffset.X() / HMM_PER_TWIPS ));
1103 0 : rStyleSet.Put( aLRItem );
1104 0 : pDocShell->SetModified(true);
1105 : }
1106 0 : else if( bRightRulerChange && bRightRulerMove )
1107 : {
1108 0 : aLRItem.SetRight( (long)( nWidth - aButtonUpPt.X() / HMM_PER_TWIPS - aOffset.X() / HMM_PER_TWIPS ));
1109 0 : rStyleSet.Put( aLRItem );
1110 0 : pDocShell->SetModified(true);
1111 : }
1112 :
1113 0 : ScStyleSaveData aNewData;
1114 0 : aNewData.InitFromStyle( pStyleSheet );
1115 0 : if( bUndo )
1116 : {
1117 0 : pDocShell->GetUndoManager()->AddUndoAction(
1118 : new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
1119 0 : aOldData, aNewData ) );
1120 : }
1121 :
1122 0 : if ( ValidTab( nTab ) )
1123 : {
1124 0 : ScPrintFunc aPrintFunc( this, pDocShell, nTab );
1125 0 : aPrintFunc.UpdatePages();
1126 : }
1127 :
1128 0 : Rectangle aRect(0,0,10000,10000);
1129 0 : Paint( aRect );
1130 0 : aModificator.SetDocumentModified();
1131 0 : bLeftRulerChange = false;
1132 0 : bRightRulerChange = false;
1133 0 : }
1134 : }
1135 0 : bLeftRulerMove = false;
1136 0 : bRightRulerMove = false;
1137 : }
1138 :
1139 0 : if( rMEvt.IsLeft() && GetPointer() == POINTER_VSIZEBAR )
1140 : {
1141 0 : SetPointer( POINTER_ARROW );
1142 :
1143 0 : bool bMoveRulerAction = true;
1144 0 : if( ( bTopRulerChange || bBottomRulerChange || bHeaderRulerChange || bFooterRulerChange ) && ( aButtonUpPt.Y() <= ( 0 - aOffset.Y() ) || aButtonUpPt.Y() > nHeight * HMM_PER_TWIPS -aOffset.Y() ) )
1145 : {
1146 0 : bMoveRulerAction = false;
1147 0 : Paint( Rectangle(0,0,10000,10000) );
1148 : }
1149 0 : else if( aButtonDownPt.Y() == aButtonUpPt.Y() )
1150 : {
1151 0 : bMoveRulerAction = false;
1152 0 : DrawInvert( aButtonUpPt.Y(), POINTER_VSIZEBAR );
1153 : }
1154 0 : if( bMoveRulerAction )
1155 : {
1156 0 : ScDocument& rDoc = pDocShell->GetDocument();
1157 0 : bool bUndo = rDoc.IsUndoEnabled();
1158 0 : ScStyleSheetPool* pStylePool = rDoc.GetStyleSheetPool();
1159 0 : SfxStyleSheetBase* pStyleSheet = pStylePool->Find( rDoc.GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE );
1160 : OSL_ENSURE( pStyleSheet, "PageStyle not found" );
1161 0 : if ( pStyleSheet )
1162 : {
1163 0 : ScDocShellModificator aModificator( *pDocShell );
1164 0 : ScStyleSaveData aOldData;
1165 0 : if( bUndo )
1166 0 : aOldData.InitFromStyle( pStyleSheet );
1167 :
1168 0 : SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
1169 :
1170 0 : SvxULSpaceItem aULItem = static_cast<const SvxULSpaceItem&>( rStyleSet.Get( ATTR_ULSPACE ) );
1171 :
1172 0 : if( bTopRulerMove && bTopRulerChange )
1173 : {
1174 0 : aULItem.SetUpperValue( (sal_uInt16)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS ) );
1175 0 : rStyleSet.Put( aULItem );
1176 0 : pDocShell->SetModified(true);
1177 : }
1178 0 : else if( bBottomRulerMove && bBottomRulerChange )
1179 : {
1180 0 : aULItem.SetLowerValue( (sal_uInt16)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS ) );
1181 0 : rStyleSet.Put( aULItem );
1182 0 : pDocShell->SetModified(true);
1183 : }
1184 0 : else if( bHeaderRulerMove && bHeaderRulerChange )
1185 : {
1186 0 : const SfxPoolItem* pItem = NULL;
1187 0 : if ( rStyleSet.GetItemState( ATTR_PAGE_HEADERSET, false, &pItem ) == SfxItemState::SET )
1188 : {
1189 0 : const SfxItemSet& pHeaderSet = static_cast<const SvxSetItem*>(pItem)->GetItemSet();
1190 0 : Size aHeaderSize = static_cast<const SvxSizeItem&>(pHeaderSet.Get(ATTR_PAGE_SIZE)).GetSize();
1191 0 : aHeaderSize.Height() = (long)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS - aULItem.GetUpper());
1192 0 : aHeaderSize.Height() = aHeaderSize.Height() * 100 / mnScale;
1193 0 : SvxSetItem aNewHeader( static_cast<const SvxSetItem&>(rStyleSet.Get(ATTR_PAGE_HEADERSET)) );
1194 0 : aNewHeader.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aHeaderSize ) );
1195 0 : rStyleSet.Put( aNewHeader );
1196 0 : pDocShell->SetModified(true);
1197 0 : }
1198 : }
1199 0 : else if( bFooterRulerMove && bFooterRulerChange )
1200 : {
1201 0 : const SfxPoolItem* pItem = NULL;
1202 0 : if( rStyleSet.GetItemState( ATTR_PAGE_FOOTERSET, false, &pItem ) == SfxItemState::SET )
1203 : {
1204 0 : const SfxItemSet& pFooterSet = static_cast<const SvxSetItem*>(pItem)->GetItemSet();
1205 0 : Size aFooterSize = static_cast<const SvxSizeItem&>(pFooterSet.Get(ATTR_PAGE_SIZE)).GetSize();
1206 0 : aFooterSize.Height() = (long)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS - aULItem.GetLower() );
1207 0 : aFooterSize.Height() = aFooterSize.Height() * 100 / mnScale;
1208 0 : SvxSetItem aNewFooter( static_cast<const SvxSetItem&>(rStyleSet.Get(ATTR_PAGE_FOOTERSET)) );
1209 0 : aNewFooter.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aFooterSize ) );
1210 0 : rStyleSet.Put( aNewFooter );
1211 0 : pDocShell->SetModified(true);
1212 : }
1213 : }
1214 :
1215 0 : ScStyleSaveData aNewData;
1216 0 : aNewData.InitFromStyle( pStyleSheet );
1217 0 : if( bUndo )
1218 : {
1219 0 : pDocShell->GetUndoManager()->AddUndoAction(
1220 : new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
1221 0 : aOldData, aNewData ) );
1222 : }
1223 :
1224 0 : if ( ValidTab( nTab ) )
1225 : {
1226 0 : ScPrintFunc aPrintFunc( this, pDocShell, nTab );
1227 0 : aPrintFunc.UpdatePages();
1228 : }
1229 :
1230 0 : Rectangle aRect(0,0,10000,10000);
1231 0 : Paint( aRect );
1232 0 : aModificator.SetDocumentModified();
1233 0 : bTopRulerChange = false;
1234 0 : bBottomRulerChange = false;
1235 0 : bHeaderRulerChange = false;
1236 0 : bFooterRulerChange = false;
1237 : }
1238 : }
1239 0 : bTopRulerMove = false;
1240 0 : bBottomRulerMove = false;
1241 0 : bHeaderRulerMove = false;
1242 0 : bFooterRulerMove = false;
1243 : }
1244 0 : if( rMEvt.IsLeft() && GetPointer() == POINTER_HSPLIT )
1245 : {
1246 0 : SetPointer(POINTER_ARROW);
1247 0 : ScDocument& rDoc = pDocShell->GetDocument();
1248 0 : bool bLayoutRTL = rDoc.IsLayoutRTL( nTab );
1249 0 : bool bMoveRulerAction = true;
1250 0 : if( aButtonDownPt.X() == aButtonUpPt.X() )
1251 : {
1252 0 : bMoveRulerAction = false;
1253 0 : if( nColNumberButttonDown == aPageArea.aStart.Col() )
1254 0 : DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1255 : else
1256 0 : DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,POINTER_HSPLIT );
1257 0 : DrawInvert( aButtonUpPt.X(), POINTER_HSPLIT );
1258 : }
1259 0 : if( bMoveRulerAction )
1260 : {
1261 0 : long nNewColWidth = 0;
1262 0 : std::vector<sc::ColRowSpan> aCols(1, sc::ColRowSpan(nColNumberButttonDown,nColNumberButttonDown));
1263 :
1264 0 : if( !bLayoutRTL )
1265 : {
1266 0 : nNewColWidth = (long) ( PixelToLogic( Point( rMEvt.GetPosPixel().X() - nRight[ nColNumberButttonDown ], 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
1267 0 : nNewColWidth += pDocShell->GetDocument().GetColWidth( nColNumberButttonDown, nTab );
1268 : }
1269 : else
1270 : {
1271 :
1272 0 : nNewColWidth = (long) ( PixelToLogic( Point( nRight[ nColNumberButttonDown ] - rMEvt.GetPosPixel().X(), 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
1273 0 : nNewColWidth += pDocShell->GetDocument().GetColWidth( nColNumberButttonDown, nTab );
1274 : }
1275 :
1276 0 : if( nNewColWidth >= 0 )
1277 : {
1278 0 : pDocShell->GetDocFunc().SetWidthOrHeight(
1279 0 : true, aCols, nTab, SC_SIZE_DIRECT, (sal_uInt16)nNewColWidth, true, true);
1280 0 : pDocShell->SetModified(true);
1281 : }
1282 0 : if ( ValidTab( nTab ) )
1283 : {
1284 0 : ScPrintFunc aPrintFunc( this, pDocShell, nTab );
1285 0 : aPrintFunc.UpdatePages();
1286 : }
1287 0 : Rectangle nRect(0,0,10000,10000);
1288 0 : Paint( nRect );
1289 : }
1290 0 : bColRulerMove = false;
1291 : }
1292 0 : ReleaseMouse();
1293 0 : }
1294 :
1295 0 : void ScPreview::MouseMove( const MouseEvent& rMEvt )
1296 : {
1297 0 : Fraction aPreviewZoom( nZoom, 100 );
1298 0 : Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
1299 0 : MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
1300 0 : Point aMouseMovePoint = PixelToLogic( rMEvt.GetPosPixel(), aMMMode );
1301 :
1302 0 : long nLeftMargin = 0;
1303 0 : long nRightMargin = 0;
1304 0 : long nTopMargin = 0;
1305 0 : long nBottomMargin = 0;
1306 :
1307 0 : long nWidth = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Width();
1308 0 : long nHeight = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Height();
1309 :
1310 0 : if ( nPageNo < nTotalPages )
1311 : {
1312 0 : ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
1313 :
1314 : ScPrintFunc* pPrintFunc;
1315 :
1316 0 : if (bStateValid)
1317 0 : pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
1318 : else
1319 0 : pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
1320 :
1321 0 : nLeftMargin = (long)( pPrintFunc->GetLeftMargin() * HMM_PER_TWIPS - aOffset.X() );
1322 0 : nRightMargin = (long)( pPrintFunc->GetRightMargin() * HMM_PER_TWIPS );
1323 0 : nRightMargin = (long)( nWidth * HMM_PER_TWIPS - nRightMargin - aOffset.X() );
1324 0 : nTopMargin = (long)( pPrintFunc->GetTopMargin() * HMM_PER_TWIPS - aOffset.Y() );
1325 0 : nBottomMargin = (long)( pPrintFunc->GetBottomMargin() * HMM_PER_TWIPS );
1326 0 : nBottomMargin = (long)( nHeight * HMM_PER_TWIPS - nBottomMargin - aOffset.Y() );
1327 0 : if( mnScale > 0 )
1328 : {
1329 0 : nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS * mnScale / 100 );
1330 0 : nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS * mnScale / 100 );
1331 : }
1332 : else
1333 : {
1334 0 : nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS );
1335 0 : nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS );
1336 : }
1337 0 : delete pPrintFunc;
1338 : }
1339 :
1340 0 : Point aPixPt( rMEvt.GetPosPixel() );
1341 0 : Point aLeftTop = LogicToPixel( Point( nLeftMargin, -aOffset.Y() ) , aMMMode );
1342 0 : Point aLeftBottom = LogicToPixel( Point( nLeftMargin ,(long)(nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
1343 0 : Point aRightTop = LogicToPixel( Point( nRightMargin, -aOffset.Y() ), aMMMode );
1344 0 : Point aTopLeft = LogicToPixel( Point( -aOffset.X(), nTopMargin ), aMMMode );
1345 0 : Point aTopRight = LogicToPixel( Point( (long)(nWidth * HMM_PER_TWIPS - aOffset.X()), nTopMargin ), aMMMode );
1346 0 : Point aBottomLeft = LogicToPixel( Point( -aOffset.X(), nBottomMargin ), aMMMode );
1347 0 : Point aHeaderLeft = LogicToPixel( Point( -aOffset.X(), nHeaderHeight ), aMMMode );
1348 0 : Point aFooderLeft = LogicToPixel( Point( -aOffset.X(), nFooterHeight ), aMMMode );
1349 :
1350 0 : bool bOnColRulerChange = false;
1351 :
1352 0 : for( SCCOL i=aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
1353 : {
1354 0 : Point aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
1355 0 : Point aColumnBottom = LogicToPixel( Point( 0, (long)( nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
1356 0 : if( aPixPt.X() < ( nRight[i] + 2 ) && ( aPixPt.X() > ( nRight[i] - 2 ) ) && ( aPixPt.X() < aRightTop.X() ) && ( aPixPt.X() > aLeftTop.X() )
1357 0 : && ( aPixPt.Y() > aColumnTop.Y() ) && ( aPixPt.Y() < aColumnBottom.Y() ) && !bLeftRulerMove && !bRightRulerMove
1358 0 : && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1359 : {
1360 0 : bOnColRulerChange = true;
1361 0 : if( !rMEvt.GetButtons() && GetPointer() == POINTER_HSPLIT )
1362 0 : nColNumberButttonDown = i;
1363 0 : break;
1364 : }
1365 : }
1366 :
1367 0 : if( aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 ) && !bRightRulerMove )
1368 : {
1369 0 : bLeftRulerChange = true;
1370 0 : bRightRulerChange = false;
1371 : }
1372 0 : else if( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) && !bLeftRulerMove )
1373 : {
1374 0 : bLeftRulerChange = false;
1375 0 : bRightRulerChange = true;
1376 : }
1377 0 : else if( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1378 : {
1379 0 : bTopRulerChange = true;
1380 0 : bBottomRulerChange = false;
1381 0 : bHeaderRulerChange = false;
1382 0 : bFooterRulerChange = false;
1383 : }
1384 0 : else if( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) && !bTopRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1385 : {
1386 0 : bTopRulerChange = false;
1387 0 : bBottomRulerChange = true;
1388 0 : bHeaderRulerChange = false;
1389 0 : bFooterRulerChange = false;
1390 : }
1391 0 : else if( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bFooterRulerMove )
1392 : {
1393 0 : bTopRulerChange = false;
1394 0 : bBottomRulerChange = false;
1395 0 : bHeaderRulerChange = true;
1396 0 : bFooterRulerChange = false;
1397 : }
1398 0 : else if( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove )
1399 : {
1400 0 : bTopRulerChange = false;
1401 0 : bBottomRulerChange = false;
1402 0 : bHeaderRulerChange = false;
1403 0 : bFooterRulerChange = true;
1404 : }
1405 :
1406 0 : if( bPageMargin )
1407 : {
1408 0 : if(( (aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 )) || bLeftRulerMove ||
1409 0 : ( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) ) || bRightRulerMove || bOnColRulerChange || bColRulerMove )
1410 0 : && aPixPt.Y() > aLeftTop.Y() && aPixPt.Y() < aLeftBottom.Y() )
1411 : {
1412 0 : if( bOnColRulerChange || bColRulerMove )
1413 : {
1414 0 : SetPointer( Pointer( POINTER_HSPLIT ) );
1415 0 : if( bColRulerMove )
1416 : {
1417 0 : if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
1418 0 : DragMove( aMouseMovePoint.X(), POINTER_HSPLIT );
1419 : }
1420 : }
1421 : else
1422 : {
1423 0 : if( bLeftRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1424 : {
1425 0 : SetPointer( Pointer( POINTER_HSIZEBAR ) );
1426 0 : if( bLeftRulerMove )
1427 : {
1428 0 : if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
1429 0 : DragMove( aMouseMovePoint.X(), POINTER_HSIZEBAR );
1430 : }
1431 : }
1432 0 : else if( bRightRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
1433 : {
1434 0 : SetPointer( Pointer( POINTER_HSIZEBAR ) );
1435 0 : if( bRightRulerMove )
1436 : {
1437 0 : if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
1438 0 : DragMove( aMouseMovePoint.X(), POINTER_HSIZEBAR );
1439 : }
1440 : }
1441 : }
1442 : }
1443 : else
1444 : {
1445 0 : if( ( ( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) ) || bTopRulerMove ||
1446 0 : ( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) ) || bBottomRulerMove ||
1447 0 : ( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) ) || bHeaderRulerMove ||
1448 0 : ( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) ) || bFooterRulerMove )
1449 0 : && aPixPt.X() > aTopLeft.X() && aPixPt.X() < aTopRight.X() )
1450 : {
1451 0 : if( bTopRulerChange )
1452 : {
1453 0 : SetPointer( Pointer( POINTER_VSIZEBAR ) );
1454 0 : if( bTopRulerMove )
1455 : {
1456 0 : if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1457 0 : DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1458 : }
1459 : }
1460 0 : else if( bBottomRulerChange )
1461 : {
1462 0 : SetPointer( Pointer( POINTER_VSIZEBAR ) );
1463 0 : if( bBottomRulerMove )
1464 : {
1465 0 : if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1466 0 : DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1467 : }
1468 : }
1469 0 : else if( bHeaderRulerChange )
1470 : {
1471 0 : SetPointer( Pointer( POINTER_VSIZEBAR ) );
1472 0 : if( bHeaderRulerMove )
1473 : {
1474 0 : if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1475 0 : DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1476 : }
1477 : }
1478 0 : else if( bFooterRulerChange )
1479 : {
1480 0 : SetPointer( Pointer( POINTER_VSIZEBAR ) );
1481 0 : if( bFooterRulerMove )
1482 : {
1483 0 : if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
1484 0 : DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
1485 : }
1486 : }
1487 : }
1488 : else
1489 0 : SetPointer( Pointer( POINTER_ARROW ) );
1490 : }
1491 0 : }
1492 0 : }
1493 :
1494 90 : void ScPreview::InvalidateLocationData(sal_uLong nId)
1495 : {
1496 90 : bLocationValid = false;
1497 90 : if (pViewShell->HasAccessibilityObjects())
1498 26 : pViewShell->BroadcastAccessibility( SfxSimpleHint( nId ) );
1499 90 : }
1500 :
1501 16 : void ScPreview::GetFocus()
1502 : {
1503 16 : if (pViewShell->HasAccessibilityObjects())
1504 0 : pViewShell->BroadcastAccessibility( ScAccWinFocusGotHint(GetAccessible()) );
1505 16 : }
1506 :
1507 16 : void ScPreview::LoseFocus()
1508 : {
1509 16 : if (pViewShell->HasAccessibilityObjects())
1510 16 : pViewShell->BroadcastAccessibility( ScAccWinFocusLostHint(GetAccessible()) );
1511 16 : }
1512 :
1513 16 : com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> ScPreview::CreateAccessible()
1514 : {
1515 16 : com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> xAcc= GetAccessible(false);
1516 16 : if (xAcc.is())
1517 : {
1518 0 : return xAcc;
1519 : }
1520 :
1521 : ScAccessibleDocumentPagePreview* pAccessible =
1522 16 : new ScAccessibleDocumentPagePreview( GetAccessibleParentWindow()->GetAccessible(), pViewShell );
1523 :
1524 16 : xAcc = pAccessible;
1525 16 : SetAccessible(xAcc);
1526 16 : pAccessible->Init();
1527 16 : return xAcc;
1528 : }
1529 :
1530 : // MT: Removed Windows::SwitchView() introduced with IA2 CWS.
1531 : // There are other notifications for this when the active view has chnaged, so please update the code to use that event mechanism
1532 0 : void ScPreview::SwitchView()
1533 : {
1534 0 : ScAccessibleDocumentBase* pAccDoc = static_cast<ScAccessibleDocumentBase*>(GetAccessible(false).get());
1535 0 : if (pAccDoc)
1536 : {
1537 0 : pAccDoc->SwitchViewFireFocus();
1538 : }
1539 0 : }
1540 :
1541 0 : void ScPreview::DragMove( long nDragMovePos, sal_uInt16 nFlags )
1542 : {
1543 0 : Fraction aPreviewZoom( nZoom, 100 );
1544 0 : Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
1545 0 : MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
1546 0 : SetMapMode( aMMMode );
1547 0 : long nPos = nDragMovePos;
1548 0 : if( nFlags == POINTER_HSIZEBAR || nFlags == POINTER_HSPLIT )
1549 : {
1550 0 : if( nDragMovePos != aButtonDownChangePoint.X() )
1551 : {
1552 0 : DrawInvert( aButtonDownChangePoint.X(), nFlags );
1553 0 : aButtonDownChangePoint.X() = nPos;
1554 0 : DrawInvert( aButtonDownChangePoint.X(), nFlags );
1555 : }
1556 : }
1557 0 : else if( nFlags == POINTER_VSIZEBAR )
1558 : {
1559 0 : if( nDragMovePos != aButtonDownChangePoint.Y() )
1560 : {
1561 0 : DrawInvert( aButtonDownChangePoint.Y(), nFlags );
1562 0 : aButtonDownChangePoint.Y() = nPos;
1563 0 : DrawInvert( aButtonDownChangePoint.Y(), nFlags );
1564 : }
1565 0 : }
1566 0 : }
1567 :
1568 0 : void ScPreview::DrawInvert( long nDragPos, sal_uInt16 nFlags )
1569 : {
1570 0 : long nHeight = (long) lcl_GetDocPageSize( &pDocShell->GetDocument(), nTab ).Height();
1571 0 : long nWidth = (long) lcl_GetDocPageSize( &pDocShell->GetDocument(), nTab ).Width();
1572 0 : if( nFlags == POINTER_HSIZEBAR || nFlags == POINTER_HSPLIT )
1573 : {
1574 0 : Rectangle aRect( nDragPos, -aOffset.Y(), nDragPos + 1,(long)( ( nHeight * HMM_PER_TWIPS ) - aOffset.Y()));
1575 0 : Invert( aRect,INVERT_50 );
1576 : }
1577 0 : else if( nFlags == POINTER_VSIZEBAR )
1578 : {
1579 0 : Rectangle aRect( -aOffset.X(), nDragPos,(long)( ( nWidth * HMM_PER_TWIPS ) - aOffset.X() ), nDragPos + 1 );
1580 0 : Invert( aRect,INVERT_50 );
1581 : }
1582 0 : }
1583 :
1584 16 : void ScPreview::SetSelectedTabs(const ScMarkData& rMark)
1585 : {
1586 16 : maSelectedTabs = rMark.GetSelectedTabs();
1587 244 : }
1588 :
1589 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|