source: eviacam/trunk/fuentes/src/clickwindowcontroller.cpp @ 567

Last change on this file since 567 was 567, checked in by mabarracus, 4 years ago

updated sources to version 2.0.3

File size: 12.0 KB
Line 
1/////////////////////////////////////////////////////////////////////////////
2// Name:        clickwindowcontroller.cpp
3// Purpose: 
4// Author:      Cesar Mauri Loba (cesar at crea-si dot com)
5// Modified by:
6// Created:     
7// Copyright:   (C) 2008 Cesar Mauri Loba - CREA Software Systems
8//
9//  This program is free software: you can redistribute it and/or modify
10//  it under the terms of the GNU General Public License as published by
11//  the Free Software Foundation, either version 3 of the License, or
12//  (at your option) any later version.
13//
14//  This program is distributed in the hope that it will be useful,
15//  but WITHOUT ANY WARRANTY; without even the implied warranty of
16//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17//  GNU General Public License for more details.
18//
19//  You should have received a copy of the GNU General Public License
20//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
21/////////////////////////////////////////////////////////////////////////////
22
23
24#include "clickwindowtext.h"
25#include "clickwindowbitmap.h"
26#include "clickwindowbitmapvertical.h"
27#include "clickwindowvertical.h"
28#include "wviacam.h"
29#include "clickwindowcontroller.h"
30#include "viacamcontroller.h"
31#include <wx/gdicmn.h>
32#include <wx/window.h>
33
34CClickWindowController::CClickWindowController(CViacamController & pViacamController)
35{
36        m_pViacamController= &pViacamController;
37
38        // Create text window
39        m_pWindowText= new CClickWindowText (NULL);     
40        m_pWindowText->SetController (*this);   
41       
42        // Create bitmap window
43        m_pWindowBitmap= new CClickWindowBitmap (NULL);
44        m_pWindowBitmap->SetController (*this); 
45       
46        // Create bitmap vertical window
47        m_pWindowBitmapVertical= new CClickWindowBitmapVertical (NULL);
48        m_pWindowBitmapVertical->SetController (*this); 
49       
50        // Create text vertical window
51        m_pWindowTextVertical= new CClickWindowTextVertical (NULL);
52        m_pWindowTextVertical->SetController (*this);   
53       
54        // Set current window
55        m_pWindow= m_pWindowBitmap;
56       
57        // FIXME: implement this using the observer pattern
58        m_pViacamController->GetMainWindow()->Connect
59                        (ID_WVIACAM, wxEVT_SHOW, wxShowEventHandler(CClickWindow::OnMainWindowShow), NULL, m_pWindow);
60       
61        Reset();
62
63        InitDefaults();
64}
65
66CClickWindowController::~CClickWindowController()
67{
68        Finalize();
69}
70
71void CClickWindowController::Finalize ()
72{
73        if (m_pViacamController->GetMainWindow())
74        {
75                m_pViacamController->GetMainWindow()->Disconnect
76                        (ID_WVIACAM, wxEVT_SHOW, wxShowEventHandler(CClickWindow::OnMainWindowShow), NULL, m_pWindowText);
77                m_pViacamController->GetMainWindow()->Disconnect
78                        (ID_WVIACAM, wxEVT_SHOW, wxShowEventHandler(CClickWindow::OnMainWindowShow), NULL, m_pWindowBitmap);
79                m_pViacamController->GetMainWindow()->Disconnect
80                        (ID_WVIACAM, wxEVT_SHOW, wxShowEventHandler(CClickWindow::OnMainWindowShow), NULL, m_pWindowBitmapVertical);
81                m_pViacamController->GetMainWindow()->Disconnect
82                        (ID_WVIACAM, wxEVT_SHOW, wxShowEventHandler(CClickWindow::OnMainWindowShow), NULL, m_pWindowTextVertical);
83       
84        }
85        if (m_pWindow)
86        {
87                m_pWindowText->Show(false);
88                m_pWindowText->Destroy ();
89                m_pWindowText= NULL;
90                m_pWindowBitmap->Show(false);
91                m_pWindowBitmap->Destroy ();
92                m_pWindowBitmap= NULL;
93                m_pWindowBitmapVertical->Show(false);
94                m_pWindowBitmapVertical->Destroy ();
95                m_pWindowBitmapVertical= NULL;
96                m_pWindowTextVertical->Show(false);
97                m_pWindowTextVertical->Destroy ();
98                m_pWindowTextVertical= NULL;
99                m_pWindow= NULL;
100        }       
101}
102
103void CClickWindowController::Show(bool show) 
104{
105        if (show!= m_pWindow->IsShown())
106        {
107        /*
108                if (m_autohide)
109                        m_pWindow->SetClickWindowStyle((CClickWindow::EClickWindowStatus)m_status,
110                                (CClickWindow::EDocking)m_dockingMode, show);
111                else
112                        m_pWindow->SetClickWindowStyle(CClickWindow::DOCKED,
113                                (CClickWindow::EDocking)m_dockingMode, show);
114        */
115                m_pWindow->Show(show); 
116                if (show) m_pWindow->UpdateButtons(GetEnabled(),GetCurrentButton(), GetLockedButton());
117        }
118}
119
120//Return to default state
121void CClickWindowController::Reset() 
122{
123        m_enabled= true;
124        m_currentButton= LEFT;
125        m_lockedButton= LEFT;
126        m_halfDragClick= false;
127}
128
129inline
130bool CClickWindowController::IsCursorOverWindow(long x, long y)
131{
132        wxRect pos= m_pWindow->GetRect();
133        wxRect parentPos= m_pWindow->GetNoClickButton()->GetScreenRect();
134        pos.Offset(0, parentPos.GetY() - pos.GetY());
135       
136       
137        int top= pos.GetTop();
138        int bottom= pos.GetBottom();
139        int left= pos.GetLeft();
140        int right= pos.GetRight();
141        if (top < 0) top= 0;
142        if (bottom < 0) bottom= 0;
143        if (left < 0) left= 0;
144        if (right < 0) right= 0;
145       
146        if (y<= bottom && y>= top && x>= left && x<= right)
147                return true;
148        else
149                return false;
150}
151
152// Get the next action that should be sent
153mousecmd::mousecmd CClickWindowController::GetAction(long x, long y)
154{
155        mousecmd::mousecmd retval= mousecmd::CMD_NO_CLICK;
156
157        //wxMutexGuiEnter();
158
159        if (m_enabled)
160        {
161                if (IsCursorOverWindow(x,y))
162                {
163#if defined(__WXMSW__)
164                        retval= mousecmd::CMD_LEFT_UP;
165#else
166                        retval= mousecmd::CMD_LEFT_CLICK;
167#endif
168                }
169                else
170                {
171                        switch (m_currentButton)
172                        {
173                        case CClickWindowController::LEFT:
174                                retval= mousecmd::CMD_LEFT_CLICK;
175                                break;
176                        case CClickWindowController::MIDDLE:
177                                retval= mousecmd::CMD_MIDDLE_CLICK;
178                                break;
179                        case CClickWindowController::RIGHT:
180                                retval= mousecmd::CMD_RIGHT_CLICK;
181                                break;
182                        case CClickWindowController::DRAG:
183                                if (!m_halfDragClick) retval= mousecmd::CMD_LEFT_DOWN;
184                                else retval= mousecmd::CMD_LEFT_UP;
185                                break;
186                        case CClickWindowController::DBLCLICK:
187                                retval= mousecmd::CMD_DOUBLE_CLICK;
188                                break;
189                        default:
190                                assert (false);
191                        }
192                }
193        }       
194        else
195        {
196                if (IsCursorOverNoClickButton(x, y))
197#if defined(__WXMSW__)
198                        retval= mousecmd::CMD_LEFT_UP;
199#else
200                        retval= mousecmd::CMD_LEFT_CLICK;
201#endif
202        }       
203
204        //wxMutexGuiLeave();
205
206        return retval;
207}
208
209// Select appropriate window taking into account design and location
210void CClickWindowController::SelectAppropriateWindow (EDesign design, ELocation location)
211{
212        bool isAutohide= m_autohide;
213        bool isHorizontal=
214                (location == FLOATING_HORIZONTAL || location == TOP_DOCKED || location == BOTTOM_DOCKED);
215               
216        WXAppBar::EDocking oldDocking= m_pWindow->GetDockingMode();
217       
218        if (design == CClickWindowController::NORMAL) {
219                if (isHorizontal)
220                        m_pWindow= m_pWindowBitmap;
221                else
222                        m_pWindow= m_pWindowBitmapVertical;
223        }
224        else {
225                if (isHorizontal)
226                        m_pWindow= m_pWindowText;
227                else
228                        m_pWindow= m_pWindowTextVertical;
229        }
230       
231        // FIXME: implement this using the observer pattern
232        m_pViacamController->GetMainWindow()->Connect
233                        (ID_WVIACAM, wxEVT_SHOW, wxShowEventHandler(CClickWindow::OnMainWindowShow), NULL, m_pWindow);
234       
235        m_pWindow->SetDockingMode(oldDocking);
236        SetAutohide(isAutohide);
237}
238
239void CClickWindowController::SetDesign(CClickWindowController::EDesign design)
240{       
241        if (m_design== design) return;
242
243        // Sanity check
244        if (design != CClickWindowController::NORMAL && design != CClickWindowController::THIN) {
245                SetDesign(CClickWindowController::NORMAL);
246                return;
247        }
248
249        bool wasShown= IsShown();
250        if (wasShown) Show(false);
251
252        SelectAppropriateWindow (design, m_location);
253               
254        if (wasShown) Show(true);
255       
256        m_design= design;
257}
258
259void CClickWindowController::SetLocation(CClickWindowController::ELocation location)
260{       
261        if (m_location== location) return;
262
263        // Sanity check
264        if (location< FLOATING_HORIZONTAL || location> RIGHT_DOCKED) {
265                SetLocation(TOP_DOCKED);
266                return;
267        }
268       
269        bool isShown= IsShown();       
270        if (isShown) Show(false);
271       
272        SelectAppropriateWindow (m_design, location);
273       
274        switch(location) {
275                case FLOATING_HORIZONTAL:
276                case FLOATING_VERTICAL:
277                        m_pWindow->SetDockingMode(WXAppBar::NON_DOCKED);
278                        break;
279                case TOP_DOCKED:
280                        m_pWindow->SetDockingMode(WXAppBar::TOP_DOCKED);
281                        break;
282                case BOTTOM_DOCKED:
283                        m_pWindow->SetDockingMode(WXAppBar::BOTTOM_DOCKED);
284                        break;
285                case LEFT_DOCKED:
286                        m_pWindow->SetDockingMode(WXAppBar::LEFT_DOCKED);
287                        break;
288                case RIGHT_DOCKED:
289                        m_pWindow->SetDockingMode(WXAppBar::RIGHT_DOCKED);
290                        break;
291                default:
292                        assert (false);
293        }
294               
295        if (isShown) Show(true);
296       
297        m_location= location;   
298}
299
300
301// Called from mouse controller. Notifies click bar that the click action has
302// to be sent and where. Updates internal state.
303void CClickWindowController::ActionDone(long x, long y) 
304{
305        //wxMutexGuiEnter();
306        // If cursor is over click window the notification takes place when
307        // mouse event is received otherwise update internal state
308        if (!IsCursorOverWindow(x,y))
309        {
310                if (m_currentButton== CClickWindowController::DRAG)
311                {
312                        if (!m_halfDragClick) m_halfDragClick= true;
313                        else
314                        {
315                                m_halfDragClick= false;
316                                m_currentButton= m_lockedButton;
317                        }
318                }
319                else
320                        m_currentButton= m_lockedButton;
321
322                m_pWindow->UpdateButtons(GetEnabled(),GetCurrentButton(), GetLockedButton());
323        }
324        //wxMutexGuiLeave();
325}
326
327// Called from window. Notifies that button has been clicked.
328void CClickWindowController::NotifyButtonClick (CClickWindowController::EButton button)
329{
330        if (m_enabled)
331        {
332                if (button== CClickWindowController::NO_CLICK)
333                        // Disable click
334                        m_enabled= false;
335                else
336                {
337                        if (m_fastMode || (m_currentButton!= m_lockedButton && button== m_currentButton))                               
338                                m_lockedButton= button;
339                        m_currentButton= button;
340                }
341
342                m_pWindow->UpdateButtons(GetEnabled(),GetCurrentButton(), GetLockedButton());
343        }
344        else
345        {
346                // Disabled state. Only handle NO_CLICK button
347                if (button== CClickWindowController::NO_CLICK)
348                {
349                        m_enabled= true;
350
351                        m_pWindow->UpdateButtons(GetEnabled(),GetCurrentButton(), GetLockedButton());
352                }
353        }
354}
355
356// Called from window. Notifies that button has been entered
357void CClickWindowController::NotifyButtonEnter (CClickWindowController::EButton button)
358{
359        if (m_enabled && m_fastMode)
360        {
361                if (button!= CClickWindowController::NO_CLICK && button!= m_currentButton)
362                {
363                        m_currentButton= button;
364                        m_pWindow->UpdateButtons(GetEnabled(),GetCurrentButton(), GetLockedButton());
365                }
366        }       
367}
368
369void CClickWindowController::SetFastMode(bool enable) 
370{
371        m_fastMode= enable;
372}
373
374void CClickWindowController::SetAutohide(bool enable) 
375{
376        // TODO
377//      bool isShown= IsShown();
378//      if (isShown) Show (false);
379       
380        m_autohide= enable;
381        m_pWindow->SetAutohideMode(m_autohide);
382//      if (m_autohide) m_status= CClickWindowController::HIDDEN;
383//      else m_status= CClickWindowController::DOCKED;
384       
385//      if (isShown) Show (true);
386}
387
388inline
389bool CClickWindowController::IsCursorOverNoClickButton(long x, long y)
390{
391        wxRect pos= m_pWindow->GetNoClickButton()->GetScreenRect();
392        if (y<= pos.GetBottom() && y>= pos.GetTop() && x>= pos.GetLeft() && x<= pos.GetRight())
393                return true;
394        else   
395                return false;   
396}
397
398
399
400void CClickWindowController::NotifyShowMainWindowClick ()
401{
402        m_pViacamController->GetMainWindow()->Show (!m_pViacamController->GetMainWindow()->IsShown());
403}
404
405void CClickWindowController::SetWarnBarOverlap (bool value)
406{
407        m_pWindow->SetWarnBarOverlap(value);
408}
409
410// Configuration methods
411void CClickWindowController::InitDefaults()
412{
413        SetFastMode (false);
414        SetDesign (CClickWindowController::NORMAL);     
415        //SetDockingMode(CClickWindowController::TOP_DOCKING);
416        SetLocation (CClickWindowController::TOP_DOCKED);
417        SetAutohide(false);
418        //m_status= CClickWindowController::HIDDEN;
419}
420
421void CClickWindowController::WriteProfileData(wxConfigBase* pConfObj)
422{
423        pConfObj->SetPath (_T("clickWindow")); 
424
425        pConfObj->Write(_T("fastMode"), m_fastMode);
426        pConfObj->Write(_T("design"), (long) m_design);
427        pConfObj->Write(_T("location"), (long) m_location);
428        pConfObj->Write(_T("autohide"), m_autohide);
429        pConfObj->Write(_T("warnBarOverlap"), m_pWindow->GetWarnBarOverlap());
430        pConfObj->SetPath (_T(".."));
431}
432
433void CClickWindowController::ReadProfileData(wxConfigBase* pConfObj)
434{
435        pConfObj->SetPath (_T("clickWindow"));
436
437        long design, location;
438        bool warnBarOverlap= true;
439       
440        pConfObj->Read(_T("fastMode"), &m_fastMode);
441        if (pConfObj->Read(_T("design"), &design))
442                SetDesign ((CClickWindowController::EDesign) design);
443        if (pConfObj->Read(_T("location"), &location))
444                SetLocation (static_cast<ELocation>(location));         
445        pConfObj->Read(_T("autohide"), &m_autohide);
446                SetAutohide(m_autohide);
447        pConfObj->Read(_T("warnBarOverlap"), &warnBarOverlap);
448                m_pWindow->SetWarnBarOverlap(warnBarOverlap);
449       
450        pConfObj->SetPath (_T(".."));
451}
452
453const bool CClickWindowController::IsShown () const
454{
455        return m_pWindow->IsShown();
456}
Note: See TracBrowser for help on using the repository browser.