1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26
27 #include "Window.hxx"
28 #include <sfx2/dispatch.hxx>
29 #include <sfx2/request.hxx>
30
31 #include <sfx2/viewfrm.hxx>
32 #include <svx/svxids.hrc>
33
34 #include <editeng/outliner.hxx>
35 #include <editeng/editview.hxx>
36
37 #include "app.hrc"
38 #include "helpids.h"
39 #include "ViewShell.hxx"
40 #include "DrawViewShell.hxx"
41 #include "View.hxx"
42 #include "FrameView.hxx"
43 #include "OutlineViewShell.hxx"
44 #include "drawdoc.hxx"
45 #include "AccessibleDrawDocumentView.hxx"
46 #include "WindowUpdater.hxx"
47
48 #include <vcl/svapp.hxx>
49
50 namespace sd {
51
52 #define SCROLL_LINE_FACT 0.05 // Faktor fuer Zeilenscrolling
53 #define SCROLL_PAGE_FACT 0.5 // Faktor fuer Seitenscrolling
54 #define SCROLL_SENSITIVE 20 // Sensitiver Bereich (Pixel)
55 #define ZOOM_MULTIPLICATOR 10000 // Multiplikator um Rundungsfehler zu vermeiden
56 #define MIN_ZOOM 5 // Minimaler Zoomfaktor
57 #define MAX_ZOOM 3000 // Maximaler Zoomfaktor
58
59
60 /*************************************************************************
61 |*
62 |* Konstruktor
63 |*
64 \************************************************************************/
65
Window(::Window * pParent)66 Window::Window(::Window* pParent)
67 : ::Window(pParent, WinBits(WB_CLIPCHILDREN | WB_DIALOGCONTROL)),
68 DropTargetHelper( this ),
69 mpShareWin(NULL),
70 maWinPos(0, 0), // vorsichtshalber; die Werte sollten aber
71 maViewOrigin(0, 0), // vom Besitzer des Fensters neu gesetzt
72 maViewSize(1000, 1000), // werden
73 mnMinZoom(MIN_ZOOM),
74 mnMaxZoom(MAX_ZOOM),
75 mbMinZoomAutoCalc(false),
76 mbCalcMinZoomByMinSide(true),
77 mbCenterAllowed(true),
78 mnTicks (0),
79 mbDraggedFrom(false),
80 mpViewShell(NULL),
81 mbUseDropScroll (true)
82 {
83 SetDialogControlFlags( WINDOW_DLGCTRL_RETURN | WINDOW_DLGCTRL_WANTFOCUS );
84
85 MapMode aMap(GetMapMode());
86 aMap.SetMapUnit(MAP_100TH_MM);
87 SetMapMode(aMap);
88
89 // Damit im Diamodus die ::WindowColor genommen wird
90 SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetWindowColor() ) );
91
92 // adjust contrast mode initially
93 bool bUseContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
94 SetDrawMode( bUseContrast
95 ? ViewShell::OUTPUT_DRAWMODE_CONTRAST
96 : ViewShell::OUTPUT_DRAWMODE_COLOR );
97
98 // Hilfe-ID setzen
99 // SetHelpId(HID_SD_WIN_DOCUMENT);
100 SetUniqueId(HID_SD_WIN_DOCUMENT);
101
102 // #i78183# Added after discussed with AF
103 EnableRTL(sal_False);
104 }
105
106 /*************************************************************************
107 |*
108 |* Destruktor
109 |*
110 \************************************************************************/
111
~Window(void)112 Window::~Window (void)
113 {
114 if (mpViewShell != NULL)
115 {
116 WindowUpdater* pWindowUpdater = mpViewShell->GetWindowUpdater();
117 if (pWindowUpdater != NULL)
118 pWindowUpdater->UnregisterWindow (this);
119 }
120 }
121
122
123
124
SetViewShell(ViewShell * pViewSh)125 void Window::SetViewShell (ViewShell* pViewSh)
126 {
127 WindowUpdater* pWindowUpdater = NULL;
128 // Unregister at device updater of old view shell.
129 if (mpViewShell != NULL)
130 {
131 pWindowUpdater = mpViewShell->GetWindowUpdater();
132 if (pWindowUpdater != NULL)
133 pWindowUpdater->UnregisterWindow (this);
134 }
135
136 mpViewShell = pViewSh;
137
138 // Register at device updater of new view shell
139 if (mpViewShell != NULL)
140 {
141 pWindowUpdater = mpViewShell->GetWindowUpdater();
142 if (pWindowUpdater != NULL)
143 pWindowUpdater->RegisterWindow (this);
144 }
145 }
146
CalcMinZoom()147 void Window::CalcMinZoom()
148 {
149 // Are we entitled to change the minimal zoom factor?
150 if ( mbMinZoomAutoCalc )
151 {
152 // Get current zoom factor.
153 long nZoom = GetZoom();
154
155 if ( mpShareWin )
156 {
157 mpShareWin->CalcMinZoom();
158 mnMinZoom = mpShareWin->mnMinZoom;
159 }
160 else
161 {
162 // Get the rectangle of the output area in logical coordinates
163 // and calculate the scaling factors that would lead to the view
164 // area (also called application area) to completely fill the
165 // window.
166 Size aWinSize = PixelToLogic(GetOutputSizePixel());
167 sal_uLong nX = (sal_uLong) ((double) aWinSize.Width()
168 * (double) ZOOM_MULTIPLICATOR / (double) maViewSize.Width());
169 sal_uLong nY = (sal_uLong) ((double) aWinSize.Height()
170 * (double) ZOOM_MULTIPLICATOR / (double) maViewSize.Height());
171
172 // Decide whether to take the larger or the smaller factor.
173 sal_uLong nFact;
174 if (mbCalcMinZoomByMinSide)
175 nFact = Min(nX, nY);
176 else
177 nFact = Max(nX, nY);
178
179 // The factor is tansfomed according to the current zoom factor.
180 nFact = nFact * nZoom / ZOOM_MULTIPLICATOR;
181 mnMinZoom = Max((sal_uInt16) MIN_ZOOM, (sal_uInt16) nFact);
182 }
183 // If the current zoom factor is smaller than the calculated minimal
184 // zoom factor then set the new minimal factor as the current zoom
185 // factor.
186 if ( nZoom < (long) mnMinZoom )
187 SetZoomFactor(mnMinZoom);
188 }
189 }
190
191
192
193
SetMinZoom(long int nMin)194 void Window::SetMinZoom (long int nMin)
195 {
196 mnMinZoom = (sal_uInt16) nMin;
197 }
198
199
200
201
GetMinZoom(void) const202 long Window::GetMinZoom (void) const
203 {
204 return mnMinZoom;
205 }
206
207
208
209
SetMaxZoom(long int nMax)210 void Window::SetMaxZoom (long int nMax)
211 {
212 mnMaxZoom = (sal_uInt16) nMax;
213 }
214
215
216
217
GetMaxZoom(void) const218 long Window::GetMaxZoom (void) const
219 {
220 return mnMaxZoom;
221 }
222
223
224
225
GetZoom(void) const226 long Window::GetZoom (void) const
227 {
228 if( GetMapMode().GetScaleX().GetDenominator() )
229 {
230 return GetMapMode().GetScaleX().GetNumerator() * 100L
231 / GetMapMode().GetScaleX().GetDenominator();
232 }
233 else
234 {
235 return 0;
236 }
237 }
238
239
240
241
242 /*************************************************************************
243 |*
244 |* Resize event
245 |*
246 \************************************************************************/
247
Resize()248 void Window::Resize()
249 {
250 ::Window::Resize();
251 CalcMinZoom();
252
253 if( mpViewShell && mpViewShell->GetViewFrame() )
254 mpViewShell->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
255 }
256
257 /*************************************************************************
258 |*
259 |* PrePaint event
260 |*
261 \************************************************************************/
262
PrePaint()263 void Window::PrePaint()
264 {
265 if ( mpViewShell )
266 mpViewShell->PrePaint();
267 }
268
269 /*************************************************************************
270 |*
271 |* Paint event
272 |*
273 \************************************************************************/
274
Paint(const Rectangle & rRect)275 void Window::Paint(const Rectangle& rRect)
276 {
277 if ( mpViewShell )
278 mpViewShell->Paint(rRect, this);
279 }
280
281 /*************************************************************************
282 |*
283 |* Keyboard event
284 |*
285 \************************************************************************/
286
KeyInput(const KeyEvent & rKEvt)287 void Window::KeyInput(const KeyEvent& rKEvt)
288 {
289 if (!(mpViewShell && mpViewShell->KeyInput(rKEvt, this)))
290 {
291 if (mpViewShell && rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
292 {
293 mpViewShell->GetViewShell()->Escape();
294 }
295 else
296 {
297 ::Window::KeyInput(rKEvt);
298 }
299 }
300 }
301
302 /*************************************************************************
303 |*
304 |* MouseButtonDown event
305 |*
306 \************************************************************************/
307
MouseButtonDown(const MouseEvent & rMEvt)308 void Window::MouseButtonDown(const MouseEvent& rMEvt)
309 {
310 if ( mpViewShell )
311 mpViewShell->MouseButtonDown(rMEvt, this);
312 }
313
314 /*************************************************************************
315 |*
316 |* MouseMove event
317 |*
318 \************************************************************************/
319
MouseMove(const MouseEvent & rMEvt)320 void Window::MouseMove(const MouseEvent& rMEvt)
321 {
322 if ( mpViewShell )
323 mpViewShell->MouseMove(rMEvt, this);
324 }
325
326 /*************************************************************************
327 |*
328 |* MouseButtonUp event
329 |*
330 \************************************************************************/
331
MouseButtonUp(const MouseEvent & rMEvt)332 void Window::MouseButtonUp(const MouseEvent& rMEvt)
333 {
334 mnTicks = 0;
335
336 if ( mpViewShell )
337 mpViewShell->MouseButtonUp(rMEvt, this);
338 }
339
340 /*************************************************************************
341 |*
342 |* Command event
343 |*
344 \************************************************************************/
345
Command(const CommandEvent & rCEvt)346 void Window::Command(const CommandEvent& rCEvt)
347 {
348 if ( mpViewShell )
349 mpViewShell->Command(rCEvt, this);
350 }
351
Notify(NotifyEvent & rNEvt)352 long Window::Notify( NotifyEvent& rNEvt )
353 {
354 long nResult = sal_False;
355 if ( mpViewShell )
356 {
357 nResult = mpViewShell->Notify(rNEvt, this);
358 }
359 if( !nResult )
360 nResult = ::Window::Notify( rNEvt );
361
362 return nResult;
363 }
364
365
366 /*************************************************************************
367 |*
368 |* RequestHelp event
369 |*
370 \************************************************************************/
371
RequestHelp(const HelpEvent & rEvt)372 void Window::RequestHelp(const HelpEvent& rEvt)
373 {
374 if ( mpViewShell )
375 {
376 if( !mpViewShell->RequestHelp( rEvt, this) )
377 ::Window::RequestHelp( rEvt );
378 }
379 else
380 ::Window::RequestHelp( rEvt );
381 }
382
383
384
385
GetWinViewPos(void) const386 Point Window::GetWinViewPos (void) const
387 {
388 return maWinPos;
389 }
390
391
392
393
GetViewOrigin(void) const394 Point Window::GetViewOrigin (void) const
395 {
396 return maViewOrigin;
397 }
398
399
400
401
GetViewSize(void) const402 Size Window::GetViewSize (void) const
403 {
404 return maViewSize;
405 }
406
407
408
409
410 /*************************************************************************
411 |*
412 |* Position der linken oberen Ecke des im Fenster sichtbaren Bereichs
413 |* setzen
414 |*
415 \************************************************************************/
416
SetWinViewPos(const Point & rPnt)417 void Window::SetWinViewPos(const Point& rPnt)
418 {
419 maWinPos = rPnt;
420 }
421
422 /*************************************************************************
423 |*
424 |* Ursprung der Darstellung in Bezug zur gesamten Arbeitsflaeche setzen
425 |*
426 \************************************************************************/
427
SetViewOrigin(const Point & rPnt)428 void Window::SetViewOrigin(const Point& rPnt)
429 {
430 maViewOrigin = rPnt;
431 }
432
433 /*************************************************************************
434 |*
435 |* Groesse der gesamten Arbeitsflaeche, die mit dem Fenster betrachtet
436 |* werden kann, setzen
437 |*
438 \************************************************************************/
439
SetViewSize(const Size & rSize)440 void Window::SetViewSize(const Size& rSize)
441 {
442 maViewSize = rSize;
443 CalcMinZoom();
444 }
445
446
447
448
SetCenterAllowed(bool bIsAllowed)449 void Window::SetCenterAllowed (bool bIsAllowed)
450 {
451 mbCenterAllowed = bIsAllowed;
452 }
453
454
455
456
SetZoomFactor(long nZoom)457 long Window::SetZoomFactor(long nZoom)
458 {
459 // Clip the zoom factor to the valid range marked by nMinZoom as
460 // calculated by CalcMinZoom() and the constant MAX_ZOOM.
461 if ( nZoom > MAX_ZOOM )
462 nZoom = MAX_ZOOM;
463 if ( nZoom < (long) mnMinZoom )
464 nZoom = mnMinZoom;
465
466 // Set the zoom factor at the window's map mode.
467 MapMode aMap(GetMapMode());
468 aMap.SetScaleX(Fraction(nZoom, 100));
469 aMap.SetScaleY(Fraction(nZoom, 100));
470 SetMapMode(aMap);
471
472 // Update the map mode's origin (to what effect?).
473 UpdateMapOrigin();
474
475 // Update the view's snapping to the the new zoom factor.
476 if ( mpViewShell && mpViewShell->ISA(DrawViewShell) )
477 ((DrawViewShell*) mpViewShell)->GetView()->
478 RecalcLogicSnapMagnetic(*this);
479
480 // Return the zoom factor just in case it has been changed above to lie
481 // inside the valid range.
482 return nZoom;
483 }
484
SetZoomIntegral(long nZoom)485 void Window::SetZoomIntegral(long nZoom)
486 {
487 // Clip the zoom factor to the valid range marked by nMinZoom as
488 // previously calculated by <member>CalcMinZoom()</member> and the
489 // MAX_ZOOM constant.
490 if ( nZoom > MAX_ZOOM )
491 nZoom = MAX_ZOOM;
492 if ( nZoom < (long) mnMinZoom )
493 nZoom = mnMinZoom;
494
495 // Calculate the window's new origin.
496 Size aSize = PixelToLogic(GetOutputSizePixel());
497 long nW = aSize.Width() * GetZoom() / nZoom;
498 long nH = aSize.Height() * GetZoom() / nZoom;
499 maWinPos.X() += (aSize.Width() - nW) / 2;
500 maWinPos.Y() += (aSize.Height() - nH) / 2;
501 if ( maWinPos.X() < 0 ) maWinPos.X() = 0;
502 if ( maWinPos.Y() < 0 ) maWinPos.Y() = 0;
503
504 // Finally update this window's map mode to the given zoom factor that
505 // has been clipped to the valid range.
506 SetZoomFactor(nZoom);
507 }
508
GetZoomForRect(const Rectangle & rZoomRect)509 long Window::GetZoomForRect( const Rectangle& rZoomRect )
510 {
511 long nRetZoom = 100;
512
513 if( (rZoomRect.GetWidth() != 0) && (rZoomRect.GetHeight() != 0))
514 {
515 // Calculate the scale factors which will lead to the given
516 // rectangle being fully visible (when translated accordingly) as
517 // large as possible in the output area independently in both
518 // coordinate directions .
519 sal_uLong nX(0L);
520 sal_uLong nY(0L);
521
522 const Size aWinSize( PixelToLogic(GetOutputSizePixel()) );
523 if(rZoomRect.GetHeight())
524 {
525 nX = (sal_uLong) ((double) aWinSize.Height()
526 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetHeight());
527 }
528
529 if(rZoomRect.GetWidth())
530 {
531 nY = (sal_uLong) ((double) aWinSize.Width()
532 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetWidth());
533 }
534
535 // Use the smaller one of both so that the zoom rectangle will be
536 // fully visible with respect to both coordinate directions.
537 sal_uLong nFact = Min(nX, nY);
538
539 // Transform the current zoom factor so that it leads to the desired
540 // scaling.
541 nRetZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR;
542
543 // Calculate the new origin.
544 if ( nFact == 0 )
545 {
546 // Don't change anything if the scale factor is degenrate.
547 nRetZoom = GetZoom();
548 }
549 else
550 {
551 // Clip the zoom factor to the valid range marked by nMinZoom as
552 // previously calculated by <member>CalcMinZoom()</member> and the
553 // MAX_ZOOM constant.
554 if ( nRetZoom > MAX_ZOOM )
555 nRetZoom = MAX_ZOOM;
556 if ( nRetZoom < (long) mnMinZoom )
557 nRetZoom = mnMinZoom;
558 }
559 }
560
561 return nRetZoom;
562 }
563
564 /** Recalculate the zoom factor and translation so that the given rectangle
565 is displayed centered and as large as possible while still being fully
566 visible in the window.
567 */
SetZoomRect(const Rectangle & rZoomRect)568 long Window::SetZoomRect (const Rectangle& rZoomRect)
569 {
570 long nNewZoom = 100;
571
572 if (rZoomRect.GetWidth() == 0 || rZoomRect.GetHeight() == 0)
573 {
574 // The given rectangle is degenerate. Use the default zoom factor
575 // (above) of 100%.
576 SetZoomIntegral(nNewZoom);
577 }
578 else
579 {
580 Point aPos = rZoomRect.TopLeft();
581 // Transform the output area from pixel coordinates into logical
582 // coordinates.
583 Size aWinSize = PixelToLogic(GetOutputSizePixel());
584 // Paranoia! The degenerate case of zero width or height has been
585 // taken care of above.
586 DBG_ASSERT(rZoomRect.GetWidth(), "ZoomRect-Breite = 0!");
587 DBG_ASSERT(rZoomRect.GetHeight(), "ZoomRect-Hoehe = 0!");
588
589 // Calculate the scale factors which will lead to the given
590 // rectangle being fully visible (when translated accordingly) as
591 // large as possible in the output area independently in both
592 // coordinate directions .
593 sal_uLong nX(0L);
594 sal_uLong nY(0L);
595
596 if(rZoomRect.GetHeight())
597 {
598 nX = (sal_uLong) ((double) aWinSize.Height()
599 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetHeight());
600 }
601
602 if(rZoomRect.GetWidth())
603 {
604 nY = (sal_uLong) ((double) aWinSize.Width()
605 * (double) ZOOM_MULTIPLICATOR / (double) rZoomRect.GetWidth());
606 }
607
608 // Use the smaller one of both so that the zoom rectangle will be
609 // fully visible with respect to both coordinate directions.
610 sal_uLong nFact = Min(nX, nY);
611
612 // Transform the current zoom factor so that it leads to the desired
613 // scaling.
614 long nZoom = nFact * GetZoom() / ZOOM_MULTIPLICATOR;
615
616 // Calculate the new origin.
617 if ( nFact == 0 )
618 {
619 // Don't change anything if the scale factor is degenrate.
620 nNewZoom = GetZoom();
621 }
622 else
623 {
624 // Calculate the new window position that centers the given
625 // rectangle on the screen.
626 if ( nZoom > MAX_ZOOM )
627 nFact = nFact * MAX_ZOOM / nZoom;
628
629 maWinPos = maViewOrigin + aPos;
630
631 aWinSize.Width() = (long) ((double) aWinSize.Width() * (double) ZOOM_MULTIPLICATOR / (double) nFact);
632 maWinPos.X() += (rZoomRect.GetWidth() - aWinSize.Width()) / 2;
633 aWinSize.Height() = (long) ((double) aWinSize.Height() * (double) ZOOM_MULTIPLICATOR / (double) nFact);
634 maWinPos.Y() += (rZoomRect.GetHeight() - aWinSize.Height()) / 2;
635
636 if ( maWinPos.X() < 0 ) maWinPos.X() = 0;
637 if ( maWinPos.Y() < 0 ) maWinPos.Y() = 0;
638
639 // Adapt the window's map mode to the new zoom factor.
640 nNewZoom = SetZoomFactor(nZoom);
641 }
642 }
643
644 return(nNewZoom);
645 }
646
647
648
649
SetMinZoomAutoCalc(bool bAuto)650 void Window::SetMinZoomAutoCalc (bool bAuto)
651 {
652 mbMinZoomAutoCalc = bAuto;
653 }
654
655
656
657
658 /*************************************************************************
659 |*
660 |* Neuen MapMode-Origin berechnen und setzen; wenn aWinPos.X()/Y()
661 |* gleich -1 ist, wird die entsprechende Position zentriert
662 |* (z.B. fuer Initialisierung)
663 |*
664 \************************************************************************/
665
UpdateMapOrigin(sal_Bool bInvalidate)666 void Window::UpdateMapOrigin(sal_Bool bInvalidate)
667 {
668 sal_Bool bChanged = sal_False;
669 Size aWinSize = PixelToLogic(GetOutputSizePixel());
670
671 if ( mbCenterAllowed )
672 {
673 if ( maWinPos.X() > maViewSize.Width() - aWinSize.Width() )
674 {
675 maWinPos.X() = maViewSize.Width() - aWinSize.Width();
676 bChanged = sal_True;
677 }
678 if ( maWinPos.Y() > maViewSize.Height() - aWinSize.Height() )
679 {
680 maWinPos.Y() = maViewSize.Height() - aWinSize.Height();
681 bChanged = sal_True;
682 }
683 if ( aWinSize.Width() > maViewSize.Width() || maWinPos.X() < 0 )
684 {
685 maWinPos.X() = maViewSize.Width() / 2 - aWinSize.Width() / 2;
686 bChanged = sal_True;
687 }
688 if ( aWinSize.Height() > maViewSize.Height() || maWinPos.Y() < 0 )
689 {
690 maWinPos.Y() = maViewSize.Height() / 2 - aWinSize.Height() / 2;
691 bChanged = sal_True;
692 }
693 }
694
695 UpdateMapMode ();
696
697 if (bChanged && bInvalidate)
698 Invalidate();
699 }
700
701
702
703
UpdateMapMode(void)704 void Window::UpdateMapMode (void)
705 {
706 Size aWinSize = PixelToLogic(GetOutputSizePixel());
707 maWinPos -= maViewOrigin;
708 Size aPix(maWinPos.X(), maWinPos.Y());
709 aPix = LogicToPixel(aPix);
710 // Groesse muss vielfaches von BRUSH_SIZE sein, damit Muster
711 // richtig dargestellt werden
712 // #i2237#
713 // removed old stuff here which still forced zoom to be
714 // %BRUSH_SIZE which is outdated now
715
716 if (mpViewShell && mpViewShell->ISA(DrawViewShell))
717 {
718 Size aViewSizePixel = LogicToPixel(maViewSize);
719 Size aWinSizePixel = LogicToPixel(aWinSize);
720
721 // Seite soll nicht am Fensterrand "kleben"
722 if (aPix.Width() == 0)
723 {
724 // #i2237#
725 // Since BRUSH_SIZE alignment is outdated now, i use the
726 // former constant here directly
727 aPix.Width() -= 8;
728 }
729 if (aPix.Height() == 0)
730 {
731 // #i2237#
732 // Since BRUSH_SIZE alignment is outdated now, i use the
733 // former constant here directly
734 aPix.Height() -= 8;
735 }
736 }
737
738 aPix = PixelToLogic(aPix);
739 maWinPos.X() = aPix.Width();
740 maWinPos.Y() = aPix.Height();
741 Point aNewOrigin (-maWinPos.X(), -maWinPos.Y());
742 maWinPos += maViewOrigin;
743
744 MapMode aMap(GetMapMode());
745 aMap.SetOrigin(aNewOrigin);
746 SetMapMode(aMap);
747 }
748
749
750
751
752 /*************************************************************************
753 |*
754 |* X-Position des sichtbaren Bereichs als Bruchteil (< 1)
755 |* der gesamten Arbeitsbereichbreite zuruegeben
756 |*
757 \************************************************************************/
758
GetVisibleX()759 double Window::GetVisibleX()
760 {
761 return ((double) maWinPos.X() / maViewSize.Width());
762 }
763
764 /*************************************************************************
765 |*
766 |* Y-Position des sichtbaren Bereichs als Bruchteil (< 1)
767 |* der gesamten Arbeitsbereichhoehe zuruegeben
768 |*
769 \************************************************************************/
770
GetVisibleY()771 double Window::GetVisibleY()
772 {
773 return ((double) maWinPos.Y() / maViewSize.Height());
774 }
775
776 /*************************************************************************
777 |*
778 |* X- und Y-Position des sichtbaren Bereichs als Bruchteile (< 1)
779 |* der gesamten Arbeitsbereichgroesse setzen
780 |* negative Werte werden ignoriert
781 |*
782 \************************************************************************/
783
SetVisibleXY(double fX,double fY)784 void Window::SetVisibleXY(double fX, double fY)
785 {
786 long nOldX = maWinPos.X();
787 long nOldY = maWinPos.Y();
788
789 if ( fX >= 0 )
790 maWinPos.X() = (long) (fX * maViewSize.Width());
791 if ( fY >= 0 )
792 maWinPos.Y() = (long) (fY * maViewSize.Height());
793 UpdateMapOrigin(sal_False);
794 // Size sz(nOldX - aWinPos.X(), nOldY - aWinPos.Y());
795 // sz = LogicToPixel(sz);
796 Scroll(nOldX - maWinPos.X(), nOldY - maWinPos.Y(), SCROLL_CHILDREN);
797 Update();
798 }
799
800 /*************************************************************************
801 |*
802 |* Breite des sichtbaren Bereichs im Verhaeltnis zur
803 |* gesamten Arbeitsbereichbreite zuruegeben
804 |*
805 \************************************************************************/
806
GetVisibleWidth()807 double Window::GetVisibleWidth()
808 {
809 Size aWinSize = PixelToLogic(GetOutputSizePixel());
810 if ( aWinSize.Width() > maViewSize.Width() )
811 aWinSize.Width() = maViewSize.Width();
812 return ((double) aWinSize.Width() / maViewSize.Width());
813 }
814
815 /*************************************************************************
816 |*
817 |* Hoehe des sichtbaren Bereichs im Verhaeltnis zur
818 |* gesamten Arbeitsbereichhoehe zuruegeben
819 |*
820 \************************************************************************/
821
GetVisibleHeight()822 double Window::GetVisibleHeight()
823 {
824 Size aWinSize = PixelToLogic(GetOutputSizePixel());
825 if ( aWinSize.Height() > maViewSize.Height() )
826 aWinSize.Height() = maViewSize.Height();
827 return ((double) aWinSize.Height() / maViewSize.Height());
828 }
829
830 /*************************************************************************
831 |*
832 |* Breite einer Scrollspalte im Verhaeltnis zur gesamten
833 |* Arbeitsbereichbreite zuruegeben
834 |*
835 \************************************************************************/
836
GetScrlLineWidth()837 double Window::GetScrlLineWidth()
838 {
839 return (GetVisibleWidth() * SCROLL_LINE_FACT);
840 }
841
842 /*************************************************************************
843 |*
844 |* Breite einer Scrollspalte im Verhaeltnis zur gesamten
845 |* Arbeitsbereichhoehe zuruegeben
846 |*
847 \************************************************************************/
848
GetScrlLineHeight()849 double Window::GetScrlLineHeight()
850 {
851 return (GetVisibleHeight() * SCROLL_LINE_FACT);
852 }
853
854 /*************************************************************************
855 |*
856 |* Breite einer Scrollpage im Verhaeltnis zur gesamten
857 |* Arbeitsbereichbreite zuruegeben
858 |*
859 \************************************************************************/
860
GetScrlPageWidth()861 double Window::GetScrlPageWidth()
862 {
863 return (GetVisibleWidth() * SCROLL_PAGE_FACT);
864 }
865
866 /*************************************************************************
867 |*
868 |* Breite einer Scrollpage im Verhaeltnis zur gesamten
869 |* Arbeitsbereichhoehe zuruegeben
870 |*
871 \************************************************************************/
872
GetScrlPageHeight()873 double Window::GetScrlPageHeight()
874 {
875 return (GetVisibleHeight() * SCROLL_PAGE_FACT);
876 }
877
878 /*************************************************************************
879 |*
880 |* Fenster deaktivieren
881 |*
882 \************************************************************************/
883
LoseFocus()884 void Window::LoseFocus()
885 {
886 mnTicks = 0;
887 ::Window::LoseFocus ();
888 }
889
890 /*************************************************************************
891 |*
892 |* Fenster aktivieren
893 |*
894 \************************************************************************/
895
GrabFocus()896 void Window::GrabFocus()
897 {
898 mnTicks = 0;
899 ::Window::GrabFocus ();
900 }
901
902
903 /*************************************************************************
904 |*
905 |* DataChanged
906 |*
907 \************************************************************************/
908
DataChanged(const DataChangedEvent & rDCEvt)909 void Window::DataChanged( const DataChangedEvent& rDCEvt )
910 {
911 ::Window::DataChanged( rDCEvt );
912
913 // PRINTER bei allen Dokumenten weglassen, die keinen Printer benutzen.
914 // FONTS und FONTSUBSTITUTION weglassen, wenn keine Textausgaben
915 // vorhanden sind, bzw. wenn das Dokument keinen Text zulaesst.
916
917 if ( (rDCEvt.GetType() == DATACHANGED_PRINTER) ||
918 (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
919 (rDCEvt.GetType() == DATACHANGED_FONTS) ||
920 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
921 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
922 (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
923 {
924 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
925 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
926 {
927 // When the screen zoom factor has changed then reset the zoom
928 // factor of the frame to allways display the whole page.
929 const AllSettings* pOldSettings = rDCEvt.GetOldSettings ();
930 const AllSettings& rNewSettings = GetSettings ();
931 if (pOldSettings)
932 if (pOldSettings->GetStyleSettings().GetScreenZoom()
933 != rNewSettings.GetStyleSettings().GetScreenZoom())
934 mpViewShell->GetViewFrame()->GetDispatcher()->
935 Execute(SID_SIZE_PAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
936
937 // ScrollBars neu anordnen bzw. Resize ausloesen, da sich
938 // ScrollBar-Groesse geaendert haben kann. Dazu muss dann im
939 // Resize-Handler aber auch die Groesse der ScrollBars aus
940 // den Settings abgefragt werden.
941 Resize();
942
943 // Daten neu Setzen, die aus den Systemeinstellungen bzw. aus
944 // den Settings uebernommen werden. Evtl. weitere Daten neu
945 // berechnen, da sich auch die Aufloesung hierdurch geaendert
946 // haben kann.
947 if( mpViewShell )
948 {
949 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
950 SvtAccessibilityOptions aAccOptions;
951 sal_uLong nOutputMode;
952 sal_uInt16 nPreviewSlot;
953
954 if( rStyleSettings.GetHighContrastMode() )
955 nOutputMode = ViewShell::OUTPUT_DRAWMODE_CONTRAST;
956 else
957 nOutputMode = ViewShell::OUTPUT_DRAWMODE_COLOR;
958
959 if( rStyleSettings.GetHighContrastMode() && aAccOptions.GetIsForPagePreviews() )
960 nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST;
961 else
962 nPreviewSlot = SID_PREVIEW_QUALITY_COLOR;
963
964 if( mpViewShell->ISA( DrawViewShell ) )
965 {
966 SetDrawMode( nOutputMode );
967 mpViewShell->GetFrameView()->SetDrawMode( nOutputMode );
968 // #110094#-7
969 // mpViewShell->GetView()->ReleaseMasterPagePaintCache();
970 Invalidate();
971 }
972
973 // #103100# Overwrite window color for OutlineView
974 if( mpViewShell->ISA(OutlineViewShell ) )
975 {
976 svtools::ColorConfig aColorConfig;
977 const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor );
978 SetBackground( Wallpaper( aDocColor ) );
979 }
980
981 SfxRequest aReq( nPreviewSlot, 0, mpViewShell->GetDocSh()->GetDoc()->GetItemPool() );
982 mpViewShell->ExecReq( aReq );
983 mpViewShell->Invalidate();
984 mpViewShell->ArrangeGUIElements();
985
986 // #101928# re-create handles to show new outfit
987 if(mpViewShell->ISA(DrawViewShell))
988 {
989 mpViewShell->GetView()->AdjustMarkHdl();
990 }
991 }
992 }
993
994 if ( (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
995 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
996 (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
997 {
998 // Virtuelle Device die auch von der Aufloesung oder von
999 // Systemeinstellungen abhaengen, sollten geupdatet werden.
1000 // Ansonsten sollte zumindest bei DATACHANGED_DISPLAY
1001 // die virtuellen Devices geupdatet werden, da es einige
1002 // Systeme erlauben die Aufloesung und Farbtiefe waehrend
1003 // der Laufzeit zu aendern oder eben bei Palettenaenderungen
1004 // die virtuellen Device geupdatet werden muessen, da bei
1005 // Ausgaben ein anderes Farbmatching stattfinden kann.
1006 }
1007
1008 if ( rDCEvt.GetType() == DATACHANGED_FONTS )
1009 {
1010 // Wenn das Dokument Font-AuswahlBoxen anbietet, muessen
1011 // diese geupdatet werden. Wie dies genau aussehen muss,
1012 // weiss ich leider auch nicht. Aber evtl. kann man das
1013 // ja global handeln. Dies muessten wir evtl. mal
1014 // mit PB absprechen, aber der ist derzeit leider Krank.
1015 // Also bevor dies hier gehandelt wird, vorher mit
1016 // PB und mir absprechen.
1017 }
1018
1019 if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
1020 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) )
1021 {
1022 // Formatierung neu durchfuehren, da Fonts die im Dokument
1023 // vorkommen, nicht mehr vorhanden sein muessen oder
1024 // jetzt vorhanden sind oder durch andere ersetzt wurden
1025 // sind.
1026 if( mpViewShell )
1027 {
1028 DrawDocShell* pDocSh = mpViewShell->GetDocSh();
1029 if( pDocSh )
1030 pDocSh->SetPrinter( pDocSh->GetPrinter( sal_True ) );
1031 }
1032 }
1033
1034 if ( rDCEvt.GetType() == DATACHANGED_PRINTER )
1035 {
1036 // Wie hier die Behandlung aussehen soll, weiss ich leider
1037 // selbst noch nicht. Evtl. mal einen Printer loeschen und
1038 // schauen was gemacht werden muss. Evtl. muesste ich in
1039 // VCL dafuer noch etwas einbauen, wenn der benutze Printer
1040 // geloescht wird. Ansonsten wuerde ich hier evtl. die
1041 // Formatierung neu berechnen, wenn der aktuelle Drucker
1042 // zerstoert wurde.
1043 if( mpViewShell )
1044 {
1045 DrawDocShell* pDocSh = mpViewShell->GetDocSh();
1046 if( pDocSh )
1047 pDocSh->SetPrinter( pDocSh->GetPrinter( sal_True ) );
1048 }
1049 }
1050
1051 // Alles neu ausgeben
1052 Invalidate();
1053 }
1054 }
1055
1056
1057
1058
1059 /*************************************************************************
1060 |*
1061 |* DropTargetHelper::AcceptDrop
1062 |*
1063 \************************************************************************/
1064
AcceptDrop(const AcceptDropEvent & rEvt)1065 sal_Int8 Window::AcceptDrop( const AcceptDropEvent& rEvt )
1066 {
1067 sal_Int8 nRet = DND_ACTION_NONE;
1068
1069 if( mpViewShell && !mpViewShell->GetDocSh()->IsReadOnly() )
1070 {
1071 if( mpViewShell )
1072 nRet = mpViewShell->AcceptDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND );
1073
1074 if (mbUseDropScroll && ! mpViewShell->ISA(OutlineViewShell))
1075 DropScroll( rEvt.maPosPixel );
1076 }
1077
1078 return nRet;
1079 }
1080
1081 /*************************************************************************
1082 |*
1083 |* DropTargetHelper::ExecuteDrop
1084 |*
1085 \************************************************************************/
1086
ExecuteDrop(const ExecuteDropEvent & rEvt)1087 sal_Int8 Window::ExecuteDrop( const ExecuteDropEvent& rEvt )
1088 {
1089 sal_Int8 nRet = DND_ACTION_NONE;
1090
1091 if( mpViewShell )
1092 {
1093 nRet = mpViewShell->ExecuteDrop( rEvt, *this, this, SDRPAGE_NOTFOUND, SDRLAYER_NOTFOUND );
1094 }
1095
1096 return nRet;
1097 }
1098
1099
1100
1101
SetUseDropScroll(bool bUseDropScroll)1102 void Window::SetUseDropScroll (bool bUseDropScroll)
1103 {
1104 mbUseDropScroll = bUseDropScroll;
1105 }
1106
1107
1108
1109
1110 /*************************************************************************
1111 |*
1112 |* Scrolling bei AcceptDrop-Events
1113 |*
1114 \************************************************************************/
1115
DropScroll(const Point & rMousePos)1116 void Window::DropScroll(const Point& rMousePos)
1117 {
1118 short nDx = 0;
1119 short nDy = 0;
1120
1121 Size aSize = GetOutputSizePixel();
1122
1123 if (aSize.Width() > SCROLL_SENSITIVE * 3)
1124 {
1125 if ( rMousePos.X() < SCROLL_SENSITIVE )
1126 {
1127 nDx = -1;
1128 }
1129
1130 if ( rMousePos.X() >= aSize.Width() - SCROLL_SENSITIVE )
1131 {
1132 nDx = 1;
1133 }
1134 }
1135
1136 if (aSize.Height() > SCROLL_SENSITIVE * 3)
1137 {
1138 if ( rMousePos.Y() < SCROLL_SENSITIVE )
1139 {
1140 nDy = -1;
1141 }
1142
1143 if ( rMousePos.Y() >= aSize.Height() - SCROLL_SENSITIVE )
1144 {
1145 nDy = 1;
1146 }
1147 }
1148
1149 if ( (nDx || nDy) && (rMousePos.X()!=0 || rMousePos.Y()!=0 ) )
1150 {
1151 if (mnTicks > 20)
1152 mpViewShell->ScrollLines(nDx, nDy);
1153 else
1154 mnTicks ++;
1155 }
1156 }
1157
1158
1159
1160
1161 ::com::sun::star::uno::Reference<
1162 ::com::sun::star::accessibility::XAccessible>
CreateAccessible(void)1163 Window::CreateAccessible (void)
1164 {
1165 // If current viewshell is PresentationViewShell, just return empty because the correct ShowWin will be created later.
1166 if (mpViewShell && mpViewShell->ISA(PresentationViewShell))
1167 {
1168 return ::Window::CreateAccessible ();
1169 }
1170 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAcc = GetAccessible(sal_False);
1171 if (xAcc.get())
1172 {
1173 return xAcc;
1174 }
1175 if (mpViewShell != NULL)
1176 {
1177 xAcc = mpViewShell->CreateAccessibleDocumentView (this);
1178 SetAccessible(xAcc);
1179 return xAcc;
1180 }
1181 else
1182 {
1183 OSL_TRACE ("::sd::Window::CreateAccessible: no view shell");
1184 return ::Window::CreateAccessible ();
1185 }
1186 }
1187
1188 // MT: Removed Windows::SwitchView() introduced with IA2 CWS.
1189 // There are other notifications for this when the active view has chnaged, so please update the code to use that event mechanism
SwitchView()1190 void Window::SwitchView()
1191 {
1192 if (!Application::IsAccessibilityEnabled())
1193 {
1194 return ;
1195 }
1196 if (mpViewShell)
1197 {
1198 mpViewShell->SwitchViewFireFocus(GetAccessible(sal_False));
1199 }
1200 }
1201
GetSurroundingText() const1202 XubString Window::GetSurroundingText() const
1203 {
1204 if ( mpViewShell->GetShellType() == ViewShell::ST_OUTLINE )
1205 {
1206 return XubString();
1207 }
1208 else if ( mpViewShell->GetView()->IsTextEdit() )
1209 {
1210 OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView();
1211 return pOLV->GetEditView().GetSurroundingText();
1212 }
1213 else
1214 {
1215 return XubString();
1216 }
1217 }
1218
GetSurroundingTextSelection() const1219 Selection Window::GetSurroundingTextSelection() const
1220 {
1221 if ( mpViewShell->GetShellType() == ViewShell::ST_OUTLINE )
1222 {
1223 return Selection( 0, 0 );
1224 }
1225 else if ( mpViewShell->GetView()->IsTextEdit() )
1226 {
1227 OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView();
1228 return pOLV->GetEditView().GetSurroundingTextSelection();
1229 }
1230 else
1231 {
1232 return Selection( 0, 0 );
1233 }
1234 }
1235
1236 } // end of namespace sd
1237