///////////////////////////////////////////////////////////////////////////// // Name: wviacam.cpp // Purpose: // Author: Cesar Mauri Loba (cesar at crea-si dot com) // Modified by: // Created: // Copyright: (C) 2008 Cesar Mauri Loba - CREA Software Systems // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/wx.h" #endif ////@begin includes #include "wconfiguration.h" #include "wabout.h" ////@end includes #include "wviacam.h" #include "camwindow.h" #include "viacamcontroller.h" #include "configmanager.h" #include "eviacamapp.h" #include "pointeraction.h" #include "dwellclick.h" #include "paths.h" #include "checkupdates_manager.h" ////@begin XPM images #include "resources/eviacam_mini.xpm" #include "resources/on.xpm" #include "resources/off.xpm" #include "resources/clickwindow.xpm" #include "resources/keyboard.xpm" #include "resources/preferences.xpm" #include "resources/help.xpm" ////@end XPM images #include "resources/clickwindowoff.xpm" #include #include /*! * WViacam type definition */ IMPLEMENT_CLASS( WViacam, wxFrame ) /*! * Custom events to comunicate worker and GUI. These are needed to avoid calling * GUI functions from worker thread */ // FPS refresh DECLARE_EVENT_TYPE(wxEVT_SET_FPS, -1) DEFINE_EVENT_TYPE(wxEVT_SET_FPS) /*! * WViacam event table definition */ BEGIN_EVENT_TABLE( WViacam, wxFrame ) ////@begin WViacam event table entries EVT_CLOSE( WViacam::OnCloseWindow ) EVT_ICONIZE( WViacam::OnIconize ) EVT_MENU( ID_MENUITEM_ENABLE, WViacam::OnMenuitemEnableClick ) EVT_UPDATE_UI( ID_MENUITEM_ENABLE, WViacam::OnMenuitemEnableUpdate ) EVT_MENU( ID_MENUITEM_EXIT, WViacam::OnMenuitemExitClick ) EVT_MENU( ID_MENU_WIZARD, WViacam::OnMenuWizardClick ) EVT_MENU( ID_MENU_OPTIONS, WViacam::OnMenuOptionsClick ) EVT_MENU( ID_MENU_HELP_CONTENTS, WViacam::OnToolHelpClick ) #if defined(ENABLE_UPDATES_CHECK) EVT_MENU( ID_MENU_CHECKUPDATES, WViacam::OnMenuCheckupdatesClick ) #endif EVT_MENU( ID_MENU_ABOUT, WViacam::OnMenuAboutClick ) EVT_MENU( ID_TOOL_ENABLE, WViacam::OnToolEnableClick ) EVT_UPDATE_UI( ID_TOOL_ENABLE, WViacam::OnToolEnableUpdate ) EVT_MENU( ID_TOOL_DISABLE, WViacam::OnToolDisableClick ) EVT_UPDATE_UI( ID_TOOL_DISABLE, WViacam::OnToolDisableUpdate ) EVT_MENU( ID_TOOL_CLICKWIN, WViacam::OnToolClickwinClick ) EVT_UPDATE_UI( ID_TOOL_CLICKWIN, WViacam::OnToolClickwinUpdate ) EVT_MENU( ID_TOOL_KEYBOARD, WViacam::OnToolKeyboardClick ) EVT_MENU( ID_TOOL_OPTIONS, WViacam::OnToolOptionsClick ) EVT_MENU( ID_TOOL_HELP, WViacam::OnToolHelpClick ) ////@end WViacam event table entries EVT_COMMAND (wxID_ANY, wxEVT_SET_FPS, WViacam::OnSetFPS) END_EVENT_TABLE() /*! * WViacam constructors */ WViacam::WViacam() { Init(); } WViacam::WViacam( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { Init(); Create( parent, id, caption, pos, size, style ); } /*! * WViacam creator */ bool WViacam::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) { ////@begin WViacam creation SetExtraStyle(wxWS_EX_BLOCK_EVENTS); wxFrame::Create( parent, id, caption, pos, size, style ); CreateControls(); SetIcon(GetIconResource(wxT("resources/eviacam_mini.xpm"))); ////@end WViacam creation return true; } /*! * WViacam destructor */ WViacam::~WViacam() { ////@begin WViacam destruction ////@end WViacam destruction delete m_taskBarIcon; delete m_helpController; } /*! * Member initialisation */ void WViacam::Init() { ////@begin WViacam member initialisation m_toolBar = NULL; m_statusBar = NULL; ////@end WViacam member initialisation m_pCamWindow= NULL; m_prevFPS= 0; m_helpController= NULL; m_updateToolbar= true; } /*! * Control creation for WViacam */ void WViacam::CreateControls() { ////@begin WViacam content construction WViacam* itemFrame1 = this; wxMenuBar* menuBar = new wxMenuBar; wxMenu* itemMenu3 = new wxMenu; itemMenu3->Append(ID_MENUITEM_ENABLE, _("E&nable / Disable"), wxEmptyString, wxITEM_CHECK); itemMenu3->AppendSeparator(); itemMenu3->Append(ID_MENUITEM_EXIT, _("&Exit"), wxEmptyString, wxITEM_NORMAL); menuBar->Append(itemMenu3, _("&File")); wxMenu* itemMenu7 = new wxMenu; itemMenu7->Append(ID_MENU_WIZARD, _("&Wizard..."), wxEmptyString, wxITEM_NORMAL); itemMenu7->AppendSeparator(); itemMenu7->Append(ID_MENU_OPTIONS, _("&Options..."), wxEmptyString, wxITEM_NORMAL); menuBar->Append(itemMenu7, _("&Configuration")); wxMenu* itemMenu11 = new wxMenu; itemMenu11->Append(ID_MENU_HELP_CONTENTS, _("&Help contents"), wxEmptyString, wxITEM_NORMAL); #if defined(ENABLE_UPDATES_CHECK) itemMenu11->Append(ID_MENU_CHECKUPDATES, _("Check for &updates"), wxEmptyString, wxITEM_NORMAL); #endif itemMenu11->AppendSeparator(); itemMenu11->Append(ID_MENU_ABOUT, _("&About..."), wxEmptyString, wxITEM_NORMAL); menuBar->Append(itemMenu11, _("&Help")); itemFrame1->SetMenuBar(menuBar); m_toolBar = CreateToolBar( wxTB_FLAT|wxTB_HORIZONTAL, ID_TOOLBAR ); m_toolBar->SetToolBitmapSize(wxSize(32, 32)); wxBitmap itemtool17Bitmap(itemFrame1->GetBitmapResource(wxT("resources/on.xpm"))); wxBitmap itemtool17BitmapDisabled; m_toolBar->AddTool(ID_TOOL_ENABLE, _("Enable"), itemtool17Bitmap, itemtool17BitmapDisabled, wxITEM_NORMAL, _("Enable"), wxEmptyString); wxBitmap itemtool18Bitmap(itemFrame1->GetBitmapResource(wxT("resources/off.xpm"))); wxBitmap itemtool18BitmapDisabled; m_toolBar->AddTool(ID_TOOL_DISABLE, _("Disable"), itemtool18Bitmap, itemtool18BitmapDisabled, wxITEM_NORMAL, _("Disable"), wxEmptyString); m_toolBar->EnableTool(ID_TOOL_DISABLE, false); wxBitmap itemtool19Bitmap(itemFrame1->GetBitmapResource(wxT("resources/clickwindow.xpm"))); wxBitmap itemtool19BitmapDisabled; m_toolBar->AddTool(ID_TOOL_CLICKWIN, _("Click Window"), itemtool19Bitmap, itemtool19BitmapDisabled, wxITEM_CHECK, _("Click Window"), wxEmptyString); wxBitmap itemtool20Bitmap(itemFrame1->GetBitmapResource(wxT("resources/keyboard.xpm"))); wxBitmap itemtool20BitmapDisabled; m_toolBar->AddTool(ID_TOOL_KEYBOARD, _("On-screen keyboard"), itemtool20Bitmap, itemtool20BitmapDisabled, wxITEM_NORMAL, _("On-screen keyboard"), wxEmptyString); m_toolBar->AddSeparator(); wxBitmap itemtool22Bitmap(itemFrame1->GetBitmapResource(wxT("resources/preferences.xpm"))); wxBitmap itemtool22BitmapDisabled; m_toolBar->AddTool(ID_TOOL_OPTIONS, _("Options"), itemtool22Bitmap, itemtool22BitmapDisabled, wxITEM_NORMAL, _("Options"), wxEmptyString); m_toolBar->AddSeparator(); wxBitmap itemtool24Bitmap(itemFrame1->GetBitmapResource(wxT("resources/help.xpm"))); wxBitmap itemtool24BitmapDisabled; m_toolBar->AddTool(ID_TOOL_HELP, _("Help"), itemtool24Bitmap, itemtool24BitmapDisabled, wxITEM_NORMAL, _("Help"), wxEmptyString); m_toolBar->Realize(); itemFrame1->SetToolBar(m_toolBar); m_statusBar = new wxStatusBar( itemFrame1, ID_STATUSBAR, wxST_SIZEGRIP|wxNO_BORDER ); if (WViacam::ShowToolTips()) m_statusBar->SetToolTip(_("Frame rate meter. For proper function\nshould be greater than 25 fps. Reduce\nthe exposure time of your camera when\nnecessary.")); m_statusBar->SetFieldsCount(1); itemFrame1->SetStatusBar(m_statusBar); ////@end WViacam content construction // Create taskbar icon m_taskBarIcon= new wxTaskBarIcon (); m_taskBarIcon->SetIcon (GetIconResource (_T("resources/eviacam_mini.xpm")), _T("Enable Viacam")); m_taskBarIcon->Connect (wxID_ANY, wxEVT_TASKBAR_LEFT_UP, wxTaskBarIconEventHandler(WViacam::OnTaskBarIconLeftUp), NULL, this); m_pCamWindow = new CCamWindow ( itemFrame1, wxID_ANY, wxPoint(0,0), wxSize(160, 144)); } /*! * Should we show tooltips? */ bool WViacam::ShowToolTips() { return true; } /*! * Get bitmap resources */ wxBitmap WViacam::GetBitmapResource( const wxString& name ) { // Bitmap retrieval ////@begin WViacam bitmap retrieval wxUnusedVar(name); if (name == wxT("resources/on.xpm")) { wxBitmap bitmap(on); return bitmap; } else if (name == wxT("resources/off.xpm")) { wxBitmap bitmap(off); return bitmap; } else if (name == wxT("resources/clickwindow.xpm")) { wxBitmap bitmap(clickwindow); return bitmap; } else if (name == wxT("resources/keyboard.xpm")) { wxBitmap bitmap(keyboard); return bitmap; } else if (name == wxT("resources/preferences.xpm")) { wxBitmap bitmap(preferences); return bitmap; } else if (name == wxT("resources/help.xpm")) { wxBitmap bitmap(help); return bitmap; } return wxNullBitmap; ////@end WViacam bitmap retrieval } /*! * Get icon resources */ wxIcon WViacam::GetIconResource( const wxString& name ) { // Icon retrieval ////@begin WViacam icon retrieval wxUnusedVar(name); if (name == wxT("resources/eviacam_mini.xpm")) { wxIcon icon(eviacam_mini); return icon; } return wxNullIcon; ////@end WViacam icon retrieval } // // Custom events // // Update FPS meter //enum EFPSCondition { GOOD, FAIR, POOR }; void WViacam::SetFPS (long value, WViacam::EFPSCondition cond) { if (value!= m_prevFPS) { wxString text; switch (cond) { case WViacam::GOOD: text.Printf (_(" %li fps (good)"), value); break; case WViacam::FAIR: text.Printf (_(" %li fps (could be improved)"), value); break; case WViacam::POOR: text.Printf (_(" %li fps (too low)"), value); break; default: assert (false); } // Send by a messege (this method is called from other thread) wxCommandEvent event(wxEVT_SET_FPS); event.SetString (text); wxPostEvent(this, event); m_prevFPS= value; } } void WViacam::OnSetFPS( wxCommandEvent &event ) { m_statusBar->SetStatusText(event.GetString()); } // // EVENT HANDLERS // /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENUITEM_EXIT */ void WViacam::OnMenuitemExitClick( wxCommandEvent& event ) { event.Skip(false); Close(); } /*! * wxEVT_CLOSE_WINDOW event handler for ID_WVIACAM */ void WViacam::OnCloseWindow( wxCloseEvent& event ) { event.Skip(false); if (event.CanVeto()) { wxMessageDialog dlg (NULL, _("This action will close the program.\nAre you sure?"), _T("Enable Viacam"), wxICON_EXCLAMATION | wxYES_NO ); if (dlg.ShowModal()== wxID_NO) { event.Veto(); return; } } // Shutdown application wxGetApp().GetController().Finalize(); Destroy (); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENUITEM_ENABLE */ void WViacam::OnMenuitemEnableClick( wxCommandEvent& event ) { wxGetApp().GetController().SetEnabled (!wxGetApp().GetController().GetEnabled()); event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_ABOUT */ void WViacam::OnMenuAboutClick( wxCommandEvent& event ) { ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_ABOUT in WViacam. // Before editing this code, remove the block markers. WAbout* window = new WAbout(this); int returnValue = window->ShowModal(); window->Destroy(); ////@end wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_ABOUT in WViacam. wxUnusedVar(returnValue); event.Skip(false); } /*! * wxEVT_UPDATE_UI event handler for ID_MENUITEM_ENABLE */ void WViacam::OnMenuitemEnableUpdate( wxUpdateUIEvent& event ) { event.Check (wxGetApp().GetController().GetEnabled()); event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_OPTIONS */ void WViacam::OnMenuOptionsClick( wxCommandEvent& event ) { wxGetApp().GetController().OpenConfiguration(); event.Skip(false); } /*! * wxEVT_ICONIZE event handler for ID_WVIACAM */ void WViacam::OnIconize( wxIconizeEvent& event ) { #if defined(WIN32) if (event.Iconized()) { // Cancel current iconization and hide window. Iconize (false); Show(false); event.Skip(false); } #endif } bool WViacam::Show(bool show) { if (show!= IsShown()) { wxFrame::Show (show); if (show) Raise (); return true; } else return false; } void WViacam::OnTaskBarIconLeftUp ( wxTaskBarIconEvent& event ) { Show(!IsShown()); event.Skip (true); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_TOOL_ENABLE */ void WViacam::OnToolEnableClick( wxCommandEvent& event ) { wxGetApp().GetController().SetEnabled (true); event.Skip(false); } /*! * wxEVT_UPDATE_UI event handler for ID_TOOL_ENABLE */ void WViacam::OnToolEnableUpdate( wxUpdateUIEvent& event ) { event.Enable (!wxGetApp().GetController().GetEnabled ()); event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_TOOL_DISABLE */ void WViacam::OnToolDisableClick( wxCommandEvent& event ) { wxGetApp().GetController().SetEnabled (false); event.Skip(false); } /*! * wxEVT_UPDATE_UI event handler for ID_TOOL_DISABLE */ void WViacam::OnToolDisableUpdate( wxUpdateUIEvent& event ) { event.Enable (wxGetApp().GetController().GetEnabled ()); event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_TOOL_CLICKWIN */ void WViacam::OnToolClickwinClick( wxCommandEvent& event ) { wxGetApp().GetController().GetPointerAction().GetDwellClick().SetUseClickWindow( !wxGetApp().GetController().GetPointerAction().GetDwellClick().GetUseClickWindow() ); m_updateToolbar= true; event.Skip(false); } /*! * wxEVT_UPDATE_UI event handler for ID_TOOL_CLICKWIN */ void WViacam::OnToolClickwinUpdate( wxUpdateUIEvent& event ) { bool buttonWasChecked= m_toolBar->GetToolState(ID_TOOL_CLICKWIN); bool needToBeChecked= wxGetApp().GetController().GetPointerAction().GetDwellClick().GetUseClickWindow(); event.Enable (wxGetApp().GetController().GetPointerAction().GetDwellClick().GetEnabled()); event.Check (needToBeChecked); if (m_updateToolbar || buttonWasChecked!= needToBeChecked) { if (!needToBeChecked) m_toolBar->SetToolNormalBitmap(ID_TOOL_CLICKWIN, wxBitmap(clickwindow)); else m_toolBar->SetToolNormalBitmap(ID_TOOL_CLICKWIN, wxBitmap(clickwindowoff)); } m_updateToolbar= false; event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_TOOL_PREFERENCES */ void WViacam::OnToolOptionsClick( wxCommandEvent& event ) { wxGetApp().GetController().OpenConfiguration(); event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_TOOL_HELP */ void WViacam::OnToolHelpClick( wxCommandEvent& event ) { if (m_helpController== NULL) { m_helpController= new wxHtmlHelpController(wxHF_DEFAULT_STYLE, this); wxString path(eviacam::GetDataDir()); switch(wxGetApp().GetController().GetLocale()->GetLanguage()) { case (wxLANGUAGE_CATALAN): path+= _T("/help/ca/help.hhp"); break; case (wxLANGUAGE_SPANISH): case (wxLANGUAGE_SPANISH_ARGENTINA): case (wxLANGUAGE_SPANISH_BOLIVIA): case (wxLANGUAGE_SPANISH_CHILE): case (wxLANGUAGE_SPANISH_COLOMBIA): case (wxLANGUAGE_SPANISH_COSTA_RICA): case (wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC): case (wxLANGUAGE_SPANISH_ECUADOR): case (wxLANGUAGE_SPANISH_EL_SALVADOR): case (wxLANGUAGE_SPANISH_GUATEMALA): case (wxLANGUAGE_SPANISH_HONDURAS): case (wxLANGUAGE_SPANISH_MEXICAN): case (wxLANGUAGE_SPANISH_MODERN): case (wxLANGUAGE_SPANISH_NICARAGUA): case (wxLANGUAGE_SPANISH_PANAMA): case (wxLANGUAGE_SPANISH_PARAGUAY): case (wxLANGUAGE_SPANISH_PERU): case (wxLANGUAGE_SPANISH_PUERTO_RICO): case (wxLANGUAGE_SPANISH_URUGUAY): case (wxLANGUAGE_SPANISH_US): case (wxLANGUAGE_SPANISH_VENEZUELA): path+= _T("/help/es/help.hhp"); break; case (wxLANGUAGE_GERMAN): case (wxLANGUAGE_GERMAN_AUSTRIAN): case (wxLANGUAGE_GERMAN_BELGIUM): case (wxLANGUAGE_GERMAN_LIECHTENSTEIN): case (wxLANGUAGE_GERMAN_LUXEMBOURG): case (wxLANGUAGE_GERMAN_SWISS): path+= _T("/help/de/help.hhp"); break; case (wxLANGUAGE_GALICIAN): path+= _T("/help/gl/help.hhp"); break; case (wxLANGUAGE_RUSSIAN): path+= _T("/help/ru/help.hhp"); break; default: path+= _T("/help/en/help.hhp"); break; } m_helpController->AddBook(path, false); } m_helpController->DisplayContents(); event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_TOOL_KEYBOARD */ void WViacam::OnToolKeyboardClick( wxCommandEvent& event ) { wxGetApp().GetController().OpenOnScreenKeyboard(); event.Skip(false); } /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_WIZARD */ void WViacam::OnMenuWizardClick( wxCommandEvent& event ) { wxGetApp().GetController().StartWizard(); event.Skip(false); } #if defined(ENABLE_UPDATES_CHECK) /*! * wxEVT_COMMAND_MENU_SELECTED event handler for ID_MENU_CHECKUPDATES */ void WViacam::OnMenuCheckupdatesClick( wxCommandEvent& event ) { eviacam::CheckUpdatesManager updateManager(this); updateManager.LaunchForeground(); event.Skip(false); } #endif