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