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 :
10 : #include <vcl/openglwin.hxx>
11 : #include <vcl/opengl/OpenGLContext.hxx>
12 : #include <vcl/event.hxx>
13 : #include <vcl/sysdata.hxx>
14 :
15 : class OpenGLWindowImpl
16 : {
17 : public:
18 : explicit OpenGLWindowImpl(vcl::Window* pWindow);
19 17 : ~OpenGLWindowImpl() { mxChildWindow.disposeAndClear(); }
20 0 : OpenGLContext& getContext() { return maContext;}
21 : private:
22 : OpenGLContext maContext;
23 : VclPtr<SystemChildWindow> mxChildWindow;
24 : };
25 :
26 17 : OpenGLWindowImpl::OpenGLWindowImpl(vcl::Window* pWindow)
27 : {
28 17 : SystemWindowData aData = OpenGLContext::generateWinData(pWindow, false);
29 17 : mxChildWindow.reset(VclPtr<SystemChildWindow>::Create(pWindow, 0, &aData));
30 17 : mxChildWindow->Show();
31 17 : maContext.init(mxChildWindow.get());
32 17 : pWindow->SetMouseTransparent(false);
33 17 : }
34 :
35 17 : OpenGLWindow::OpenGLWindow(vcl::Window* pParent):
36 : Window(pParent, 0),
37 17 : mxImpl(new OpenGLWindowImpl(this)),
38 34 : mpRenderer(NULL)
39 : {
40 17 : }
41 :
42 3 : OpenGLWindow::~OpenGLWindow()
43 : {
44 1 : disposeOnce();
45 2 : }
46 :
47 17 : void OpenGLWindow::dispose()
48 : {
49 17 : if(mpRenderer)
50 17 : mpRenderer->contextDestroyed();
51 17 : mpRenderer = NULL;
52 17 : mxImpl.reset();
53 17 : Window::dispose();
54 17 : }
55 :
56 0 : OpenGLContext& OpenGLWindow::getContext()
57 : {
58 0 : return mxImpl->getContext();
59 : }
60 :
61 0 : void OpenGLWindow::Paint(vcl::RenderContext& /*rRenderContext*/, const Rectangle&)
62 : {
63 0 : if(mpRenderer)
64 0 : mpRenderer->update();
65 0 : }
66 :
67 0 : void OpenGLWindow::MouseButtonDown( const MouseEvent& rMEvt )
68 : {
69 0 : maStartPoint = rMEvt.GetPosPixel();
70 0 : }
71 :
72 0 : void OpenGLWindow::MouseButtonUp( const MouseEvent& rMEvt )
73 : {
74 0 : if(!mpRenderer)
75 0 : return;
76 :
77 0 : Point aPoint = rMEvt.GetPosPixel();
78 0 : if(aPoint == maStartPoint)
79 : {
80 0 : mpRenderer->clickedAt(aPoint, rMEvt.GetButtons());
81 : }
82 : else
83 : {
84 : mpRenderer->mouseDragMove(maStartPoint, aPoint,
85 0 : rMEvt.GetButtons());
86 : }
87 : }
88 :
89 0 : void OpenGLWindow::Command( const CommandEvent& rCEvt )
90 : {
91 0 : if(!mpRenderer)
92 0 : return;
93 :
94 0 : if(rCEvt.GetCommand() == CommandEventId::Wheel)
95 : {
96 0 : const CommandWheelData* pData = rCEvt.GetWheelData();
97 0 : if(pData->GetMode() == CommandWheelMode::SCROLL)
98 : {
99 0 : long nDelta = pData->GetDelta();
100 0 : mpRenderer->scroll(nDelta);
101 : }
102 : }
103 : }
104 :
105 0 : void OpenGLWindow::MouseMove( const MouseEvent& /*rMEvt*/ )
106 : {
107 0 : }
108 :
109 793 : void OpenGLWindow::setRenderer(IRenderer* pRenderer)
110 : {
111 793 : mpRenderer = pRenderer;
112 793 : }
113 :
114 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|