Blob Blame Raw


#include "tfarmcontroller.h"
#include "application.h"
#include "dependedlist.h"
#include "submitpage.h"

#include "tw/message.h"

#include <vector>

using namespace std;

DependedList::DependedList(TWidget *parent)
	: TWidget(parent)
{
	m_depList = new TTextList(this);

	m_add = new TButton(this, "Add");
	tconnect<DependedList>(*(m_add), this, onAdd);

	m_remove = new TButton(this, "Remove");
	tconnect<DependedList>(*(m_remove), this, onRemove);
}

//------------------------------------------------------------------------------

void DependedList::configureNotify(const TDimension &size)
{
	const int leftSize = size.lx / 3;
	m_depList->setGeometry(0, 0, leftSize, size.ly - 1);

	TDimension buttonSize(60, 15);
	int x = leftSize + 30;
	int y0 = size.ly - 10;

	m_add->setGeometry(x, y0 - buttonSize.ly, x + buttonSize.lx, y0);
	y0 -= (buttonSize.ly + 10);
	m_remove->setGeometry(x, y0 - buttonSize.ly, x + buttonSize.lx, y0);
}

//------------------------------------------------------------------------------

void DependedList::onRemove()
{
	if (!m_depList->getSelectedItem(0))
		return;

	int count = m_depList->getSelectedItemCount();
	int i = 0;
	for (; i < count; ++i) {
		string id = m_depList->getSelectedItemId(i);
		m_tasks.erase(m_tasks.find(id));
		m_depList->removeItem(id);
	}

	m_depList->invalidate();

	SubmitPage *submitPage = dynamic_cast<SubmitPage *>(getParent());
	if (submitPage) {
		SubmitPageTask *task = submitPage->getTask();
		if (task)
			task->setDependencies(m_tasks);
	}
}

//------------------------------------------------------------------------------

void DependedList::clearAll()
{
	m_depList->clearAll();
	m_tasks.erase(m_tasks.begin(), m_tasks.end());
}

//------------------------------------------------------------------------------

void DependedList::onAdd()
{
	static DependedPopup *popup = 0;

	if (!popup) {
		popup = new DependedPopup(this);

		popup->setOkAction(
			new TDependedPopupAction<DependedList>(this, &DependedList::AddItems));
	}

	if (!popup)
		return;

	TFarmController *controller = Application::instance()->getController();
	vector<TaskShortInfo> tasks;
	try {
		controller->getTasks("", tasks);
	} catch (TException &e) {
		TMessage::error(toString(e.getMessage()));
		return;
	}

	popup->setList(tasks);

	TDimension d = TMainshell::getMainshell()->getSize();
#ifdef WIN32
	HDC hdc = GetDC(0);
	d.lx = GetDeviceCaps(hdc, HORZRES);
	d.ly = GetDeviceCaps(hdc, VERTRES);
	ReleaseDC(0, hdc);
#endif

	d -= popup->getSize();
	popup->popup(TPoint(d.lx / 2, d.ly / 2));
	popup->setCaption("Tasks Submitted");
}

//------------------------------------------------------------------------------

void DependedList::AddItems(const vector<string> &tasksId)
{
	TFarmController *controller = Application::instance()->getController();
	vector<string>::const_iterator it = tasksId.begin();
	for (; it != tasksId.end(); ++it)
		if (m_tasks.end() == m_tasks.find(*it)) {
			try {
				string parentId, name;
				TaskState status;
				controller->queryTaskShortInfo(*it, parentId, name, status);
				string label = "<" + *it + "> " + name;
				m_depList->addItem(new TTextListItem(*it, label));
				m_tasks.insert(make_pair(*it, label));
			} catch (TException &e) {
				TMessage::error(toString(e.getMessage()));
			}
		}
	m_depList->invalidate();

	SubmitPage *submitPage = dynamic_cast<SubmitPage *>(getParent());
	if (submitPage) {
		SubmitPageTask *task = submitPage->getTask();
		if (task)
			task->setDependencies(m_tasks);
	}
}

//------------------------------------------------------------------------------

void DependedList::setList(const std::map<string, string> &tasks)
{
	m_depList->clearAll();
	std::map<string, string>::const_iterator it = tasks.begin();
	for (; it != tasks.end(); ++it)
		m_depList->addItem(new TTextListItem((*it).first, (*it).second));
	m_tasks = tasks;
	invalidate();
}

//==============================================================================

DependedPopup::DependedPopup(TWidget *parent)
	: TModalPopup(parent, "DependedList"), m_okAction(0)
{
	m_submitList = new TTextList(this);

	m_ok = new TButton(this, "Ok");
	tconnect<DependedPopup>(*(m_ok), this, onOk);

	m_cancel = new TButton(this, "Cancel");
	tconnect<DependedPopup>(*(m_cancel), this, TPopup::close);
}

//------------------------------------------------------------------------------

void DependedPopup::configureNotify(const TDimension &size)
{
	const int bottomSize = 35;
	m_submitList->setGeometry(0, bottomSize, size.lx - 1, size.ly - 1);

	TDimension buttonSize(60, 15);
	int x1 = 30;
	int x2 = size.lx - x1;
	int y0 = bottomSize - 10;

	m_ok->setGeometry(x1, y0 - buttonSize.ly, x1 + buttonSize.lx, y0);
	m_cancel->setGeometry(x2 - buttonSize.lx, y0 - buttonSize.ly, x2, y0);
}

//------------------------------------------------------------------------------

TDimension DependedPopup::getPreferredSize() const
{
	return TDimension(400, 300);
}

//------------------------------------------------------------------------------

void DependedPopup::onOk()
{
	assert(m_okAction);
	vector<string> tasks;
	if (m_submitList->getSelectedItem(0)) {
		int count = m_submitList->getSelectedItemCount();
		int i = 0;
		for (; i < count; ++i)
			tasks.push_back(m_submitList->getSelectedItemId(i));
	}
	try {
		m_okAction->sendCommand(tasks);
		close();
	} catch (TException &e) {
		TMessage::error(toString(e.getMessage()));
	}
}

//------------------------------------------------------------------------------

void DependedPopup::setList(const vector<TaskShortInfo> &tasks)
{
	m_submitList->clearAll();

	vector<TaskShortInfo>::const_iterator it = tasks.begin();
	for (; it != tasks.end(); ++it) {
		string label = "<" + (*it).m_id + "> " + (*it).m_name;
		m_submitList->addItem(new TTextListItem((*it).m_id, label));
	}
}

//------------------------------------------------------------------------------

void DependedPopup::setOkAction(TGenericDependedPopupAction *action)
{
	m_okAction = action;
}