/* Copyright (C) 2021 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. 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 2 of the License, or
* (at your option) any later version.
*
* 0 A.D. 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 0 A.D. If not, see .
*/
#include "precompiled.h"
#include "FieldEditCtrl.h"
#include "EditableListCtrlCommands.h"
#include "ListCtrlValidator.h"
#include "QuickTextCtrl.h"
#include "QuickComboBox.h"
#include "QuickFileCtrl.h"
#include "Windows/AtlasDialog.h"
#include "EditableListCtrl/EditableListCtrl.h"
#include "AtlasObject/AtlasObject.h"
#include "AtlasObject/AtlasObjectText.h"
#include "General/Datafile.h"
#include "wx/colour.h"
#include "wx/colordlg.h"
#include "wx/regex.h"
#include "wx/filename.h"
#include
//////////////////////////////////////////////////////////////////////////
void FieldEditCtrl_Text::StartEdit(wxWindow* parent, wxRect rect, long row, int col)
{
ListCtrlValidator validator((EditableListCtrl*)parent, row, col);
new QuickTextCtrl(parent, rect, validator);
}
//////////////////////////////////////////////////////////////////////////
void FieldEditCtrl_Color::StartEdit(wxWindow* parent, wxRect WXUNUSED(rect), long row, int col)
{
EditableListCtrl* editCtrl = (EditableListCtrl*)parent;
wxColor oldColor;
wxString oldColorStr (editCtrl->GetCellObject(row, col));
// Parse the "r g b" color string (and ignore leading/trailing junk)
wxRegEx re (_T("([0-9]+) ([0-9]+) ([0-9]+)")); // don't use \d, since that requires wxRE_ADVANCED
wxASSERT(re.IsValid());
if (re.Matches(oldColorStr))
{
wxASSERT(re.GetMatchCount() == 4); // 1 for matched string, +3 for captured groups
long r, g, b;
re.GetMatch(oldColorStr, 1).ToLong(&r);
re.GetMatch(oldColorStr, 2).ToLong(&g);
re.GetMatch(oldColorStr, 3).ToLong(&b);
oldColor = wxColor(r, g, b);
}
wxColor newColor = wxGetColourFromUser(parent, oldColor);
if (newColor.IsOk()) // test whether the user cancelled the selection
{
wxString newColorStr = wxString::Format(_T("%d %d %d"), newColor.Red(), newColor.Green(), newColor.Blue());
AtlasWindowCommandProc::GetFromParentFrame(editCtrl)->Submit(
new EditCommand_Text(editCtrl, row, col, newColorStr)
);
}
}
//////////////////////////////////////////////////////////////////////////
void FieldEditCtrl_Boolean::StartEdit(wxWindow* parent, wxRect rect, long row, int col)
{
wxArrayString choices;
// The famous three-valued boolean.
choices.Add("true");
choices.Add("false");
choices.Add("");
ListCtrlValidator validator((EditableListCtrl*)parent, row, col);
new QuickComboBox(parent, rect, choices, validator);
}
//////////////////////////////////////////////////////////////////////////
FieldEditCtrl_List::FieldEditCtrl_List(const char* listType)
: m_ListType(listType)
{
}
void FieldEditCtrl_List::StartEdit(wxWindow* parent, wxRect rect, long row, int col)
{
wxArrayString choices;
AtObj list (Datafile::ReadList(m_ListType));
for (AtIter it = list["item"]; it.defined(); ++it)
choices.Add((wxString)it);
ListCtrlValidator validator((EditableListCtrl*)parent, row, col);
new QuickComboBox(parent, rect, choices, validator);
}
//////////////////////////////////////////////////////////////////////////
FieldEditCtrl_Dialog::FieldEditCtrl_Dialog(AtlasDialog* (*dialogCtor)(wxWindow*))
: m_DialogCtor(dialogCtor)
{
}
void FieldEditCtrl_Dialog::StartEdit(wxWindow* parent, wxRect WXUNUSED(rect), long row, int col)
{
AtlasDialog* dialog = m_DialogCtor(parent);
wxCHECK2(dialog, return);
dialog->SetParent(parent);
EditableListCtrl* editCtrl = (EditableListCtrl*)parent;
AtObj in (editCtrl->GetCellObject(row, col));
dialog->ImportData(in);
int ret = dialog->ShowModal();
if (ret == wxID_OK)
{
AtObj out (dialog->ExportData());
AtlasWindowCommandProc::GetFromParentFrame(parent)->Submit(
new EditCommand_Dialog(editCtrl, row, col, out)
);
}
delete dialog;
}
//////////////////////////////////////////////////////////////////////////
FieldEditCtrl_File::FieldEditCtrl_File(const wxString& rootDir, const wxString& fileMask)
: m_RootDir(rootDir), m_FileMask(fileMask)
{
// Make the rootDir path absolute (where rootDir is relative to binaries/system),
// defaulting to the 'public' mod:
wxFileName path (_T("mods/public/") + rootDir);
wxASSERT(path.IsOk());
path.MakeAbsolute(Datafile::GetDataDirectory());
wxASSERT(path.IsOk());
m_RememberedDir = path.GetPath();
}
void FieldEditCtrl_File::StartEdit(wxWindow* parent, wxRect rect, long row, int col)
{
ListCtrlValidator validator((EditableListCtrl*)parent, row, col);
new QuickFileCtrl(parent, rect, m_RootDir, m_FileMask, m_RememberedDir, validator);
}