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