Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "scriptconfigpanel.h"
Toshihiro Shimizu 890ddd
#include "filebrowserpopup.h"
Toshihiro Shimizu 890ddd
#include "application.h"
Toshihiro Shimizu 890ddd
#include "util.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tw/mainshell.h"
Toshihiro Shimizu 890ddd
#include "tw/label.h"
Toshihiro Shimizu 890ddd
#include "tw/button.h"
Toshihiro Shimizu 890ddd
#include "tw/keycodes.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tw/message.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace TwConsts;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PathFileField::PathFileField(TWidget *parent, string name)
Toshihiro Shimizu 890ddd
	: TTextField(parent, name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_page = dynamic_cast<ScriptConfigPanel *>(parent);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PathFileField::onFocusChange(bool on)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!on)
Toshihiro Shimizu 890ddd
		close();
Toshihiro Shimizu 890ddd
	TWidget::onFocusChange(on);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PathFileField::close()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static wstring oldText;
Toshihiro Shimizu 890ddd
	if (oldText != m_text) {
Toshihiro Shimizu 890ddd
		TFilePath fp(m_text);
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			wstring uncString;
Toshihiro Shimizu 890ddd
			try {
Toshihiro Shimizu 890ddd
				uncString = toWideString(convertToUncString(fp));
Toshihiro Shimizu 890ddd
				m_text = uncString;
Toshihiro Shimizu 890ddd
				m_page->loadScript(TFilePath(uncString));
Toshihiro Shimizu 890ddd
			} catch (TException &) {
Toshihiro Shimizu 890ddd
				TFileStatus fs(fp);
Toshihiro Shimizu 890ddd
				if (fs.doesExist() && !fs.isDirectory())
Toshihiro Shimizu 890ddd
					m_page->loadScript(fp);
Toshihiro Shimizu 890ddd
				else {
Toshihiro Shimizu 890ddd
					ScriptTask *task = dynamic_cast<ScriptTask *>(m_page->getTask());
Toshihiro Shimizu 890ddd
					if (task)
Toshihiro Shimizu 890ddd
						task->m_arg1 = toString(m_text);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			oldText = m_text;
Toshihiro Shimizu 890ddd
		} catch (...) {
Toshihiro Shimizu 890ddd
			TMessage::error("boh");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	invalidate();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PathFileField::keyDown(int key, unsigned long flags, const TPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (key == TK_Return)
Toshihiro Shimizu 890ddd
		close();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		TTextField::keyDown(key, flags, p);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
enum textFieldType {
Toshihiro Shimizu 890ddd
	M_ARG1 = 0,
Toshihiro Shimizu 890ddd
	M_ARG2,
Toshihiro Shimizu 890ddd
	M_ARG3,
Toshihiro Shimizu 890ddd
	M_ARG4,
Toshihiro Shimizu 890ddd
	M_ARG5
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ArgumentChanger : public TTextField::Action
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ScriptConfigPanel *m_scp;
Toshihiro Shimizu 890ddd
	textFieldType m_typeField;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	ArgumentChanger(ScriptConfigPanel *scp, textFieldType type)
Toshihiro Shimizu 890ddd
		: m_scp(scp), m_typeField(type)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void sendCommand(std::wstring value)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_scp->onTextField(toString(value), m_typeField);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ScriptConfigPanel::ScriptConfigPanel(TWidget *parent)
Toshihiro Shimizu 890ddd
	: TaskConfigPanel(parent), m_task(new ScriptTask())
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_fileLbl = new TLabel(this);
Toshihiro Shimizu 890ddd
	m_fileLbl->setText("Arg #1:");
Toshihiro Shimizu 890ddd
	m_file = new PathFileField(this);
Toshihiro Shimizu 890ddd
	m_browseBtn = new TButton(this);
Toshihiro Shimizu 890ddd
	m_browseBtn->setTitle("...");
Toshihiro Shimizu 890ddd
	tconnect(*m_browseBtn, this, &ScriptConfigPanel::browseFiles);
Toshihiro Shimizu 890ddd
	//m_file->addAction(new ArgumentChanger(this, M_ARG1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_arg2Lbl = new TLabel(this);
Toshihiro Shimizu 890ddd
	m_arg2Lbl->setText("Arg #2:");
Toshihiro Shimizu 890ddd
	m_arg2 = new TTextField(this);
Toshihiro Shimizu 890ddd
	m_arg2->addAction(new ArgumentChanger(this, M_ARG2));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_arg3Lbl = new TLabel(this);
Toshihiro Shimizu 890ddd
	m_arg3Lbl->setText("Arg #3:");
Toshihiro Shimizu 890ddd
	m_arg3 = new TTextField(this);
Toshihiro Shimizu 890ddd
	m_arg3->addAction(new ArgumentChanger(this, M_ARG3));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_arg4Lbl = new TLabel(this);
Toshihiro Shimizu 890ddd
	m_arg4Lbl->setText("Arg #4:");
Toshihiro Shimizu 890ddd
	m_arg4 = new TTextField(this);
Toshihiro Shimizu 890ddd
	m_arg4->addAction(new ArgumentChanger(this, M_ARG4));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_arg5Lbl = new TLabel(this);
Toshihiro Shimizu 890ddd
	m_arg5Lbl->setText("Arg #5:");
Toshihiro Shimizu 890ddd
	m_arg5 = new TTextField(this);
Toshihiro Shimizu 890ddd
	m_arg5->addAction(new ArgumentChanger(this, M_ARG5));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ScriptConfigPanel::configureNotify(const TDimension &d)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int x0 = 20;
Toshihiro Shimizu 890ddd
	int y = d.ly - 1 - 10;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int x = x0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_fileLbl->setGeometry(x, y - 15, x + 100, y);
Toshihiro Shimizu 890ddd
	m_file->setGeometry(x + 104, y - 15, x + 650, y);
Toshihiro Shimizu 890ddd
	m_browseBtn->setGeometry(x + 660, y - 15, x + 680, y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	y -= 40;
Toshihiro Shimizu 890ddd
	m_arg2Lbl->setGeometry(x, y - 15, x + 100, y);
Toshihiro Shimizu 890ddd
	m_arg2->setGeometry(x + 104, y - 15, x + 650, y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	y -= 40;
Toshihiro Shimizu 890ddd
	m_arg3Lbl->setGeometry(x, y - 15, x + 100, y);
Toshihiro Shimizu 890ddd
	m_arg3->setGeometry(x + 104, y - 15, x + 650, y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	y -= 40;
Toshihiro Shimizu 890ddd
	m_arg4Lbl->setGeometry(x, y - 15, x + 100, y);
Toshihiro Shimizu 890ddd
	m_arg4->setGeometry(x + 104, y - 15, x + 650, y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	y -= 40;
Toshihiro Shimizu 890ddd
	m_arg5Lbl->setGeometry(x, y - 15, x + 100, y);
Toshihiro Shimizu 890ddd
	m_arg5->setGeometry(x + 104, y - 15, x + 650, y);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ScriptConfigPanel::setTask(SubmitPageTask *task)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_task = dynamic_cast<ScriptTask *>(task);
Toshihiro Shimizu 890ddd
	assert(m_task);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_file->setText(m_task->m_arg1);
Toshihiro Shimizu 890ddd
	m_arg2->setText(m_task->m_arg2);
Toshihiro Shimizu 890ddd
	m_arg3->setText(m_task->m_arg3);
Toshihiro Shimizu 890ddd
	m_arg4->setText(m_task->m_arg4);
Toshihiro Shimizu 890ddd
	m_arg5->setText(m_task->m_arg5);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SubmitPageTask *ScriptConfigPanel::getTask() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_task;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ScriptConfigPanel::browseFiles()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	static FileBrowserPopup *popup = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!popup) {
Toshihiro Shimizu 890ddd
		ScriptConfigPanel *csp = this;
Toshihiro Shimizu 890ddd
		vector<string> fileTypes;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
		fileTypes.push_back("bat");
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		fileTypes.push_back("csh");
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		popup = new FileBrowserPopup(csp, fileTypes);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		popup->setOkAction(
Toshihiro Shimizu 890ddd
			new TFileBrowserPopupAction<ScriptConfigPanel>(csp, &ScriptConfigPanel::loadScript));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!popup)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath fp = Application::instance()->getCurrentFolder();
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  E'stato necessario fare questo controllo perche' il popup non e' in grado
Toshihiro Shimizu 890ddd
  di impostare opportunamente le cose
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	string path = toString(fp.getWideString()).c_str();
Toshihiro Shimizu 890ddd
	if (fp != TFilePath() && (path[0] != '\\'))
Toshihiro Shimizu 890ddd
		popup->setCurrentDir(fp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDimension d = TMainshell::getMainshell()->getSize();
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	HDC hdc = GetDC(0);
Toshihiro Shimizu 890ddd
	d.lx = GetDeviceCaps(hdc, HORZRES);
Toshihiro Shimizu 890ddd
	d.ly = GetDeviceCaps(hdc, VERTRES);
Toshihiro Shimizu 890ddd
	ReleaseDC(0, hdc);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	d -= popup->getSize();
Toshihiro Shimizu 890ddd
	//TDimension d = TMainshell::getMainshell()->getSize() - popup->getSize();
Toshihiro Shimizu 890ddd
	popup->popup(TPoint(d.lx / 2, d.ly / 2));
Toshihiro Shimizu 890ddd
	popup->setCaption("Load Script");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ScriptConfigPanel::loadScript(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!TFileStatus(fp).doesExist()) {
Toshihiro Shimizu 890ddd
		string msg = toString(fp.getWideString()) + "\n";
Toshihiro Shimizu 890ddd
		msg += "File not found\n";
Toshihiro Shimizu 890ddd
		msg += "Please verify that the path and file name are correct";
Toshihiro Shimizu 890ddd
		m_file->setText("");
Toshihiro Shimizu 890ddd
		TMessage::error(msg);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wstring uncString = fp.getWideString();
Toshihiro Shimizu 890ddd
	if (m_file->getText() != uncString)
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			uncString = toWideString(convertToUncString(fp));
Toshihiro Shimizu 890ddd
		} catch (TException &e) {
Toshihiro Shimizu 890ddd
			TMessage::error(toString(e.getMessage()));
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Application::instance()->setCurrentFolder(fp.getParentDir());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_file->setText(uncString);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
  int x = uncString.find("\\",2);
Toshihiro Shimizu 890ddd
  while (x != string::npos)
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    uncString.replace(x,1,"/",0,1);
Toshihiro Shimizu 890ddd
    x = uncString.find("\\",x+1);    
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
	m_task->m_arg1 = toString(uncString);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ScriptConfigPanel::onTextField(string value, int type)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_task)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (type) {
Toshihiro Shimizu 890ddd
	case M_ARG1:
Toshihiro Shimizu 890ddd
		m_task->m_arg1 = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case M_ARG2:
Toshihiro Shimizu 890ddd
		m_task->m_arg2 = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case M_ARG3:
Toshihiro Shimizu 890ddd
		m_task->m_arg3 = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case M_ARG4:
Toshihiro Shimizu 890ddd
		m_task->m_arg4 = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case M_ARG5:
Toshihiro Shimizu 890ddd
		m_task->m_arg5 = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}