Patch level : 10.0
Files correlati : ba0 Ricompilazione Demo : [ ] Commento : Aggiunta gestione evento EVT_NOTEBOOK_PAGE_CHANGED indispensabile per il menu outlook del menu principale git-svn-id: svn://10.65.10.50/trunk@19567 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
80204db695
commit
549d36f4a6
760
xvaga/xvaga.cpp
760
xvaga/xvaga.cpp
@ -3,15 +3,11 @@
|
|||||||
#include <wx/artprov.h>
|
#include <wx/artprov.h>
|
||||||
#include <wx/aui/aui.h>
|
#include <wx/aui/aui.h>
|
||||||
#include <wx/clipbrd.h>
|
#include <wx/clipbrd.h>
|
||||||
#include <wx/calctrl.h>
|
|
||||||
#include <wx/colordlg.h>
|
|
||||||
#include <wx/dialup.h>
|
#include <wx/dialup.h>
|
||||||
#include <wx/fileconf.h>
|
#include <wx/fileconf.h>
|
||||||
#include <wx/filename.h>
|
#include <wx/filename.h>
|
||||||
#include <wx/fontdlg.h>
|
|
||||||
#include <wx/image.h>
|
#include <wx/image.h>
|
||||||
#include <wx/snglinst.h>
|
#include <wx/snglinst.h>
|
||||||
#include <wx/statline.h>
|
|
||||||
#include <wx/sysopt.h>
|
#include <wx/sysopt.h>
|
||||||
#include <wx/thread.h>
|
#include <wx/thread.h>
|
||||||
#include <wx/tokenzr.h>
|
#include <wx/tokenzr.h>
|
||||||
@ -42,11 +38,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define XVT_ASSERT(test) _AssertBox((test), __FUNCTION__, __FILE__, __LINE__)
|
#define XVT_ASSERT(test) _AssertBox((test), __FUNCTION__, __FILE__, __LINE__)
|
||||||
#define CAST_WIN(win,w) wxWindow& w = *wxStaticCast((wxObject*)win, wxWindow);
|
|
||||||
#define CAST_TWIN(win,w) TwxWindow& w = *wxStaticCast((wxObject*)win, TwxWindow);
|
|
||||||
#define CAST_TDC(win,dc) TDC& dc = GetTDCMapper().GetTDC(win);
|
|
||||||
#define CAST_DC(win,dc) wxDC& dc = GetTDCMapper().GetDC(win);
|
|
||||||
#define CAST_FONT(font_id, font) TFontId& font = *wxStaticCast(font_id, TFontId);
|
|
||||||
|
|
||||||
wxWindow* _mouse_trapper = NULL;
|
wxWindow* _mouse_trapper = NULL;
|
||||||
RCT _startup_rect = { 0,0,0,0 };
|
RCT _startup_rect = { 0,0,0,0 };
|
||||||
@ -54,6 +45,7 @@ long _startup_style = 0;
|
|||||||
wxString _startup_dir;
|
wxString _startup_dir;
|
||||||
wxString _strDefaultStatbarText;
|
wxString _strDefaultStatbarText;
|
||||||
wxString _appl_name;
|
wxString _appl_name;
|
||||||
|
wxString _appl_version;
|
||||||
wxLocale* _locale = NULL;
|
wxLocale* _locale = NULL;
|
||||||
|
|
||||||
static XVT_ERRMSG_HANDLER _error_handler = NULL;
|
static XVT_ERRMSG_HANDLER _error_handler = NULL;
|
||||||
@ -61,159 +53,6 @@ static XVT_ERRMSG_HANDLER _error_handler = NULL;
|
|||||||
const wxString& _GetAppTitle()
|
const wxString& _GetAppTitle()
|
||||||
{ return _appl_name; }
|
{ return _appl_name; }
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
// TMessageBox
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
class TMessageBox : public wxDialog
|
|
||||||
{
|
|
||||||
wxTimer m_timer;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void OnButton(wxCommandEvent& evt);
|
|
||||||
void OnTimeout(wxTimerEvent& evt);
|
|
||||||
void AddButton(wxSizer* sz, int id, int ico);
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
|
|
||||||
public:
|
|
||||||
TMessageBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout = 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(TMessageBox, wxDialog)
|
|
||||||
EVT_BUTTON(wxID_ANY, TMessageBox::OnButton)
|
|
||||||
EVT_TIMER(wxID_ANY, TMessageBox::OnTimeout)
|
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
void TMessageBox::OnButton(wxCommandEvent& evt)
|
|
||||||
{
|
|
||||||
int ec = wxCANCEL;
|
|
||||||
switch (evt.GetId())
|
|
||||||
{
|
|
||||||
case wxID_YES: ec = wxYES; break;
|
|
||||||
case wxID_OK : ec = wxOK; break;
|
|
||||||
case wxID_NO : ec = wxNO; break;
|
|
||||||
default : ec = GetEscapeId(); break;
|
|
||||||
}
|
|
||||||
EndModal(ec);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TMessageBox::OnTimeout(wxTimerEvent& WXUNUSED(evt))
|
|
||||||
{
|
|
||||||
wxWindowID id = GetEscapeId();
|
|
||||||
if (id <= 0)
|
|
||||||
id = GetAffirmativeId();
|
|
||||||
if (id > 0)
|
|
||||||
{
|
|
||||||
wxCommandEvent cmd(wxEVT_COMMAND_BUTTON_CLICKED, id);
|
|
||||||
AddPendingEvent(cmd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
EndModal(wxCANCEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TMessageBox::AddButton(wxSizer* sz, int id, int WXUNUSED(ico))
|
|
||||||
{
|
|
||||||
sz->Add(new wxButton(this, id, wxEmptyString, wxDefaultPosition, wxSize(80, 32)), 0, wxALL, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
TMessageBox::TMessageBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout)
|
|
||||||
: wxDialog(pParent, wxID_ANY, _GetAppTitle(), wxDefaultPosition, wxDefaultSize,
|
|
||||||
wxCAPTION | wxRAISED_BORDER), m_timer(this)
|
|
||||||
{
|
|
||||||
TTaskWin* tw = wxDynamicCast(pParent ? pParent : _task_win, TTaskWin);
|
|
||||||
if (tw != NULL)
|
|
||||||
{
|
|
||||||
const COLOR col = tw->GetCtlColor(XVT_COLOR_BACKGROUND);
|
|
||||||
if (col != COLOR_INVALID)
|
|
||||||
{
|
|
||||||
CAST_COLOR(col, rgb);
|
|
||||||
SetOwnBackgroundColour(rgb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
|
|
||||||
|
|
||||||
wxBoxSizer* sz1 = new wxBoxSizer(wxHORIZONTAL);
|
|
||||||
sizer->Add(sz1);
|
|
||||||
|
|
||||||
wxArtID nIco = wxART_INFORMATION;
|
|
||||||
if (nStyle & wxICON_HAND) nIco = wxART_ERROR; else
|
|
||||||
if (nStyle & wxICON_INFORMATION) nIco = wxART_INFORMATION; else
|
|
||||||
if (nStyle & wxICON_EXCLAMATION) nIco = wxART_WARNING; else
|
|
||||||
if (nStyle & wxICON_QUESTION) nIco = wxART_QUESTION; else
|
|
||||||
if (nStyle & 0x1000) nIco = "220";
|
|
||||||
|
|
||||||
const wxBitmap img = wxArtProvider::GetBitmap(nIco, wxART_MESSAGE_BOX, wxSize(64,64));
|
|
||||||
|
|
||||||
const int nBorder = 8;
|
|
||||||
sz1->Add(new wxStaticBitmap(this, wxID_ANY, img), 0, wxALL, nBorder);
|
|
||||||
wxStaticText* ss = new wxStaticText(this, wxID_ANY, wxEmptyString);
|
|
||||||
ss->Wrap(160);
|
|
||||||
ss->SetLabel(msg);
|
|
||||||
sz1->Add(ss, 0, wxALL|wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL, nBorder);
|
|
||||||
|
|
||||||
sizer->Add(new wxStaticLine(this), 0, wxALL|wxEXPAND, nBorder);
|
|
||||||
|
|
||||||
wxBoxSizer* sz2 = new wxBoxSizer(wxHORIZONTAL);
|
|
||||||
sizer->Add(sz2, 0, wxALIGN_CENTER);
|
|
||||||
if (nStyle & wxYES_NO)
|
|
||||||
{
|
|
||||||
if (nStyle & wxNO_DEFAULT)
|
|
||||||
{
|
|
||||||
SetAffirmativeId(wxID_NO);
|
|
||||||
SetEscapeId(wxID_YES);
|
|
||||||
AddButton(sz2, wxID_NO, 102);
|
|
||||||
AddButton(sz2, wxID_YES, 101);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetAffirmativeId(wxID_YES);
|
|
||||||
SetEscapeId(wxID_NO);
|
|
||||||
AddButton(sz2, wxID_YES, 101);
|
|
||||||
AddButton(sz2, wxID_NO, 102);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nStyle & wxOK)
|
|
||||||
{
|
|
||||||
SetAffirmativeId(wxID_OK);
|
|
||||||
AddButton(sz2, wxID_OK, 101);
|
|
||||||
}
|
|
||||||
if (nStyle & wxCANCEL)
|
|
||||||
{
|
|
||||||
SetEscapeId(wxID_CANCEL);
|
|
||||||
AddButton(sz2, wxID_CANCEL, 102);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetSizerAndFit(sizer);
|
|
||||||
|
|
||||||
if (nStyle & wxCENTRE)
|
|
||||||
Centre();
|
|
||||||
|
|
||||||
if (nTimeout > 0)
|
|
||||||
m_timer.Start(1000*nTimeout, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
// _*Box
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
int _MessageBox(const wxString& msg, int nStyle, int nTimeout = 0)
|
|
||||||
{
|
|
||||||
xvt_dm_post_speech(msg, 1, TRUE);
|
|
||||||
|
|
||||||
TMessageBox dlg(NULL, msg, nStyle, nTimeout);
|
|
||||||
const int ret = dlg.ShowModal();
|
|
||||||
|
|
||||||
switch(ret)
|
|
||||||
{
|
|
||||||
case wxOK : xvt_dm_post_speech(_("ok"), 7, TRUE); break;
|
|
||||||
case wxYES: xvt_dm_post_speech(_("si"), 7, TRUE); break;
|
|
||||||
case wxNO : xvt_dm_post_speech(_("no"), 7, TRUE); break;
|
|
||||||
default : xvt_dm_post_speech(_("annulla"), 7, TRUE); break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _AssertBox(bool test, const char* func, const char* file, int line)
|
void _AssertBox(bool test, const char* func, const char* file, int line)
|
||||||
{
|
{
|
||||||
if (!test)
|
if (!test)
|
||||||
@ -229,226 +68,6 @@ void _AssertBox(bool test, const char* func, const char* file, int line)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
// _PopUpBox
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
class TPopUpBox : public wxDialog
|
|
||||||
{
|
|
||||||
DECLARE_EVENT_TABLE();
|
|
||||||
wxTimer m_Timer;
|
|
||||||
int m_nStep, m_nTimeout;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void OnTimer(wxTimerEvent& evt);
|
|
||||||
void OnChar(wxKeyEvent& evt);
|
|
||||||
void OnClick(wxMouseEvent& evt);
|
|
||||||
|
|
||||||
public:
|
|
||||||
TPopUpBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout);
|
|
||||||
};
|
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(TPopUpBox, wxDialog)
|
|
||||||
EVT_TIMER(wxID_ANY, TPopUpBox::OnTimer)
|
|
||||||
EVT_CHAR(TPopUpBox::OnChar)
|
|
||||||
EVT_LEFT_DOWN(TPopUpBox::OnClick)
|
|
||||||
END_EVENT_TABLE()
|
|
||||||
|
|
||||||
void TPopUpBox::OnChar(wxKeyEvent& WXUNUSED(evt))
|
|
||||||
{
|
|
||||||
if (IsShown())
|
|
||||||
EndModal(wxID_CANCEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TPopUpBox::OnClick(wxMouseEvent& WXUNUSED(evt))
|
|
||||||
{
|
|
||||||
if (IsShown())
|
|
||||||
EndModal(wxID_CANCEL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void TPopUpBox::OnTimer(wxTimerEvent& WXUNUSED(evt))
|
|
||||||
{
|
|
||||||
if (IsShown())
|
|
||||||
{
|
|
||||||
const wxRect rctMain = GetParent()->GetRect();
|
|
||||||
const wxRect rctMine = GetRect();
|
|
||||||
const int msec = (m_nStep++)*m_Timer.GetInterval();
|
|
||||||
if (msec <= m_nTimeout/4)
|
|
||||||
{
|
|
||||||
const double perc = double(msec)/(m_nTimeout/4);
|
|
||||||
Move(rctMain.x, rctMain.GetBottom() - rctMine.height * perc);
|
|
||||||
}
|
|
||||||
if (msec >= 3*m_nTimeout/4 && msec <= m_nTimeout)
|
|
||||||
{
|
|
||||||
const double perc = double(m_nTimeout-msec)/(m_nTimeout/4);
|
|
||||||
Move(rctMain.x, rctMain.GetBottom() - rctMine.height * perc);
|
|
||||||
}
|
|
||||||
if (msec > m_nTimeout)
|
|
||||||
{
|
|
||||||
m_Timer.Stop();
|
|
||||||
EndModal(wxID_CANCEL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TPopUpBox::TPopUpBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout)
|
|
||||||
: wxDialog(pParent, wxID_ANY, wxEmptyString, wxPoint(0,2024), wxDefaultSize, wxBORDER_SIMPLE),
|
|
||||||
m_nTimeout(nTimeout*1000), m_Timer(this), m_nStep(0)
|
|
||||||
{
|
|
||||||
TTaskWin* tw = wxDynamicCast(pParent ? pParent : _task_win, TTaskWin);
|
|
||||||
if (tw != NULL)
|
|
||||||
{
|
|
||||||
const COLOR col = tw->GetCtlColor(XVT_COLOR_BACKGROUND);
|
|
||||||
if (col != COLOR_INVALID)
|
|
||||||
{
|
|
||||||
CAST_COLOR(col, rgb);
|
|
||||||
SetOwnBackgroundColour(rgb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxBoxSizer* sz = new wxBoxSizer(wxHORIZONTAL);
|
|
||||||
|
|
||||||
wxArtID nIco = wxART_ERROR;
|
|
||||||
if (nStyle & wxICON_HAND) nIco = wxART_ERROR; else
|
|
||||||
if (nStyle & wxICON_INFORMATION) nIco = wxART_INFORMATION; else
|
|
||||||
if (nStyle & wxICON_EXCLAMATION) nIco = wxART_WARNING; else
|
|
||||||
if (nStyle & 0x1000) nIco = "220";
|
|
||||||
const wxBitmap img = wxArtProvider::GetBitmap(nIco, wxART_MESSAGE_BOX);
|
|
||||||
|
|
||||||
wxStaticBitmap* bmp = new wxStaticBitmap(this, wxID_ANY, img);
|
|
||||||
sz->Add(bmp, 0, wxALL, 8);
|
|
||||||
|
|
||||||
wxStaticText* ss = new wxStaticText(this, wxID_ANY, wxEmptyString);
|
|
||||||
ss->Wrap(160);
|
|
||||||
ss->SetLabel(msg);
|
|
||||||
sz->Add(ss, 0, wxALL | wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, 8);
|
|
||||||
|
|
||||||
SetSizerAndFit(sz);
|
|
||||||
m_Timer.Start(25);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _PopUpBox(const wxString& msg, int nStyle, int nTimeout = 4)
|
|
||||||
{
|
|
||||||
const int oem = xvt_sys_get_oem_int("OEM", -1);
|
|
||||||
wxWindow* pFrame = wxTheApp->GetTopWindow();
|
|
||||||
if (oem == 0 && pFrame != NULL)
|
|
||||||
{
|
|
||||||
xvt_sys_beep(nStyle & wxICON_ERROR ? 2 : 1);
|
|
||||||
TPopUpBox dlg(pFrame, msg, nStyle, nTimeout <= 0 ? 4 : nTimeout);
|
|
||||||
dlg.ShowModal();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_MessageBox(msg, nStyle|wxOK|wxCENTRE, nTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
WX_DECLARE_STRING_HASH_MAP(int, TMessagesMap);
|
|
||||||
|
|
||||||
void xvt_sys_sorry_box(const char* func, const char* file, int line)
|
|
||||||
{
|
|
||||||
#ifndef NDEBUG
|
|
||||||
static TMessagesMap sorry;
|
|
||||||
if (sorry[func]++ == 0)
|
|
||||||
{
|
|
||||||
wxString strMessage;
|
|
||||||
strMessage.Printf("Function %s in file %s at line %d\nis not implemented yet: be patient...",
|
|
||||||
func, file, line);
|
|
||||||
_PopUpBox(strMessage, 0x1000); // Smiley Icon
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_sys_deprecated_box(const char* oldfunc, const char* file, const char* newfunc)
|
|
||||||
{
|
|
||||||
#ifndef NDEBUG
|
|
||||||
static TMessagesMap deprecated;
|
|
||||||
if (deprecated[oldfunc]++ == 0)
|
|
||||||
{
|
|
||||||
wxString strMessage;
|
|
||||||
strMessage.Printf("Function %s in file %s is deprecated:\n%s is much more trendy now!\nYou can blame Guy for this, if you're bold enough!",
|
|
||||||
oldfunc, file, newfunc);
|
|
||||||
_PopUpBox(strMessage, 0x1000);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
// Font cache
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
//WX_DECLARE_HASH_MAP(wxString, wxFont*, wxStringHash, wxStringEqual, wxFontHashMap);
|
|
||||||
WX_DECLARE_STRING_HASH_MAP(wxFont*, wxFontHashMap);
|
|
||||||
|
|
||||||
class TFontCache
|
|
||||||
{
|
|
||||||
wxFontHashMap* m_map;
|
|
||||||
|
|
||||||
public:
|
|
||||||
wxFont& FindOrCreate(int pointSize, int family, int style, int weight,
|
|
||||||
bool underline, const wxString& face);
|
|
||||||
void Destroy();
|
|
||||||
TFontCache() : m_map(NULL) { }
|
|
||||||
~TFontCache() { Destroy(); }
|
|
||||||
|
|
||||||
} XVT_FONT_CACHE;
|
|
||||||
|
|
||||||
void TFontCache::Destroy()
|
|
||||||
{
|
|
||||||
if (m_map)
|
|
||||||
{
|
|
||||||
m_map->clear();
|
|
||||||
// delete m_map; // NON funziona ma non si capisce perche': PAZIENZA!
|
|
||||||
m_map = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxFont& TFontCache::FindOrCreate(int pointSize, int family, int style, int weight,
|
|
||||||
bool underline, const wxString& face)
|
|
||||||
{
|
|
||||||
if (m_map == NULL)
|
|
||||||
m_map = new wxFontHashMap;
|
|
||||||
|
|
||||||
wxString key;
|
|
||||||
key.Printf("%s_%d_%d_%d_%d", face, pointSize, style, weight, underline);
|
|
||||||
wxFont* pFont = (*m_map)[key];
|
|
||||||
if (pFont == NULL)
|
|
||||||
{
|
|
||||||
pFont = new wxFont(pointSize, family, style, weight, underline, face);
|
|
||||||
pFont->SetPointSize(pointSize); // Colpo di classe indispensabile per i PDF :-)
|
|
||||||
(*m_map)[key] = pFont;
|
|
||||||
}
|
|
||||||
return *pFont;
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
// Speech support
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// 0 Errors
|
|
||||||
// 1 Warnings
|
|
||||||
// 2 Messages
|
|
||||||
// 3 Requests
|
|
||||||
// 7 Buttons
|
|
||||||
static int m_nSpeechMode = 0;
|
|
||||||
|
|
||||||
void xvt_dm_enable_speech(int mode)
|
|
||||||
{
|
|
||||||
#ifdef SPEECH_API
|
|
||||||
m_nSpeechMode = mode;
|
|
||||||
#ifdef WIN32
|
|
||||||
if (m_nSpeechMode != 0)
|
|
||||||
{
|
|
||||||
if (!OsWin32_InitializeSpeech())
|
|
||||||
m_nSpeechMode = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
OsWin32_DeinitializeSpeech();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// XVT
|
// XVT
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
@ -483,12 +102,12 @@ XVTDLL void xvt_app_pre_create(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void xvt_app_create(int argc, char **argv, unsigned long WXUNUSED(flags),
|
void xvt_app_create(int argc, char** argv, unsigned long WXUNUSED(flags),
|
||||||
EVENT_HANDLER eh, XVT_CONFIG *config)
|
EVENT_HANDLER eh, XVT_CONFIG* config)
|
||||||
{
|
{
|
||||||
_task_win_handler = eh;
|
_task_win_handler = eh;
|
||||||
_appl_name = config->appl_name;
|
_appl_name = config->appl_name;
|
||||||
|
|
||||||
const wxString title = config->taskwin_title;
|
const wxString title = config->taskwin_title;
|
||||||
|
|
||||||
wxPoint pos = wxDefaultPosition;
|
wxPoint pos = wxDefaultPosition;
|
||||||
@ -830,352 +449,53 @@ BOOLEAN xvt_dongle_sl_write_block(unsigned short reg, unsigned short size, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// Common dialogs
|
// Font cache
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void xvt_dm_post_about_box()
|
//WX_DECLARE_HASH_MAP(wxString, wxFont*, wxStringHash, wxStringEqual, wxFontHashMap);
|
||||||
|
WX_DECLARE_STRING_HASH_MAP(wxFont*, wxFontHashMap);
|
||||||
|
|
||||||
|
class TFontCache
|
||||||
{
|
{
|
||||||
SORRY_BOX();
|
wxFontHashMap* m_map;
|
||||||
}
|
|
||||||
|
|
||||||
COLOR xvt_dm_post_choose_color(WINDOW win, COLOR xc)
|
|
||||||
{
|
|
||||||
DEPRECATED_BOX("xvt_dm_post_color_sel");
|
|
||||||
xvt_dm_post_color_sel(&xc, win);
|
|
||||||
return xc;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN xvt_dm_post_color_sel(COLOR* color, unsigned long reserved)
|
|
||||||
{
|
|
||||||
CAST_COLOR(*color, wc);
|
|
||||||
|
|
||||||
wxColourData cd;
|
|
||||||
cd.SetChooseFull(true);
|
|
||||||
cd.SetColour(wc);
|
|
||||||
for (int i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
const unsigned char val = (i & 0x8) ? 255 : 127;
|
|
||||||
const unsigned char red = (i & 0x1) ? val : 0;
|
|
||||||
const unsigned char green = (i & 0x2) ? val : 0;
|
|
||||||
const unsigned char blue = (i & 0x4) ? val : 0;
|
|
||||||
wxColour col(red, green, blue);
|
|
||||||
cd.SetCustomColour(i, col);
|
|
||||||
}
|
|
||||||
|
|
||||||
wxWindow* win = wxDynamicCast ((void*)reserved, wxWindow);
|
|
||||||
wxColourDialog dialog(win, &cd);
|
|
||||||
if (dialog.ShowModal() == wxID_OK)
|
|
||||||
{
|
|
||||||
*color = MAKE_XVT_COLOR(dialog.GetColourData().GetColour());
|
|
||||||
if (*color == 0) *color = COLOR_BLACK; // 0x000000 confonde XI, mentre con 0x07000000 e' a suo agio
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
class TwxCalendarDlg : public wxDialog
|
|
||||||
{
|
|
||||||
enum { ID_CAL = 1883 };
|
|
||||||
wxDateTime& m_date;
|
|
||||||
wxCalendarCtrl* m_cal;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual bool TransferDataFromWindow();
|
|
||||||
void OnCalendar(wxCalendarEvent& e);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TwxCalendarDlg(wxWindow* parent, wxDateTime& date);
|
wxFont& FindOrCreate(int pointSize, int family, int style, int weight,
|
||||||
|
bool underline, const wxString& face);
|
||||||
|
void Destroy();
|
||||||
|
TFontCache() : m_map(NULL) { }
|
||||||
|
~TFontCache() { Destroy(); }
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
} XVT_FONT_CACHE;
|
||||||
};
|
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(TwxCalendarDlg, wxDialog)
|
void TFontCache::Destroy()
|
||||||
EVT_CALENDAR(wxID_ANY, TwxCalendarDlg::OnCalendar)
|
{
|
||||||
END_EVENT_TABLE()
|
if (m_map)
|
||||||
|
{
|
||||||
void TwxCalendarDlg::OnCalendar(wxCalendarEvent& WXUNUSED(e))
|
m_map->clear();
|
||||||
{
|
// delete m_map; // NON funziona ma non si capisce perche': PAZIENZA!
|
||||||
wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
|
m_map = NULL;
|
||||||
AddPendingEvent(evt);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TwxCalendarDlg::TransferDataFromWindow()
|
wxFont& TFontCache::FindOrCreate(int pointSize, int family, int style, int weight,
|
||||||
|
bool underline, const wxString& face)
|
||||||
{
|
{
|
||||||
bool ok = wxDialog::TransferDataFromWindow();
|
if (m_map == NULL)
|
||||||
if (ok)
|
m_map = new wxFontHashMap;
|
||||||
m_date = m_cal->GetDate();
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
TwxCalendarDlg::TwxCalendarDlg(wxWindow* parent, wxDateTime& date)
|
|
||||||
: wxDialog(parent, wxID_ANY, "Data", wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER), m_date(date)
|
|
||||||
{
|
|
||||||
|
|
||||||
m_cal = new wxCalendarCtrl(this, ID_CAL, m_date, wxDefaultPosition, wxDefaultSize,
|
|
||||||
wxCAL_MONDAY_FIRST | wxCAL_SHOW_HOLIDAYS | wxCAL_SHOW_SURROUNDING_WEEKS);
|
|
||||||
|
|
||||||
wxButton* button = new wxButton(this, wxID_OK, "OK");
|
|
||||||
|
|
||||||
wxGridSizer* sizer = new wxFlexGridSizer(2, 1, 8, 8);
|
|
||||||
sizer->Add(m_cal, 0, wxALIGN_CENTER);
|
|
||||||
sizer->Add(button, 0, wxALIGN_CENTER);
|
|
||||||
SetSizer(sizer);
|
|
||||||
sizer->SetSizeHints(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int xvt_dm_post_choose_date(WINDOW win, const RCT* rct, unsigned int ansidate)
|
|
||||||
{
|
|
||||||
int d = ansidate%100;
|
|
||||||
int m = (ansidate/100)%100;
|
|
||||||
int y = ansidate / 10000;
|
|
||||||
|
|
||||||
wxDateTime date;
|
|
||||||
if (d >= 1 && d <= 31 && m >= 1 && m <= 12 && y > 1900)
|
|
||||||
date.Set(d, wxDateTime::Month(m-1), y);
|
|
||||||
else
|
|
||||||
date = wxDateTime::Today();
|
|
||||||
|
|
||||||
CAST_WIN(win, w);
|
wxString key;
|
||||||
wxDialog* dlg = new TwxCalendarDlg(&w, date);
|
key.Printf("%s_%d_%d_%d_%d", face, pointSize, style, weight, underline);
|
||||||
|
wxFont* pFont = (*m_map)[key];
|
||||||
if (rct != NULL)
|
if (pFont == NULL)
|
||||||
{
|
{
|
||||||
const wxRect client = w.GetClientRect();
|
pFont = new wxFont(pointSize, family, style, weight, underline, face);
|
||||||
const wxRect rect = dlg->GetRect();
|
pFont->SetPointSize(pointSize); // Colpo di classe indispensabile per i PDF :-)
|
||||||
wxPoint pos(rct->right - rect.width, rct->bottom);
|
(*m_map)[key] = pFont;
|
||||||
if (pos.x < 0)
|
|
||||||
pos.x = rct->left;
|
|
||||||
if (rct->bottom + rect.height > client.GetBottom())
|
|
||||||
pos.y = rct->top - rect.height;
|
|
||||||
dlg->Move(w.ClientToScreen(pos));
|
|
||||||
}
|
}
|
||||||
|
return *pFont;
|
||||||
if (dlg->ShowModal() == wxID_OK)
|
|
||||||
{
|
|
||||||
d = date.GetDay();
|
|
||||||
m = date.GetMonth()+1;
|
|
||||||
y = date.GetYear();
|
|
||||||
ansidate = y*10000 + m*100 + d;
|
|
||||||
}
|
|
||||||
dlg->Destroy();
|
|
||||||
|
|
||||||
return ansidate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN xvt_dm_post_speech(const char* text, int priority, BOOLEAN async)
|
|
||||||
{
|
|
||||||
BOOLEAN ok = FALSE;
|
|
||||||
#ifdef SPEECH_API
|
|
||||||
if ((m_nSpeechMode & (1 << priority)) != 0)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
ok = OsWin32_Speak(text, async != 0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASK_RESPONSE xvt_dm_post_ask(const char* Btn1, const char* Btn2, const char* Btn3, const char* fmt)
|
|
||||||
{
|
|
||||||
int nFlags = wxCENTRE | wxICON_QUESTION | wxYES_NO;
|
|
||||||
if (Btn3 == NULL)
|
|
||||||
{
|
|
||||||
if (wxStricmp(Btn1, "no") == 0)
|
|
||||||
nFlags |= wxNO_DEFAULT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
nFlags |= wxCANCEL;
|
|
||||||
|
|
||||||
const int answer = _MessageBox(fmt, nFlags);
|
|
||||||
return answer == wxYES ? RESP_DEFAULT : (answer == wxNO ? RESP_2 : RESP_3);
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_post_error(const char *fmt)
|
|
||||||
{
|
|
||||||
//_MessageBox(fmt, wxOK | wxCENTRE | wxICON_HAND);
|
|
||||||
_PopUpBox(fmt, wxICON_HAND, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_post_fatal_exit(const char *fmt)
|
|
||||||
{
|
|
||||||
xvt_dm_post_speech(fmt, 1, TRUE);
|
|
||||||
wxLogFatalError(fmt);
|
|
||||||
xvt_dm_post_speech("OK", 7, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static wxString MakeFileName(const wxChar* name, const wxChar* ext)
|
|
||||||
{
|
|
||||||
wxString f = name;
|
|
||||||
if (ext && *ext)
|
|
||||||
{
|
|
||||||
if (*ext != '.')
|
|
||||||
f += '.';
|
|
||||||
f += ext;
|
|
||||||
}
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FL_STATUS xvt_dm_post_file_ask(FILE_SPEC *fsp, const char *msg, int flags)
|
|
||||||
{
|
|
||||||
DIRECTORY savedir; xvt_fsys_get_dir(&savedir); // Salvo cartella corrente
|
|
||||||
|
|
||||||
wxString path = fsp->dir.path;
|
|
||||||
wxString name = MakeFileName(fsp->name, fsp->type);
|
|
||||||
wxString extension = fsp->type;
|
|
||||||
wxString wild;
|
|
||||||
if (!extension.IsEmpty() && extension != "*")
|
|
||||||
wild << "File " << extension << " (*." << extension << ")|*." << extension << "|";
|
|
||||||
if (flags & wxFD_OPEN)
|
|
||||||
wild << "Tutti i file (*.*)|*.*|";
|
|
||||||
wild << '|';
|
|
||||||
|
|
||||||
wxString selectedname = wxFileSelector(msg, path, name, extension , wild, flags);
|
|
||||||
if (selectedname.IsEmpty())
|
|
||||||
return FL_CANCEL;
|
|
||||||
xvt_fsys_convert_str_to_fspec(selectedname, fsp);
|
|
||||||
|
|
||||||
xvt_fsys_set_dir(&savedir); // Ripristino cartella corrente
|
|
||||||
|
|
||||||
return FL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
FL_STATUS xvt_dm_post_file_open(FILE_SPEC *fsp, const char *msg)
|
|
||||||
{
|
|
||||||
const int flags = wxFD_OPEN | wxFD_FILE_MUST_EXIST;
|
|
||||||
return xvt_dm_post_file_ask(fsp, msg, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
FL_STATUS xvt_dm_post_file_save(FILE_SPEC *fsp, const char *msg)
|
|
||||||
{
|
|
||||||
const int flags = wxFD_SAVE | wxFD_OVERWRITE_PROMPT;
|
|
||||||
return xvt_dm_post_file_ask(fsp, msg, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
FL_STATUS xvt_dm_post_dir_sel(DIRECTORY *dir)
|
|
||||||
{
|
|
||||||
wxDirDialog dlg(_task_win);
|
|
||||||
dlg.SetPath(dir->path);
|
|
||||||
if (dlg.ShowModal() == wxID_OK)
|
|
||||||
{
|
|
||||||
xvt_fsys_convert_str_to_dir(dlg.GetPath(), dir);
|
|
||||||
return FL_OK;
|
|
||||||
}
|
|
||||||
return FL_CANCEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN xvt_dm_post_font_sel(WINDOW win, XVT_FNTID font_id, PRINT_RCD* WXUNUSED(precp), unsigned long reserved)
|
|
||||||
{
|
|
||||||
CAST_FONT(font_id, font);
|
|
||||||
wxFontData data;
|
|
||||||
data.SetInitialFont(font.Font(NULL, win));
|
|
||||||
data.EnableEffects(reserved != 0);
|
|
||||||
wxFontDialog dlg(_task_win, data);
|
|
||||||
BOOLEAN ok = dlg.ShowModal() == wxID_OK;
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
font.Copy(dlg.GetFontData().GetChosenFont());
|
|
||||||
if (win == (WINDOW)_task_win)
|
|
||||||
{
|
|
||||||
EVENT e; memset(&e, 0, sizeof(EVENT));
|
|
||||||
e.type = E_FONT;
|
|
||||||
e.v.font.font_id = font_id;
|
|
||||||
_task_win_handler(win, &e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_post_message(const char *fmt)
|
|
||||||
{
|
|
||||||
//_MessageBox(fmt, wxOK | wxCENTRE | wxICON_INFORMATION);
|
|
||||||
_PopUpBox(fmt, wxICON_INFORMATION, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_post_note(const char *fmt)
|
|
||||||
{
|
|
||||||
// _MessageBox(fmt, wxOK | wxCENTRE | wxICON_EXCLAMATION);
|
|
||||||
_PopUpBox(fmt, wxICON_EXCLAMATION, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* xvt_dm_post_string_prompt(const char* message, char* response, int response_len)
|
|
||||||
{
|
|
||||||
XVT_ASSERT(message && response && response_len > 0);
|
|
||||||
wxTextEntryDialog dlg(NULL, message, _GetAppTitle(), response);
|
|
||||||
if (dlg.ShowModal() == wxID_OK)
|
|
||||||
{
|
|
||||||
wxStrncpy(response, dlg.GetValue(), response_len);
|
|
||||||
response[response_len-1] = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
*response = '\0';
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_post_warning(const char *fmt)
|
|
||||||
{
|
|
||||||
// _MessageBox(fmt, wxOK | wxCENTRE | wxICON_EXCLAMATION);
|
|
||||||
_PopUpBox(fmt, wxICON_EXCLAMATION, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_popup_error(const char *fmt)
|
|
||||||
{
|
|
||||||
_PopUpBox(fmt, wxICON_HAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_popup_message(const char *fmt)
|
|
||||||
{
|
|
||||||
_PopUpBox(fmt, wxICON_INFORMATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_dm_popup_warning(const char *fmt)
|
|
||||||
{
|
|
||||||
_PopUpBox(fmt, wxICON_EXCLAMATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
// Help system
|
|
||||||
///////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
struct XVAGA_HELP_INFO
|
|
||||||
{
|
|
||||||
wxString m_strFilename;
|
|
||||||
bool m_hlp;
|
|
||||||
} help_info;
|
|
||||||
|
|
||||||
XVT_HELP_INFO xvt_help_open_helpfile(FILE_SPEC* WXUNUSED(fs), unsigned long WXUNUSED(flags))
|
|
||||||
{
|
|
||||||
return (XVT_HELP_INFO)&help_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
void xvt_help_close_helpfile(XVT_HELP_INFO hi)
|
|
||||||
{
|
|
||||||
if (hi == NULL_HELP_INFO)
|
|
||||||
hi = (XVT_HELP_INFO)&help_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOLEAN xvt_help_process_event(XVT_HELP_INFO hi, WINDOW win, EVENT *ev)
|
|
||||||
{
|
|
||||||
BOOLEAN bProcessed = FALSE;
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
WXHWND hwnd = (WXHWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
|
|
||||||
switch (ev->type)
|
|
||||||
{
|
|
||||||
case E_COMMAND:
|
|
||||||
bProcessed = OsWin32_Help(hwnd, "", ev->v.cmd.tag, NULL);
|
|
||||||
break;
|
|
||||||
case E_HELP:
|
|
||||||
bProcessed = OsWin32_Help(hwnd, "", M_HELP_ONCONTEXT, (const char*)ev->v.help.tid);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif // WIN32
|
|
||||||
|
|
||||||
return bProcessed;
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// Image handling
|
// Image handling
|
||||||
@ -4281,6 +3601,9 @@ long xvt_vobj_get_attr(WINDOW win, long data)
|
|||||||
ret = (long)xcc;
|
ret = (long)xcc;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ATTR_APPL_VERSION_STRING:
|
||||||
|
ret = (long)(const char*)_appl_version;
|
||||||
|
break;
|
||||||
case ATTR_FRAME_WIDTH:
|
case ATTR_FRAME_WIDTH:
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
ret = 8; //verificare not impl
|
ret = 8; //verificare not impl
|
||||||
@ -4355,7 +3678,7 @@ long xvt_vobj_get_attr(WINDOW win, long data)
|
|||||||
ret = 882L; // Scelta arbitraria ma accettabile
|
ret = 882L; // Scelta arbitraria ma accettabile
|
||||||
break;
|
break;
|
||||||
case ATTR_SPEECH_MODE:
|
case ATTR_SPEECH_MODE:
|
||||||
ret = m_nSpeechMode;
|
ret = xvt_dm_speech_enabled();
|
||||||
break;
|
break;
|
||||||
case ATTR_TASK_WINDOW:
|
case ATTR_TASK_WINDOW:
|
||||||
ret = long(_task_win);
|
ret = long(_task_win);
|
||||||
@ -4564,13 +3887,14 @@ void xvt_vobj_set_attr(WINDOW win, long data, long value)
|
|||||||
tw->SetCtlColors((XVT_COLOR_COMPONENT*)value);
|
tw->SetCtlColors((XVT_COLOR_COMPONENT*)value);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case ATTR_APPL_VERSION_STRING: _appl_version = (const char*)value; break;
|
||||||
case ATTR_BACK_COLOR: SetArtistColor(win, wxAUI_DOCKART_BACKGROUND_COLOUR, value); break;
|
case ATTR_BACK_COLOR: SetArtistColor(win, wxAUI_DOCKART_BACKGROUND_COLOUR, value); break;
|
||||||
case ATTR_ERRMSG_HANDLER: _error_handler = (XVT_ERRMSG_HANDLER)value; break;
|
case ATTR_ERRMSG_HANDLER: _error_handler = (XVT_ERRMSG_HANDLER)value; break;
|
||||||
case ATTR_EVENT_HOOK: SORRY_BOX(); break; // TBI?: Native events hook!
|
case ATTR_EVENT_HOOK: SORRY_BOX(); break; // TBI?: Native events hook!
|
||||||
case ATTR_WIN_PM_DRAWABLE_TWIN: break; // Ignored: Always TRUE
|
case ATTR_WIN_PM_DRAWABLE_TWIN: break; // Ignored: Always TRUE
|
||||||
case ATTR_WIN_PM_TWIN_STARTUP_RCT: _startup_rect = *(RCT*)value; break;
|
case ATTR_WIN_PM_TWIN_STARTUP_RCT: _startup_rect = *(RCT*)value; break;
|
||||||
case ATTR_WIN_PM_TWIN_STARTUP_STYLE: _startup_style = value; break;
|
case ATTR_WIN_PM_TWIN_STARTUP_STYLE: _startup_style = value; break;
|
||||||
case ATTR_SPEECH_MODE: xvt_dm_enable_speech(value); break;
|
case ATTR_SPEECH_MODE: xvt_dm_speech_enable(value); break;
|
||||||
default: SORRY_BOX(); break;
|
default: SORRY_BOX(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
11
xvaga/xvt.h
11
xvaga/xvt.h
@ -88,6 +88,9 @@ XVTDLL char* xvt_dm_post_string_prompt(const char* message, char* respon
|
|||||||
XVTDLL void xvt_dm_post_warning(const char *fmt);
|
XVTDLL void xvt_dm_post_warning(const char *fmt);
|
||||||
XVTDLL BOOLEAN xvt_dm_post_speech(const char* text, int priority, BOOLEAN async); // 0 = Error, 1 = Warning, 2 Message, ...
|
XVTDLL BOOLEAN xvt_dm_post_speech(const char* text, int priority, BOOLEAN async); // 0 = Error, 1 = Warning, 2 Message, ...
|
||||||
|
|
||||||
|
XVTDLL void xvt_dm_speech_enable(int mode);
|
||||||
|
XVTDLL int xvt_dm_speech_enabled(void);
|
||||||
|
|
||||||
// Dongle support by AGA
|
// Dongle support by AGA
|
||||||
XVTDLL BOOLEAN xvt_dongle_hl_crypt(unsigned short* data);
|
XVTDLL BOOLEAN xvt_dongle_hl_crypt(unsigned short* data);
|
||||||
XVTDLL BOOLEAN xvt_dongle_hl_login(unsigned short address, const unsigned char* label, const unsigned char* password);
|
XVTDLL BOOLEAN xvt_dongle_hl_login(unsigned short address, const unsigned char* label, const unsigned char* password);
|
||||||
@ -246,14 +249,15 @@ XVTDLL void xvt_menu_update(WINDOW win);
|
|||||||
XVTDLL MENU_ITEM* xvt_menu_duplicate_tree(const MENU_ITEM* m);
|
XVTDLL MENU_ITEM* xvt_menu_duplicate_tree(const MENU_ITEM* m);
|
||||||
|
|
||||||
XVTDLL short xvt_notebk_add_page(WINDOW notebk, WINDOW page, const char* title, XVT_IMAGE img, short page_no);
|
XVTDLL short xvt_notebk_add_page(WINDOW notebk, WINDOW page, const char* title, XVT_IMAGE img, short page_no);
|
||||||
XVTDLL WINDOW xvt_notebk_get_page(WINDOW notebk, short page_no);
|
XVTDLL short xvt_notebk_get_front_page(WINDOW notebk);
|
||||||
XVTDLL short xvt_notebk_get_num_tabs(WINDOW notebk);
|
XVTDLL short xvt_notebk_get_num_tabs(WINDOW notebk);
|
||||||
|
XVTDLL WINDOW xvt_notebk_get_page(WINDOW notebk, short page_no);
|
||||||
|
XVTDLL char* xvt_notebk_get_tab_title(WINDOW notebk, short page_no, char* title, int sz_title);
|
||||||
XVTDLL void xvt_notebk_set_front_page(WINDOW notebk, short page_no);
|
XVTDLL void xvt_notebk_set_front_page(WINDOW notebk, short page_no);
|
||||||
XVTDLL void xvt_notebk_set_tab_icon(WINDOW notebk, short page_no, int rid);
|
XVTDLL void xvt_notebk_set_tab_icon(WINDOW notebk, short page_no, int rid);
|
||||||
XVTDLL void xvt_notebk_set_tab_image(WINDOW notebk, short page_no, XVT_IMAGE img);
|
XVTDLL void xvt_notebk_set_tab_image(WINDOW notebk, short page_no, XVT_IMAGE img);
|
||||||
XVTDLL void xvt_notebk_set_tab_title(WINDOW notebk, short page_no, const char* title);
|
XVTDLL void xvt_notebk_set_tab_title(WINDOW notebk, short page_no, const char* title);
|
||||||
XVTDLL void xvt_notebk_set_page_title(WINDOW notebk, short page_no, const char* title);
|
XVTDLL void xvt_notebk_set_page_title(WINDOW notebk, short page_no, const char* title);
|
||||||
XVTDLL char* xvt_notebk_get_tab_title(WINDOW notebk, short page_no, char* title, int sz_title);
|
|
||||||
XVTDLL void xvt_notebk_rem_page(WINDOW notebk, short page_no);
|
XVTDLL void xvt_notebk_rem_page(WINDOW notebk, short page_no);
|
||||||
XVTDLL void xvt_notebk_rem_tab(WINDOW notebk, short tab_no);
|
XVTDLL void xvt_notebk_rem_tab(WINDOW notebk, short tab_no);
|
||||||
|
|
||||||
@ -468,12 +472,15 @@ XVTDLL BOOLEAN xvt_odbc_free_connection(XVT_ODBC handle);
|
|||||||
XVTDLL ULONG xvt_odbc_execute(XVT_ODBC handle, const char* sql, ODBC_CALLBACK cb, void* jolly);
|
XVTDLL ULONG xvt_odbc_execute(XVT_ODBC handle, const char* sql, ODBC_CALLBACK cb, void* jolly);
|
||||||
XVTDLL BOOLEAN xvt_odbc_driver(XVT_ODBC handle, char* str, int max_size);
|
XVTDLL BOOLEAN xvt_odbc_driver(XVT_ODBC handle, char* str, int max_size);
|
||||||
|
|
||||||
|
typedef BOOLEAN PROP_CALLBACK(WINDOW win, XVT_TREEVIEW_NODE node, void* app_data);
|
||||||
XVTDLL XVT_TREEVIEW_NODE xvt_prop_add(WINDOW win, const char* type, const char* name, const char* value, const char* label);
|
XVTDLL XVT_TREEVIEW_NODE xvt_prop_add(WINDOW win, const char* type, const char* name, const char* value, const char* label);
|
||||||
XVTDLL XVT_TREEVIEW_NODE xvt_prop_find(WINDOW win, const char* name);
|
XVTDLL XVT_TREEVIEW_NODE xvt_prop_find(WINDOW win, const char* name);
|
||||||
|
XVTDLL BOOLEAN xvt_prop_for_each(WINDOW win, PROP_CALLBACK pcb, void* jolly);
|
||||||
XVTDLL int xvt_prop_get_string(WINDOW win, XVT_TREEVIEW_NODE node, char* label, int maxlen);
|
XVTDLL int xvt_prop_get_string(WINDOW win, XVT_TREEVIEW_NODE node, char* label, int maxlen);
|
||||||
XVTDLL int xvt_prop_get_data(WINDOW win, XVT_TREEVIEW_NODE node, char* value, int maxlen);
|
XVTDLL int xvt_prop_get_data(WINDOW win, XVT_TREEVIEW_NODE node, char* value, int maxlen);
|
||||||
XVTDLL BOOLEAN xvt_prop_restart(WINDOW win);
|
XVTDLL BOOLEAN xvt_prop_restart(WINDOW win);
|
||||||
XVTDLL BOOLEAN xvt_prop_set_data(WINDOW win, XVT_TREEVIEW_NODE node, const char* value);
|
XVTDLL BOOLEAN xvt_prop_set_data(WINDOW win, XVT_TREEVIEW_NODE node, const char* value);
|
||||||
|
XVTDLL BOOLEAN xvt_prop_set_read_only(WINDOW win, XVT_TREEVIEW_NODE node, BOOLEAN ro);
|
||||||
XVTDLL BOOLEAN xvt_prop_suspend(WINDOW win);
|
XVTDLL BOOLEAN xvt_prop_suspend(WINDOW win);
|
||||||
|
|
||||||
XVTDLL BOOLEAN xvt_mail_send(const char* to, const char* cc, const char* ccn,
|
XVTDLL BOOLEAN xvt_mail_send(const char* to, const char* cc, const char* ccn,
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Agreement with XVT Software.
|
* Agreement with XVT Software.
|
||||||
*
|
*
|
||||||
* $RCSfile: xvt_defs.h,v $
|
* $RCSfile: xvt_defs.h,v $
|
||||||
* $Revision: 1.10 $
|
* $Revision: 1.11 $
|
||||||
*
|
*
|
||||||
* Purpose: Global XVT macro definitions.
|
* Purpose: Global XVT macro definitions.
|
||||||
*
|
*
|
||||||
@ -491,6 +491,7 @@
|
|||||||
#define ATTR_R40_TXEDIT_BEHAVIOR (ATTR_BASE + 718)
|
#define ATTR_R40_TXEDIT_BEHAVIOR (ATTR_BASE + 718)
|
||||||
#define ATTR_APP_CTL_FONT_RID (ATTR_BASE + 719)
|
#define ATTR_APP_CTL_FONT_RID (ATTR_BASE + 719)
|
||||||
#define ATTR_SPEECH_MODE (ATTR_BASE + 720) /* Added by Guy */
|
#define ATTR_SPEECH_MODE (ATTR_BASE + 720) /* Added by Guy */
|
||||||
|
#define ATTR_APPL_VERSION_STRING (ATTR_BASE + 721) /* Added by Guy */
|
||||||
|
|
||||||
/* Font attributes */
|
/* Font attributes */
|
||||||
#define ATTR_FONT_MAPPER (ATTR_BASE + 800)
|
#define ATTR_FONT_MAPPER (ATTR_BASE + 800)
|
||||||
|
@ -88,7 +88,7 @@ protected:
|
|||||||
virtual bool SetBackgroundColour(const wxColour& col);
|
virtual bool SetBackgroundColour(const wxColour& col);
|
||||||
|
|
||||||
void OnPageChanging(wxAuiNotebookEvent& e);
|
void OnPageChanging(wxAuiNotebookEvent& e);
|
||||||
//void OnPageChanged(wxAuiNotebookEvent& e);
|
void OnPageChanged(wxAuiNotebookEvent& e);
|
||||||
long Flags2Style(long flags) const;
|
long Flags2Style(long flags) const;
|
||||||
|
|
||||||
TwxNoteBook() {}
|
TwxNoteBook() {}
|
||||||
@ -415,7 +415,7 @@ void xvt_btn_set_images(WINDOW win, XVT_IMAGE up, XVT_IMAGE down)
|
|||||||
if (pb != NULL)
|
if (pb != NULL)
|
||||||
{
|
{
|
||||||
int mx, my; pb->GetSize(&mx, &my);
|
int mx, my; pb->GetSize(&mx, &my);
|
||||||
wxBitmap bmpUp(Image2Bitmap(up, mx, my, TRUE));
|
wxBitmap bmpUp = Image2Bitmap(up, mx, my, TRUE);
|
||||||
if (bmpUp.Ok())
|
if (bmpUp.Ok())
|
||||||
{
|
{
|
||||||
pb->SetBitmapLabel(bmpUp);
|
pb->SetBitmapLabel(bmpUp);
|
||||||
@ -425,7 +425,7 @@ void xvt_btn_set_images(WINDOW win, XVT_IMAGE up, XVT_IMAGE down)
|
|||||||
}
|
}
|
||||||
if (down != NULL)
|
if (down != NULL)
|
||||||
{
|
{
|
||||||
wxBitmap bmpDown(Image2Bitmap(down, mx, my, TRUE));
|
wxBitmap bmpDown = Image2Bitmap(down, mx, my, TRUE);
|
||||||
if (bmpDown.Ok())
|
if (bmpDown.Ok())
|
||||||
pb->SetBitmapSelected(bmpDown);
|
pb->SetBitmapSelected(bmpDown);
|
||||||
}
|
}
|
||||||
@ -621,8 +621,8 @@ inline bool VALID_NOTEBOOK(WINDOW notebk, short page_no)
|
|||||||
{ return page_no >= 0 && wxDynamicCast((wxObject*)notebk, TwxNoteBook)!=NULL; }
|
{ return page_no >= 0 && wxDynamicCast((wxObject*)notebk, TwxNoteBook)!=NULL; }
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(TwxNoteBook, wxAuiNotebook)
|
BEGIN_EVENT_TABLE(TwxNoteBook, wxAuiNotebook)
|
||||||
EVT_AUINOTEBOOK_PAGE_CHANGING(wxID_ANY, OnPageChanging)
|
EVT_AUINOTEBOOK_PAGE_CHANGING(wxID_ANY, TwxNoteBook::OnPageChanging)
|
||||||
//EVT_AUINOTEBOOK_PAGE_CHANGED(wxID_ANY, OnPageChanged)
|
EVT_AUINOTEBOOK_PAGE_CHANGED(wxID_ANY, TwxNoteBook::OnPageChanged)
|
||||||
END_EVENT_TABLE();
|
END_EVENT_TABLE();
|
||||||
|
|
||||||
bool TwxNoteBook::SetBackgroundColour(const wxColour& col)
|
bool TwxNoteBook::SetBackgroundColour(const wxColour& col)
|
||||||
@ -636,6 +636,7 @@ bool TwxNoteBook::SetBackgroundColour(const wxColour& col)
|
|||||||
}
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TwxNoteBook::OnPageChanging(wxAuiNotebookEvent& evt)
|
void TwxNoteBook::OnPageChanging(wxAuiNotebookEvent& evt)
|
||||||
{
|
{
|
||||||
if (!m_bSuspended)
|
if (!m_bSuspended)
|
||||||
@ -646,6 +647,7 @@ void TwxNoteBook::OnPageChanging(wxAuiNotebookEvent& evt)
|
|||||||
e.v.ctl.id = evt.GetId();
|
e.v.ctl.id = evt.GetId();
|
||||||
ci.type = WC_NOTEBK;
|
ci.type = WC_NOTEBK;
|
||||||
ci.win = WINDOW(this);
|
ci.win = WINDOW(this);
|
||||||
|
// page == NULL_WIN -> changing page; page != NULL_WIN -> page changed.
|
||||||
ci.v.notebk.page = NULL_WIN;
|
ci.v.notebk.page = NULL_WIN;
|
||||||
ci.v.notebk.page_new = evt.GetSelection();
|
ci.v.notebk.page_new = evt.GetSelection();
|
||||||
ci.v.notebk.page_old = evt.GetOldSelection();
|
ci.v.notebk.page_old = evt.GetOldSelection();
|
||||||
@ -653,15 +655,21 @@ void TwxNoteBook::OnPageChanging(wxAuiNotebookEvent& evt)
|
|||||||
TwxWindow* win = wxStaticCast(GetParent(), TwxWindow);
|
TwxWindow* win = wxStaticCast(GetParent(), TwxWindow);
|
||||||
const bool refused = win->DoXvtEvent(e) != 0;
|
const bool refused = win->DoXvtEvent(e) != 0;
|
||||||
if (refused)
|
if (refused)
|
||||||
evt.Veto();
|
evt.Veto(); // Vieta il passaggio alla pagina nuova
|
||||||
|
else
|
||||||
|
evt.Skip(); // Permette la notifica dell'evento PageChanged
|
||||||
|
|
||||||
m_bSuspended = false;
|
m_bSuspended = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
void TwxNoteBook::OnPageChanged(wxAuiNotebookEvent& evt)
|
void TwxNoteBook::OnPageChanged(wxAuiNotebookEvent& evt)
|
||||||
{
|
{
|
||||||
|
#if !wxCHECK_VERSION(2,9,0)
|
||||||
|
// Nelle versioni vecchie mando la notifica solo al book in basso di ba0
|
||||||
|
if (m_flags & wxAUI_NB_BOTTOM)
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!m_bSuspended)
|
if (!m_bSuspended)
|
||||||
{
|
{
|
||||||
m_bSuspended = true;
|
m_bSuspended = true;
|
||||||
@ -670,7 +678,8 @@ void TwxNoteBook::OnPageChanged(wxAuiNotebookEvent& evt)
|
|||||||
e.v.ctl.id = evt.GetId();
|
e.v.ctl.id = evt.GetId();
|
||||||
ci.type = WC_NOTEBK;
|
ci.type = WC_NOTEBK;
|
||||||
ci.win = WINDOW(this);
|
ci.win = WINDOW(this);
|
||||||
ci.v.notebk.page = (WINDOW)GetPage(evt.GetSelection());
|
// page == NULL_WIN -> changing page; page != NULL_WIN -> page changed.
|
||||||
|
ci.v.notebk.page = (WINDOW)GetPage(evt.GetSelection());
|
||||||
ci.v.notebk.page_new = evt.GetSelection();
|
ci.v.notebk.page_new = evt.GetSelection();
|
||||||
ci.v.notebk.page_old = evt.GetOldSelection();
|
ci.v.notebk.page_old = evt.GetOldSelection();
|
||||||
|
|
||||||
@ -679,13 +688,10 @@ void TwxNoteBook::OnPageChanged(wxAuiNotebookEvent& evt)
|
|||||||
m_bSuspended = false;
|
m_bSuspended = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
short TwxNoteBook::AddTab(wxWindow* pPage, const wxString text, XVT_IMAGE xvt_img, short idx)
|
short TwxNoteBook::AddTab(wxWindow* pPage, const wxString text, XVT_IMAGE xvt_img, short idx)
|
||||||
{
|
{
|
||||||
wxBitmap bmp;
|
wxBitmap bmp = Image2Bitmap(xvt_img, BOOK_ICO_SIZE, BOOK_ICO_SIZE, TRUE);
|
||||||
if (xvt_img != NULL)
|
|
||||||
bmp = Image2Bitmap(xvt_img, BOOK_ICO_SIZE, BOOK_ICO_SIZE, TRUE);
|
|
||||||
|
|
||||||
if (idx < 0 || idx >= (int)GetPageCount())
|
if (idx < 0 || idx >= (int)GetPageCount())
|
||||||
{
|
{
|
||||||
@ -700,15 +706,8 @@ short TwxNoteBook::AddTab(wxWindow* pPage, const wxString text, XVT_IMAGE xvt_im
|
|||||||
|
|
||||||
void TwxNoteBook::SetTabImage(size_t idx, XVT_IMAGE img)
|
void TwxNoteBook::SetTabImage(size_t idx, XVT_IMAGE img)
|
||||||
{
|
{
|
||||||
if (img != NULL)
|
wxBitmap bmp = Image2Bitmap(img, BOOK_ICO_SIZE, BOOK_ICO_SIZE, TRUE);
|
||||||
{
|
SetPageBitmap(idx, bmp);
|
||||||
wxImage ico(*wxStaticCast(img, wxImage));
|
|
||||||
ico.Rescale(BOOK_ICO_SIZE, BOOK_ICO_SIZE, wxIMAGE_QUALITY_HIGH);
|
|
||||||
const wxBitmap bmp(ico);
|
|
||||||
SetPageBitmap(idx, bmp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
SetPageBitmap(idx, wxNullBitmap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TwxNoteBook::ChangeSelection(size_t tab_no)
|
int TwxNoteBook::ChangeSelection(size_t tab_no)
|
||||||
@ -834,6 +833,18 @@ void xvt_notebk_set_front_page(WINDOW notebk, short tab_no)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
short xvt_notebk_get_front_page(WINDOW notebk)
|
||||||
|
{
|
||||||
|
short idx = -1;
|
||||||
|
if (notebk != NULL_WIN)
|
||||||
|
{
|
||||||
|
CAST_NOTEBOOK(notebk, nb);
|
||||||
|
idx = nb.GetSelection();
|
||||||
|
}
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
char* xvt_notebk_get_tab_title(WINDOW notebk, short tab_no, char* title, int sz_title)
|
char* xvt_notebk_get_tab_title(WINDOW notebk, short tab_no, char* title, int sz_title)
|
||||||
{
|
{
|
||||||
if (VALID_NOTEBOOK(notebk, tab_no))
|
if (VALID_NOTEBOOK(notebk, tab_no))
|
||||||
@ -2363,3 +2374,38 @@ int xvt_prop_get_data(WINDOW win, XVT_TREEVIEW_NODE node, char* value, int maxle
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOLEAN xvt_for_each_property(WINDOW pg, const wxPGProperty* prop, PROP_CALLBACK pcb, void* jolly)
|
||||||
|
{
|
||||||
|
BOOLEAN ok = prop != NULL && pcb != NULL;
|
||||||
|
if (ok && !prop->IsRoot())
|
||||||
|
ok = pcb(pg, (XVT_TREEVIEW_NODE)prop, jolly);
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
const int nc = prop->GetChildCount();
|
||||||
|
for (int c = 0; c < nc && ok; c++)
|
||||||
|
ok = xvt_for_each_property(pg, prop->Item(c), pcb, jolly);
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN xvt_prop_for_each(WINDOW win, PROP_CALLBACK pcb, void* jolly)
|
||||||
|
{
|
||||||
|
BOOLEAN ok = FALSE;
|
||||||
|
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
|
||||||
|
if (pg != NULL)
|
||||||
|
ok = xvt_for_each_property(win, pg->GetRoot(), pcb, jolly);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN xvt_prop_set_read_only(WINDOW win, XVT_TREEVIEW_NODE node, BOOLEAN ro)
|
||||||
|
{
|
||||||
|
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
|
||||||
|
if (pg != NULL)
|
||||||
|
{
|
||||||
|
wxPGProperty* pgp = wxDynamicCast((wxObject*)node, wxPGProperty);
|
||||||
|
if (pgp == NULL)
|
||||||
|
pgp = pg->GetRoot();
|
||||||
|
pgp->SetFlagRecursively(wxPG_PROP_DISABLED, ro != 0);
|
||||||
|
}
|
||||||
|
return pg != NULL;
|
||||||
|
}
|
||||||
|
704
xvaga/xvtdm.cpp
Executable file
704
xvaga/xvtdm.cpp
Executable file
@ -0,0 +1,704 @@
|
|||||||
|
#include "wxinc.h"
|
||||||
|
|
||||||
|
#include "xvt.h"
|
||||||
|
#include "xvtwin.h"
|
||||||
|
|
||||||
|
#include <wx/artprov.h>
|
||||||
|
#include <wx/calctrl.h>
|
||||||
|
#include <wx/colordlg.h>
|
||||||
|
#include <wx/fontdlg.h>
|
||||||
|
#include <wx/statline.h>
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// TMessageBox
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class TMessageBox : public wxDialog
|
||||||
|
{
|
||||||
|
wxTimer m_timer;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void OnButton(wxCommandEvent& evt);
|
||||||
|
void OnTimeout(wxTimerEvent& evt);
|
||||||
|
void AddButton(wxSizer* sz, int id, int ico);
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
|
||||||
|
public:
|
||||||
|
TMessageBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(TMessageBox, wxDialog)
|
||||||
|
EVT_BUTTON(wxID_ANY, TMessageBox::OnButton)
|
||||||
|
EVT_TIMER(wxID_ANY, TMessageBox::OnTimeout)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
void TMessageBox::OnButton(wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
int ec = wxCANCEL;
|
||||||
|
switch (evt.GetId())
|
||||||
|
{
|
||||||
|
case wxID_YES: ec = wxYES; break;
|
||||||
|
case wxID_OK : ec = wxOK; break;
|
||||||
|
case wxID_NO : ec = wxNO; break;
|
||||||
|
default : ec = GetEscapeId(); break;
|
||||||
|
}
|
||||||
|
EndModal(ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMessageBox::OnTimeout(wxTimerEvent& WXUNUSED(evt))
|
||||||
|
{
|
||||||
|
wxWindowID id = GetEscapeId();
|
||||||
|
if (id <= 0)
|
||||||
|
id = GetAffirmativeId();
|
||||||
|
if (id > 0)
|
||||||
|
{
|
||||||
|
wxCommandEvent cmd(wxEVT_COMMAND_BUTTON_CLICKED, id);
|
||||||
|
AddPendingEvent(cmd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
EndModal(wxCANCEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMessageBox::AddButton(wxSizer* sz, int id, int WXUNUSED(ico))
|
||||||
|
{
|
||||||
|
sz->Add(new wxButton(this, id, wxEmptyString, wxDefaultPosition, wxSize(80, 32)), 0, wxALL, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
TMessageBox::TMessageBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout)
|
||||||
|
: wxDialog(pParent, wxID_ANY, _GetAppTitle(), wxDefaultPosition, wxDefaultSize,
|
||||||
|
wxCAPTION | wxRAISED_BORDER), m_timer(this)
|
||||||
|
{
|
||||||
|
TTaskWin* tw = wxDynamicCast(pParent ? pParent : _task_win, TTaskWin);
|
||||||
|
if (tw != NULL)
|
||||||
|
{
|
||||||
|
const COLOR col = tw->GetCtlColor(XVT_COLOR_BACKGROUND);
|
||||||
|
if (col != COLOR_INVALID)
|
||||||
|
{
|
||||||
|
CAST_COLOR(col, rgb);
|
||||||
|
SetOwnBackgroundColour(rgb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
|
wxBoxSizer* sz1 = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
sizer->Add(sz1);
|
||||||
|
|
||||||
|
wxArtID nIco = wxART_INFORMATION;
|
||||||
|
if (nStyle & wxICON_HAND) nIco = wxART_ERROR; else
|
||||||
|
if (nStyle & wxICON_INFORMATION) nIco = wxART_INFORMATION; else
|
||||||
|
if (nStyle & wxICON_EXCLAMATION) nIco = wxART_WARNING; else
|
||||||
|
if (nStyle & wxICON_QUESTION) nIco = wxART_QUESTION; else
|
||||||
|
if (nStyle & 0x1000) nIco = "220";
|
||||||
|
|
||||||
|
const wxBitmap img = wxArtProvider::GetBitmap(nIco, wxART_MESSAGE_BOX, wxSize(64,64));
|
||||||
|
|
||||||
|
const int nBorder = 8;
|
||||||
|
sz1->Add(new wxStaticBitmap(this, wxID_ANY, img), 0, wxALL, nBorder);
|
||||||
|
wxStaticText* ss = new wxStaticText(this, wxID_ANY, wxEmptyString);
|
||||||
|
ss->Wrap(160);
|
||||||
|
ss->SetLabel(msg);
|
||||||
|
sz1->Add(ss, 0, wxALL|wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL, nBorder);
|
||||||
|
|
||||||
|
sizer->Add(new wxStaticLine(this), 0, wxALL|wxEXPAND, nBorder);
|
||||||
|
|
||||||
|
wxBoxSizer* sz2 = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
sizer->Add(sz2, 0, wxALIGN_CENTER);
|
||||||
|
if (nStyle & wxYES_NO)
|
||||||
|
{
|
||||||
|
if (nStyle & wxNO_DEFAULT)
|
||||||
|
{
|
||||||
|
SetAffirmativeId(wxID_NO);
|
||||||
|
SetEscapeId(wxID_YES);
|
||||||
|
AddButton(sz2, wxID_NO, 102);
|
||||||
|
AddButton(sz2, wxID_YES, 101);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetAffirmativeId(wxID_YES);
|
||||||
|
SetEscapeId(wxID_NO);
|
||||||
|
AddButton(sz2, wxID_YES, 101);
|
||||||
|
AddButton(sz2, wxID_NO, 102);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nStyle & wxOK)
|
||||||
|
{
|
||||||
|
SetAffirmativeId(wxID_OK);
|
||||||
|
AddButton(sz2, wxID_OK, 101);
|
||||||
|
}
|
||||||
|
if (nStyle & wxCANCEL)
|
||||||
|
{
|
||||||
|
SetEscapeId(wxID_CANCEL);
|
||||||
|
AddButton(sz2, wxID_CANCEL, 102);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetSizerAndFit(sizer);
|
||||||
|
|
||||||
|
if (nStyle & wxCENTRE)
|
||||||
|
Centre();
|
||||||
|
|
||||||
|
if (nTimeout > 0)
|
||||||
|
m_timer.Start(1000*nTimeout, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// _*Box
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
int _MessageBox(const wxString& msg, int nStyle, int nTimeout = 0)
|
||||||
|
{
|
||||||
|
xvt_dm_post_speech(msg, 1, TRUE);
|
||||||
|
|
||||||
|
TMessageBox dlg(NULL, msg, nStyle, nTimeout);
|
||||||
|
const int ret = dlg.ShowModal();
|
||||||
|
|
||||||
|
switch(ret)
|
||||||
|
{
|
||||||
|
case wxOK : xvt_dm_post_speech(_("ok"), 7, TRUE); break;
|
||||||
|
case wxYES: xvt_dm_post_speech(_("si"), 7, TRUE); break;
|
||||||
|
case wxNO : xvt_dm_post_speech(_("no"), 7, TRUE); break;
|
||||||
|
default : xvt_dm_post_speech(_("annulla"), 7, TRUE); break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// _PopUpBox
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class TPopUpBox : public wxDialog
|
||||||
|
{
|
||||||
|
DECLARE_EVENT_TABLE();
|
||||||
|
wxTimer m_Timer;
|
||||||
|
int m_nStep, m_nTimeout;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void OnTimer(wxTimerEvent& evt);
|
||||||
|
void OnChar(wxKeyEvent& evt);
|
||||||
|
void OnClick(wxMouseEvent& evt);
|
||||||
|
|
||||||
|
public:
|
||||||
|
TPopUpBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout);
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(TPopUpBox, wxDialog)
|
||||||
|
EVT_TIMER(wxID_ANY, TPopUpBox::OnTimer)
|
||||||
|
EVT_CHAR(TPopUpBox::OnChar)
|
||||||
|
EVT_LEFT_DOWN(TPopUpBox::OnClick)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
void TPopUpBox::OnChar(wxKeyEvent& WXUNUSED(evt))
|
||||||
|
{
|
||||||
|
if (IsShown())
|
||||||
|
{
|
||||||
|
m_Timer.Stop();
|
||||||
|
EndModal(wxID_CANCEL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPopUpBox::OnClick(wxMouseEvent& WXUNUSED(evt))
|
||||||
|
{
|
||||||
|
if (IsShown())
|
||||||
|
{
|
||||||
|
m_Timer.Stop();
|
||||||
|
EndModal(wxID_CANCEL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TPopUpBox::OnTimer(wxTimerEvent& WXUNUSED(evt))
|
||||||
|
{
|
||||||
|
if (IsShown())
|
||||||
|
{
|
||||||
|
const wxRect rctMain = GetParent()->GetRect();
|
||||||
|
const wxRect rctMine = GetRect();
|
||||||
|
const int msec = (m_nStep++)*m_Timer.GetInterval();
|
||||||
|
if (msec <= m_nTimeout/4)
|
||||||
|
{
|
||||||
|
const double perc = double(msec)/(m_nTimeout/4);
|
||||||
|
Move(rctMain.x, rctMain.GetBottom() - rctMine.height * perc);
|
||||||
|
}
|
||||||
|
if (msec >= 3*m_nTimeout/4 && msec <= m_nTimeout)
|
||||||
|
{
|
||||||
|
const double perc = double(m_nTimeout-msec)/(m_nTimeout/4);
|
||||||
|
Move(rctMain.x, rctMain.GetBottom() - rctMine.height * perc);
|
||||||
|
}
|
||||||
|
if (msec > m_nTimeout)
|
||||||
|
{
|
||||||
|
m_Timer.Stop();
|
||||||
|
EndModal(wxID_CANCEL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TPopUpBox::TPopUpBox(wxWindow* pParent, const wxString& msg, int nStyle, int nTimeout)
|
||||||
|
: wxDialog(pParent, wxID_ANY, wxEmptyString, wxPoint(0,2024), wxDefaultSize, wxBORDER_SIMPLE),
|
||||||
|
m_nTimeout(nTimeout*1000), m_Timer(this), m_nStep(0)
|
||||||
|
{
|
||||||
|
TTaskWin* tw = wxDynamicCast(pParent ? pParent : _task_win, TTaskWin);
|
||||||
|
if (tw != NULL)
|
||||||
|
{
|
||||||
|
const COLOR col = tw->GetCtlColor(XVT_COLOR_BACKGROUND);
|
||||||
|
if (col != COLOR_INVALID)
|
||||||
|
{
|
||||||
|
CAST_COLOR(col, rgb);
|
||||||
|
SetOwnBackgroundColour(rgb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBoxSizer* sz = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
|
wxArtID nIco = wxART_ERROR;
|
||||||
|
if (nStyle & wxICON_HAND) nIco = wxART_ERROR; else
|
||||||
|
if (nStyle & wxICON_INFORMATION) nIco = wxART_INFORMATION; else
|
||||||
|
if (nStyle & wxICON_EXCLAMATION) nIco = wxART_WARNING; else
|
||||||
|
if (nStyle & 0x1000) nIco = "220";
|
||||||
|
const wxBitmap img = wxArtProvider::GetBitmap(nIco, wxART_MESSAGE_BOX);
|
||||||
|
|
||||||
|
wxStaticBitmap* bmp = new wxStaticBitmap(this, wxID_ANY, img);
|
||||||
|
sz->Add(bmp, 0, wxALL, 8);
|
||||||
|
|
||||||
|
wxStaticText* ss = new wxStaticText(this, wxID_ANY, wxEmptyString);
|
||||||
|
ss->Wrap(160);
|
||||||
|
ss->SetLabel(msg);
|
||||||
|
sz->Add(ss, 0, wxALL | wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, 8);
|
||||||
|
|
||||||
|
SetSizerAndFit(sz);
|
||||||
|
m_Timer.Start(25);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _PopUpBox(const wxString& msg, int nStyle, int nTimeout = 4)
|
||||||
|
{
|
||||||
|
const int oem = xvt_sys_get_oem_int("OEM", -1);
|
||||||
|
wxWindow* pFrame = wxTheApp->GetTopWindow();
|
||||||
|
if (oem == 0 && pFrame != NULL)
|
||||||
|
{
|
||||||
|
xvt_sys_beep(nStyle & wxICON_ERROR ? 2 : 1);
|
||||||
|
TPopUpBox dlg(pFrame, msg, nStyle, nTimeout <= 0 ? 4 : nTimeout);
|
||||||
|
dlg.ShowModal();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_MessageBox(msg, nStyle|wxOK|wxCENTRE, nTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
WX_DECLARE_STRING_HASH_MAP(int, TMessagesMap);
|
||||||
|
|
||||||
|
void xvt_sys_sorry_box(const char* func, const char* file, int line)
|
||||||
|
{
|
||||||
|
#ifndef NDEBUG
|
||||||
|
static TMessagesMap sorry;
|
||||||
|
if (sorry[func]++ == 0)
|
||||||
|
{
|
||||||
|
wxString strMessage;
|
||||||
|
strMessage.Printf("Function %s in file %s at line %d\nis not implemented yet: be patient...",
|
||||||
|
func, file, line);
|
||||||
|
_PopUpBox(strMessage, 0x1000); // Smiley Icon
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_sys_deprecated_box(const char* oldfunc, const char* file, const char* newfunc)
|
||||||
|
{
|
||||||
|
#ifndef NDEBUG
|
||||||
|
static TMessagesMap deprecated;
|
||||||
|
if (deprecated[oldfunc]++ == 0)
|
||||||
|
{
|
||||||
|
wxString strMessage;
|
||||||
|
strMessage.Printf("Function %s in file %s is deprecated:\n%s is much more trendy now!\nYou can blame Guy for this, if you're bold enough!",
|
||||||
|
oldfunc, file, newfunc);
|
||||||
|
_PopUpBox(strMessage, 0x1000);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// Speech support
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// 0 Errors
|
||||||
|
// 1 Warnings
|
||||||
|
// 2 Messages
|
||||||
|
// 3 Requests
|
||||||
|
// 7 Buttons
|
||||||
|
static int m_nSpeechMode = 0;
|
||||||
|
|
||||||
|
void xvt_dm_speech_enable(int mode)
|
||||||
|
{
|
||||||
|
#ifdef SPEECH_API
|
||||||
|
m_nSpeechMode = mode;
|
||||||
|
#ifdef WIN32
|
||||||
|
if (m_nSpeechMode != 0)
|
||||||
|
{
|
||||||
|
if (!OsWin32_InitializeSpeech())
|
||||||
|
m_nSpeechMode = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OsWin32_DeinitializeSpeech();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int xvt_dm_speech_enabled(void)
|
||||||
|
{
|
||||||
|
return m_nSpeechMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// Common dialogs
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void xvt_dm_post_about_box()
|
||||||
|
{
|
||||||
|
const char* ver = (const char*)xvt_vobj_get_attr(NULL_WIN, ATTR_APPL_VERSION_STRING);
|
||||||
|
if (ver == NULL || !*ver) ver = "2010 10.0/900";
|
||||||
|
wxString msg; msg << "Versione " << ver;
|
||||||
|
xvt_dm_post_message(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
COLOR xvt_dm_post_choose_color(WINDOW win, COLOR xc)
|
||||||
|
{
|
||||||
|
DEPRECATED_BOX("xvt_dm_post_color_sel");
|
||||||
|
if (!xvt_dm_post_color_sel(&xc, win))
|
||||||
|
xc = COLOR_INVALID;
|
||||||
|
return xc;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN xvt_dm_post_color_sel(COLOR* color, unsigned long reserved)
|
||||||
|
{
|
||||||
|
CAST_COLOR(*color, wc);
|
||||||
|
|
||||||
|
wxColourData cd;
|
||||||
|
cd.SetChooseFull(true);
|
||||||
|
cd.SetColour(wc);
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
const unsigned char val = (i & 0x8) ? 255 : 127;
|
||||||
|
const unsigned char red = (i & 0x1) ? val : 0;
|
||||||
|
const unsigned char green = (i & 0x2) ? val : 0;
|
||||||
|
const unsigned char blue = (i & 0x4) ? val : 0;
|
||||||
|
wxColour col(red, green, blue);
|
||||||
|
cd.SetCustomColour(i, col);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxWindow* win = wxDynamicCast ((void*)reserved, wxWindow);
|
||||||
|
wxColourDialog dialog(win, &cd);
|
||||||
|
if (dialog.ShowModal() == wxID_OK)
|
||||||
|
{
|
||||||
|
*color = MAKE_XVT_COLOR(dialog.GetColourData().GetColour());
|
||||||
|
if (*color == 0) *color = COLOR_BLACK; // 0x000000 confonde XI, mentre con 0x07000000 e' a suo agio
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
class TwxCalendarDlg : public wxDialog
|
||||||
|
{
|
||||||
|
enum { ID_CAL = 1883 };
|
||||||
|
wxDateTime& m_date;
|
||||||
|
wxCalendarCtrl* m_cal;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool TransferDataFromWindow();
|
||||||
|
void OnCalendar(wxCalendarEvent& e);
|
||||||
|
|
||||||
|
public:
|
||||||
|
TwxCalendarDlg(wxWindow* parent, wxDateTime& date);
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
BEGIN_EVENT_TABLE(TwxCalendarDlg, wxDialog)
|
||||||
|
EVT_CALENDAR(wxID_ANY, TwxCalendarDlg::OnCalendar)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
void TwxCalendarDlg::OnCalendar(wxCalendarEvent& WXUNUSED(e))
|
||||||
|
{
|
||||||
|
wxCommandEvent evt(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
|
||||||
|
AddPendingEvent(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TwxCalendarDlg::TransferDataFromWindow()
|
||||||
|
{
|
||||||
|
bool ok = wxDialog::TransferDataFromWindow();
|
||||||
|
if (ok)
|
||||||
|
m_date = m_cal->GetDate();
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
TwxCalendarDlg::TwxCalendarDlg(wxWindow* parent, wxDateTime& date)
|
||||||
|
: wxDialog(parent, wxID_ANY, "Data", wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER), m_date(date)
|
||||||
|
{
|
||||||
|
|
||||||
|
m_cal = new wxCalendarCtrl(this, ID_CAL, m_date, wxDefaultPosition, wxDefaultSize,
|
||||||
|
wxCAL_MONDAY_FIRST | wxCAL_SHOW_HOLIDAYS | wxCAL_SHOW_SURROUNDING_WEEKS);
|
||||||
|
|
||||||
|
wxButton* button = new wxButton(this, wxID_OK, "OK");
|
||||||
|
|
||||||
|
wxGridSizer* sizer = new wxFlexGridSizer(2, 1, 8, 8);
|
||||||
|
sizer->Add(m_cal, 0, wxALIGN_CENTER);
|
||||||
|
sizer->Add(button, 0, wxALIGN_CENTER);
|
||||||
|
SetSizer(sizer);
|
||||||
|
sizer->SetSizeHints(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int xvt_dm_post_choose_date(WINDOW win, const RCT* rct, unsigned int ansidate)
|
||||||
|
{
|
||||||
|
int d = ansidate%100;
|
||||||
|
int m = (ansidate/100)%100;
|
||||||
|
int y = ansidate / 10000;
|
||||||
|
|
||||||
|
wxDateTime date;
|
||||||
|
if (d >= 1 && d <= 31 && m >= 1 && m <= 12 && y > 1900)
|
||||||
|
date.Set(d, wxDateTime::Month(m-1), y);
|
||||||
|
else
|
||||||
|
date = wxDateTime::Today();
|
||||||
|
|
||||||
|
CAST_WIN(win, w);
|
||||||
|
wxDialog* dlg = new TwxCalendarDlg(&w, date);
|
||||||
|
|
||||||
|
if (rct != NULL)
|
||||||
|
{
|
||||||
|
const wxRect client = w.GetClientRect();
|
||||||
|
const wxRect rect = dlg->GetRect();
|
||||||
|
wxPoint pos(rct->right - rect.width, rct->bottom);
|
||||||
|
if (pos.x < 0)
|
||||||
|
pos.x = rct->left;
|
||||||
|
if (rct->bottom + rect.height > client.GetBottom())
|
||||||
|
pos.y = rct->top - rect.height;
|
||||||
|
dlg->Move(w.ClientToScreen(pos));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dlg->ShowModal() == wxID_OK)
|
||||||
|
{
|
||||||
|
d = date.GetDay();
|
||||||
|
m = date.GetMonth()+1;
|
||||||
|
y = date.GetYear();
|
||||||
|
ansidate = y*10000 + m*100 + d;
|
||||||
|
}
|
||||||
|
dlg->Destroy();
|
||||||
|
|
||||||
|
return ansidate;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN xvt_dm_post_speech(const char* text, int priority, BOOLEAN async)
|
||||||
|
{
|
||||||
|
BOOLEAN ok = FALSE;
|
||||||
|
#ifdef SPEECH_API
|
||||||
|
if ((m_nSpeechMode & (1 << priority)) != 0)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
ok = OsWin32_Speak(text, async != 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASK_RESPONSE xvt_dm_post_ask(const char* Btn1, const char* Btn2, const char* Btn3, const char* fmt)
|
||||||
|
{
|
||||||
|
int nFlags = wxCENTRE | wxICON_QUESTION | wxYES_NO;
|
||||||
|
if (Btn3 == NULL)
|
||||||
|
{
|
||||||
|
if (wxStricmp(Btn1, "no") == 0)
|
||||||
|
nFlags |= wxNO_DEFAULT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nFlags |= wxCANCEL;
|
||||||
|
|
||||||
|
const int answer = _MessageBox(fmt, nFlags);
|
||||||
|
return answer == wxYES ? RESP_DEFAULT : (answer == wxNO ? RESP_2 : RESP_3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_post_error(const char *fmt)
|
||||||
|
{
|
||||||
|
//_MessageBox(fmt, wxOK | wxCENTRE | wxICON_HAND);
|
||||||
|
_PopUpBox(fmt, wxICON_HAND, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_post_fatal_exit(const char *fmt)
|
||||||
|
{
|
||||||
|
xvt_dm_post_speech(fmt, 1, TRUE);
|
||||||
|
wxLogFatalError(fmt);
|
||||||
|
xvt_dm_post_speech("OK", 7, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static wxString MakeFileName(const wxChar* name, const wxChar* ext)
|
||||||
|
{
|
||||||
|
wxString f = name;
|
||||||
|
if (ext && *ext)
|
||||||
|
{
|
||||||
|
if (*ext != '.')
|
||||||
|
f += '.';
|
||||||
|
f += ext;
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FL_STATUS xvt_dm_post_file_ask(FILE_SPEC *fsp, const char *msg, int flags)
|
||||||
|
{
|
||||||
|
DIRECTORY savedir; xvt_fsys_get_dir(&savedir); // Salvo cartella corrente
|
||||||
|
|
||||||
|
wxString path = fsp->dir.path;
|
||||||
|
wxString name = MakeFileName(fsp->name, fsp->type);
|
||||||
|
wxString extension = fsp->type;
|
||||||
|
wxString wild;
|
||||||
|
if (!extension.IsEmpty() && extension != "*")
|
||||||
|
wild << "File " << extension << " (*." << extension << ")|*." << extension << "|";
|
||||||
|
if (flags & wxFD_OPEN)
|
||||||
|
wild << "Tutti i file (*.*)|*.*|";
|
||||||
|
wild << '|';
|
||||||
|
|
||||||
|
wxString selectedname = wxFileSelector(msg, path, name, extension , wild, flags);
|
||||||
|
if (selectedname.IsEmpty())
|
||||||
|
return FL_CANCEL;
|
||||||
|
xvt_fsys_convert_str_to_fspec(selectedname, fsp);
|
||||||
|
|
||||||
|
xvt_fsys_set_dir(&savedir); // Ripristino cartella corrente
|
||||||
|
|
||||||
|
return FL_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
FL_STATUS xvt_dm_post_file_open(FILE_SPEC *fsp, const char *msg)
|
||||||
|
{
|
||||||
|
const int flags = wxFD_OPEN | wxFD_FILE_MUST_EXIST;
|
||||||
|
return xvt_dm_post_file_ask(fsp, msg, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
FL_STATUS xvt_dm_post_file_save(FILE_SPEC *fsp, const char *msg)
|
||||||
|
{
|
||||||
|
const int flags = wxFD_SAVE | wxFD_OVERWRITE_PROMPT;
|
||||||
|
return xvt_dm_post_file_ask(fsp, msg, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
FL_STATUS xvt_dm_post_dir_sel(DIRECTORY *dir)
|
||||||
|
{
|
||||||
|
wxDirDialog dlg(_task_win);
|
||||||
|
dlg.SetPath(dir->path);
|
||||||
|
if (dlg.ShowModal() == wxID_OK)
|
||||||
|
{
|
||||||
|
xvt_fsys_convert_str_to_dir(dlg.GetPath(), dir);
|
||||||
|
return FL_OK;
|
||||||
|
}
|
||||||
|
return FL_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN xvt_dm_post_font_sel(WINDOW win, XVT_FNTID font_id, PRINT_RCD* WXUNUSED(precp), unsigned long reserved)
|
||||||
|
{
|
||||||
|
CAST_FONT(font_id, font);
|
||||||
|
wxFontData data;
|
||||||
|
data.SetInitialFont(font.Font(NULL, win));
|
||||||
|
data.EnableEffects(reserved != 0);
|
||||||
|
wxFontDialog dlg(_task_win, data);
|
||||||
|
BOOLEAN ok = dlg.ShowModal() == wxID_OK;
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
font.Copy(dlg.GetFontData().GetChosenFont());
|
||||||
|
if (win == (WINDOW)_task_win)
|
||||||
|
{
|
||||||
|
EVENT e; memset(&e, 0, sizeof(EVENT));
|
||||||
|
e.type = E_FONT;
|
||||||
|
e.v.font.font_id = font_id;
|
||||||
|
_task_win_handler(win, &e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_post_message(const char *fmt)
|
||||||
|
{
|
||||||
|
//_MessageBox(fmt, wxOK | wxCENTRE | wxICON_INFORMATION);
|
||||||
|
_PopUpBox(fmt, wxICON_INFORMATION, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_post_note(const char *fmt)
|
||||||
|
{
|
||||||
|
// _MessageBox(fmt, wxOK | wxCENTRE | wxICON_EXCLAMATION);
|
||||||
|
_PopUpBox(fmt, wxICON_EXCLAMATION, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* xvt_dm_post_string_prompt(const char* message, char* response, int response_len)
|
||||||
|
{
|
||||||
|
if (message && response && response_len > 0)
|
||||||
|
{
|
||||||
|
wxTextEntryDialog dlg(NULL, message, _GetAppTitle(), response);
|
||||||
|
if (dlg.ShowModal() == wxID_OK)
|
||||||
|
{
|
||||||
|
wxStrncpy(response, dlg.GetValue(), response_len);
|
||||||
|
response[response_len-1] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*response = '\0';
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_post_warning(const char *fmt)
|
||||||
|
{
|
||||||
|
// _MessageBox(fmt, wxOK | wxCENTRE | wxICON_EXCLAMATION);
|
||||||
|
_PopUpBox(fmt, wxICON_EXCLAMATION, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_popup_error(const char *fmt)
|
||||||
|
{
|
||||||
|
_PopUpBox(fmt, wxICON_HAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_popup_message(const char *fmt)
|
||||||
|
{
|
||||||
|
_PopUpBox(fmt, wxICON_INFORMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_dm_popup_warning(const char *fmt)
|
||||||
|
{
|
||||||
|
_PopUpBox(fmt, wxICON_EXCLAMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// Help system
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
#include "OsWin32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct XVAGA_HELP_INFO
|
||||||
|
{
|
||||||
|
wxString m_strFilename;
|
||||||
|
bool m_hlp;
|
||||||
|
} help_info;
|
||||||
|
|
||||||
|
XVT_HELP_INFO xvt_help_open_helpfile(FILE_SPEC* WXUNUSED(fs), unsigned long WXUNUSED(flags))
|
||||||
|
{
|
||||||
|
return (XVT_HELP_INFO)&help_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
void xvt_help_close_helpfile(XVT_HELP_INFO hi)
|
||||||
|
{
|
||||||
|
if (hi == NULL_HELP_INFO)
|
||||||
|
hi = (XVT_HELP_INFO)&help_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN xvt_help_process_event(XVT_HELP_INFO hi, WINDOW win, EVENT *ev)
|
||||||
|
{
|
||||||
|
BOOLEAN bProcessed = FALSE;
|
||||||
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
WXHWND hwnd = (WXHWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
|
||||||
|
switch (ev->type)
|
||||||
|
{
|
||||||
|
case E_COMMAND:
|
||||||
|
bProcessed = OsWin32_Help(hwnd, "", ev->v.cmd.tag, NULL);
|
||||||
|
break;
|
||||||
|
case E_HELP:
|
||||||
|
bProcessed = OsWin32_Help(hwnd, "", M_HELP_ONCONTEXT, (const char*)ev->v.help.tid);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif // WIN32
|
||||||
|
|
||||||
|
return bProcessed;
|
||||||
|
}
|
@ -231,6 +231,12 @@ struct XVT_EVENT : public EVENT
|
|||||||
#define TIMER_ID 1
|
#define TIMER_ID 1
|
||||||
const wxString& _GetAppTitle();
|
const wxString& _GetAppTitle();
|
||||||
|
|
||||||
|
#define CAST_WIN(win,w) wxWindow& w = *wxStaticCast((wxObject*)win, wxWindow);
|
||||||
|
#define CAST_TWIN(win,w) TwxWindow& w = *wxStaticCast((wxObject*)win, TwxWindow);
|
||||||
|
#define CAST_TDC(win,dc) TDC& dc = GetTDCMapper().GetTDC(win);
|
||||||
|
#define CAST_DC(win,dc) wxDC& dc = GetTDCMapper().GetDC(win);
|
||||||
|
#define CAST_FONT(font_id, font) TFontId& font = *wxStaticCast(font_id, TFontId);
|
||||||
|
|
||||||
#define CAST_COLOR(xc, wc) wxColour wc((xc>>16)&0xFF, (xc>>8)&0xFF, xc&0xFF)
|
#define CAST_COLOR(xc, wc) wxColour wc((xc>>16)&0xFF, (xc>>8)&0xFF, xc&0xFF)
|
||||||
#define MAKE_XVT_COLOR(wc) XVT_MAKE_COLOR(wc.Red(), wc.Green(), wc.Blue())
|
#define MAKE_XVT_COLOR(wc) XVT_MAKE_COLOR(wc.Red(), wc.Green(), wc.Blue())
|
||||||
wxRect NormalizeRCT(const RCT* prct);
|
wxRect NormalizeRCT(const RCT* prct);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user