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_sdext.hxx"
26
27 #include "PresenterPaintManager.hxx"
28
29 #include "PresenterPaneContainer.hxx"
30 #include <com/sun/star/awt/InvalidateStyle.hpp>
31 #include <com/sun/star/awt/XWindowPeer.hpp>
32 #include <boost/bind.hpp>
33
34 using namespace ::com::sun::star;
35 using namespace ::com::sun::star::uno;
36
37 namespace sdext { namespace presenter {
38
PresenterPaintManager(const css::uno::Reference<css::awt::XWindow> & rxParentWindow,const css::uno::Reference<css::drawing::XPresenterHelper> & rxPresenterHelper,const rtl::Reference<PresenterPaneContainer> & rpPaneContainer)39 PresenterPaintManager::PresenterPaintManager (
40 const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
41 const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper,
42 const rtl::Reference<PresenterPaneContainer>& rpPaneContainer)
43 : mxParentWindow(rxParentWindow),
44 mxParentWindowPeer(rxParentWindow, UNO_QUERY),
45 mxPresenterHelper(rxPresenterHelper),
46 mpPaneContainer(rpPaneContainer)
47 {
48 }
49
50
51
52
53 ::boost::function<void(const css::awt::Rectangle& rRepaintBox)>
GetInvalidator(const css::uno::Reference<css::awt::XWindow> & rxWindow,const bool bSynchronous)54 PresenterPaintManager::GetInvalidator (
55 const css::uno::Reference<css::awt::XWindow>& rxWindow,
56 const bool bSynchronous)
57 {
58 return ::boost::bind(
59 static_cast<void (PresenterPaintManager::*)(
60 const css::uno::Reference<css::awt::XWindow>&,
61 const css::awt::Rectangle&,
62 const bool)>(&PresenterPaintManager::Invalidate),
63 this,
64 rxWindow,
65 _1,
66 bSynchronous);
67 }
68
69
70
71
Invalidate(const css::uno::Reference<css::awt::XWindow> & rxWindow,const bool bSynchronous)72 void PresenterPaintManager::Invalidate (
73 const css::uno::Reference<css::awt::XWindow>& rxWindow,
74 const bool bSynchronous)
75 {
76 sal_Int16 nInvalidateMode (awt::InvalidateStyle::CHILDREN);
77 if (bSynchronous)
78 nInvalidateMode |= awt::InvalidateStyle::UPDATE;
79
80 PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
81 mpPaneContainer->FindContentWindow(rxWindow));
82 if (pDescriptor.get()==NULL || ! pDescriptor->mbIsOpaque)
83 nInvalidateMode |= awt::InvalidateStyle::TRANSPARENT;
84 else
85 nInvalidateMode |= awt::InvalidateStyle::NOTRANSPARENT;
86
87 Invalidate(rxWindow, nInvalidateMode);
88 }
89
90
91
92
Invalidate(const css::uno::Reference<css::awt::XWindow> & rxWindow,const sal_Int16 nInvalidateFlags)93 void PresenterPaintManager::Invalidate (
94 const css::uno::Reference<css::awt::XWindow>& rxWindow,
95 const sal_Int16 nInvalidateFlags)
96 {
97 if ((nInvalidateFlags & awt::InvalidateStyle::TRANSPARENT) != 0)
98 {
99 // Window is transparent and parent window(s) have to be painted as
100 // well. Invalidate the parent explicitly.
101 if (mxPresenterHelper.is() && mxParentWindowPeer.is())
102 {
103 const awt::Rectangle aBBox (
104 mxPresenterHelper->getWindowExtentsRelative(rxWindow, mxParentWindow));
105 mxParentWindowPeer->invalidateRect(aBBox, nInvalidateFlags);
106 }
107 }
108 else
109 {
110 Reference<awt::XWindowPeer> xPeer (rxWindow, UNO_QUERY);
111 if (xPeer.is())
112 xPeer->invalidate(nInvalidateFlags);
113 }
114 }
115
116
117
118
Invalidate(const css::uno::Reference<css::awt::XWindow> & rxWindow,const css::awt::Rectangle & rRepaintBox,const bool bSynchronous)119 void PresenterPaintManager::Invalidate (
120 const css::uno::Reference<css::awt::XWindow>& rxWindow,
121 const css::awt::Rectangle& rRepaintBox,
122 const bool bSynchronous)
123 {
124 sal_Int16 nInvalidateMode (awt::InvalidateStyle::CHILDREN);
125 if (bSynchronous)
126 nInvalidateMode |= awt::InvalidateStyle::UPDATE;
127
128 PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
129 mpPaneContainer->FindContentWindow(rxWindow));
130 if (pDescriptor.get()==NULL || ! pDescriptor->mbIsOpaque)
131 nInvalidateMode |= awt::InvalidateStyle::TRANSPARENT;
132 else
133 nInvalidateMode |= awt::InvalidateStyle::NOTRANSPARENT;
134
135 Invalidate(rxWindow, rRepaintBox, nInvalidateMode);
136 }
137
138
139
140
Invalidate(const css::uno::Reference<css::awt::XWindow> & rxWindow,const css::awt::Rectangle & rRepaintBox,const sal_Int16 nInvalidateFlags)141 void PresenterPaintManager::Invalidate (
142 const css::uno::Reference<css::awt::XWindow>& rxWindow,
143 const css::awt::Rectangle& rRepaintBox,
144 const sal_Int16 nInvalidateFlags)
145 {
146 if ((nInvalidateFlags & awt::InvalidateStyle::TRANSPARENT) != 0)
147 {
148 // Window is transparent and parent window(s) have to be painted as
149 // well. Invalidate the parent explicitly.
150 if (mxPresenterHelper.is() && mxParentWindowPeer.is())
151 {
152 const awt::Rectangle aBBox (
153 mxPresenterHelper->getWindowExtentsRelative(rxWindow, mxParentWindow));
154 mxParentWindowPeer->invalidateRect(
155 awt::Rectangle(
156 rRepaintBox.X + aBBox.X,
157 rRepaintBox.Y + aBBox.Y,
158 rRepaintBox.Width,
159 rRepaintBox.Height),
160 nInvalidateFlags);
161 }
162 }
163 else
164 {
165 Reference<awt::XWindowPeer> xPeer (rxWindow, UNO_QUERY);
166 if (xPeer.is())
167 xPeer->invalidateRect(rRepaintBox, nInvalidateFlags);
168 }
169 }
170
171 } }
172