diff options
Diffstat (limited to 'libs/mTextControl/src/services.cpp')
-rw-r--r-- | libs/mTextControl/src/services.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/libs/mTextControl/src/services.cpp b/libs/mTextControl/src/services.cpp new file mode 100644 index 0000000000..e589d6efae --- /dev/null +++ b/libs/mTextControl/src/services.cpp @@ -0,0 +1,206 @@ +/* +Miranda Text Control - Plugin for Miranda IM +Copyright (C) 2005 Victor Pavlychko (nullbie@gmail.com) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "stdafx.h" +#include "FormattedTextDraw.h" + +struct TextObject +{ + DWORD options; + IFormattedTextDraw *ftd; + TextObject() : options(0), ftd(nullptr) {} + ~TextObject() { if (ftd) delete ftd; } +}; + +///////////////////////////////////////////////////////////////////////////////////////// +// elper functions + +void MText_InitFormatting0(IFormattedTextDraw *ftd, DWORD) +{ + LRESULT lResult; + + // urls + ftd->getTextService()->TxSendMessage(EM_AUTOURLDETECT, TRUE, 0, &lResult); +} + +void MText_InitFormatting1(TextObject *text) +{ + // bbcodes + bbCodeParse(text->ftd); + + // smilies + // HWND hwnd = (HWND)CallServiceSync(MS_TEXT_CREATEPROXY, (WPARAM)text, 0); + HWND hwnd = CreateProxyWindow(text->ftd->getTextService()); + SMADD_RICHEDIT3 sm = { 0 }; + sm.cbSize = sizeof(sm); + sm.hwndRichEditControl = hwnd; + sm.rangeToReplace = nullptr; + sm.Protocolname = nullptr; + sm.flags = SAFLRE_INSERTEMF; + CallService(MS_SMILEYADD_REPLACESMILEYS, RGB(0xff, 0xff, 0xff), (LPARAM)&sm); + DestroyWindow(hwnd); + + // text->ftd->getTextService()->TxSendMessage(EM_SETSEL, 0, -1, &lResult); + /* + // rtl stuff + PARAFORMAT2 pf2; + pf2.cbSize = sizeof(pf2); + pf2.dwMask = PFM_ALIGNMENT|PFM_RTLPARA; + pf2.wEffects = PFE_RTLPARA; + pf2.wAlignment = PFA_RIGHT; + text->ftd->getTextService()->TxSendMessage(EM_SETSEL, 0, -1, &lResult); + text->ftd->getTextService()->TxSendMessage(EM_SETPARAFORMAT, 0, (LPARAM)&pf2, &lResult); + text->ftd->getTextService()->TxSendMessage(EM_SETSEL, 0, 0, &lResult); + */ +} + +///////////////////////////////////////////////////////////////////////////////////////// +// allocate text object (unicode) + +MTEXTCONTROL_DLL(HANDLE) MTextCreateW(HANDLE userHandle, WCHAR *text) +{ + TextObject *result = new TextObject; + result->options = TextUserGetOptions(userHandle); + result->ftd = new CFormattedTextDraw; + result->ftd->Create(); + InitRichEdit(result->ftd->getTextService()); + + MText_InitFormatting0(result->ftd, result->options); + result->ftd->putTextW(text); + MText_InitFormatting1(result); + + return (HANDLE)result; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// allocate text object (advanced) + +MTEXTCONTROL_DLL(HANDLE) MTextCreateEx(HANDLE userHandle, void *text, DWORD flags) +{ + TextObject *result = new TextObject; + result->options = TextUserGetOptions(userHandle); + result->ftd = new CFormattedTextDraw; + result->ftd->Create(); + InitRichEdit(result->ftd->getTextService()); + + MText_InitFormatting0(result->ftd, result->options); + if (flags & MTEXT_FLG_WCHAR) + result->ftd->putTextW((WCHAR *)text); + else + result->ftd->putTextA((char *)text); + MText_InitFormatting1(result); + delete result; + + return nullptr; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// measure text object + +MTEXTCONTROL_DLL(int) MTextMeasure(HDC dc, SIZE *sz, HANDLE text) +{ + if (!text) return 0; + + long lWidth = sz->cx, lHeight = sz->cy; + ((TextObject *)text)->ftd->get_NaturalSize(dc, &lWidth, &lHeight); + sz->cx = lWidth; + sz->cy = lHeight; + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// display text object + +MTEXTCONTROL_DLL(int) MTextDisplay(HDC dc, POINT pos, SIZE sz, HANDLE text) +{ + if (!text) return 0; + + COLORREF cl = GetTextColor(dc); + + LRESULT lResult; + CHARFORMAT cf = { 0 }; + cf.cbSize = sizeof(cf); + cf.dwMask = CFM_COLOR; + cf.crTextColor = cl; + ((TextObject *)text)->ftd->getTextService()->TxSendMessage(EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf, &lResult); + + SetBkMode(dc, TRANSPARENT); + + long lWidth = sz.cx, lHeight; + ((TextObject *)text)->ftd->get_NaturalSize(dc, &lWidth, &lHeight); + + RECT rt; + rt.left = pos.x; + rt.top = pos.y; + rt.right = pos.x + lWidth; + rt.bottom = pos.y + lHeight; + ((TextObject *)text)->ftd->Draw(dc, &rt); + + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// set parent window for text object (this is required for mouse handling, etc) + +MTEXTCONTROL_DLL(int) MTextSetParent(HANDLE text, HWND hwnd, RECT rect) +{ + if (text) + ((TextObject *)text)->ftd->setParentWnd(hwnd, rect); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// send message to an object + +MTEXTCONTROL_DLL(int) MTextSendMessage(HWND hwnd, HANDLE text, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (!text) + return 0; + + LRESULT lResult; + ((TextObject *)text)->ftd->getTextService()->TxSendMessage(msg, wParam, lParam, &lResult); + + if (hwnd && (msg == WM_MOUSEMOVE)) { + HDC hdc = GetDC(hwnd); + ((TextObject *)text)->ftd->getTextService()->OnTxSetCursor(DVASPECT_CONTENT, 0, nullptr, nullptr, hdc, nullptr, nullptr, LOWORD(0), HIWORD(0)); + ReleaseDC(hwnd, hdc); + } + + return lResult; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// create a proxy window + +MTEXTCONTROL_DLL(HWND) MTextCreateProxy(HANDLE text) +{ + if (!text) + return nullptr; + + return CreateProxyWindow(((TextObject *)text)->ftd->getTextService()); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// destroy text object + +MTEXTCONTROL_DLL(int) MTextDestroy(HANDLE text) +{ + if (text) delete (TextObject *)text; + return 0; +} |