campo-sirio/fd/gtDialog.cpp
guy 15ceb346c3 Modulo speciale autonomo per firma digitale
git-svn-id: svn://10.65.10.50/branches/R_10_00@22958 c028cbd2-c16b-5b4b-a496-9718f37d4682
2014-06-24 12:40:43 +00:00

1205 lines
34 KiB
C++

#include "wxinc.h"
#include "gtArt.h"
#include "gtDialog.h"
#include <wx/aui/aui.h>
#include <wx/datectrl.h>
#include <wx/dateevt.h>
#include <wx/dir.h>
#include <wx/filename.h>
#include <wx/taskbar.h>
///////////////////////////////////////////////////////////
// gt*Box
///////////////////////////////////////////////////////////
#define APPFULLNAME wxAppConsole::GetInstance()->GetAppName()
bool gtMessage(const wxString str)
{
wxMessageBox(str, APPFULLNAME, wxOK | wxCENTRE | wxICON_INFORMATION);
return false;
}
bool gtWarning(const wxString str)
{
wxMessageBox(str, APPFULLNAME, wxOK | wxCENTRE | wxICON_EXCLAMATION);
return false;
}
bool gtError(const wxString str)
{
wxMessageBox(str, APPFULLNAME, wxOK | wxCENTRE | wxICON_ERROR);
return false;
}
bool gtAsk(const wxString str)
{
const int a = wxMessageBox(str, APPFULLNAME, wxYES_NO | wxCENTRE | wxICON_QUESTION);
return a == wxYES;
}
bool TryToUpdateFile(const wxString& strFile)
{
while (wxFileName::FileExists(strFile) && !wxFileName::IsFileWritable(strFile))
{
wxLogWarning("Can't update %s", (const char*)strFile);
wxString msg = "Impossibile aggiornare il file " + strFile;
msg += "\nProbabilmente il file è in uso esclusivo da parte di ";
if (strFile.Find(".xls") > 0 || strFile.Find(".doc") > 0)
msg += "Office"; else
if (strFile.Find(".dwg") > 0 || strFile.Find(".dxf") > 0)
msg += "Autocad";
else
msg += "un'altra applicazione";
msg += ".\nSi desidera ritentare dopo averlo chiuso?";
if (!gtAsk(msg))
return false;
}
return true;
}
bool TryToRemoveFile(wxString& strFile)
{
wxFileName fn(strFile);
bool ok = true;
while (fn.FileExists())
{
ok = TryToUpdateFile(strFile);
if (ok)
::wxRemoveFile(strFile);
else
{
strFile = wxFileSelector("Selezionare un nome alternativo", fn.GetPath(), fn.GetName()+"SAV."+fn.GetExt(), fn.GetExt(),
wxFileSelectorDefaultWildcardStr, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
ok = !strFile.IsEmpty();
if (!ok)
break;
fn = strFile;
}
}
return ok;
}
///////////////////////////////////////////////////////////
// gtNumberCtrl
///////////////////////////////////////////////////////////
class gtRealValidator : public wxTextValidator
{
protected:
virtual wxValidator* Clone() const { return new gtRealValidator; }
public:
gtRealValidator();
};
gtRealValidator::gtRealValidator()
: wxTextValidator(wxFILTER_INCLUDE_CHAR_LIST)
{
const wxChar* inc = wxT("0123456789e+-.,");
wxArrayString a;
for (const wxChar* i = inc; *i; i++)
a.Add(wxString(*i));
SetIncludes(a);
}
class gtNumberCtrl : public wxTextCtrl
{
protected:
gtNumberCtrl(wxWindow* parent, const wxString& id, wxSize sz, long flags, const wxTextValidator& val);
public:
virtual wxString GetValue() const;
gtNumberCtrl(wxWindow* parent, const wxString& id, wxSize sz = wxSize(64, -1), long flags = wxTE_RIGHT);
};
wxString gtNumberCtrl::GetValue() const
{
wxString str = wxTextCtrl::GetValue();
str.Replace(wxT(","), wxT("."));
return str;
}
gtNumberCtrl::gtNumberCtrl(wxWindow* parent, const wxString& id, wxSize sz, long flags, const wxTextValidator& val)
: wxTextCtrl(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, sz, flags | wxTE_RIGHT, val, id)
{ }
gtNumberCtrl::gtNumberCtrl(wxWindow* parent, const wxString& id, wxSize sz, long flags)
: wxTextCtrl(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, sz, flags | wxTE_RIGHT,
gtRealValidator(), id)
{ }
///////////////////////////////////////////////////////////
// gtNaturalCtrl
///////////////////////////////////////////////////////////
class gtNaturalCtrl : public gtNumberCtrl
{
public:
gtNaturalCtrl(wxWindow* parent, const wxString& id, wxSize sz = wxSize(64, -1), long flags = wxTE_RIGHT);
};
gtNaturalCtrl::gtNaturalCtrl(wxWindow* parent, const wxString& id, wxSize sz, long flags)
: gtNumberCtrl(parent, id, sz, flags, wxTextValidator(wxFILTER_NUMERIC, NULL))
{ }
///////////////////////////////////////////////////////////
// gtFloatCtrl
///////////////////////////////////////////////////////////
class gtFloatValidator : public wxTextValidator
{
protected:
virtual wxValidator* Clone() const { return new gtFloatValidator; }
public:
gtFloatValidator();
};
gtFloatValidator::gtFloatValidator()
: wxTextValidator(wxFILTER_INCLUDE_CHAR_LIST)
{
const wxChar* inc = wxT("0123456789-.,");
wxArrayString a;
for (const wxChar* i = inc; *i; i++)
a.Add(wxString(*i));
SetIncludes(a);
}
class gtFloatCtrl : public gtNumberCtrl
{
public:
gtFloatCtrl(wxWindow* parent, const wxString& id, int nFlags = wxTE_RIGHT);
};
gtFloatCtrl::gtFloatCtrl(wxWindow* parent, const wxString& id, int nFlags)
: gtNumberCtrl(parent, id, wxSize(64,-1), nFlags, gtFloatValidator())
{ }
///////////////////////////////////////////////////////////
// gt01Ctrl
///////////////////////////////////////////////////////////
class gt01Validator : public wxTextValidator
{
protected:
virtual wxValidator* Clone() const { return new gt01Validator; }
public:
gt01Validator();
};
gt01Validator::gt01Validator()
: wxTextValidator(wxFILTER_INCLUDE_CHAR_LIST)
{
const wxChar* inc = wxT("0123456789.,");
wxArrayString a;
for (const wxChar* i = inc; *i; i++)
a.Add(wxString(*i));
SetIncludes(a);
}
class gt01Ctrl : public gtNumberCtrl
{
public:
virtual wxString GetValue() const;
gt01Ctrl(wxWindow* parent, const wxString& id);
};
wxString gt01Ctrl::GetValue() const
{
wxString str = gtNumberCtrl::GetValue();
double d; str.ToDouble(&d);
if (d < 0) str = wxEmptyString; else
if (d > 1) str = wxT("1");
return str;
}
gt01Ctrl::gt01Ctrl(wxWindow* parent, const wxString& id)
: gtNumberCtrl(parent, id, wxSize(40,-1), wxTE_RIGHT, gt01Validator())
{ }
///////////////////////////////////////////////////////////
// gtCoordCtrl
///////////////////////////////////////////////////////////
class gtCoordCtrl : public gtNumberCtrl
{
public:
static wxColour Axis2Color(int a);
static wxString Axis2Label(int a);
gtCoordCtrl(wxWindow* parent, const wxString& id, int axis);
};
wxColour gtCoordCtrl::Axis2Color(int a)
{
static const wxColour col[4] = { *wxRED, *wxGREEN, *wxBLUE, *wxWHITE };
wxASSERT(a >= 0 && a <= 3);
return ModulatedColor(col[a], 190);
}
wxString gtCoordCtrl::Axis2Label(int a)
{
static const wxChar* lab[4] = { wxT("x"), wxT("y"), wxT("z"), wxT("t") };
wxASSERT(a >= 0 && a <= 3);
return wxString(lab[a]);
}
gtCoordCtrl::gtCoordCtrl(wxWindow* parent, const wxString& id, int a)
: gtNumberCtrl(parent, id, wxSize(80,-1))
{ SetBackgroundColour(Axis2Color(a)); }
///////////////////////////////////////////////////////////
// gtComboBox
///////////////////////////////////////////////////////////
class gtComboBox : public wxComboBox
{
DECLARE_DYNAMIC_CLASS(gtComboBox);
public:
virtual wxString GetValue() const;
virtual void SetValue(const wxString& value);
gtComboBox() {}
gtComboBox(wxWindow *parent,
wxWindowID id,
const wxString& value,
const wxPoint& pos,
const wxSize& size,
const wxArrayString& choices,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxComboBoxNameStr)
: wxComboBox(parent, id, value, pos, size, choices, style, validator, name) {}
};
IMPLEMENT_DYNAMIC_CLASS(gtComboBox, wxComboBox);
wxString gtComboBox::GetValue() const
{
const wxString str = GetStringSelection();
return str.BeforeFirst('-').Trim();
}
void gtComboBox::SetValue(const wxString& value)
{
const size_t n = GetCount();
int i = 0;
if (n > 1)
{
for (i = n-1; i > 0; i--)
{
if (GetString(i).StartsWith(value))
break;
}
}
SetSelection(i);
}
///////////////////////////////////////////////////////////
// gtBaseDlg
///////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC_CLASS(gtBaseDlg, wxDialog);
BEGIN_EVENT_TABLE(gtBaseDlg, wxDialog)
EVT_IDLE(gtBaseDlg::OnIdle)
END_EVENT_TABLE()
bool gtBaseDlg::Init()
{
if (GetSizer() == NULL)
{
const int nSize = 128*3;
wxSizer* pMainSizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* pSplitBox = new wxBoxSizer(wxHORIZONTAL);
pMainSizer->Add(pSplitBox, 1, wxGROW);
m_rgbTheme = *wxLIGHT_GREY;
const wxString strLogo = wxT("fd0logo.png");
if (wxFileName::FileExists(strLogo))
{
wxImage img(strLogo, wxBITMAP_TYPE_PNG);
if (img.GetWidth() > img.GetHeight())
img = img.Rotate90(false);
const int nHeight = img.GetHeight();
const int nWidth = img.GetWidth();
if (nHeight > nSize)
img.Rescale(nWidth * nSize / nHeight, nSize, wxIMAGE_QUALITY_HIGH);
const wxBitmap bmp(img);
pSplitBox->Add(new wxStaticBitmap(this, wxID_ANY, bmp), 0, wxALL, 2);
m_rgbTheme = wxColour(img.GetRed(0,0), img.GetGreen(0,0), img.GetBlue(0,0));
}
wxSizer* pButtons = CreateButtonSizer(wxOK | wxCANCEL);
pMainSizer->Add(pButtons, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM);
wxSizer* pRightSizer = new wxBoxSizer(wxVERTICAL);
pRightSizer->SetMinSize(nSize, nSize);
pSplitBox->Add(pRightSizer, 1, wxGROW);
/*
for (int i = pButtons->GetChildren().GetCount()-1; i >= 0; i--)
{
const wxSizerItem* si = pButtons->GetItem(i);
wxButton* pButton = wxDynamicCast(si->GetWindow(), wxButton);
if (pButton != NULL)
{
wxArtID id;
switch (pButton->GetId())
{
case wxID_OK : id = wxART_GO_FORWARD; break;
case wxID_CANCEL: id = wxART_ERROR; break;
default: break;
}
if (!id.IsEmpty())
{
const wxBitmap bmp = wxArtProvider::GetBitmap(id, wxART_BUTTON);
if (bmp.IsOk())
pButton->SetBitmap(bmp);
}
}
}
*/
SetSizerAndFit(pMainSizer); // Useful inside the following call
CreateControls(*pRightSizer);
}
return true;
}
bool gtBaseDlg::gtError(const wxString msg)
{
m_msg = msg;
return false;
}
void gtBaseDlg::OnIdle(wxIdleEvent& evt)
{
if (!m_msg.IsEmpty())
{
::gtError(m_msg);
m_msg.Empty();
}
else
evt.Skip();
}
wxButton* gtBaseDlg::PrependButton(wxWindowID id, wxString strLabel, wxArtID art)
{
if (GetSizer() == NULL)
Init();
wxSizer* pMainSizer = GetSizer();
wxSizerItemList& list = pMainSizer->GetChildren();
wxSizerItem* pButtonsItem = list.GetLast()->GetData();
wxSizer* pButtons = pButtonsItem->GetSizer();
wxButton* pButt = new wxButton(this, id, strLabel);
// if (!art.IsEmpty()) pButt->SetBitmap(wxArtProvider::GetBitmap(art, wxART_BUTTON));
pButtons->Insert(0, pButt);
return pButt;
}
gtBaseDlg::gtBaseDlg(const wxString& strTitle, int nFlags)
: wxDialog(NULL, wxID_ANY, strTitle,
wxDefaultPosition, wxDefaultSize,
(nFlags ? nFlags : wxDEFAULT_DIALOG_STYLE) | wxCENTRE)
{
wxFrame* pFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame);
if (pFrame != NULL)
{
const wxIcon ico = pFrame->GetIcon();
if (ico.Ok())
SetIcon(ico);
}
}
///////////////////////////////////////////////////////////
// gtPropertyDlg
///////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC_CLASS(gtPropertyDlg, gtBaseDlg)
void gtPropertyDlg::OnTextChanged(wxFocusEvent& evt)
{
wxTextCtrl* pText = wxDynamicCast(evt.GetEventObject(), wxTextCtrl);
if (pText != NULL && pText->IsModified())
{
wxVariant var(pText->GetValue(), pText->GetName());
if (!OnValidateProperty(var) || !OnPropertyChanged(var))
{
// veto!
}
}
evt.Skip(true);
}
void gtPropertyDlg::OnComboChanged(wxCommandEvent& evt)
{
const wxObject* pObj = evt.GetEventObject();
wxVariant var;
gtComboBox* pStrCombo = wxDynamicCast(pObj, gtComboBox);
if (pStrCombo != NULL)
var = wxVariant(pStrCombo->GetValue(), pStrCombo->GetName());
else
{
const wxComboBox* pCombo = wxStaticCast(pObj, wxComboBox);
var = wxVariant(pCombo->GetCurrentSelection(), pCombo->GetName());
}
if (!var.IsNull() && OnValidateProperty(var))
OnPropertyChanged(var);
}
void gtPropertyDlg::OnRadioBoxChanged(wxCommandEvent& evt)
{
const wxObject* pObj = evt.GetEventObject();
wxRadioBox* pRadio = wxDynamicCast(pObj, wxRadioBox);
wxVariant var = wxVariant(pRadio->GetSelection(), pRadio->GetName());
if (!var.IsNull() && OnValidateProperty(var))
OnPropertyChanged(var);
}
void gtPropertyDlg::OnCheckChanged(wxCommandEvent& evt)
{
const wxCheckBox* pCheck = wxStaticCast(evt.GetEventObject(), wxCheckBox);
wxVariant var(pCheck->GetValue(), pCheck->GetName());
if (OnValidateProperty(var))
OnPropertyChanged(var);
}
void gtPropertyDlg::OnDateChanged(wxCalendarEvent& evt)
{
/*
const wxCalendarCtrl* pDate = wxStaticCast(evt.GetEventObject(), wxCalendarCtrl);
wxVariant var(evt.GetDate(), pDate->GetName());
if (OnValidateProperty(var))
OnPropertyChanged(var);
*/
}
void gtPropertyDlg::OnDatePickChanged(wxDateEvent& evt)
{
const wxDatePickerCtrl* pDate = wxStaticCast(evt.GetEventObject(), wxDatePickerCtrl);
wxVariant var(evt.GetDate(), pDate->GetName());
if (OnValidateProperty(var))
OnPropertyChanged(var);
}
struct GTTableInfo : public wxObject
{
wxString m_strTable;
};
void gtPropertyDlg::OnSqlPressed(wxCommandEvent& evt)
{
wxWindow* pButton = wxStaticCast(evt.GetEventObject(), wxWindow);
const wxString strProp = pButton->GetName().Mid(4); // Btn_TABLENAME
const GTTableInfo* info = (const GTTableInfo*)evt.m_callbackUserData;
if (info && info->m_strTable.StartsWith("*."))
{
const wxString ext = info->m_strTable.Mid(2);
wxString str;
if (!ext.IsEmpty())
{
wxString filter;
filter << info->m_strTable << "|(File " << ext << ")|";
str << wxT("Selezionare il file di tipo ") << ext;
str = wxFileSelector(str, NULL, NULL, ext, NULL, 0, this);
}
else
{
str = wxT("Selezionare una cartella");
str = wxDirSelector(str, GetString(strProp), wxDD_DEFAULT_STYLE, wxDefaultPosition, this);
}
if (!str.IsEmpty())
SetProperty(strProp, str);
}
}
void gtPropertyDlg::CreateControls(wxSizer& sizer)
{
const int dx = 320;
const int dy = dx * ((1 + sqrt(5.0))/2.0);
m_pNoteBook = new wxAuiNotebook(this, wxID_ANY, wxDefaultPosition, wxSize(dx,dy),
wxAUI_NB_TAB_FIXED_WIDTH | wxAUI_NB_SCROLL_BUTTONS);
sizer.Add(m_pNoteBook, 1, wxGROW);
AddPage(_("Proprietà"));
}
bool gtPropertyDlg::TransferDataToWindow()
{
bool ok = gtBaseDlg::TransferDataToWindow();
if (ok && m_pNoteBook == NULL)
ok = Init();
return ok;
}
bool gtPropertyDlg::TransferDataFromWindow()
{
const bool ok = m_pNoteBook != NULL && gtBaseDlg::TransferDataFromWindow();
return ok;
}
void gtPropertyDlg::AddPage(const wxString& strLabel)
{
wxASSERT(m_pNoteBook != NULL);
wxPanel* pPanel = new wxPanel(m_pNoteBook);
m_pNoteBook->AddPage(pPanel, strLabel);
wxFlexGridSizer* pGrid = new wxFlexGridSizer(2);
pGrid->AddGrowableCol(1, 1);
pPanel->SetSizer(pGrid);
pGrid->SetSizeHints(pPanel);
}
wxPanel* gtPropertyDlg::GetCurrPanel()
{
wxASSERT(m_pNoteBook != NULL);
wxWindow* pWindow = m_pNoteBook->GetPage(m_pNoteBook->GetPageCount()-1);
return wxStaticCast(pWindow, wxPanel);
}
void gtPropertyDlg::AddCategory(const wxString& strLabel)
{
wxPanel* pPanel = GetCurrPanel();
wxGridSizer* pSizer = wxStaticCast(pPanel->GetSizer(), wxGridSizer);
wxStaticText* pText = new wxStaticText(pPanel, wxID_ANY, " " + strLabel + " ",
wxDefaultPosition, wxDefaultSize, 0);
const wxColour& rgb = ThemeColour();
pText->SetForegroundColour(gtContrastingColor(rgb));
pText->SetBackgroundColour(rgb);
pSizer->Add(pText, 1, wxGROW|wxALIGN_CENTER_VERTICAL);
for (int i = pSizer->GetCols(); i > 1; i--)
{
// pSizer->AddSpacer(4);
wxStaticText* pSpacer = new wxStaticText(pPanel, wxID_ANY, "");
pSpacer->SetBackgroundColour(rgb);
pSizer->Add(pSpacer, 1, wxGROW|wxALIGN_CENTER_VERTICAL);
}
}
static void SetPropertyHint(wxWindow& p, const wxString& strHint)
{
if (!strHint.IsEmpty())
{
p.SetToolTip(strHint);
}
}
void gtPropertyDlg::AddLabel(const wxString& strLabel)
{
if (!strLabel.IsEmpty())
{
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
wxStaticText* pText = new wxStaticText(pPanel, wxID_ANY, strLabel);
pSizer->Add(pText, 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);
}
}
void gtPropertyDlg::AddProperty(const char* strName, const wxString& strValue, const wxString& strLabel,
long flags, const wxString& strHint)
{
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
AddLabel(strLabel);
const wxString strHandle = strName;
const wxSize sz((flags & wxTE_READONLY) ? -1 : 128, -1);
wxTextCtrl* pText = new wxTextCtrl(pPanel, wxID_ANY, strValue,
wxDefaultPosition, sz,
flags, wxDefaultValidator, strHandle);
pText->Connect(wxEVT_KILL_FOCUS,
wxFocusEventHandler(gtPropertyDlg::OnTextChanged),
NULL, this);
//SetPropertyColor(*pText);
SetPropertyHint(*pText, strHint);
if (flags & wxTE_READONLY)
{
pText->Disable();
pSizer->Add(pText, 0, wxALL, 1); // Evita resizing campi fissi
}
else
pSizer->Add(pText, 1, wxGROW|wxALL, 1);
m_hControls[strName] = pText;
}
void gtPropertyDlg::AddProperty(const char* strName, const wxArrayString& aLabels, int nValue,
const wxString& strLabel, long flags)
{
const wxString strHandle = strName;
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
if ((flags & wxTE_MULTILINE) || aLabels.GetCount() == 2)
{
wxRadioBox* pBox = new wxRadioBox(pPanel, wxID_ANY, strLabel, wxDefaultPosition, wxDefaultSize,
aLabels, 0, wxRA_SPECIFY_ROWS, wxDefaultValidator, strHandle);
pBox->Connect(wxEVT_COMMAND_RADIOBOX_SELECTED,
wxCommandEventHandler(gtPropertyDlg::OnRadioBoxChanged), NULL, this);
pSizer->Add(pBox, 1, wxALL | wxGROW, 1);
pSizer->AddSpacer(8);
}
else
{
AddLabel(strLabel);
wxComboBox* pBox = new wxComboBox(pPanel, wxID_ANY, aLabels[nValue], wxDefaultPosition, wxDefaultSize,
aLabels, flags | wxCB_READONLY, wxDefaultValidator, strHandle);
pSizer->Add(pBox, 1, wxGROW | wxALL, 2);
if (flags & wxTE_READONLY)
{
pBox->Disable();
}
else
{
pBox->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED ,
wxCommandEventHandler(gtPropertyDlg::OnComboChanged), NULL, this);
}
m_hControls[strName] = pBox;
}
}
void gtPropertyDlg::AddProperty(const char* strName, const wxArrayString& aLabels, const wxString& strValue,
const wxString& strLabel, long flags)
{
const wxString strHandle = strName;
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
AddLabel(strLabel);
gtComboBox* pBox = new gtComboBox(pPanel, wxID_ANY, strValue, wxDefaultPosition, wxDefaultSize,
aLabels, flags | wxCB_READONLY, wxDefaultValidator, strHandle);
pBox->SetValue(strValue);
pSizer->Add(pBox, 1, wxGROW|wxALL, 1);
if (flags & wxTE_READONLY)
{
pBox->Disable();
}
else
{
pBox->Connect(wxEVT_COMMAND_COMBOBOX_SELECTED ,
wxCommandEventHandler(gtPropertyDlg::OnComboChanged), NULL, this);
}
m_hControls[strName] = pBox;
}
void gtPropertyDlg::AddProperty(const char* strName, int nValue, const wxString& strLabel,
long flags, const wxString& strHint)
{
const wxString strHandle = strName;
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
AddLabel(strLabel);
wxTextCtrl* pText = new gtNaturalCtrl(pPanel, strHandle, wxSize(64, -1), wxTE_RIGHT | flags);
//SetPropertyColor(*pText);
SetPropertyHint(*pText, strHint);
if (flags & wxTE_READONLY)
pText->Disable();
if (nValue != 0)
{
wxString strValue; strValue.Printf("%d", nValue);
pText->ChangeValue(strValue);
}
pSizer->Add(pText, 0, wxALL, 1);
pText->Connect(wxEVT_KILL_FOCUS,
wxFocusEventHandler(gtPropertyDlg::OnTextChanged), NULL, this);
m_hControls[strName] = pText;
}
void gtPropertyDlg::AddProperty(const char* strName, double nValue, const wxString& strLabel,
long flags, const wxString& strHint)
{
const wxString strHandle = strName;
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
AddLabel(strLabel);
wxTextCtrl* pText = new gtFloatCtrl(pPanel, strHandle, flags);
if (flags & wxTE_READONLY)
pText->Disable();
wxString strValue; strValue.Printf("%.2lf", nValue);
pText->ChangeValue(strValue);
SetPropertyHint(*pText, strHint);
pSizer->Add(pText, 0, wxALL, 1);
pText->Connect(wxEVT_KILL_FOCUS,
wxFocusEventHandler(gtPropertyDlg::OnTextChanged), NULL, this);
m_hControls[strName] = pText;
}
void gtPropertyDlg::AddProperty(const char* strName, bool bValue, const wxString& strLabel, long flags)
{
const wxString strHandle = strName;
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
AddLabel(strLabel);
wxCheckBox* pBox = new wxCheckBox(pPanel, wxID_ANY, wxEmptyString,
wxDefaultPosition, wxDefaultSize,
flags, wxDefaultValidator, strHandle);
pSizer->Add(pBox, 0, wxALL, 2);
pBox->SetValue(bValue);
if (flags & wxTE_READONLY)
pBox->Disable();
else
pBox->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED,
wxCommandEventHandler(gtPropertyDlg::OnCheckChanged), NULL, this);
m_hControls[strName] = pBox;
}
void gtPropertyDlg::AddProperty(const char* strName, const wxDateTime& dt, const wxString& strLabel, long flags)
{
AddLabel(strLabel);
wxPanel* pPanel = GetCurrPanel();
const bool bDisable = (flags & wxTE_READONLY) != 0;
if (bDisable)
flags &= ~wxTE_READONLY;
wxControl* pCtrl = NULL;
/*
if (flags & wxTE_MULTILINE)
{
flags = wxCAL_SHOW_HOLIDAYS | wxCAL_MONDAY_FIRST;
wxCalendarCtrl* cc = new wxCalendarCtrl(pPanel, wxID_ANY, wxDefaultDateTime,
wxDefaultPosition, wxSize(256,-1), flags, strName);
if (dt.IsValid())
cc->SetDate(dt);
cc->Connect(wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler(gtPropertyDlg::OnDateChanged), NULL, this);
pCtrl = cc;
}
else
*/
{
wxDatePickerCtrl* dp = new wxDatePickerCtrl(pPanel, wxID_ANY, dt, wxDefaultPosition, wxDefaultSize,
4, wxDefaultValidator, strName);
dp->Connect(wxEVT_DATE_CHANGED, wxDateEventHandler(gtPropertyDlg::OnDatePickChanged), NULL, this);
pCtrl = dp;
}
pPanel->GetSizer()->Add(pCtrl, 1, wxALL|wxGROW, 2);
if (bDisable)
pCtrl->Disable();
m_hControls[strName] = pCtrl;
}
void gtPropertyDlg::AddPropertyDB(const char* strName, const wxString& strValue, const wxString& strLabel,
long flags, const wxString& strHint, const char* strTable)
{
wxPanel* pPanel = GetCurrPanel();
wxSizer* pSizer = pPanel->GetSizer();
wxSizer* pButtonSizer = new wxBoxSizer(wxHORIZONTAL);
pSizer->Add(pButtonSizer, 1, wxGROW|wxALL, 1);
pButtonSizer->Add(new wxStaticText(pPanel, wxID_ANY, strLabel), 1, wxGROW|wxALIGN_CENTER_VERTICAL);
pButtonSizer->AddSpacer(8);
wxButton* pButton = NULL;
const wxBitmap bmp = wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_BUTTON);
if (bmp.Ok())
pButton= new wxBitmapButton(pPanel, wxID_ANY, bmp, wxDefaultPosition, wxSize(24,-1),
0, wxDefaultValidator, wxString("Btn_")+strName);
else
pButton= new wxButton(pPanel, wxID_ANY, wxT("..."), wxDefaultPosition, wxSize(24,-1),
0, wxDefaultValidator, wxString("Btn_")+strName);
GTTableInfo* info = new GTTableInfo;
info->m_strTable = strTable;
pButton->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(gtPropertyDlg::OnSqlPressed), info, this);
pButtonSizer->Add(pButton, 0, wxALIGN_RIGHT);
gtPropertyDlg::AddProperty(strName, strValue, "", flags, strHint);
}
wxWindow* gtPropertyDlg::FindControl(const char* strName) const
{
wxString key = strName;
wxWindow* pWin = ((gtPropertyCtrls&)m_hControls)[key];
if (pWin == NULL)
{
pWin = wxWindowBase::FindWindowByName(key, m_pNoteBook);
if (pWin != NULL)
{
if (pWin->GetName() == key)
((gtPropertyCtrls&)m_hControls)[key] = pWin;
else
pWin = NULL; // Succede con wxStaticText
}
}
return pWin;
}
wxVariant gtPropertyDlg::GetProperty(const char* strName) const
{
const wxString name(strName);
wxWindow* pCtrl = FindControl(strName);
if (pCtrl == NULL || !pCtrl->IsShown())
return wxNullVariant;
wxVariant var;
var.SetName(name);
gtComboBox* pStrCombo = wxDynamicCast(pCtrl, gtComboBox);
if (pStrCombo)
var = pStrCombo->GetValue();
else
{
wxComboBox* pCombo = wxDynamicCast(pCtrl, wxComboBox);
if (pCombo)
var = (long)pCombo->GetCurrentSelection();
else
{
wxCheckBox* pCheck= wxDynamicCast(pCtrl, wxCheckBox);
if (pCheck)
{
var = pCheck->GetValue();
}
else
{
wxRadioBox* pRadioBox= wxDynamicCast(pCtrl, wxRadioBox);
if (pRadioBox)
{
var = (long)pRadioBox->GetSelection();
}
else
{
wxRadioButton* pRadio= wxDynamicCast(pCtrl, wxRadioButton);
if (pRadio)
{
var = pRadio->GetValue();
}
else
{
/*
wxCalendarCtrl* pCalendar = wxDynamicCast(pCtrl, wxCalendarCtrl);
if (pCalendar)
{
var = pCalendar->GetDate();
}
else
*/
{
wxDatePickerCtrl* pDate = wxDynamicCast(pCtrl, wxDatePickerCtrl);
if (pDate)
{
var = pDate->GetValue();
} else
{
wxTextCtrl* pText = wxDynamicCast(pCtrl, wxTextCtrl);
if (pText)
{
const wxString str = pText->GetValue();
if (!str.IsEmpty() && wxIsdigit(str[0]) && pText->GetAlignment() == wxALIGN_RIGHT)
var = wxAtol(str);
else
var = str;
}
else
var = pCtrl->GetLabel();
}
}
}
}
}
}
}
return var;
}
bool gtPropertyDlg::SetProperty(const char* strName, const wxVariant& var)
{
wxWindow* pCtrl = FindControl(strName);
if (pCtrl == NULL)
return false;
gtComboBox* pStrCombo = wxDynamicCast(pCtrl, gtComboBox);
if (pStrCombo)
{
if (var.IsType(wxT("long")))
pStrCombo->SetSelection(var.GetLong());
else
pStrCombo->SetValue(var.GetString());
}
else
{
wxComboBox* pCombo = wxDynamicCast(pCtrl, wxComboBox);
if (pCombo)
{
if (var.IsType(wxT("long")))
pCombo->SetSelection(var.GetLong());
else
{
const wxString val = var.GetString();
if (!pCombo->SetStringSelection(val))
pCombo->SetSelection(wxAtoi(val));
}
}
else
{
wxCheckBox* pCheck= wxDynamicCast(pCtrl, wxCheckBox);
if (pCheck)
{
if (var.IsType("string"))
pCheck->SetValue(!var.GetString().IsEmpty());
else
pCheck->SetValue(var.GetBool());
}
else
{
/*
wxCalendarCtrl* pCalendar= wxDynamicCast(pCtrl, wxCalendarCtrl);
if (pCalendar)
{
if (var.IsType("datetime"))
pCalendar->SetDate(var.GetDateTime());
else
{
const long val = var.GetLong();
if (val >= 19000101)
{
const wxDateTime dt(val%100, (val/100)%100, val/10000, 12);
pCalendar->SetDate(dt);
}
else
pCalendar->SetDate(wxDateTime::Now());
}
}
else
*/
{
wxDatePickerCtrl* pDate= wxDynamicCast(pCtrl, wxDatePickerCtrl);
if (pDate)
{
if (var.IsType("datetime"))
pDate->SetValue(var.GetDateTime());
else
{
const long val = var.GetLong();
if (val >= 19000101)
{
const wxDateTime dt(val%100, (val/100)%100, val/10000, 12);
pDate->SetValue(dt);
}
else
pDate->SetValue(wxDateTime::Now());
}
}
else
{
wxTextCtrl* pText = wxDynamicCast(pCtrl, wxTextCtrl);
if (pText)
{
if (var.IsType(wxT("double")))
{
const double d = var.GetDouble();
wxString str;
if (d)
str.Printf("%.2lf", d);
pText->ChangeValue(str);
}
else
pText->ChangeValue(var.GetString());
}
else
pCtrl->SetLabel(var.GetString());
}
}
}
}
}
return true;
}
wxString gtPropertyDlg::GetString(const char* strName) const
{ return GetProperty(strName).GetString(); }
int gtPropertyDlg::GetInt(const char* strName) const
{
const wxVariant& var = GetProperty(strName);
if (var.GetType() == "datetime")
{
const wxDateTime dt = var.GetDateTime();
return dt.GetYear()*10000 + (dt.GetMonth()+1)*100 + dt.GetDay();
}
return var.GetLong();
}
wxDateTime gtPropertyDlg::GetDate(const char* strName) const
{
wxDateTime dt;
wxWindow* pCtrl = FindControl(strName);
if (pCtrl != NULL)
{
/*
const wxCalendarCtrl* pCalendar = wxDynamicCast(pCtrl, wxCalendarCtrl);
if (pCalendar)
dt = pCalendar->GetDate();
else
*/
{
const wxDatePickerCtrl* pDate = wxDynamicCast(pCtrl, wxDatePickerCtrl);
if (pDate)
dt = pDate->GetValue();
}
}
return dt;
}
double gtPropertyDlg::GetDouble(const char* strName) const
{
const wxVariant v = GetProperty(strName);
double d = 0; v.Convert(&d);
return d;
}
bool gtPropertyDlg::GetBool(const char* strName) const
{ return GetProperty(strName).GetBool(); }
bool gtPropertyDlg::EnableProperty(const wxString& name, bool on)
{
wxWindow* pCtrl = FindControl(name);
if (pCtrl != NULL)
pCtrl->Enable(on);
return pCtrl != NULL;
}
bool gtPropertyDlg::IsPropertyEnabled(const wxString& name) const
{
wxWindow* pCtrl = FindControl(name);
return (pCtrl != NULL) && pCtrl->IsEnabled();
}
bool gtPropertyDlg::ShowProperty(const wxString& name, bool on)
{
wxWindow* pCtrl = FindControl(name);
if (pCtrl != NULL)
pCtrl->Show(on);
return pCtrl != NULL;
}
bool gtPropertyDlg::IsPropertyShown(const wxString& name) const
{
wxWindow* pCtrl = FindControl(name);
return (pCtrl != NULL) && pCtrl->IsShown();
}
bool gtPropertyDlg::OnDecodeProperty(wxVariant& var)
{
return true;
}
bool gtPropertyDlg::OnValidateProperty(wxVariant& var)
{
if (!OnDecodeProperty(var))
{
wxString msg;
msg << wxT("Valore non ammesso per ") << var.GetName();
return gtError(msg);
}
return true;
}
bool gtPropertyDlg::OnPropertyChanged(const wxVariant&)
{
return true;
}
int gtPropertyDlg::ShowModal()
{
if (m_pNoteBook == NULL)
Init();
const int ret = gtBaseDlg::ShowModal();
return ret;
}
bool gtPropertyDlg::SaveDefault() const
{
/*
const wxFileName fpath = ((gtApp*)wxTheApp)->OutputName("ini");
const wxString strIni = fpath.GetFullPath();
const wxString strPar = GetTitle();
for (auto it = m_hControls.begin(); it != m_hControls.end(); ++it )
{
const wxString key = it->first;
const wxWindow* pCtl = it->second;
if (pCtl != NULL && pCtl->IsEnabled())
{
wxString val = GetProperty(key).GetString();
val.Replace("\n", "<br/>");
::WritePrivateProfileString(strPar, key, val, strIni);
}
}
return fpath.FileExists();
*/
return false;
}
bool gtPropertyDlg::LoadDefault()
{
/*
const wxFileName fpath = ((gtApp*)wxTheApp)->OutputName("ini");
bool bDone = fpath.FileExists();
if (bDone)
{
if (m_pNoteBook == NULL)
Init();
const wxString strIni = fpath.GetFullPath();
const wxString strPar = GetTitle();
for (auto it = m_hControls.begin(); it != m_hControls.end(); ++it )
{
const wxString key = it->first;
char buf[2048];
::GetPrivateProfileStringA(strPar, key, "", buf, sizeof(buf), strIni);
wxString val = buf;
val.Replace("<br/>", "\n");
SetProperty(key, wxVariant(val, key));
}
for (auto it = m_hControls.begin(); it != m_hControls.end(); ++it )
{
wxVariant var = GetProperty(it->first);
if (OnDecodeProperty(var))
OnPropertyChanged(var);
}
}
return bDone;
*/
return false;
}
gtPropertyDlg::gtPropertyDlg(const wxString& strTitle, int flags)
: gtBaseDlg(strTitle, flags), m_pNoteBook(NULL)
{}