| |
| |
| #include "serverstatuspage.h" |
| #include "tfarmcontroller.h" |
| #include "application.h" |
| #include "textlist.h" |
| #include "tw/mainshell.h" |
| #include "tw/textfield.h" |
| #include "tw/event.h" |
| |
| #include "tw/message.h" |
| |
| #include <vector> |
| #include <set> |
| using namespace std; |
| |
| |
| |
| class ServerList : public TTextList { |
| public: |
| ServerList(TWidget *parent); |
| |
| void rightButtonDown(const TMouseEvent &e); |
| |
| void onDeactivate(); |
| void onActivate(); |
| |
| TPopupMenuItem *m_activationItem; |
| TPopupMenu *m_popupMenu; |
| }; |
| |
| |
| |
| ServerList::ServerList(TWidget *parent) : TTextList(parent, "servers") { |
| m_popupMenu = new TPopupMenu(this); |
| |
| TPopupMenuItem *item = new TPopupMenuItem(m_popupMenu, "deactivate"); |
| TGuiCommand("deactivate") |
| .setAction(new TCommandAction<ServerList>(this, onDeactivate)); |
| TGuiCommand("deactivate").add(item); |
| |
| item = new TPopupMenuItem(m_popupMenu, "activate"); |
| TGuiCommand("activate") |
| .setAction(new TCommandAction<ServerList>(this, onActivate)); |
| TGuiCommand("activate").add(item); |
| } |
| |
| |
| |
| void ServerList::rightButtonDown(const TMouseEvent &e) { |
| leftButtonDown(e); |
| TTextListItem *item = getSelectedItem(0); |
| if (item) { |
| TFarmController *controller = Application::instance()->getController(); |
| ServerState state; |
| try { |
| state = controller->queryServerState2(item->getId()); |
| } catch (TException &e) { |
| TMessage::error(toString(e.getMessage())); |
| return; |
| } |
| |
| if (state != Offline) { |
| TGuiCommand("activate").disable(); |
| TGuiCommand("deactivate").enable(); |
| } else { |
| TGuiCommand("activate").enable(); |
| TGuiCommand("deactivate").disable(); |
| } |
| |
| TPoint pos = |
| getAbsolutePosition() + TPoint(e.m_pos.x, getSize().ly - e.m_pos.y); |
| m_popupMenu->popup(pos); |
| } |
| } |
| |
| |
| |
| void ServerList::onDeactivate() { |
| TTextListItem *item = getSelectedItem(0); |
| if (item) { |
| TFarmController *controller = Application::instance()->getController(); |
| try { |
| controller->deactivateServer(item->getId()); |
| } catch (TException &e) { |
| TMessage::error(toString(e.getMessage())); |
| } |
| } |
| } |
| |
| |
| |
| void ServerList::onActivate() { |
| TTextListItem *item = getSelectedItem(0); |
| if (item) { |
| TFarmController *controller = Application::instance()->getController(); |
| try { |
| controller->activateServer(item->getId()); |
| } catch (TException &e) { |
| TMessage::error(toString(e.getMessage())); |
| } |
| } |
| } |
| |
| |
| |
| class ServerStatusPage::Data { |
| public: |
| Data(ServerStatusPage *parent) { |
| m_serverList = new ServerList(parent); |
| m_serverList->setSelAction( |
| new TTextListAction<Data>(this, &Data::onServerSelection)); |
| m_name = new TTextField(parent, "name"); |
| m_ipAddress = new TTextField(parent, "ipAddress"); |
| m_portNumber = new TTextField(parent, "portNumber"); |
| m_tasks = new TTextField(parent, "tasks"); |
| m_state = new TTextField(parent, "state"); |
| m_cpuCount = new TTextField(parent, "cpuCount"); |
| m_totPhysMem = new TTextField(parent, "totalPhysMemory"); |
| |
| m_nameLbl = new TLabel(parent, "name"); |
| m_ipAddressLbl = new TLabel(parent, "ipAddress"); |
| m_portNumberLbl = new TLabel(parent, "portNumber"); |
| m_tasksLbl = new TLabel(parent, "tasks"); |
| m_stateLbl = new TLabel(parent, "state"); |
| m_cpuCountLbl = new TLabel(parent, "cpuCount"); |
| m_totPhysMemLbl = new TLabel(parent, "totalPhysMemory"); |
| } |
| ~Data() {} |
| |
| void onServerSelection(int index) { |
| TTextListItem *item = m_serverList->getSelectedItem(0); |
| if (item) { |
| showServerInfo(item->getId()); |
| } |
| } |
| |
| void showServerInfo(const string &id) { |
| TFarmController *controller = Application::instance()->getController(); |
| ServerInfo info; |
| |
| try { |
| controller->queryServerInfo(id, info); |
| } catch (TException &e) { |
| TMessage::error(toString(e.getMessage())); |
| } |
| |
| switch (info.m_state) { |
| case Ready: |
| m_state->setText("Ready"); |
| break; |
| case Busy: |
| m_state->setText("Busy"); |
| break; |
| case NotResponding: |
| m_state->setText("Not Responding"); |
| break; |
| case Down: |
| m_state->setText("Down"); |
| break; |
| case Offline: |
| m_state->setText("Offline"); |
| break; |
| case ServerUnknown: |
| m_state->setText(""); |
| m_name->setText(""); |
| m_ipAddress->setText(""); |
| m_portNumber->setText(""); |
| m_tasks->setText(""); |
| m_cpuCount->setText(""); |
| m_totPhysMem->setText(""); |
| return; |
| } |
| |
| m_name->setText(info.m_name); |
| m_ipAddress->setText(info.m_ipAddress); |
| m_portNumber->setText(info.m_portNumber); |
| if (info.m_currentTaskId == "") |
| m_tasks->setText(""); |
| else { |
| TFarmTask task; |
| try { |
| controller->queryTaskInfo(info.m_currentTaskId, task); |
| m_tasks->setText("<" + task.m_id + "> " + task.m_name); |
| } catch (TException &e) { |
| m_tasks->setText(""); |
| TMessage::error(toString(e.getMessage())); |
| } |
| } |
| |
| if (info.m_state != Down) { |
| m_cpuCount->setText(toString(info.m_cpuCount)); |
| m_totPhysMem->setText(toString((long)info.m_totPhysMem)); |
| } else { |
| m_cpuCount->setText(""); |
| m_totPhysMem->setText(""); |
| } |
| } |
| |
| void addServer(const ServerIdentity &sid) { |
| m_serverList->addItem(new TTextListItem(sid.m_id, sid.m_name)); |
| } |
| |
| void configureNotify(const TDimension &size) { |
| const int dx = 10; |
| const int dy = 5; |
| const int h = 20; |
| const int lw = 120; |
| const int leftSize = tmin(250, size.lx / 3); |
| |
| const int w = size.lx - leftSize - lw - dx * 3; |
| int left = leftSize + dx; |
| int y0 = size.ly - 30; |
| int x0; |
| |
| |
| m_serverList->setGeometry(0, 0, leftSize , size.ly - 1); |
| |
| |
| x0 = left; |
| m_nameLbl->setGeometry(x0, y0, x0 + lw, y0 + h); |
| x0 += lw + dx; |
| m_name->setGeometry(x0, y0, x0 + w, y0 + h); |
| |
| x0 = left; |
| y0 -= h + dy; |
| m_ipAddressLbl->setGeometry(x0, y0, x0 + lw, y0 + h); |
| x0 += lw + dx; |
| m_ipAddress->setGeometry(x0, y0, x0 + w, y0 + h); |
| |
| x0 = left; |
| y0 -= h + dy; |
| m_portNumberLbl->setGeometry(x0, y0, x0 + lw, y0 + h); |
| x0 += lw + dx; |
| m_portNumber->setGeometry(x0, y0, x0 + w, y0 + h); |
| |
| x0 = left; |
| y0 -= h + dy; |
| m_tasksLbl->setGeometry(x0, y0, x0 + lw, y0 + h); |
| x0 += lw + dx; |
| m_tasks->setGeometry(x0, y0, x0 + w, y0 + h); |
| |
| x0 = left; |
| y0 -= h + dy; |
| m_stateLbl->setGeometry(x0, y0, x0 + lw, y0 + h); |
| x0 += lw + dx; |
| m_state->setGeometry(x0, y0, x0 + w, y0 + h); |
| |
| x0 = left; |
| y0 -= h + dy; |
| m_cpuCountLbl->setGeometry(x0, y0, x0 + lw, y0 + h); |
| x0 += lw + dx; |
| m_cpuCount->setGeometry(x0, y0, x0 + w, y0 + h); |
| |
| x0 = left; |
| y0 -= h + dy; |
| m_totPhysMemLbl->setGeometry(x0, y0, x0 + lw, y0 + h); |
| x0 += lw + dx; |
| m_totPhysMem->setGeometry(x0, y0, x0 + w, y0 + h); |
| } |
| |
| TTextList *m_serverList; |
| |
| TTextField *m_name, *m_ipAddress, *m_portNumber, *m_tasks, *m_state, |
| *m_cpuCount, *m_totPhysMem; |
| |
| TLabel *m_nameLbl, *m_ipAddressLbl, *m_portNumberLbl, *m_tasksLbl, |
| *m_stateLbl, *m_cpuCountLbl, *m_totPhysMemLbl; |
| }; |
| |
| |
| |
| void ServerStatusPage::onActivate() { |
| TFarmController *controller = Application::instance()->getController(); |
| try { |
| vector<ServerIdentity> servers; |
| controller->getServers(servers); |
| vector<ServerIdentity>::iterator it = servers.begin(); |
| for (; it != servers.end(); ++it) m_data->addServer(*it); |
| } catch (TException &e) { |
| TMessage::error(toString(e.getMessage())); |
| } |
| } |
| |
| |
| |
| void ServerStatusPage::onDeactivate() {} |
| |
| |
| |
| ServerStatusPage::ServerStatusPage(TWidget *parent) |
| : TabPage(parent, "Servers") { |
| m_data = new Data(this); |
| } |
| |
| |
| |
| ServerStatusPage::~ServerStatusPage() {} |
| |
| |
| |
| void ServerStatusPage::configureNotify(const TDimension &size) { |
| m_data->configureNotify(size); |
| } |
| |
| |
| |
| void ServerStatusPage::update() { |
| TFarmController *controller = Application::instance()->getController(); |
| vector<ServerIdentity> servers; |
| try { |
| controller->getServers(servers); |
| } catch (TException &e) { |
| TMessage::error(toString(e.getMessage())); |
| return; |
| } |
| |
| vector<ServerIdentity>::iterator it = servers.begin(); |
| vector<ServerIdentity> newServers; |
| std::set<int> oldServers; |
| TTextList *sl = m_data->m_serverList; |
| for (; it != servers.end(); ++it) { |
| int index; |
| if ((index = sl->itemToIndex(it->m_id)) == -1) |
| newServers.push_back(*it); |
| else |
| oldServers.insert(index); |
| } |
| int i = 0, count = sl->getItemCount(); |
| for (; i < count; ++i) |
| if (oldServers.find(i) == oldServers.end()) { |
| string itemId = sl->getItem(i)->getId(); |
| |
| |
| |
| |
| sl->removeItem(itemId); |
| } |
| it = newServers.begin(); |
| for (; it != newServers.end(); it++) |
| sl->addItem(new TTextListItem(it->m_id, it->m_name)); |
| |
| TTextListItem *item = m_data->m_serverList->getSelectedItem(0); |
| if (item) m_data->showServerInfo(item->getId()); |
| invalidate(); |
| } |
| |