From 5b2fa6f292b910409066b2ca748b3f7b8ff020b1 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 31 Oct 2023 13:09:10 +0300 Subject: NewStory: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fixes #3755 (NewStory: неработающий тэг color парсится криво); - fixes bug with template preview in the options dialog --- plugins/ExternalAPI/m_text.h | 10 +++++++-- plugins/NewStory/src/history_array.cpp | 35 ++++++++++++++++++++++++++++++++ plugins/NewStory/src/history_array.h | 3 ++- plugins/NewStory/src/options.cpp | 8 ++++---- plugins/NewStory/src/templates.cpp | 37 ++++++++++++++++++---------------- 5 files changed, 69 insertions(+), 24 deletions(-) (limited to 'plugins') diff --git a/plugins/ExternalAPI/m_text.h b/plugins/ExternalAPI/m_text.h index d6607e2eb1..d2165802ac 100644 --- a/plugins/ExternalAPI/m_text.h +++ b/plugins/ExternalAPI/m_text.h @@ -3,8 +3,14 @@ // Text control #define MTEXTCONTROLCLASS "MTextControl" -#define MTM_SETUSER WM_USER -#define MTM_UPDATE WM_USER+1 + +#define MTM_SETUSER (WM_USER) +#define MTM_UPDATE (WM_USER+1) + +// analog of calling MTextCreateEx +// wParam = MTEXT_FLG_* +// lParam = (void*)text +#define MTM_UPDATEEX (WM_USER+2) typedef struct TextObject *HText; diff --git a/plugins/NewStory/src/history_array.cpp b/plugins/NewStory/src/history_array.cpp index bffdfc944a..eedcbb0b9b 100644 --- a/plugins/NewStory/src/history_array.cpp +++ b/plugins/NewStory/src/history_array.cpp @@ -214,6 +214,41 @@ bool ItemData::isLinkChar(int idx) const return ((res & CFM_LINK) && (cf.dwEffects & CFE_LINK)) || ((res & CFM_REVISED) && (cf.dwEffects & CFE_REVISED)); } +void ItemData::fill(int tmpl) +{ + switch (tmpl) { + case TPL_MESSAGE: + dbe.eventType = EVENTTYPE_MESSAGE; + break; + case TPL_MSG_HEAD: + m_grouping = GROUPING_HEAD; + dbe.eventType = EVENTTYPE_MESSAGE; + break; + case TPL_MSG_GRP: + m_grouping = GROUPING_ITEM; + dbe.eventType = EVENTTYPE_MESSAGE; + break; + case TPL_FILE: + dbe.eventType = EVENTTYPE_FILE; + break; + case TPL_SIGN: + dbe.eventType = EVENTTYPE_STATUSCHANGE; + break; + case TPL_AUTH: + dbe.eventType = EVENTTYPE_AUTHREQUEST; + break; + case TPL_ADDED: + dbe.eventType = EVENTTYPE_ADDED; + break; + case TPL_PRESENCE: + dbe.eventType = EVENTTYPE_JABBER_PRESENCE; + break; + default: + dbe.eventType = 309247; + break; + } +} + int ItemData::getTemplate() const { switch (dbe.eventType) { diff --git a/plugins/NewStory/src/history_array.h b/plugins/NewStory/src/history_array.h index 151ff568ca..0f30c64740 100644 --- a/plugins/NewStory/src/history_array.h +++ b/plugins/NewStory/src/history_array.h @@ -36,6 +36,7 @@ struct ItemData void checkCreate(HWND hwnd); void setText(); + void fill(int tmpl); void load(bool bFullLoad); bool isLink(POINT pt, CMStringW *url = nullptr) const; bool isLinkChar(int idx) const; @@ -46,7 +47,7 @@ struct ItemData CMStringA formatRtf(); CMStringW formatString() { return TplFormatString(getTemplate(), hContact, this); } - CMStringW formatStringEx(int tpl, wchar_t *sztpl); + CMStringW formatStringEx(wchar_t *sztpl); inline wchar_t *getWBuf() { diff --git a/plugins/NewStory/src/options.cpp b/plugins/NewStory/src/options.cpp index ee84cd1b79..ab1be7e672 100644 --- a/plugins/NewStory/src/options.cpp +++ b/plugins/NewStory/src/options.cpp @@ -78,14 +78,14 @@ class CTemplateOptsDlg : public CBaseOptsDlg { replaceStrW(m_curr->tmpValue, m_edit.GetText()); - ItemData item; + ItemData item = {}; item.hContact = m_hContact; item.hEvent = m_hDbEVent; item.load(true); + item.fill(int(m_curr - templates)); // copy data from template to event - CMStringW wszText(item.formatStringEx(int(m_curr - templates), m_curr->tmpValue)); - preview.SetText(wszText); - gpreview.SetText(wszText); + preview.SetText(item.formatStringEx(m_curr->tmpValue)); + gpreview.SendMsg(MTM_UPDATEEX, MTEXT_FLG_RTF, LPARAM(item.formatRtf().c_str())); } CCtrlBase preview, gpreview; diff --git a/plugins/NewStory/src/templates.cpp b/plugins/NewStory/src/templates.cpp index b6ab2d727f..6721ee39cc 100644 --- a/plugins/NewStory/src/templates.cpp +++ b/plugins/NewStory/src/templates.cpp @@ -47,38 +47,40 @@ static void AppendUnicodeToBuffer(CMStringA &buf, const wchar_t *p) buf.AppendChar((char)*p); } else if (*p == '[') { - if (p[1] == 'c' && p[3] == ']') { - buf.AppendFormat("\\cf%c ", p[2]); - p += 3; + p++; + if (*p == 'c' && p[2] == ']') { + buf.AppendFormat("\\cf%c ", p[1]); + p += 2; continue; } char *pEnd = ""; - if (p[1] == '/') { + if (*p == '/') { pEnd = "0"; p++; } - if (p[1] == 'b' && p[2] == ']') { + if (*p == 'b' && p[1] == ']') { buf.AppendFormat("\\b%s ", pEnd); - p += 2; + p++; } - else if (p[1] == 'i' && p[2] == ']') { + else if (*p == 'i' && p[1] == ']') { buf.AppendFormat("\\i%s ", pEnd); - p += 2; + p++; } - else if (p[1] == 'u' && p[2] == ']') { + else if (*p == 'u' && p[1] == ']') { buf.AppendFormat("\\ul%s ", pEnd); - p += 2; + p++; } - else if (p[1] == 's' && p[2] == ']') { + else if (*p == 's' && p[1] == ']') { buf.AppendFormat("\\strike%s ", pEnd); - p += 2; + p++; } - else if (p[1] == 'c' && p[2] == ']') { - buf.Append("\\cf1 "); - p += 2; + else { + buf.AppendChar('['); + if (*pEnd == '0') + p--; + p--; } - else buf.AppendChar('['); } else if (*p < 128) { buf.AppendChar((char)*p); @@ -153,9 +155,10 @@ CMStringW TplFormatString(int tpl, MCONTACT hContact, ItemData *item) /////////////////////////////////////////////////////////////////////////////// // Template formatting for options dialog -CMStringW ItemData::formatStringEx(int tpl, wchar_t *sztpl) +CMStringW ItemData::formatStringEx(wchar_t *sztpl) { CMStringW buf; + int tpl = getTemplate(); if (tpl < 0 || tpl >= TPL_COUNT || !sztpl) return buf; -- cgit v1.2.3