Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "ChartWindow.hxx"
21 : #include "ChartController.hxx"
22 : #include "HelpIds.hrc"
23 :
24 : #include <vcl/help.hxx>
25 : #include <vcl/openglwin.hxx>
26 : #include <vcl/settings.hxx>
27 :
28 : #include <com/sun/star/chart2/X3DChartWindowProvider.hpp>
29 :
30 : using namespace ::com::sun::star;
31 :
32 : namespace
33 : {
34 0 : ::Rectangle lcl_AWTRectToVCLRect( const ::com::sun::star::awt::Rectangle & rAWTRect )
35 : {
36 0 : ::Rectangle aResult;
37 0 : aResult.setX( rAWTRect.X );
38 0 : aResult.setY( rAWTRect.Y );
39 0 : aResult.setWidth( rAWTRect.Width );
40 0 : aResult.setHeight( rAWTRect.Height );
41 0 : return aResult;
42 : }
43 : } // anonymous namespace
44 :
45 : namespace chart
46 : {
47 :
48 34 : ChartWindow::ChartWindow( ChartController* pController, vcl::Window* pParent, WinBits nStyle )
49 : : Window(pParent, nStyle)
50 : , m_pWindowController( pController )
51 : , m_bInPaint(false)
52 34 : , m_pOpenGLWindow(new OpenGLWindow(this))
53 : {
54 34 : this->SetHelpId( HID_SCH_WIN_DOCUMENT );
55 34 : this->SetMapMode( MapMode(MAP_100TH_MM) );
56 34 : adjustHighContrastMode();
57 : // chart does not depend on exact pixel painting => enable antialiased drawing
58 34 : SetAntialiasing( ANTIALIASING_ENABLE_B2DDRAW | GetAntialiasing() );
59 34 : EnableRTL( false );
60 34 : if( pParent )
61 34 : pParent->EnableRTL( false );// #i96215# necessary for a correct position of the context menu in rtl mode
62 :
63 34 : if( m_pOpenGLWindow )
64 : {
65 34 : m_pOpenGLWindow->Show();
66 34 : uno::Reference< chart2::X3DChartWindowProvider > x3DWindowProvider(pController->getModel(), uno::UNO_QUERY_THROW);
67 34 : sal_uInt64 nWindowPtr = reinterpret_cast<sal_uInt64>(m_pOpenGLWindow);
68 34 : x3DWindowProvider->setWindow(nWindowPtr);
69 34 : x3DWindowProvider->update();
70 : }
71 34 : }
72 :
73 102 : ChartWindow::~ChartWindow()
74 : {
75 34 : if (m_pWindowController && m_pWindowController->getModel().is())
76 : {
77 0 : uno::Reference< chart2::X3DChartWindowProvider > x3DWindowProvider(m_pWindowController->getModel(), uno::UNO_QUERY_THROW);
78 0 : x3DWindowProvider->setWindow(0);
79 0 : x3DWindowProvider->update();
80 : }
81 34 : delete m_pOpenGLWindow;
82 68 : }
83 :
84 2 : void ChartWindow::clear()
85 : {
86 2 : m_pWindowController=0;
87 2 : this->ReleaseMouse();
88 2 : }
89 :
90 278 : void ChartWindow::PrePaint()
91 : {
92 : // forward VCLs PrePaint window event to DrawingLayer
93 278 : if( m_pWindowController )
94 : {
95 278 : m_pWindowController->PrePaint();
96 : }
97 278 : }
98 :
99 268 : void ChartWindow::Paint( const Rectangle& rRect )
100 : {
101 268 : m_bInPaint = true;
102 268 : if (m_pOpenGLWindow && m_pOpenGLWindow->IsVisible())
103 : {
104 0 : m_pOpenGLWindow->Paint(rRect);
105 : }
106 268 : else if (m_pWindowController)
107 : {
108 268 : m_pWindowController->execute_Paint(rRect);
109 : }
110 : else
111 : {
112 0 : Window::Paint( rRect );
113 : }
114 268 : m_bInPaint = false;
115 268 : }
116 :
117 0 : void ChartWindow::MouseButtonDown(const MouseEvent& rMEvt)
118 : {
119 0 : if( m_pWindowController )
120 0 : m_pWindowController->execute_MouseButtonDown(rMEvt);
121 : else
122 0 : Window::MouseButtonDown(rMEvt);
123 0 : }
124 :
125 0 : void ChartWindow::MouseMove( const MouseEvent& rMEvt )
126 : {
127 0 : if( m_pWindowController )
128 0 : m_pWindowController->execute_MouseMove( rMEvt );
129 : else
130 0 : Window::MouseMove( rMEvt );
131 0 : }
132 :
133 0 : void ChartWindow::Tracking( const TrackingEvent& rTEvt )
134 : {
135 0 : if( m_pWindowController )
136 0 : m_pWindowController->execute_Tracking( rTEvt );
137 : else
138 0 : Window::Tracking( rTEvt );
139 0 : }
140 :
141 0 : void ChartWindow::MouseButtonUp( const MouseEvent& rMEvt )
142 : {
143 0 : if( m_pWindowController )
144 0 : m_pWindowController->execute_MouseButtonUp( rMEvt );
145 : else
146 0 : Window::MouseButtonUp( rMEvt );
147 0 : }
148 :
149 68 : void ChartWindow::Resize()
150 : {
151 68 : if( m_pWindowController )
152 68 : m_pWindowController->execute_Resize();
153 : else
154 0 : Window::Resize();
155 :
156 68 : if( m_pOpenGLWindow )
157 68 : m_pOpenGLWindow->SetSizePixel(GetSizePixel());
158 68 : }
159 :
160 0 : void ChartWindow::Activate()
161 : {
162 0 : if( m_pWindowController )
163 0 : m_pWindowController->execute_Activate();
164 : else
165 0 : Window::Activate();
166 0 : }
167 0 : void ChartWindow::Deactivate()
168 : {
169 0 : if( m_pWindowController )
170 0 : m_pWindowController->execute_Deactivate();
171 : else
172 0 : Window::Deactivate();
173 0 : }
174 34 : void ChartWindow::GetFocus()
175 : {
176 34 : if( m_pWindowController )
177 34 : m_pWindowController->execute_GetFocus();
178 : else
179 0 : Window::GetFocus();
180 34 : }
181 9 : void ChartWindow::LoseFocus()
182 : {
183 9 : if( m_pWindowController )
184 9 : m_pWindowController->execute_LoseFocus();
185 : else
186 0 : Window::LoseFocus();
187 9 : }
188 :
189 0 : void ChartWindow::Command( const CommandEvent& rCEvt )
190 : {
191 0 : if( m_pWindowController )
192 0 : m_pWindowController->execute_Command( rCEvt );
193 : else
194 0 : Window::Command( rCEvt );
195 0 : }
196 :
197 0 : void ChartWindow::KeyInput( const KeyEvent& rKEvt )
198 : {
199 0 : if( m_pWindowController )
200 : {
201 0 : if( !m_pWindowController->execute_KeyInput(rKEvt) )
202 0 : Window::KeyInput(rKEvt);
203 : }
204 : else
205 0 : Window::KeyInput( rKEvt );
206 0 : }
207 :
208 0 : uno::Reference< css::accessibility::XAccessible > ChartWindow::CreateAccessible()
209 : {
210 0 : if( m_pWindowController )
211 0 : return m_pWindowController->CreateAccessible();
212 : else
213 0 : return Window::CreateAccessible();
214 : }
215 :
216 0 : void ChartWindow::DataChanged( const DataChangedEvent& rDCEvt )
217 : {
218 0 : vcl::Window::DataChanged( rDCEvt );
219 :
220 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
221 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
222 : {
223 0 : adjustHighContrastMode();
224 : }
225 0 : }
226 :
227 0 : void ChartWindow::RequestHelp( const HelpEvent& rHEvt )
228 : {
229 0 : bool bHelpHandled = false;
230 0 : if( ( rHEvt.GetMode() & HELPMODE_QUICK ) &&
231 : m_pWindowController )
232 : {
233 : // Point aLogicHitPos = PixelToLogic( rHEvt.GetMousePosPixel()); // old chart: GetPointerPosPixel()
234 0 : Point aLogicHitPos = PixelToLogic( GetPointerPosPixel());
235 0 : OUString aQuickHelpText;
236 0 : awt::Rectangle aHelpRect;
237 0 : bool bIsBalloonHelp( Help::IsBalloonHelpEnabled() );
238 0 : bHelpHandled = m_pWindowController->requestQuickHelp( aLogicHitPos, bIsBalloonHelp, aQuickHelpText, aHelpRect );
239 :
240 0 : if( bHelpHandled )
241 : {
242 0 : if( bIsBalloonHelp )
243 : Help::ShowBalloon(
244 0 : this, rHEvt.GetMousePosPixel(), lcl_AWTRectToVCLRect( aHelpRect ), aQuickHelpText );
245 : else
246 : Help::ShowQuickHelp(
247 0 : this, lcl_AWTRectToVCLRect( aHelpRect ), aQuickHelpText );
248 0 : }
249 : }
250 :
251 0 : if( !bHelpHandled )
252 0 : vcl::Window::RequestHelp( rHEvt );
253 0 : }
254 :
255 34 : void ChartWindow::adjustHighContrastMode()
256 : {
257 : static const sal_Int32 nContrastMode =
258 : DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL |
259 : DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT;
260 :
261 34 : bool bUseContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
262 34 : SetDrawMode( bUseContrast ? nContrastMode : DRAWMODE_DEFAULT );
263 34 : }
264 :
265 1647 : void ChartWindow::ForceInvalidate()
266 : {
267 1647 : vcl::Window::Invalidate();
268 1647 : if(m_pOpenGLWindow)
269 : {
270 1647 : m_pOpenGLWindow->Invalidate();
271 : }
272 1647 : }
273 357 : void ChartWindow::Invalidate( sal_uInt16 nFlags )
274 : {
275 357 : if( m_bInPaint ) // #i101928# superfluous paint calls while entering and editing charts"
276 588 : return;
277 126 : vcl::Window::Invalidate( nFlags );
278 126 : if(m_pOpenGLWindow)
279 : {
280 126 : m_pOpenGLWindow->Invalidate( nFlags );
281 : }
282 : }
283 452 : void ChartWindow::Invalidate( const Rectangle& rRect, sal_uInt16 nFlags )
284 : {
285 452 : if( m_bInPaint ) // #i101928# superfluous paint calls while entering and editing charts"
286 860 : return;
287 44 : vcl::Window::Invalidate( rRect, nFlags );
288 44 : if(m_pOpenGLWindow)
289 : {
290 44 : m_pOpenGLWindow->Invalidate( rRect, nFlags );
291 : }
292 : }
293 0 : void ChartWindow::Invalidate( const vcl::Region& rRegion, sal_uInt16 nFlags )
294 : {
295 0 : if( m_bInPaint ) // #i101928# superfluous paint calls while entering and editing charts"
296 0 : return;
297 0 : vcl::Window::Invalidate( rRegion, nFlags );
298 0 : if(m_pOpenGLWindow)
299 : {
300 0 : m_pOpenGLWindow->Invalidate( rRegion, nFlags );
301 : }
302 : }
303 :
304 102 : } //namespace chart
305 :
306 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|