Aggiunto supporto per mail senza outlook

git-svn-id: svn://10.65.10.50/branches/R_10_00@23147 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2015-11-30 16:29:32 +00:00
parent 50bf746c69
commit 941d28df75
11 changed files with 266 additions and 274 deletions

View File

@ -53,6 +53,8 @@ static LONG GetNextNameValue(HKEY key, LPCTSTR subkey, LPTSTR szName, LPTSTR szD
#define W7STR _T("Windows 7")
#define W2012STR _T("Windows Server 2012")
#define W8STR _T("Windows 8")
#define W10STR _T("Windows 10")
#define W2016STR _T("Windows Server 2016")
#define WUNKNOWN 0
@ -78,6 +80,8 @@ static LONG GetNextNameValue(HKEY key, LPCTSTR subkey, LPTSTR szName, LPTSTR szD
#define W7 109
#define W2012 110
#define W8 111
#define W10 112
#define W2016 103
#define WNTLAST 199
#define WCEFIRST 201
@ -572,7 +576,10 @@ Vista 2 6 0
2008 2 6 0
2008 R2 2 6 1
Win7 2 6 1 3600
Win8 2 6 2
Win8.1 2 6 3
Win10 2 6 4
Win10 2 10 0
CE 3
*/
@ -605,7 +612,7 @@ bool GetWinVer(LPTSTR lpszVersion, int nVersionSize, int *pnVersion)
DWORD dwMinorVersion = osinfo.dwMinorVersion;
DWORD dwMajorVersion = osinfo.dwMajorVersion;
DWORD dwBuildNumber = osinfo.dwBuildNumber & 0xFFFF; // Win 95 needs this
TRACE(_T("%d: %d.%d.%d\n"), dwPlatformId, dwMajorVersion, dwMinorVersion, dwBuildNumber);
const bool bServer = osinfo.wProductType != VER_NT_WORKSTATION;
if (dwPlatformId == VER_PLATFORM_WIN32_NT)
{
@ -618,10 +625,9 @@ bool GetWinVer(LPTSTR lpszVersion, int nVersionSize, int *pnVersion)
case 2:
default: cp = W2003STR; nVersion = W2003; break;
}
}
else if (dwMajorVersion == 6)
} else
if (dwMajorVersion == 6)
{
const bool bServer = osinfo.wProductType != VER_NT_WORKSTATION;
switch (dwMinorVersion)
{
case 0:
@ -636,14 +642,28 @@ bool GetWinVer(LPTSTR lpszVersion, int nVersionSize, int *pnVersion)
else
{ cp = W7STR; nVersion = W7; }
break;
default:
case 2:
case 3:
if (bServer)
{ cp = W2012STR; nVersion = W2012; }
else
{ cp = W8STR; nVersion = W8; }
break;
default:
if (bServer)
{ cp = W2016STR; nVersion = W2016; }
else
{ cp = W10STR; nVersion = W10; }
break;
}
}
} else
if (dwMajorVersion >= 10)
{
if (bServer)
{ cp = W2016STR; nVersion = W2016; }
else
{ cp = W10STR; nVersion = W10; }
}
}
}

View File

@ -214,7 +214,9 @@ bool aga_dde_execute(unsigned long connection, const char* msg)
if (connection != 0)
{
wxAgaConnection* conn = (wxAgaConnection*)connection;
const bool bLogEnabled = wxLog::EnableLogging(false);
ok = conn->Execute(msg, -1);
wxLog::EnableLogging(bLogEnabled);
}
return ok;
}

View File

@ -1,107 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
// Name: email.h
// Purpose: wxEmail: portable email client class
// Author: Julian Smart
// Modified by:
// Created: 2001-08-21
// RCS-ID: $Id: email.cpp,v 1.6 2009-04-07 09:19:08 guy Exp $
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wxinc.h"
#include "email.h"
#ifdef __WXMSW__
#include "smapi.h"
#endif
#ifdef __UNIX__
#include "wx/filefn.h"
#include "wx/timer.h"
#include "wx/wfstream.h"
#include "stdlib.h"
#include "unistd.h"
#endif
// Send a message.
// Specify profile, if empty use MAPI default profile
#ifdef __WXMSW__
bool wxEmail::Send(wxMailMessage& message, const wxString& profileName, bool bUI, const wxString& WXUNUSED(sendMail))
{
wxASSERT (message.m_to.GetCount() > 0) ;
wxString profile(profileName);
wxMapiSession session;
if (!session.MapiInstalled())
return FALSE;
if (!session.Logon(profile))
return FALSE;
return session.Send(message, bUI);
}
#elif defined(__UNIX__)
bool wxEmail::Send(wxMailMessage& message, const wxString& profileName,
bool bUI, const wxString& sendMail)
{
wxASSERT_MSG( !message.m_to.IsEmpty(), _T("no recipients to send mail to") ) ;
// The 'from' field is optionally supplied by the app; it's not needed
// by MAPI, and on Unix, will be guessed if not supplied.
wxString from = message.m_from;
if ( from.empty() )
{
from = wxGetEmailAddress();
}
wxString msg;
msg << wxT("To: ");
const size_t rcptCount = message.m_to.GetCount();
for (size_t rcpt = 0; rcpt < rcptCount; rcpt++)
{
if ( rcpt )
msg << wxT(", ");
msg << message.m_to[rcpt];
}
msg << wxT("\nFrom: ") << from << wxT("\nSubject: ") << message.m_subject;
msg << wxT("\n\n") << message.m_body;
wxString filename;
filename.Printf(wxT("/tmp/msg-%ld-%ld-%ld.txt"), (long) getpid(), wxGetLocalTime(),
(long) rand());
{
wxFileOutputStream stream(filename);
if (stream.Ok())
{
stream.Write(msg, msg.Length());
}
else
{
return FALSE ;
}
}
// TODO search for a suitable sendmail if sendMail is empty
wxString sendmail(sendMail);
wxString cmd;
cmd << sendmail << wxT(" < ") << filename;
// TODO: check return code
wxSystem(cmd.c_str());
wxRemoveFile(filename);
return TRUE;
}
#else
#error Send not yet implemented for this platform.
#endif

View File

@ -1,90 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
// Name: email.h
// Purpose: wxEmail: portable email client class
// Author: Julian Smart
// Modified by:
// Created: 2001-08-21
// RCS-ID: $Id: email.h,v 1.4 2010-04-22 15:26:15 guy Exp $
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_EMAIL_H_
#define _WX_EMAIL_H_
/*
* wxMailMessage
* Encapsulates an email message
*/
class wxMailMessage
{
public:
// A common usage
wxMailMessage(const wxString& subject, const wxString& to,
const wxString& body, const wxString& from = wxEmptyString,
const wxString& attachment = wxEmptyString,
const wxString& attachmentTitle = wxEmptyString) : m_query_receipt(false)
{
m_to.Add(to);
m_subject = subject;
m_body = body;
m_from = from;
if (!attachment.IsEmpty())
{
m_attachments.Add(attachment);
m_attachmentTitles.Add(attachmentTitle);
}
}
wxMailMessage() : m_query_receipt(false) {}
//// Accessors
void AddTo(const wxString& to) { m_to.Add(to); }
void AddCc(const wxString& cc) { m_cc.Add(cc); }
void AddBcc(const wxString& bcc) { m_bcc.Add(bcc); }
void AddAttachment(const wxString& attach, const wxString& title = wxEmptyString)
{ m_attachments.Add(attach); m_attachmentTitles.Add(title); }
void SetSubject(const wxString& subject) { m_subject = subject; }
void SetBody(const wxString& body) { m_body = body; }
void SetFrom(const wxString& from) { m_from = from; }
public:
wxArrayString m_to; //The To: Recipients
wxString m_from; //The From: email address (optional)
wxArrayString m_cc; //The CC: Recipients
wxArrayString m_bcc; //The BCC Recipients
wxString m_subject; //The Subject of the message
wxString m_body; //The Body of the message
wxArrayString m_attachments; //Files to attach to the email
wxArrayString m_attachmentTitles; //Titles to use for the email file attachments
bool m_query_receipt; //Query receipt message
};
/*
* wxEmail
* Miscellaneous email functions
*/
class wxEmail
{
public:
//// Ctor/dtor
wxEmail() {};
//// Operations
// Send a message.
// Specify profile, or leave it to wxWidgets to find the current user name
static bool Send(wxMailMessage& message, const wxString& profileName = wxEmptyString,
bool bShowUI = false, const wxString& sendMail = wxT("/usr/sbin/sendmail -t"));
protected:
};
#endif //_WX_EMAIL_H_

View File

@ -503,4 +503,21 @@ long wxMapiSession::GetLastError() const
return m_data->m_nLastError;
}
bool wxMailMessage::Send(const wxString& profileName, bool bUI, const wxString& WXUNUSED(sendMail))
{
wxASSERT(m_to.GetCount() > 0) ;
wxString profile(profileName);
wxMapiSession session;
if (!session.MapiInstalled())
return FALSE;
if (!session.Logon(profile))
return FALSE;
return session.Send(*this, bUI);
}
#endif // __WXMSW__

View File

@ -12,7 +12,54 @@
#ifndef _WX_SMAPI_H_
#define _WX_SMAPI_H_
#include "email.h"
class wxMailMessage
{
public:
// A common usage
wxMailMessage(const wxString& subject, const wxString& to,
const wxString& body, const wxString& from = wxEmptyString,
const wxString& attachment = wxEmptyString,
const wxString& attachmentTitle = wxEmptyString) : m_query_receipt(false)
{
m_to.Add(to);
m_subject = subject;
m_body = body;
m_from = from;
if (!attachment.IsEmpty())
{
m_attachments.Add(attachment);
m_attachmentTitles.Add(attachmentTitle);
}
}
wxMailMessage() : m_query_receipt(false) {}
//// Accessors
void AddTo(const wxString& to) { m_to.Add(to); }
void AddCc(const wxString& cc) { m_cc.Add(cc); }
void AddBcc(const wxString& bcc) { m_bcc.Add(bcc); }
void AddAttachment(const wxString& attach, const wxString& title = wxEmptyString)
{ m_attachments.Add(attach); m_attachmentTitles.Add(title); }
void SetSubject(const wxString& subject) { m_subject = subject; }
void SetBody(const wxString& body) { m_body = body; }
void SetFrom(const wxString& from) { m_from = from; }
bool Send(const wxString& profileName = wxEmptyString,
bool bShowUI = false, const wxString& sendMail = wxT("/usr/sbin/sendmail -t"));
public:
wxArrayString m_to; //The To: Recipients
wxString m_from; //The From: email address (optional)
wxArrayString m_cc; //The CC: Recipients
wxArrayString m_bcc; //The BCC Recipients
wxString m_subject; //The Subject of the message
wxString m_body; //The Body of the message
wxArrayString m_attachments; //Files to attach to the email
wxArrayString m_attachmentTitles; //Titles to use for the email file attachments
bool m_query_receipt; //Query receipt message
};
class wxMapiData;

View File

@ -15,17 +15,13 @@ extern "C" {
#endif
/* internal constants for sizing arrays, defaults, etc... */
#define STATBAR_MAX_LEN 256 /* maximum length of status bar string */
#define STATBAR_MAX_NUM 128 /* maximum number of status bars in an app */
#if ( (XVTWS==MACWS) || (XVTWS==MTFWS) || (XVTWS==XOLWS) )
#define STATBAR_FONT_SIZE 12 /* default font size on Mac/XM/XOL */
#else
#define STATBAR_FONT_SIZE 10 /* default font size on Windows/PM/NT/CH */
#endif
//#define STATBAR_MAX_LEN 256 /* maximum length of status bar string */
//#define STATBAR_MAX_NUM 128 /* maximum number of status bars in an app */
//#define STATBAR_FONT_SIZE 10 /* default font size on Windows/PM/NT/CH */
/* the following CIS functions are external and may be called by the app */
XVTDLL const char *statbar_set_title(WINDOW win, const char *text);
XVTDLL const char *statbar_set_default_title(WINDOW win, const char *text);
XVTDLL const char* statbar_set_title(WINDOW win, const char *text);
XVTDLL const char* statbar_set_default_title(WINDOW win, const char *text);
/* the following CIS functions are external and are usable in all font modes */

View File

@ -1538,7 +1538,6 @@ BOOLEAN xvt_fsys_convert_str_to_fspec(const char *mbs, FILE_SPEC *fs)
return ok;
}
void xvt_fsys_get_default_dir(DIRECTORY *dirp)
{
if (_startup_dir.IsEmpty())
@ -1551,6 +1550,13 @@ BOOLEAN xvt_fsys_get_dir(DIRECTORY *dirp)
return xvt_fsys_convert_str_to_dir(::wxGetCwd(), dirp);
}
void xvt_fsys_get_temp_dir(DIRECTORY *dirp)
{
xvt_sys_get_profile_string(NULL, "Main", "Temp", "", dirp->path, sizeof(dirp->path));
if (!*dirp->path)
wxStrcpy(dirp->path, wxFileName::GetTempDir());
}
static wxString get_disk_root(const char* path)
{
wxString str;
@ -4044,6 +4050,8 @@ WINDOW xvt_vobj_get_parent(WINDOW win)
char* xvt_vobj_get_title(WINDOW win, char *title, int sz_title)
{
if (win == NULL_WIN)
return NULL;
CAST_WIN(win, w);
wxStrncpy(title, w.GetLabel(), sz_title);
title[sz_title-1] = '\0';
@ -4052,7 +4060,9 @@ char* xvt_vobj_get_title(WINDOW win, char *title, int sz_title)
BOOLEAN xvt_vobj_is_focusable(WINDOW win)
{
BOOLEAN ok = win != NULL_WIN && win != PRINTER_WIN && xvt_vobj_is_valid(win);
BOOLEAN ok = win != NULL_WIN && win != PRINTER_WIN &&
win != TASK_WIN && win != SCREEN_WIN &&
xvt_vobj_is_valid(win);
if (ok)
{
CAST_WIN(win, w);

View File

@ -172,8 +172,9 @@ XVTDLL BOOLEAN xvt_fsys_convert_str_to_dir(const char *path, DIRECTORY *dirp);
XVTDLL BOOLEAN xvt_fsys_convert_fspec_to_str(const FILE_SPEC *fs, char *path, int sz_path);
XVTDLL BOOLEAN xvt_fsys_convert_str_to_fspec(const char *mbs, FILE_SPEC *fs);
XVTDLL BOOLEAN xvt_fsys_get_dir(DIRECTORY *dirp);
XVTDLL void xvt_fsys_get_default_dir(DIRECTORY *dirp);
XVTDLL BOOLEAN xvt_fsys_get_dir(DIRECTORY* dirp);
XVTDLL void xvt_fsys_get_default_dir(DIRECTORY* dirp);
XVTDLL void xvt_fsys_get_temp_dir(DIRECTORY* dirp);
XVTDLL SLIST xvt_fsys_list_files(const char *type, const char *pat, BOOLEAN dirs);
XVTDLL BOOLEAN xvt_fsys_parse_pathname (const char *mbs, char *volname, char *dirname, char *leafroot, char *leafext, char *leafvers);
XVTDLL void xvt_fsys_restore_dir();

View File

@ -1,13 +1,16 @@
#include "wxinc.h"
#include "xvt.h"
#include "email.h"
#include "smapi.h"
#include <wx/tokenzr.h>
#include <wx/file.h>
#include <wx/filename.h>
#include <wx/mimetype.h>
static wxString GetMailParam(const char* key, const char* def = "")
{
static wxString ini;
static wxString ini; // C:\campo\dati\config\user.ini
if (ini.IsEmpty())
{
wxString cu = "ADMIN";
@ -67,15 +70,38 @@ short xvt_mail_installed()
static void AppendQuotedString(wxString& cmd, const char* key, const wxString& value)
{
if (!value.IsEmpty())
cmd << " -" << key << " \"" << value << "\"";
}
static void AppendAttachment(wxString& cmd, const wxString& fname, bool att = true)
{
if (wxFileName::FileExists(fname))
{
cmd += " -";
cmd += key;
cmd += " \"";
cmd += value;
cmd += "\"";
char ext[_MAX_EXT] = { 0 };
xvt_fsys_parse_pathname (fname, NULL, NULL, NULL, ext, NULL);
wxString mime = ext;
wxFileType* ft = wxTheMimeTypesManager->GetFileTypeFromExtension(mime);
if (ft != NULL)
{
wxArrayString aMime;
if (ft->GetMimeTypes(aMime))
mime = aMime[0];
}
if (att)
{
wxString a; a << fname << "," << mime << ",a";
AppendQuotedString(cmd, "attach", a);
}
else
{
wxString a; a << fname << "," << mime << ",i";
AppendQuotedString(cmd, "attach", a);
}
}
}
BOOLEAN xvt_mail_send(const char* to, const char* cc, const char* ccn,
const char* subject, const char* msg,
const char* attach, short flags)
@ -125,48 +151,127 @@ BOOLEAN xvt_mail_send(const char* to, const char* cc, const char* ccn,
if ((mail_inst & 0x2) && GetMailParams(server, port, user, password, from))
{
wxString cmd = "servers/mailsend.exe";
AppendQuotedString(cmd, "to", Msg.m_to[0]);
AppendQuotedString(cmd, "from", from);
if (Msg.m_cc.IsEmpty())
cmd += " +cc";
else
AppendQuotedString(cmd, "cc", Msg.m_cc[0]);
if (Msg.m_bcc.IsEmpty())
cmd += " +bc";
else
AppendQuotedString(cmd, "bc", Msg.m_bcc[0]);
AppendQuotedString(cmd, "smtp", server);
if (!port.IsEmpty())
{
cmd += " -port ";
cmd += port;
}
AppendQuotedString(cmd, "from", from);
if ((flags | 0x2) && from.Find("@") > 0)
{
//AppendQuotedString(cmd, "rt", from);
AppendQuotedString(cmd, "rrr", from);
}
// Lista dei destinatari
for (size_t i = 0; i < Msg.m_to.size(); i++)
AppendQuotedString(cmd, "to", Msg.m_to[i]);
// Lista dei destinatari in copia
for (size_t i = 0; i < Msg.m_cc.size(); i++)
AppendQuotedString(cmd, "cc", Msg.m_cc[i]);
if (cmd.Find("-cc") < 0)
cmd += " +cc"; // In assenza di destinatari in copia aggiungo +cc
// Lista dei destinatari in copia nascosta
for (size_t i = 0; i < Msg.m_bcc.size(); i++)
AppendQuotedString(cmd, "bc", Msg.m_bcc[i]);
if (from.Find("@") > 0)
{
wxString strMyself; strMyself << "c " << from;
if (cmd.Find(strMyself) < 0)
AppendQuotedString(cmd, "bc", from); // Aggiungo me stesso ai destinatari nascosti
}
if (cmd.Find("-bc") < 0)
cmd += " +bc"; // In assenza di destinatari nascosti aggiungo +bc
AppendQuotedString(cmd, "sub", Msg.m_subject);
AppendQuotedString(cmd, "user", user);
AppendQuotedString(cmd, "pass", password);
AppendQuotedString(cmd, "enc-type", "base64");
if (!Msg.m_attachments.IsEmpty())
{
for (size_t a = 0; a < Msg.m_attachments.size(); a++)
AppendQuotedString(cmd, "attach", Msg.m_attachments[a]);
{
const wxString& fn = Msg.m_attachments[a];
if (wxFileName::FileExists(fn))
AppendAttachment(cmd, fn);
}
}
wxArrayString output, error;
wxExecute(cmd, output, error, wxEXEC_SYNC);
wxString ftmp;
if (Msg.m_body.IsEmpty())
{
if (cmd.Find("-M ") < 0)
{
wxString m; m << "Cordiali saluti\n" << from;
m.Trim();
AppendQuotedString(cmd, "M", m);
}
}
else
{
wxStringTokenizer tok(Msg.m_body, "\n");
Msg.m_body.Trim();
if (Msg.m_body.Find("\n") < 0)
AppendQuotedString(cmd, "M", Msg.m_body);
else
{
DIRECTORY tmp; xvt_fsys_get_temp_dir(&tmp);
xvt_fsys_build_pathname(ftmp.GetWriteBuf(_MAX_PATH), NULL, tmp.path, "msgbody", "html", NULL);
ftmp.UngetWriteBuf();
wxFile file(ftmp, wxFile::write);
file.Write("<html><body>\n");
Msg.m_body.Replace("\n", "<br>");
file.Write(Msg.m_body);
file.Write("\n</body><html>\n");
file.Close();
AppendAttachment(cmd, ftmp, false);
}
}
const wxString strLog = "mailsend.log";
xvt_fsys_remove_file(strLog);
AppendQuotedString(cmd, "log", strLog);
int nRetry = wxAtoi(GetMailParam("Retry", "2"));
if (nRetry <= 0) nRetry = 2;
ok = FALSE;
for (size_t i = 0; !ok && i < error.size(); i++)
ok = error[i].find("uccess") > 0;
for (int r = 0; r < nRetry && !ok; r++)
{
if (r > 0)
{
const int nSeconds = 5*r;
WINDOW w = xvt_dm_progress_create(TASK_WIN, "MailSend retrying...", nSeconds, TRUE);
for (int s = 1; s <= nSeconds; s++)
{
xvt_sys_sleep(1000);
xvt_dm_progress_set_status(w, s, nSeconds);
}
xvt_dm_progress_destroy(w);
}
wxExecute(cmd, wxEXEC_SYNC);
wxFile fLog(strLog, wxFile::read);
const wxFileOffset flen = fLog.Length();
if (flen > 0)
{
char* buff = (char*)calloc(flen+8, 1); // zero filled buffer
fLog.Read(buff, flen);
if (wxStrstr(buff, "Mail sent successfully"))
ok = TRUE;
delete [] buff;
}
}
} else
if (mail_inst & 1)
{
xvt_fsys_save_dir();
wxEmail Mail;
ok = Mail.Send(Msg, wxEmptyString, ui);
ok = Msg.Send(wxEmptyString, ui);
xvt_fsys_restore_dir();
}

View File

@ -554,28 +554,9 @@ long TwxWindow::DoXvtEvent(EVENT& e)
void TwxWindow::OnChar(wxKeyEvent& evt)
{
static int nSkipNextDotKey = -883; // Valore indefinito
if (nSkipNextDotKey == -883) // Devo stabilire se attivare la gestione o no
{
const char* campoini = xvt_fsys_get_campo_ini();
char str[2];
xvt_sys_get_profile_string(campoini, "Main", "Point2Comma", "1", str, sizeof(str));
nSkipNextDotKey = strchr("1XY", *str) != NULL ? 0 : -1; // Dis/Abilita conversione punto in virgola
}
XVT_EVENT e(E_CHAR);
int k = evt.GetKeyCode();
if (nSkipNextDotKey == 1)
{
nSkipNextDotKey = 0;
if (k == '.')
{
evt.Skip();
return;
}
}
switch (k)
{
case WXK_ALT:
@ -592,14 +573,6 @@ void TwxWindow::OnChar(wxKeyEvent& evt)
case WXK_NUMPAD9:
evt.Skip();
return;
case WXK_NUMPAD_DECIMAL: // Arriva solo dalla 2.6.3 in poi
case WXK_DECIMAL: // ??? Arriva sia '.' sia WXK_DECIMAL=340
if (nSkipNextDotKey == 0)
{
k = ','; // Trasformo il punto in virgola
nSkipNextDotKey = 1;
}
break;
case WXK_NUMPAD_ADD: k = '+';break;
case WXK_DOWN : k = K_DOWN; break;
case WXK_END : k = K_LEND; break;
@ -643,7 +616,7 @@ void TwxWindow::OnChar(wxKeyEvent& evt)
void TwxWindow::OnKeyDown(wxKeyEvent& e)
{
// Triste necessita' per gestire corretamente Alt+'+' del tasterino
const int k = e.GetKeyCode();
const int k = e.GetKeyCode();
if (k == WXK_NUMPAD_ADD)
{
if (e.AltDown())
@ -651,6 +624,22 @@ void TwxWindow::OnKeyDown(wxKeyEvent& e)
OnChar(e);
return;
}
} else
if (k == WXK_NUMPAD_DECIMAL)
{
static int nPoint2Comma = -883; // Valore indefinito
if (nPoint2Comma == -883) // Devo stabilire se attivare la gestione o no
{
char str[4] = { 0 };
xvt_sys_get_profile_string(NULL, "Main", "Point2Comma", "1", str, sizeof(str));
nPoint2Comma = wxStrchr("1XY", *str) ? 1 : 0; // Dis/Abilita conversione punto in virgola
}
if (nPoint2Comma)
{
e.m_keyCode = ',';
OnChar(e);
return;
}
}
e.Skip();
}
@ -1006,7 +995,9 @@ void TTaskWin::OnMenu(wxCommandEvent& evt)
e.v.cmd.tag = evt.GetId();
if (m_MenuOwner == NULL || m_MenuOwner == this)
{
_task_win_handler((WINDOW)this, &e);
}
else
{
TwxWindow* w = wxDynamicCast(m_MenuOwner, TwxWindow);