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 #include "precompiled_sd.hxx"
25
26 #include "framework/ViewShellWrapper.hxx"
27 #include "framework/Pane.hxx"
28 #include "ViewShell.hxx"
29 #include "Window.hxx"
30
31 #include <com/sun/star/drawing/framework/XPane.hpp>
32 #include <com/sun/star/lang/DisposedException.hpp>
33
34 #include <rtl/uuid.h>
35 #include <toolkit/helper/vclunohelper.hxx>
36 #include <comphelper/sequence.hxx>
37 #include <cppuhelper/typeprovider.hxx>
38 #include <vcl/svapp.hxx>
39 #include <vos/mutex.hxx>
40 #include <tools/diagnose_ex.h>
41
42
43 using namespace ::com::sun::star;
44 using namespace ::com::sun::star::uno;
45 using namespace ::com::sun::star::drawing::framework;
46
47 using ::com::sun::star::awt::XWindow;
48 using ::com::sun::star::rendering::XCanvas;
49 using ::com::sun::star::lang::DisposedException;
50
51 using ::rtl::OUString;
52
53 namespace sd { namespace framework {
54
ViewShellWrapper(::boost::shared_ptr<ViewShell> pViewShell,const Reference<XResourceId> & rxViewId,const Reference<awt::XWindow> & rxWindow)55 ViewShellWrapper::ViewShellWrapper (
56 ::boost::shared_ptr<ViewShell> pViewShell,
57 const Reference<XResourceId>& rxViewId,
58 const Reference<awt::XWindow>& rxWindow)
59 : ViewShellWrapperInterfaceBase(MutexOwner::maMutex),
60 mpViewShell(pViewShell),
61 mxViewId(rxViewId),
62 mxWindow(rxWindow)
63 {
64 if (rxWindow.is())
65 {
66 rxWindow->addWindowListener(this);
67 if( bool(pViewShell) )
68 {
69 pViewShell->Resize();
70 }
71 }
72 }
73
74
75
76
~ViewShellWrapper(void)77 ViewShellWrapper::~ViewShellWrapper (void)
78 {
79 }
80
81
82
83
disposing(void)84 void SAL_CALL ViewShellWrapper::disposing (void)
85 {
86 ::osl::MutexGuard aGuard( maMutex );
87
88 OSL_TRACE("disposing ViewShellWrapper %x", this);
89 Reference<awt::XWindow> xWindow (mxWindow);
90 if (xWindow.is())
91 {
92 OSL_TRACE("removing ViewShellWrapper %x from window listener at %x", this, mxWindow.get());
93 xWindow->removeWindowListener(this);
94 }
95
96 mpViewShell.reset();
97 }
98
99
100
101
GetViewShell(void)102 ::boost::shared_ptr<ViewShell> ViewShellWrapper::GetViewShell (void)
103 {
104 return mpViewShell;
105 }
106
107
108
109
110 //----- XResource -------------------------------------------------------------
111
getResourceId(void)112 Reference<XResourceId> SAL_CALL ViewShellWrapper::getResourceId (void)
113 throw (RuntimeException)
114 {
115 return mxViewId;
116 }
117
118
119
120
isAnchorOnly(void)121 sal_Bool SAL_CALL ViewShellWrapper::isAnchorOnly (void)
122 throw (RuntimeException)
123 {
124 return false;
125 }
126
127
128
129
130 //----- XRelocatableResource --------------------------------------------------
131
relocateToAnchor(const Reference<XResource> & xResource)132 sal_Bool SAL_CALL ViewShellWrapper::relocateToAnchor (
133 const Reference<XResource>& xResource)
134 throw (RuntimeException)
135 {
136 sal_Bool bResult (false);
137
138 Reference<XPane> xPane (xResource, UNO_QUERY);
139 if (xPane.is())
140 {
141 // Detach from the window of the old pane.
142 Reference<awt::XWindow> xWindow (mxWindow);
143 if (xWindow.is())
144 xWindow->removeWindowListener(this);
145 mxWindow = NULL;
146
147 if (mpViewShell.get() != NULL)
148 {
149 ::Window* pWindow = VCLUnoHelper::GetWindow(xPane->getWindow());
150 if (pWindow != NULL && mpViewShell->RelocateToParentWindow(pWindow))
151 {
152 bResult = sal_True;
153
154 // Attach to the window of the new pane.
155 xWindow = Reference<awt::XWindow>(xPane->getWindow(), UNO_QUERY);
156 if (xWindow.is())
157 {
158 xWindow->addWindowListener(this);
159 mpViewShell->Resize();
160 }
161 }
162 }
163 }
164
165 return bResult;
166 }
167
168
169
170
171 //----- XUnoTunnel ------------------------------------------------------------
172
getUnoTunnelId(void)173 const Sequence<sal_Int8>& ViewShellWrapper::getUnoTunnelId (void)
174 {
175 static Sequence<sal_Int8>* pSequence = NULL;
176 if (pSequence == NULL)
177 {
178 const ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
179 if (pSequence == NULL)
180 {
181 static ::com::sun::star::uno::Sequence<sal_Int8> aSequence (16);
182 rtl_createUuid((sal_uInt8*)aSequence.getArray(), 0, sal_True);
183 pSequence = &aSequence;
184 }
185 }
186 return *pSequence;
187 }
188
189
190
191
getSomething(const Sequence<sal_Int8> & rId)192 sal_Int64 SAL_CALL ViewShellWrapper::getSomething (const Sequence<sal_Int8>& rId)
193 throw (RuntimeException)
194 {
195 sal_Int64 nResult = 0;
196
197 if (rId.getLength() == 16
198 && rtl_compareMemory(getUnoTunnelId().getConstArray(), rId.getConstArray(), 16) == 0)
199 {
200 nResult = reinterpret_cast<sal_Int64>(this);
201 }
202
203 return nResult;
204 }
205
206
207
208
209 //===== awt::XWindowListener ==================================================
210
windowResized(const awt::WindowEvent & rEvent)211 void SAL_CALL ViewShellWrapper::windowResized (const awt::WindowEvent& rEvent)
212 throw (RuntimeException)
213 {
214 (void)rEvent;
215 ViewShell* pViewShell (mpViewShell.get());
216 if (pViewShell != NULL)
217 pViewShell->Resize();
218 }
219
220
221
222
windowMoved(const awt::WindowEvent & rEvent)223 void SAL_CALL ViewShellWrapper::windowMoved (const awt::WindowEvent& rEvent)
224 throw (RuntimeException)
225 {
226 (void)rEvent;
227 }
228
229
230
231
windowShown(const lang::EventObject & rEvent)232 void SAL_CALL ViewShellWrapper::windowShown (const lang::EventObject& rEvent)
233 throw (RuntimeException)
234 {
235 (void)rEvent;
236 ViewShell* pViewShell (mpViewShell.get());
237 if (pViewShell != NULL)
238 pViewShell->Resize();
239 }
240
241
242
243
windowHidden(const lang::EventObject & rEvent)244 void SAL_CALL ViewShellWrapper::windowHidden (const lang::EventObject& rEvent)
245 throw (RuntimeException)
246 {
247 (void)rEvent;
248 }
249
250
251
252
253 //===== XEventListener ========================================================
254
disposing(const lang::EventObject & rEvent)255 void SAL_CALL ViewShellWrapper::disposing (const lang::EventObject& rEvent)
256 throw (RuntimeException)
257 {
258 if (rEvent.Source == mxWindow)
259 mxWindow = NULL;
260 }
261
262
263 } } // end of namespace sd::framework
264