From 60338d55bb73d0c45b6e092703c4bb88a3c49755 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Mon, 23 Jul 2012 13:03:18 +0000 Subject: Rate, RecentContacts, Scriver: changed folder structure git-svn-id: http://svn.miranda-ng.org/main/trunk@1121 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Scriver/src/utils.cpp | 652 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 652 insertions(+) create mode 100644 plugins/Scriver/src/utils.cpp (limited to 'plugins/Scriver/src/utils.cpp') diff --git a/plugins/Scriver/src/utils.cpp b/plugins/Scriver/src/utils.cpp new file mode 100644 index 0000000000..3551119adc --- /dev/null +++ b/plugins/Scriver/src/utils.cpp @@ -0,0 +1,652 @@ +/* +Scriver + +Copyright 2000-2012 Miranda ICQ/IM project, + +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +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 "commonheaders.h" + +#ifndef TTI_NONE +#define TTI_NONE 0 +#endif + +static unsigned hookNum = 0; +static unsigned serviceNum = 0; +static HANDLE* hHooks = NULL; +static HANDLE* hServices = NULL; + +HANDLE HookEvent_Ex(const char *name, MIRANDAHOOK hook) { + hookNum ++; + hHooks = (HANDLE *) mir_realloc(hHooks, sizeof(HANDLE) * (hookNum)); + hHooks[hookNum - 1] = HookEvent(name, hook); + return hHooks[hookNum - 1] ; +} + +HANDLE CreateServiceFunction_Ex(const char *name, MIRANDASERVICE service) { + serviceNum++; + hServices = (HANDLE *) mir_realloc(hServices, sizeof(HANDLE) * (serviceNum)); + hServices[serviceNum - 1] = CreateServiceFunction(name, service); + return hServices[serviceNum - 1] ; +} + +void UnhookEvents_Ex() { + unsigned i; + for (i=0; i 0) { + textBufferSize += sizeof(TCHAR); + textBuffer = (TCHAR *) mir_alloc(textBufferSize); + gt.cb = textBufferSize; + gt.flags = GT_USECRLF; + gt.codepage = codepage; + SendMessage(hwnd, EM_GETTEXTEX, (WPARAM) >, (LPARAM) textBuffer); + } + return textBuffer; +} + +char *GetRichTextEncoded(HWND hwnd, int codepage) { + TCHAR *textBuffer = GetRichText(hwnd, codepage); + char *textUtf = NULL; + if (textBuffer != NULL) { + textUtf = mir_utf8encodeW(textBuffer); + mir_free(textBuffer); + } + return textUtf; +} + +int SetRichTextEncoded(HWND hwnd, const char *text, int codepage) { + TCHAR *textToSet; + SETTEXTEX st; + st.flags = ST_DEFAULT; + st.codepage = 1200; + textToSet = mir_utf8decodeW(text); + SendMessage(hwnd, EM_SETTEXTEX, (WPARAM) &st, (LPARAM)textToSet); + mir_free(textToSet); + return GetRichTextLength(hwnd, st.codepage, FALSE); +} + +int SetRichTextRTF(HWND hwnd, const char *text) { + SETTEXTEX st; + st.flags = ST_DEFAULT; + st.codepage = CP_ACP; + SendMessage(hwnd, EM_SETTEXTEX, (WPARAM) &st, (LPARAM)text); + return GetRichTextLength(hwnd, st.codepage, FALSE); +} + +static DWORD CALLBACK RichTextStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb) +{ + static DWORD dwRead; + char ** ppText = (char **) dwCookie; + + if (*ppText == NULL) { + *ppText = (char *)mir_alloc(cb + 1); + memcpy(*ppText, pbBuff, cb); + (*ppText)[cb] = 0; + *pcb = cb; + dwRead = cb; + } + else { + char *p = (char *)mir_alloc(dwRead + cb + 1); + memcpy(p, *ppText, dwRead); + memcpy(p+dwRead, pbBuff, cb); + p[dwRead + cb] = 0; + mir_free(*ppText); + *ppText = p; + *pcb = cb; + dwRead += cb; + } + + return 0; +} + +char* GetRichTextRTF(HWND hwnd) +{ + EDITSTREAM stream; + char* pszText = NULL; + DWORD dwFlags; + + if (hwnd == 0) + return NULL; + + ZeroMemory(&stream, sizeof(stream)); + stream.pfnCallback = RichTextStreamCallback; + stream.dwCookie = (DWORD_PTR) &pszText; // pass pointer to pointer + dwFlags = SF_RTFNOOBJS | SFF_PLAINRTF | SF_USECODEPAGE | (CP_UTF8 << 16); + SendMessage(hwnd, EM_STREAMOUT, dwFlags, (LPARAM) & stream); + return pszText; // pszText contains the text +} + +void rtrimText(TCHAR *text) +{ + static TCHAR szTrimString[] = _T(":;,.!?\'\"><()[]- \r\n"); + int iLen = lstrlen(text)-1; + while(iLen >= 0 && _tcschr(szTrimString, text[iLen])) { + text[iLen] = _T('\0'); + iLen--; + } +} + +TCHAR *limitText(TCHAR *text, int limit) +{ + int len = lstrlen(text); + if (len > g_dat->limitNamesLength) + { + TCHAR *ptszTemp = (TCHAR *)mir_alloc(sizeof(TCHAR) * (limit + 4)); + _tcsncpy(ptszTemp, text, limit + 1); + _tcsncpy(ptszTemp + limit, _T("..."), 4); + return ptszTemp; + } + return text; +} +TCHAR *GetRichTextWord(HWND hwnd, POINTL *ptl) +{ + TCHAR* pszWord = NULL; + long iCharIndex, start, end, iRes; + pszWord = GetRichEditSelection(hwnd); + if (pszWord == NULL) { + iCharIndex = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM)ptl); + if (iCharIndex >= 0) + { + start = SendMessage(hwnd, EM_FINDWORDBREAK, WB_LEFT, iCharIndex);//-iChars; + end = SendMessage(hwnd, EM_FINDWORDBREAK, WB_RIGHT, iCharIndex);//-iChars; + if (end - start > 0) + { + TEXTRANGE tr; + CHARRANGE cr; + ZeroMemory(&tr, sizeof(TEXTRANGE)); + pszWord = (TCHAR *)mir_alloc(sizeof(TCHAR) * (end - start + 1)); + cr.cpMin = start; + cr.cpMax = end; + tr.chrg = cr; + tr.lpstrText = pszWord; + iRes = SendMessage(hwnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr); + if (iRes <= 0) + { + mir_free(pszWord); + pszWord = NULL; + } + } + } + } + if (pszWord != NULL) + { + rtrimText(pszWord); + } + return pszWord; +} + +static DWORD CALLBACK StreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb) +{ + MessageSendQueueItem * msi = (MessageSendQueueItem *) dwCookie; + msi->sendBuffer = (char *)mir_realloc(msi->sendBuffer, msi->sendBufferSize + cb + 2); + memcpy (msi->sendBuffer + msi->sendBufferSize, pbBuff, cb); + msi->sendBufferSize += cb; + *((TCHAR *)(msi->sendBuffer+msi->sendBufferSize)) = '\0'; + *pcb = cb; + return 0; +} + +TCHAR *GetRichEditSelection(HWND hwnd) +{ + CHARRANGE sel; + SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); + if (sel.cpMin!=sel.cpMax) { + MessageSendQueueItem msi; + EDITSTREAM stream; + DWORD dwFlags = 0; + ZeroMemory(&stream, sizeof(stream)); + stream.pfnCallback = StreamOutCallback; + stream.dwCookie = (DWORD_PTR) &msi; + dwFlags = SF_TEXT|SF_UNICODE|SFF_SELECTION; + msi.sendBuffer = NULL; + msi.sendBufferSize = 0; + SendMessage(hwnd, EM_STREAMOUT, (WPARAM)dwFlags, (LPARAM) & stream); + return (TCHAR *)msi.sendBuffer; + } + return NULL; +} + +void AppendToBuffer(char **buffer, int *cbBufferEnd, int *cbBufferAlloced, const char *fmt, ...) +{ + va_list va; + int charsDone; + + va_start(va, fmt); + for (;;) { + charsDone = _vsnprintf(*buffer + *cbBufferEnd, *cbBufferAlloced - *cbBufferEnd, fmt, va); + if (charsDone >= 0) + break; + *cbBufferAlloced += 1024; + *buffer = (char *) mir_realloc(*buffer, *cbBufferAlloced); + } + va_end(va); + *cbBufferEnd += charsDone; +} + + +int MeasureMenuItem(WPARAM wParam, LPARAM lParam) +{ + LPMEASUREITEMSTRUCT mis = (LPMEASUREITEMSTRUCT) lParam; + if (mis->itemData != (ULONG_PTR) g_dat->hButtonIconList && mis->itemData != (ULONG_PTR) g_dat->hSearchEngineIconList && mis->itemData != (ULONG_PTR) g_dat->hChatButtonIconList) { + return FALSE; + } + mis->itemWidth = max(0, GetSystemMetrics(SM_CXSMICON) - GetSystemMetrics(SM_CXMENUCHECK) + 4); + mis->itemHeight = GetSystemMetrics(SM_CYSMICON) + 2; + return TRUE; +} + +int DrawMenuItem(WPARAM wParam, LPARAM lParam) +{ + int y; + int id; + LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT) lParam; + if (dis->itemData != (ULONG_PTR) g_dat->hButtonIconList && dis->itemData != (ULONG_PTR) g_dat->hSearchEngineIconList && dis->itemData != (ULONG_PTR) g_dat->hChatButtonIconList) { + return FALSE; + } + id = dis->itemID; + if (id >= IDM_SEARCH_GOOGLE) { + id -= IDM_SEARCH_GOOGLE; + } + y = (dis->rcItem.bottom - dis->rcItem.top - GetSystemMetrics(SM_CYSMICON)) / 2 + 1; + if (dis->itemState & ODS_SELECTED) { + if (dis->itemState & ODS_CHECKED) { + RECT rc; + rc.left = 2; + rc.right = GetSystemMetrics(SM_CXSMICON) + 2; + rc.top = y; + rc.bottom = rc.top + GetSystemMetrics(SM_CYSMICON) + 2; + FillRect(dis->hDC, &rc, GetSysColorBrush(COLOR_HIGHLIGHT)); + ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_SELECTED); + } else + ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_DEFAULT, ILD_FOCUS); + } else { + if (dis->itemState & ODS_CHECKED) { + HBRUSH hBrush; + RECT rc; + COLORREF menuCol, hiliteCol; + rc.left = 0; + rc.right = GetSystemMetrics(SM_CXSMICON) + 4; + rc.top = y - 2; + rc.bottom = rc.top + GetSystemMetrics(SM_CYSMICON) + 4; + DrawEdge(dis->hDC, &rc, BDR_SUNKENOUTER, BF_RECT); + InflateRect(&rc, -1, -1); + menuCol = GetSysColor(COLOR_MENU); + hiliteCol = GetSysColor(COLOR_3DHIGHLIGHT); + hBrush = CreateSolidBrush(RGB + ((GetRValue(menuCol) + GetRValue(hiliteCol)) / 2, (GetGValue(menuCol) + GetGValue(hiliteCol)) / 2, + (GetBValue(menuCol) + GetBValue(hiliteCol)) / 2)); + FillRect(dis->hDC, &rc, hBrush); + DeleteObject(hBrush); + ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, GetSysColor(COLOR_MENU), ILD_BLEND25); + } else + ImageList_DrawEx((HIMAGELIST)dis->itemData, id, dis->hDC, 2, y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL); + } + return TRUE; +} + +// Code taken from http://www.geekhideout.com/urlcode.shtml + +/* Converts an integer value to its hex character*/ +char to_hex(char code) { + static char hex[] = "0123456789abcdef"; + return hex[code & 15]; +} + +/* Returns a url-encoded version of str */ +/* IMPORTANT: be sure to free() the returned string after use */ +char *url_encode(char *str) { + char *pstr = str, *buf = (char *)mir_alloc(strlen(str) * 3 + 1), *pbuf = buf; + while (*pstr) { + if ( (48 <= *pstr && *pstr <= 57) ||//0-9 + (65 <= *pstr && *pstr <= 90) ||//ABC...XYZ + (97 <= *pstr && *pstr <= 122) ||//abc...xyz + *pstr == '-' || *pstr == '_' || *pstr == '.') + *pbuf++ = *pstr; + else if (*pstr == ' ') + *pbuf++ = '+'; + else + *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15); + pstr++; + } + *pbuf = '\0'; + return buf; +} + +void SearchWord(TCHAR * word, int engine) +{ + char szURL[4096]; + if (word && word[0]) { + char *wordUTF = mir_utf8encodeT(word); + //char *wordURL = (char *)CallService(MS_NETLIB_URLENCODE, 0, (LPARAM)wordUTF); + char *wordURL = url_encode(wordUTF); + switch (engine) { + case SEARCHENGINE_WIKIPEDIA: + mir_snprintf( szURL, sizeof( szURL ), "http://en.wikipedia.org/wiki/%s", wordURL ); + break; + case SEARCHENGINE_YAHOO: + mir_snprintf( szURL, sizeof( szURL ), "http://search.yahoo.com/search?p=%s&ei=UTF-8", wordURL ); + break; + case SEARCHENGINE_FOODNETWORK: + mir_snprintf( szURL, sizeof( szURL ), "http://search.foodnetwork.com/search/delegate.do?fnSearchString=%s", wordURL ); + break; + case SEARCHENGINE_BING: + mir_snprintf( szURL, sizeof( szURL ), "http://www.bing.com/search?q=%s&form=OSDSRC", wordURL ); + break; + case SEARCHENGINE_GOOGLE_MAPS: + mir_snprintf( szURL, sizeof( szURL ), "http://maps.google.com/maps?q=%s&ie=utf-8&oe=utf-8", wordURL ); + break; + case SEARCHENGINE_GOOGLE_TRANSLATE: + mir_snprintf( szURL, sizeof( szURL ), "http://translate.google.com/?q=%s&ie=utf-8&oe=utf-8", wordURL ); + break; + case SEARCHENGINE_GOOGLE: + default: + mir_snprintf( szURL, sizeof( szURL ), "http://www.google.com/search?q=%s&ie=utf-8&oe=utf-8", wordURL ); + break; + } +// HeapFree(GetProcessHeap(), 0, wordURL); + mir_free(wordUTF); + mir_free(wordURL); + CallService(MS_UTILS_OPENURL, 1, (LPARAM) szURL); + } +} + +void SetSearchEngineIcons(HMENU hMenu, HIMAGELIST hImageList) { + int i; + for (i=0; iwindowData.hContact; + ci.szProto = dat->szProto; + ci.dwFlag = CNF_UNIQUEID; + buf[0] = 0; + if (!CallService(MS_CONTACT_GETCONTACTINFO, 0, (LPARAM) & ci)) { + switch (ci.type) { + case CNFT_ASCIIZ: + mir_snprintf(buf, maxlen, "%s", ci.pszVal); + mir_free(ci.pszVal); + break; + case CNFT_DWORD: + mir_snprintf(buf, maxlen, "%u", ci.dVal); + break; + } + } +} + +HWND CreateToolTip(HWND hwndParent, LPTSTR ptszText, LPTSTR ptszTitle, RECT* rect) +{ + TOOLINFO ti = { 0 }; + HWND hwndTT; + hwndTT = CreateWindowEx(WS_EX_TOPMOST, + TOOLTIPS_CLASS, NULL, + WS_POPUP | TTS_NOPREFIX, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + hwndParent, NULL, g_hInst, NULL); + + SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + ti.cbSize = sizeof(TOOLINFO); + ti.uFlags = TTF_SUBCLASS | TTF_CENTERTIP; + ti.hwnd = hwndParent; + ti.hinst = g_hInst; + ti.lpszText = ptszText; + ti.rect = *rect; + SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); + SendMessage(hwndTT, TTM_SETTITLE, TTI_NONE, (LPARAM)ptszTitle); + return hwndTT; +} + +void SetToolTipText(HWND hwndParent, HWND hwndTT, LPTSTR ptszText, LPTSTR ptszTitle) { + TOOLINFO ti = { 0 }; + ti.cbSize = sizeof(TOOLINFO); + ti.hinst = g_hInst; + ti.hwnd = hwndParent; + ti.lpszText = ptszText; + SendMessage(hwndTT, TTM_UPDATETIPTEXT, 0, (LPARAM) (LPTOOLINFO) &ti); + SendMessage(hwndTT, TTM_SETTITLE, TTI_NONE, (LPARAM)ptszTitle); +} + +void SetToolTipRect(HWND hwndParent, HWND hwndTT, RECT* rect) +{ + TOOLINFO ti = { 0 }; + ti.cbSize = sizeof(TOOLINFO); + ti.hinst = g_hInst; + ti.hwnd = hwndParent; + ti.rect = *rect; + SendMessage(hwndTT, TTM_NEWTOOLRECT, 0, (LPARAM) (LPTOOLINFO) &ti); +} + +/* toolbar-related stuff, to be moved to a separate file */ + +HDWP ResizeToolbar(HWND hwnd, HDWP hdwp, int width, int vPos, int height, int cControls, const ToolbarButton * buttons, int controlVisibility) +{ + int i; + int lPos = 0; + int rPos = width; + for (i = 0; i < cControls ; i++) { + if (!buttons[i].alignment && (controlVisibility & (1 << i))) { + lPos += buttons[i].spacing; + hdwp = DeferWindowPos(hdwp, GetDlgItem(hwnd, buttons[i].controlId), 0, lPos, vPos, buttons[i].width, height, SWP_NOZORDER); + lPos += buttons[i].width; + } + } + for (i = cControls - 1; i >=0; i--) { + if (buttons[i].alignment && (controlVisibility & (1 << i))) { + rPos -= buttons[i].spacing + buttons[i].width; + hdwp = DeferWindowPos(hdwp, GetDlgItem(hwnd, buttons[i].controlId), 0, rPos, vPos, buttons[i].width, height, SWP_NOZORDER); + } + } + return hdwp; +} + +void ShowToolbarControls(HWND hwndDlg, int cControls, const ToolbarButton* buttons, int controlVisibility, int state) +{ + int i; + for (i = 0; i < cControls; i++) + ShowWindow(GetDlgItem(hwndDlg, buttons[i].controlId), (controlVisibility & (1 << i)) ? state : SW_HIDE); +} + +int GetToolbarWidth(int cControls, const ToolbarButton * buttons) +{ + int i, w = 0; + for (i = 0; i < cControls; i++) { +// if (g_dat->buttonVisibility & (1 << i)) { + if (buttons[i].controlId != IDC_SMILEYS || g_dat->smileyAddInstalled) { + w += buttons[i].width + buttons[i].spacing; + } +// } + } + return w; +} + +BOOL IsToolbarVisible(int cControls, int visibilityFlags) +{ + int i; + for (i = 0; i < cControls; i++) { + if (visibilityFlags & (1 << i)) { + return TRUE; + } + } + return FALSE; +} -- cgit v1.2.3