1 /*****************************************************************************
4 ** Name: backgroundmgr.cpp
5 ** Purpose: Background manager class
6 ** Programmer: Kevin Rosenberg
7 ** Date Started: February 2001
9 ** This is part of the CTSim program
10 ** Copyright (C) 1983-2001 Kevin Rosenberg
12 ** $Id: backgroundmgr.cpp,v 1.12 2001/03/05 20:29:23 kevin Exp $
14 ** This program is free software; you can redistribute it and/or modify
15 ** it under the terms of the GNU General Public License (version 2) as
16 ** published by the Free Software Foundation.
18 ** This program is distributed in the hope that it will be useful,
19 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ** GNU General Public License for more details.
23 ** You should have received a copy of the GNU General Public License
24 ** along with this program; if not, write to the Free Software
25 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 ******************************************************************************/
28 #include "wx/wxprec.h"
38 #include "backgroundsupr.h"
39 #include "backgroundmgr.h"
45 IMPLEMENT_DYNAMIC_CLASS(BackgroundManager, wxMiniFrame)
46 BEGIN_EVENT_TABLE(BackgroundManager, wxMiniFrame)
47 EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, BackgroundManager::OnAddTask)
48 EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, BackgroundManager::OnRemoveTask)
49 EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_UNIT_TICK, BackgroundManager::OnUnitTick)
50 EVT_CLOSE(BackgroundManager::OnCloseWindow)
51 EVT_COMMAND_RANGE(0, 1000, wxEVT_COMMAND_BUTTON_CLICKED, BackgroundManager::OnCancelButton)
54 BackgroundManager::BackgroundManager ()
55 : wxMiniFrame (theApp->getMainFrame(), -1, _T("Background Tasks"), wxPoint(0,0), wxSize(210, 50)) //, wxTHICK_FRAME)
58 m_pCanvas = new BackgroundManagerCanvas (this);
59 theApp->setIconForFrame (this);
61 m_sizeGauge.Set (70, 20);
62 m_sizeLabel.Set (140, 20);
63 m_sizeBorder.Set (4, 4);
64 m_sizeCellSpacing.Set (3, 3);
65 //m_sizeButton.Set (70, 20);
66 m_sizeButton.Set (0, 0);
68 m_sizeCell.Set (m_sizeGauge.x + m_sizeLabel.x + m_sizeCellSpacing.x + m_sizeButton.x, 25);
75 BackgroundManager::OnCloseWindow (wxCloseEvent& event)
77 if (theApp->getMainFrame()->getShuttingDown())
78 wxMiniFrame::OnCloseWindow (event);
84 BackgroundManager::OnUnitTick (wxCommandEvent& event)
86 int iUnits = event.GetInt();
87 BackgroundSupervisor* pTask = reinterpret_cast<BackgroundSupervisor*>(event.GetClientData());
89 sys_error (ERR_SEVERE, "Received NULL task [BackgroundManager::OnAddTask]");
92 if (wxGauge* pGauge = lookupGauge (pTask))
93 pGauge->SetValue (iUnits);
97 BackgroundManager::OnAddTask (wxCommandEvent& event)
99 int iNumUnits = event.GetInt();
100 const char* const pszTaskName = event.GetString().c_str();
101 BackgroundSupervisor* pTask = reinterpret_cast<BackgroundSupervisor*>(event.GetClientData());
103 sys_error (ERR_SEVERE, "Received NULL task [BackgroundManager::OnAddTask]");
107 wxCriticalSectionLocker locker (m_criticalSection);
108 int iNumTasks = m_vecpBackgroundTasks.size();
109 std::vector<bool> vecPositionUsed (iNumTasks);
111 for (i = 0; i < iNumTasks; i++)
112 vecPositionUsed[i] = false;
114 for (i = 0; i < iNumTasks; i++) {
115 int iPosUsed = m_vecpPositions[i];
116 if (iPosUsed < iNumTasks)
117 vecPositionUsed[iPosUsed] = true;
120 int iFirstUnusedPos = iNumTasks; // default is just past current number of tasks
121 for (i = 0; i < iNumTasks; i++)
122 if (! vecPositionUsed[i]) {
127 wxPoint posGauge (m_sizeBorder.x, m_sizeBorder.y + iFirstUnusedPos * m_sizeCell.y);
128 wxPoint posLabel (m_sizeBorder.x + m_sizeGauge.x, m_sizeBorder.y + iFirstUnusedPos * m_sizeCell.y);
129 wxGauge* pGauge = new wxGauge (m_pCanvas, -1, iNumUnits, posGauge, m_sizeGauge);
130 wxStaticText* pLabel = new wxStaticText (m_pCanvas, -1, pszTaskName, posLabel, m_sizeLabel);
131 // wxPoint posButton (m_sizeBorder.x + m_sizeGauge.x + m_sizeLabel.x, m_sizeBorder.y + iFirstUnusedPos * m_sizeCell.y);
132 // wxButton* pCancelButton = new wxButton (m_pCanvas, iFirstUnusedPos, _T("Cancel"), posButton, m_sizeButton, wxBU_LEFT);
134 m_vecpBackgroundTasks.push_back (pTask);
135 m_vecpGauges.push_back (pGauge);
136 m_vecpNames.push_back (new std::string (pszTaskName));
137 m_vecpPositions.push_back (iFirstUnusedPos);
138 m_vecpLabels.push_back (pLabel);
139 //m_vecpCancelButtons.push_back (pCancelButton);
143 if (m_iNumTasks == 1) {
145 theApp->getMainFrame()->SetFocus(); // necessary to keep wxWindows from crashing
150 BackgroundManager::OnRemoveTask (wxCommandEvent& event)
152 BackgroundSupervisor* pTask = reinterpret_cast<BackgroundSupervisor*>(event.GetClientData());
154 sys_error (ERR_SEVERE, "Received NULL task [BackgroundManager::OnAddTask]");
158 wxCriticalSectionLocker locker (m_criticalSection);
160 StringContainer::iterator iName = m_vecpNames.begin();
161 GaugeContainer::iterator iGauge = m_vecpGauges.begin();
162 PositionContainer::iterator iPosition = m_vecpPositions.begin();
163 LabelContainer::iterator iLabel = m_vecpLabels.begin();
164 //ButtonContainer::iterator iCancelButton = m_vecpCancelButtons.begin();
165 for (TaskContainer::iterator iTask = m_vecpBackgroundTasks.begin(); iTask != m_vecpBackgroundTasks.end(); iTask++) {
166 if (*iTask == pTask) {
170 //delete *iCancelButton;
171 m_vecpBackgroundTasks.erase (iTask);
172 m_vecpGauges.erase (iGauge);
173 m_vecpNames.erase (iName);
174 m_vecpPositions.erase (iPosition);
175 m_vecpLabels.erase (iLabel);
176 //m_vecpCancelButtons.erase (iCancelButton);
188 if (m_iNumTasks <= 0)
193 BackgroundManager::OnCancelButton (wxCommandEvent& event)
198 BackgroundManager::lookupGauge (BackgroundSupervisor* pTask)
200 wxGauge* pGauge = NULL;
203 wxCriticalSectionLocker locker (m_criticalSection);
204 for (TaskContainer::iterator iTask = m_vecpBackgroundTasks.begin(); iTask != m_vecpBackgroundTasks.end(); iTask++) {
205 if (*iTask == pTask) {
206 pGauge = m_vecpGauges[i];
216 BackgroundManager::resizeWindow()
218 int iHighestPosition = -1;
220 for (unsigned int i = 0; i < m_vecpPositions.size(); i++)
221 if (iHighestPosition < m_vecpPositions[i])
222 iHighestPosition = m_vecpPositions[i];
224 wxSize sizeWindow (m_sizeCell.x, m_sizeCell.y * (iHighestPosition + 1));
225 SetClientSize (sizeWindow);
226 m_pCanvas->Refresh();
231 IMPLEMENT_DYNAMIC_CLASS(BackgroundManagerCanvas, wxPanel)
232 BEGIN_EVENT_TABLE(BackgroundManagerCanvas, wxPanel)
233 //EVT_PAINT(BackgroundManagerCanvas::OnPaint)
236 BackgroundManagerCanvas::BackgroundManagerCanvas (BackgroundManager* pMgr)
237 : wxPanel (pMgr), m_pBackgroundManager(pMgr)
243 BackgroundManagerCanvas::OnPaint (wxPaintEvent& event)
246 // dc.DrawLine (0, 0, 30, 30);
247 // dc.DrawLine (30,0, 0, 30);
251 #endif // HAVE_WXTHREADS