summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2017-10-30 15:10:50 +0300
committerGeorge Hazan <ghazan@miranda.im>2017-10-30 15:10:57 +0300
commit1d0b695325e4a1d11c9986403766041e1be2ef4f (patch)
tree7a8b527e626c0476f1f31bbe2c3ec52daceaec98
parent7ed053c528020b73fe9f620a530a7c68f2d56433 (diff)
fixes #1010 (custom colors do not appear in the IRC log)
-rw-r--r--plugins/TabSRMM/src/chat_main.cpp1
-rw-r--r--plugins/TabSRMM/src/chat_window.cpp2
-rw-r--r--plugins/TabSRMM/src/generic_msghandlers.cpp4
-rw-r--r--plugins/TabSRMM/src/msgdialog.cpp15
-rw-r--r--plugins/TabSRMM/src/msgdlgutils.cpp37
-rw-r--r--plugins/TabSRMM/src/msglog.cpp10
-rw-r--r--plugins/TabSRMM/src/msgs.cpp3
-rw-r--r--plugins/TabSRMM/src/msgs.h2
-rw-r--r--plugins/TabSRMM/src/utils.cpp56
-rw-r--r--plugins/TabSRMM/src/utils.h3
-rw-r--r--plugins/TabSRMM/src/version.h2
11 files changed, 69 insertions, 66 deletions
diff --git a/plugins/TabSRMM/src/chat_main.cpp b/plugins/TabSRMM/src/chat_main.cpp
index 72d0e9c0a3..9669930aea 100644
--- a/plugins/TabSRMM/src/chat_main.cpp
+++ b/plugins/TabSRMM/src/chat_main.cpp
@@ -215,6 +215,7 @@ static void stubShowRoom(SESSION_INFO *si)
int Chat_Load()
{
CheckUpdate();
+ Utils::RTF_CTableInit();
CHAT_MANAGER_INITDATA data = { &g_Settings, sizeof(MODULEINFO), sizeof(SESSION_INFO), LPGENW("Message Sessions") L"/" LPGENW("Group chats"), FONTMODE_ALTER };
pci = Chat_GetInterface(&data);
diff --git a/plugins/TabSRMM/src/chat_window.cpp b/plugins/TabSRMM/src/chat_window.cpp
index 2a9c2a8698..58bb9dce6e 100644
--- a/plugins/TabSRMM/src/chat_window.cpp
+++ b/plugins/TabSRMM/src/chat_window.cpp
@@ -639,7 +639,7 @@ void CChatRoomDlg::onClick_OK(CCtrlButton*)
if (ptszText.IsEmpty())
return;
- DoRtfToTags(ptszText, 0, nullptr);
+ DoRtfToTags(ptszText);
ptszText.Trim();
ptszText.Replace(L"%", L"%%");
diff --git a/plugins/TabSRMM/src/generic_msghandlers.cpp b/plugins/TabSRMM/src/generic_msghandlers.cpp
index 6f6ca314bb..45fc240a4a 100644
--- a/plugins/TabSRMM/src/generic_msghandlers.cpp
+++ b/plugins/TabSRMM/src/generic_msghandlers.cpp
@@ -557,8 +557,8 @@ void CTabBaseDlg::DM_InitRichEdit()
LOGFONTA lf = m_pContainer->theme.logFonts[MSGFONTID_MESSAGEAREA];
inputcharcolor = m_pContainer->theme.fontColors[MSGFONTID_MESSAGEAREA];
- for (int i = 0; i < Utils::rtf_ctable_size; i++)
- if (Utils::rtf_ctable[i].clr == inputcharcolor)
+ for (int i = 0; i < Utils::rtf_clrs.getCount(); i++)
+ if (Utils::rtf_clrs[i].clr == inputcharcolor)
inputcharcolor = RGB(GetRValue(inputcharcolor), GetGValue(inputcharcolor), GetBValue(inputcharcolor) == 0 ? GetBValue(inputcharcolor) + 1 : GetBValue(inputcharcolor) - 1);
cf2.dwMask = CFM_COLOR | CFM_FACE | CFM_CHARSET | CFM_SIZE | CFM_WEIGHT | CFM_BOLD | CFM_ITALIC;
diff --git a/plugins/TabSRMM/src/msgdialog.cpp b/plugins/TabSRMM/src/msgdialog.cpp
index f5405007f5..2606353dc7 100644
--- a/plugins/TabSRMM/src/msgdialog.cpp
+++ b/plugins/TabSRMM/src/msgdialog.cpp
@@ -38,8 +38,6 @@ static const UINT addControls[] = { IDC_ADD, IDC_CANCELADD };
static const UINT btnControls[] = { IDC_RETRY, IDC_CANCELSEND, IDC_MSGSENDLATER, IDC_ADD, IDC_CANCELADD };
static const UINT errorControls[] = { IDC_STATICERRORICON, IDC_STATICTEXT, IDC_RETRY, IDC_CANCELSEND, IDC_MSGSENDLATER };
-static COLORREF rtfDefColors[] = { RGB(255, 0, 0), RGB(0, 0, 255), RGB(0, 255, 0), RGB(255, 0, 255), RGB(255, 255, 0), RGB(0, 255, 255), 0, RGB(255, 255, 255) };
-
struct
{
int id;
@@ -617,9 +615,6 @@ void CSrmmWindow::OnInitDialog()
{
CTabBaseDlg::OnInitDialog();
- if (Utils::rtf_ctable == 0)
- Utils::RTF_CTableInit();
-
m_cache->setWindowData(this);
m_szProto = const_cast<char *>(m_cache->getProto());
@@ -1107,7 +1102,7 @@ void CSrmmWindow::onClick_Ok(CCtrlButton*)
return;
if (final_sendformat)
- DoRtfToTags(decoded, _countof(rtfDefColors), rtfDefColors);
+ DoRtfToTags(decoded);
decoded.TrimRight();
T2Utf utfResult(decoded);
@@ -1208,8 +1203,8 @@ void CSrmmWindow::onClick_Color(CCtrlButton *pButton)
if (iSelection == ID_FONT_DEFAULTCOLOR) {
cf.crTextColor = M.GetDword(FONTMODULE, "Font16Col", 0);
- for (int i = 0; i < Utils::rtf_ctable_size; i++)
- if (Utils::rtf_ctable[i].clr == cf.crTextColor)
+ for (int i = 0; i < Utils::rtf_clrs.getCount(); i++)
+ if (Utils::rtf_clrs[i].clr == cf.crTextColor)
cf.crTextColor = RGB(GetRValue(cf.crTextColor), GetGValue(cf.crTextColor), GetBValue(cf.crTextColor) == 0 ? GetBValue(cf.crTextColor) + 1 : GetBValue(cf.crTextColor) - 1);
m_message.SendMsg(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
@@ -1217,8 +1212,8 @@ void CSrmmWindow::onClick_Color(CCtrlButton *pButton)
}
for (int i = 0; i < RTF_CTABLE_DEFSIZE; i++) {
- if (Utils::rtf_ctable[i].menuid == iSelection) {
- cf.crTextColor = Utils::rtf_ctable[i].clr;
+ if (Utils::rtf_clrs[i].menuid == iSelection) {
+ cf.crTextColor = Utils::rtf_clrs[i].clr;
m_message.SendMsg(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
}
}
diff --git a/plugins/TabSRMM/src/msgdlgutils.cpp b/plugins/TabSRMM/src/msgdlgutils.cpp
index 09f477af63..19593fa9e7 100644
--- a/plugins/TabSRMM/src/msgdlgutils.cpp
+++ b/plugins/TabSRMM/src/msgdlgutils.cpp
@@ -827,7 +827,16 @@ static void CreateColorMap(CMStringW &Text, int iCount, COLORREF *pSrc, int *pDs
// convert rich edit code to bbcode (if wanted). Otherwise, strip all RTF formatting
// tags and return plain text
-BOOL CTabBaseDlg::DoRtfToTags(CMStringW &pszText, int iNumColors, COLORREF *pColors) const
+static int RtfColorToIndex(int iNumColors, int *pIndex, int iCol)
+{
+ for (int i = 0; i < iNumColors; i++)
+ if (pIndex[i] == iCol)
+ return i;
+
+ return -1;
+}
+
+BOOL CTabBaseDlg::DoRtfToTags(CMStringW &pszText) const
{
if (pszText.IsEmpty())
return FALSE;
@@ -837,7 +846,11 @@ BOOL CTabBaseDlg::DoRtfToTags(CMStringW &pszText, int iNumColors, COLORREF *pCol
// create an index of colors in the module and map them to
// corresponding colors in the RTF color table
+ int iNumColors = Utils::rtf_clrs.getCount();
int *pIndex = (int*)_alloca(iNumColors * sizeof(int));
+ COLORREF *pColors = (COLORREF*)_alloca(iNumColors * sizeof(COLORREF));
+ for (int i = 0; i < iNumColors; i++)
+ pColors[i] = Utils::rtf_clrs[i].clr;
CreateColorMap(pszText, iNumColors, pColors, pIndex);
// scan the file for rtf commands and remove or parse them
@@ -867,22 +880,22 @@ BOOL CTabBaseDlg::DoRtfToTags(CMStringW &pszText, int iNumColors, COLORREF *pCol
if (!wcsncmp(p, L"\\cf", 3)) { // foreground color
int iCol = _wtoi(p + 3);
- int iInd = -1;
- for (int i = 0; i < iNumColors; i++)
- if (pIndex[i] == iCol) {
- iInd = i;
- break;
- }
+ int iInd = RtfColorToIndex(iNumColors, pIndex, iCol);
- if (iCol && !isChat())
- res.AppendFormat((iInd >= 0) ? (bInsideColor ? L"[/color][color=%s]" : L"[color=%s]") : (bInsideColor ? L"[/color]" : L""), Utils::rtf_ctable[iInd].szName);
+ if (iCol > 0) {
+ if (!isChat())
+ res.AppendFormat((iInd >= 0) ? (bInsideColor ? L"[/color][color=%s]" : L"[color=%s]") : (bInsideColor ? L"[/color]" : L""), Utils::rtf_clrs[iInd].szName);
+ // else
+ // res.AppendFormat((iInd >= 0) ? L"%%c%02u" : L"%%C", iInd);
+ }
bInsideColor = iInd >= 0;
}
else if (!wcsncmp(p, L"\\highlight", 10)) { //background color
- wchar_t szTemp[20];
- int iCol = _wtoi(p + 10);
- mir_snwprintf(szTemp, L"%d", iCol);
+ /* if (isChat()) {
+ int iInd = RtfColorToIndex(iNumColors, pIndex, _wtoi(p + 10));
+ res.AppendFormat((iInd >= 0) ? L"%%f%02u" : L"%%F", iInd);
+ } */
}
else if (!wcsncmp(p, L"\\line", 5)) { // soft line break;
res.AppendChar('\n');
diff --git a/plugins/TabSRMM/src/msglog.cpp b/plugins/TabSRMM/src/msglog.cpp
index 512cd8373f..d96e3ddcbf 100644
--- a/plugins/TabSRMM/src/msglog.cpp
+++ b/plugins/TabSRMM/src/msglog.cpp
@@ -351,8 +351,10 @@ static void Build_RTF_Header(CMStringA &str, CTabBaseDlg *dat)
}
// bbcode colors...
- for (i = 0; i < Utils::rtf_ctable_size; i++)
- str.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(Utils::rtf_ctable[i].clr), GetGValue(Utils::rtf_ctable[i].clr), GetBValue(Utils::rtf_ctable[i].clr));
+ for (i = 0; i < Utils::rtf_clrs.getCount(); i++) {
+ auto &p = Utils::rtf_clrs[i];
+ str.AppendFormat("\\red%u\\green%u\\blue%u;", GetRValue(p.clr), GetGValue(p.clr), GetBValue(p.clr));
+ }
// paragraph header
str.AppendFormat("}");
@@ -1083,8 +1085,8 @@ void CTabBaseDlg::ReplaceIcons(LONG startAt, int fAppend, BOOL isSent)
m_log.SendMsg(EM_REPLACESEL, FALSE, (LPARAM)L"");
UINT length = (unsigned int)_wtol(&trbuffer[7]);
int index = _wtol(&trbuffer[14]);
- if (length > 0 && length < 20000 && index >= RTF_CTABLE_DEFSIZE && index < Utils::rtf_ctable_size) {
- cf2.crTextColor = Utils::rtf_ctable[index].clr;
+ if (length > 0 && length < 20000 && index >= RTF_CTABLE_DEFSIZE && index < Utils::rtf_clrs.getCount()) {
+ cf2.crTextColor = Utils::rtf_clrs[index].clr;
cr.cpMin = fi.chrgText.cpMin;
cr.cpMax = cr.cpMin + length;
m_log.SendMsg(EM_EXSETSEL, 0, (LPARAM)&cr);
diff --git a/plugins/TabSRMM/src/msgs.cpp b/plugins/TabSRMM/src/msgs.cpp
index 411717f89b..fad83f4175 100644
--- a/plugins/TabSRMM/src/msgs.cpp
+++ b/plugins/TabSRMM/src/msgs.cpp
@@ -486,9 +486,6 @@ int SplitmsgShutdown(void)
UnloadIcons();
FreeTabConfig();
- if (Utils::rtf_ctable)
- mir_free(Utils::rtf_ctable);
-
UnloadTSButtonModule();
return 0;
}
diff --git a/plugins/TabSRMM/src/msgs.h b/plugins/TabSRMM/src/msgs.h
index 397e5aba17..3882d33a4a 100644
--- a/plugins/TabSRMM/src/msgs.h
+++ b/plugins/TabSRMM/src/msgs.h
@@ -412,7 +412,7 @@ public:
void AdjustBottomAvatarDisplay();
void CalcDynamicAvatarSize(BITMAP *bminfo);
void CheckStatusIconClick(POINT pt, const RECT &rc, int gap, int code);
- BOOL DoRtfToTags(CMStringW &pszText, int iNumColors, COLORREF *pColors) const;
+ BOOL DoRtfToTags(CMStringW &pszText) const;
void DrawStatusIcons(HDC hDC, const RECT &rc, int gap);
void EnableSendButton(bool bMode) const;
void EnableSending(bool bMode) const;
diff --git a/plugins/TabSRMM/src/utils.cpp b/plugins/TabSRMM/src/utils.cpp
index 607fe6ec74..8faf8bbce5 100644
--- a/plugins/TabSRMM/src/utils.cpp
+++ b/plugins/TabSRMM/src/utils.cpp
@@ -32,21 +32,7 @@
#define MWF_LOG_TEXTFORMAT 0x2000000
#define MSGDLGFONTCOUNT 22
-static TRTFColorTable _rtf_ctable[] =
-{
- { L"red", RGB(255, 0, 0), ID_FONT_RED },
- { L"blue", RGB(0, 0, 255), ID_FONT_BLUE },
- { L"green", RGB(0, 255, 0), ID_FONT_GREEN },
- { L"magenta", RGB(255, 0, 255), ID_FONT_MAGENTA },
- { L"yellow", RGB(255, 255, 0), ID_FONT_YELLOW },
- { L"cyan", RGB(0, 255, 255), ID_FONT_CYAN },
- { L"black", 0, ID_FONT_BLACK },
- { L"white", RGB(255, 255, 255), ID_FONT_WHITE },
- { L"", 0, 0 }
-};
-
-int Utils::rtf_ctable_size = 0;
-TRTFColorTable* Utils::rtf_ctable = 0;
+OBJLIST<TRTFColorTable> Utils::rtf_clrs(10);
MWindowList CWarning::hWindowList = 0;
@@ -95,9 +81,10 @@ void CTabBaseDlg::FormatRaw(CMStringW &msg, int flags, bool isSent)
CMStringW colorname = msg.Mid(beginmark + 7, 8);
search_again:
bool clr_found = false;
- for (int ii = 0; ii < Utils::rtf_ctable_size; ii++) {
- if (!wcsnicmp(colorname, Utils::rtf_ctable[ii].szName, mir_wstrlen(Utils::rtf_ctable[ii].szName))) {
- closing = beginmark + 7 + (int)mir_wstrlen(Utils::rtf_ctable[ii].szName);
+ for (int ii = 0; ii < Utils::rtf_clrs.getCount(); ii++) {
+ auto &rtfc = Utils::rtf_clrs[ii];
+ if (!wcsnicmp(colorname, rtfc.szName, mir_wstrlen(rtfc.szName))) {
+ closing = beginmark + 7 + (int)mir_wstrlen(rtfc.szName);
if (endmark != -1) {
msg.Delete(endmark, 8);
msg.Insert(endmark, L"c0 ");
@@ -427,14 +414,22 @@ int CTabBaseDlg::FindRTLLocale()
/////////////////////////////////////////////////////////////////////////////////////////
// init default color table. the table may grow when using custom colors via bbcodes
-void Utils::RTF_CTableInit()
+static TRTFColorTable _rtf_ctable[] =
{
- int iSize = sizeof(TRTFColorTable) * RTF_CTABLE_DEFSIZE;
+ { L"red", RGB(255, 0, 0), ID_FONT_RED },
+ { L"blue", RGB(0, 0, 255), ID_FONT_BLUE },
+ { L"green", RGB(0, 255, 0), ID_FONT_GREEN },
+ { L"magenta", RGB(255, 0, 255), ID_FONT_MAGENTA },
+ { L"yellow", RGB(255, 255, 0), ID_FONT_YELLOW },
+ { L"cyan", RGB(0, 255, 255), ID_FONT_CYAN },
+ { L"black", 0, ID_FONT_BLACK },
+ { L"white", RGB(255, 255, 255), ID_FONT_WHITE }
+};
- rtf_ctable = (TRTFColorTable *)mir_alloc(iSize);
- memset(rtf_ctable, 0, iSize);
- memcpy(rtf_ctable, _rtf_ctable, iSize);
- rtf_ctable_size = RTF_CTABLE_DEFSIZE;
+void Utils::RTF_CTableInit()
+{
+ for (int i = 0; i < _countof(_rtf_ctable); i++)
+ rtf_clrs.insert(new TRTFColorTable(_rtf_ctable[i]));
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -442,16 +437,17 @@ void Utils::RTF_CTableInit()
void Utils::RTF_ColorAdd(const wchar_t *tszColname, size_t length)
{
- wchar_t *stopped;
+ TRTFColorTable *p = new TRTFColorTable;
- rtf_ctable_size++;
- rtf_ctable = (TRTFColorTable *)mir_realloc(rtf_ctable, sizeof(TRTFColorTable) * rtf_ctable_size);
+ wchar_t *stopped;
COLORREF clr = wcstol(tszColname, &stopped, 16);
- mir_snwprintf(rtf_ctable[rtf_ctable_size - 1].szName, length + 1, L"%06x", clr);
- rtf_ctable[rtf_ctable_size - 1].menuid = 0;
+ mir_snwprintf(p->szName, length + 1, L"%06x", clr);
+ p->menuid = 0;
clr = wcstol(tszColname, &stopped, 16);
- rtf_ctable[rtf_ctable_size - 1].clr = (RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)));
+ p->clr = (RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)));
+
+ rtf_clrs.insert(p);
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/TabSRMM/src/utils.h b/plugins/TabSRMM/src/utils.h
index f6a3bf49b3..0218f7956e 100644
--- a/plugins/TabSRMM/src/utils.h
+++ b/plugins/TabSRMM/src/utils.h
@@ -104,8 +104,7 @@ public:
}
public:
- static TRTFColorTable* rtf_ctable;
- static int rtf_ctable_size;
+ static OBJLIST<TRTFColorTable> rtf_clrs;
};
__forceinline LRESULT _dlgReturn(HWND hWnd, LRESULT result)
diff --git a/plugins/TabSRMM/src/version.h b/plugins/TabSRMM/src/version.h
index 46e0f319cc..354d5d3922 100644
--- a/plugins/TabSRMM/src/version.h
+++ b/plugins/TabSRMM/src/version.h
@@ -1,7 +1,7 @@
#define __MAJOR_VERSION 3
#define __MINOR_VERSION 5
#define __RELEASE_NUM 0
-#define __BUILD_NUM 6
+#define __BUILD_NUM 7
#include <stdver.h>