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 17 : ChartWindow::ChartWindow( ChartController* pController, vcl::Window* pParent, WinBits nStyle )
49 : : Window(pParent, nStyle)
50 : , m_pWindowController( pController )
51 : , m_bInPaint(false)
52 17 : , m_pOpenGLWindow(VclPtr<OpenGLWindow>::Create(this))
53 : {
54 17 : this->SetHelpId( HID_SCH_WIN_DOCUMENT );
55 17 : this->SetMapMode( MapMode(MAP_100TH_MM) );
56 17 : adjustHighContrastMode();
57 : // chart does not depend on exact pixel painting => enable antialiased drawing
58 17 : SetAntialiasing( AntialiasingFlags::EnableB2dDraw | GetAntialiasing() );
59 17 : EnableRTL( false );
60 17 : if( pParent )
61 17 : pParent->EnableRTL( false );// #i96215# necessary for a correct position of the context menu in rtl mode
62 :
63 17 : if( m_pOpenGLWindow )
64 : {
65 17 : m_pOpenGLWindow->Show();
66 17 : uno::Reference< chart2::X3DChartWindowProvider > x3DWindowProvider(pController->getModel(), uno::UNO_QUERY_THROW);
67 17 : sal_uInt64 nWindowPtr = reinterpret_cast<sal_uInt64>(m_pOpenGLWindow.get());
68 17 : x3DWindowProvider->setWindow(nWindowPtr);
69 17 : x3DWindowProvider->update();
70 : }
71 17 : }
72 :
73 3 : ChartWindow::~ChartWindow()
74 : {
75 1 : disposeOnce();
76 2 : }
77 :
78 17 : void ChartWindow::dispose()
79 : {
80 17 : if (m_pWindowController && m_pWindowController->getModel().is())
81 : {
82 0 : uno::Reference< chart2::X3DChartWindowProvider > x3DWindowProvider(m_pWindowController->getModel(), uno::UNO_QUERY_THROW);
83 0 : x3DWindowProvider->setWindow(0);
84 0 : x3DWindowProvider->update();
85 : }
86 17 : m_pOpenGLWindow.disposeAndClear();
87 17 : vcl::Window::dispose();
88 17 : }
89 :
90 1 : void ChartWindow::clear()
91 : {
92 1 : m_pWindowController=0;
93 1 : this->ReleaseMouse();
94 1 : }
95 :
96 1608 : void ChartWindow::PrePaint(vcl::RenderContext& rRenderContext)
97 : {
98 : // forward VCLs PrePaint window event to DrawingLayer
99 1608 : if (m_pWindowController)
100 : {
101 1608 : m_pWindowController->PrePaint(rRenderContext);
102 : }
103 1608 : }
104 :
105 863 : void ChartWindow::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
106 : {
107 863 : m_bInPaint = true;
108 863 : if (m_pOpenGLWindow && m_pOpenGLWindow->IsVisible())
109 : {
110 0 : m_pOpenGLWindow->Paint(rRenderContext, rRect);
111 : }
112 863 : else if (m_pWindowController)
113 : {
114 863 : m_pWindowController->execute_Paint(rRenderContext, rRect);
115 : }
116 : else
117 : {
118 0 : Window::Paint(rRenderContext, rRect);
119 : }
120 863 : m_bInPaint = false;
121 863 : }
122 :
123 0 : void ChartWindow::MouseButtonDown(const MouseEvent& rMEvt)
124 : {
125 0 : if( m_pWindowController )
126 0 : m_pWindowController->execute_MouseButtonDown(rMEvt);
127 : else
128 0 : Window::MouseButtonDown(rMEvt);
129 0 : }
130 :
131 0 : void ChartWindow::MouseMove( const MouseEvent& rMEvt )
132 : {
133 0 : if( m_pWindowController )
134 0 : m_pWindowController->execute_MouseMove( rMEvt );
135 : else
136 0 : Window::MouseMove( rMEvt );
137 0 : }
138 :
139 0 : void ChartWindow::Tracking( const TrackingEvent& rTEvt )
140 : {
141 0 : if( m_pWindowController )
142 0 : m_pWindowController->execute_Tracking( rTEvt );
143 : else
144 0 : Window::Tracking( rTEvt );
145 0 : }
146 :
147 0 : void ChartWindow::MouseButtonUp( const MouseEvent& rMEvt )
148 : {
149 0 : if( m_pWindowController )
150 0 : m_pWindowController->execute_MouseButtonUp( rMEvt );
151 : else
152 0 : Window::MouseButtonUp( rMEvt );
153 0 : }
154 :
155 34 : void ChartWindow::Resize()
156 : {
157 34 : if( m_pWindowController )
158 34 : m_pWindowController->execute_Resize();
159 : else
160 0 : Window::Resize();
161 :
162 34 : if( m_pOpenGLWindow )
163 34 : m_pOpenGLWindow->SetSizePixel(GetSizePixel());
164 34 : }
165 :
166 0 : void ChartWindow::Activate()
167 : {
168 0 : if( m_pWindowController )
169 0 : m_pWindowController->execute_Activate();
170 : else
171 0 : Window::Activate();
172 0 : }
173 0 : void ChartWindow::Deactivate()
174 : {
175 0 : if( m_pWindowController )
176 0 : m_pWindowController->execute_Deactivate();
177 : else
178 0 : Window::Deactivate();
179 0 : }
180 17 : void ChartWindow::GetFocus()
181 : {
182 17 : if( m_pWindowController )
183 17 : m_pWindowController->execute_GetFocus();
184 : else
185 0 : Window::GetFocus();
186 17 : }
187 3 : void ChartWindow::LoseFocus()
188 : {
189 3 : if( m_pWindowController )
190 3 : m_pWindowController->execute_LoseFocus();
191 : else
192 0 : Window::LoseFocus();
193 3 : }
194 :
195 0 : void ChartWindow::Command( const CommandEvent& rCEvt )
196 : {
197 0 : if( m_pWindowController )
198 0 : m_pWindowController->execute_Command( rCEvt );
199 : else
200 0 : Window::Command( rCEvt );
201 0 : }
202 :
203 0 : void ChartWindow::KeyInput( const KeyEvent& rKEvt )
204 : {
205 0 : if( m_pWindowController )
206 : {
207 0 : if( !m_pWindowController->execute_KeyInput(rKEvt) )
208 0 : Window::KeyInput(rKEvt);
209 : }
210 : else
211 0 : Window::KeyInput( rKEvt );
212 0 : }
213 :
214 0 : uno::Reference< css::accessibility::XAccessible > ChartWindow::CreateAccessible()
215 : {
216 0 : if( m_pWindowController )
217 0 : return m_pWindowController->CreateAccessible();
218 : else
219 0 : return Window::CreateAccessible();
220 : }
221 :
222 0 : void ChartWindow::DataChanged( const DataChangedEvent& rDCEvt )
223 : {
224 0 : vcl::Window::DataChanged( rDCEvt );
225 :
226 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
227 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
228 : {
229 0 : adjustHighContrastMode();
230 : }
231 0 : }
232 :
233 0 : void ChartWindow::RequestHelp( const HelpEvent& rHEvt )
234 : {
235 0 : bool bHelpHandled = false;
236 0 : if( ( rHEvt.GetMode() & HelpEventMode::QUICK ) &&
237 0 : m_pWindowController )
238 : {
239 : // Point aLogicHitPos = PixelToLogic( rHEvt.GetMousePosPixel()); // old chart: GetPointerPosPixel()
240 0 : Point aLogicHitPos = PixelToLogic( GetPointerPosPixel());
241 0 : OUString aQuickHelpText;
242 0 : awt::Rectangle aHelpRect;
243 0 : bool bIsBalloonHelp( Help::IsBalloonHelpEnabled() );
244 0 : bHelpHandled = m_pWindowController->requestQuickHelp( aLogicHitPos, bIsBalloonHelp, aQuickHelpText, aHelpRect );
245 :
246 0 : if( bHelpHandled )
247 : {
248 0 : if( bIsBalloonHelp )
249 : Help::ShowBalloon(
250 0 : this, rHEvt.GetMousePosPixel(), lcl_AWTRectToVCLRect( aHelpRect ), aQuickHelpText );
251 : else
252 : Help::ShowQuickHelp(
253 0 : this, lcl_AWTRectToVCLRect( aHelpRect ), aQuickHelpText );
254 0 : }
255 : }
256 :
257 0 : if( !bHelpHandled )
258 0 : vcl::Window::RequestHelp( rHEvt );
259 0 : }
260 :
261 17 : void ChartWindow::adjustHighContrastMode()
262 : {
263 : static const DrawModeFlags nContrastMode =
264 : DrawModeFlags::SettingsLine | DrawModeFlags::SettingsFill |
265 17 : DrawModeFlags::SettingsText | DrawModeFlags::SettingsGradient;
266 :
267 17 : bool bUseContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
268 17 : SetDrawMode( bUseContrast ? nContrastMode : DrawModeFlags::Default );
269 17 : }
270 :
271 825 : void ChartWindow::ForceInvalidate()
272 : {
273 825 : vcl::Window::Invalidate();
274 825 : if(m_pOpenGLWindow)
275 : {
276 825 : m_pOpenGLWindow->Invalidate();
277 : }
278 825 : }
279 832 : void ChartWindow::Invalidate( InvalidateFlags nFlags )
280 : {
281 832 : if( m_bInPaint ) // #i101928# superfluous paint calls while entering and editing charts"
282 1610 : return;
283 54 : vcl::Window::Invalidate( nFlags );
284 54 : if(m_pOpenGLWindow)
285 : {
286 54 : m_pOpenGLWindow->Invalidate( nFlags );
287 : }
288 : }
289 1527 : void ChartWindow::Invalidate( const Rectangle& rRect, InvalidateFlags nFlags )
290 : {
291 1527 : if( m_bInPaint ) // #i101928# superfluous paint calls while entering and editing charts"
292 3050 : return;
293 4 : vcl::Window::Invalidate( rRect, nFlags );
294 4 : if(m_pOpenGLWindow)
295 : {
296 4 : m_pOpenGLWindow->Invalidate( rRect, nFlags );
297 : }
298 : }
299 0 : void ChartWindow::Invalidate( const vcl::Region& rRegion, InvalidateFlags nFlags )
300 : {
301 0 : if( m_bInPaint ) // #i101928# superfluous paint calls while entering and editing charts"
302 0 : return;
303 0 : vcl::Window::Invalidate( rRegion, nFlags );
304 0 : if(m_pOpenGLWindow)
305 : {
306 0 : m_pOpenGLWindow->Invalidate( rRegion, nFlags );
307 : }
308 : }
309 :
310 57 : } //namespace chart
311 :
312 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|