static void ReplaceContactSmileys(RichEditData *rdt, const CHARRANGE &sel, bool ignoreLast, bool unFreeze) { if ((rdt->inputarea && !opt.InputSmileys) || rdt->dontReplace) return; SmileyPackCType *smcp = NULL; SmileyPackType* SmileyPack = GetSmileyPack(NULL, rdt->hContact, rdt->inputarea ? NULL : &smcp); ReplaceSmileys(rdt->hwnd, SmileyPack, smcp, sel, false, ignoreLast, unFreeze); }
bool SmileyPackCListType::AddSmiley(HANDLE hContact, TCHAR* path) { SmileyPackCType* smpack = GetSmileyPack(hContact); if (smpack == NULL) { smpack = new SmileyPackCType; smpack->SetId(hContact); m_SmileyPacks.insert(smpack); } return smpack->LoadSmiley(path); }
bool SmileyPackListType::AddSmileyPack(CMString& filename, CMString& packname) { bool res = true; if (GetSmileyPack(filename) == NULL) { //not exist yet, so add SmileyPackType *smileyPack = new SmileyPackType; res = smileyPack->LoadSmileyFile(filename, packname, FALSE); if (res) m_SmileyPacks.insert(smileyPack); else delete smileyPack; } return res; }
bool SmileyPackCListType::AddSmileyPack(HANDLE hContact, TCHAR* dir) { bool res = true; if (GetSmileyPack(hContact) == NULL) { SmileyPackCType *smileyPack = new SmileyPackCType; res = smileyPack->LoadSmileyDir(dir); if (res) { smileyPack->SetId(hContact); m_SmileyPacks.insert(smileyPack); } else delete smileyPack; } return res; }
//global subclass function for all dialogs static LRESULT CALLBACK MessageDlgSubclass(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { MsgWndData* dat = IsMsgWnd(hwnd); if (dat == NULL) return 0; switch(uMsg) { case DM_OPTIONSAPPLIED: dat->clear(); dat->CreateSmileyButton(); break; case DM_APPENDTOLOG: if (opt.PluginSupportEnabled) { //get length of text now before things can get added... GETTEXTLENGTHEX gtl; gtl.codepage = 1200; gtl.flags = GTL_PRECISE | GTL_NUMCHARS; dat->idxLastChar = (int)SendMessage(dat->REdit, EM_GETTEXTLENGTHEX, (WPARAM) >l, 0); } break; } LRESULT result = mir_callNextSubclass(hwnd, MessageDlgSubclass, uMsg, wParam, lParam); if (!opt.PluginSupportEnabled) return result; switch(uMsg) { case WM_DESTROY: WaitForSingleObject(g_hMutex, 2000); { int ind = g_MsgWndList.getIndex((MsgWndData*)&hwnd); if ( ind != -1 ) { delete g_MsgWndList[ind]; g_MsgWndList.remove(ind); } } ReleaseMutex(g_hMutex); break; case WM_SIZE: if (dat->doSmileyButton) { RECT rect = dat->CalcSmileyButtonPos(); SetWindowPos(dat->hSmlButton, NULL, rect.left, rect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); } break; case DM_APPENDTOLOG: if (dat->doSmileyReplace) { SmileyPackCType* smcp; SmileyPackType* SmileyPack = GetSmileyPack(dat->ProtocolName, dat->hContact, &smcp); if (SmileyPack != NULL) { const CHARRANGE sel = { dat->idxLastChar, LONG_MAX }; ReplaceSmileys(dat->REdit, SmileyPack, smcp, sel, false, false, false); } } break; case DM_REMAKELOG: if (dat->doSmileyReplace) { SmileyPackCType* smcp; SmileyPackType* SmileyPack = GetSmileyPack(dat->ProtocolName, dat->hContact, &smcp); if (SmileyPack != NULL) { static const CHARRANGE sel = { 0, LONG_MAX }; ReplaceSmileys(dat->REdit, SmileyPack, smcp, sel, false, false, false); } } break; case WM_COMMAND: if (LOWORD(wParam) == IDC_SMLBUTTON && HIWORD(wParam) == BN_CLICKED) { SmileyToolWindowParam *stwp = new SmileyToolWindowParam; stwp->pSmileyPack = GetSmileyPack(dat->ProtocolName, dat->hContact); stwp->hWndParent = hwnd; stwp->hWndTarget = dat->MEdit; stwp->targetMessage = EM_REPLACESEL; stwp->targetWParam = TRUE; RECT rect; GetWindowRect(dat->hSmlButton, &rect); if (dat->OldButtonPlace) { stwp->direction = 3; stwp->xPosition = rect.left; stwp->yPosition = rect.top + 4; } else { stwp->direction = 0; stwp->xPosition = rect.left; stwp->yPosition = rect.top + 24; } mir_forkthread(SmileyToolThread, stwp); } if (LOWORD(wParam) == MI_IDC_ADD && HIWORD(wParam) == BN_CLICKED && dat->doSmileyButton) { RECT rect = dat->CalcSmileyButtonPos(); SetWindowPos(dat->hSmlButton, NULL, rect.left, rect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); } break; } return result; }
void CreateSmileyButton(void) { doSmileyButton = opt.ButtonStatus != 0; OldButtonPlace = opt.ButtonStatus == 2; SmileyPackType* SmileyPack = GetSmileyPack(ProtocolName, hContact); doSmileyButton &= SmileyPack != NULL && SmileyPack->VisibleSmileyCount() != 0; bool showButtonLine; if (IsOldSrmm()) { isSplit = db_get_b(NULL,"SRMsg","Split", TRUE) != 0; doSmileyReplace = (isSplit || !isSend); doSmileyButton &= isSplit || isSend; showButtonLine = db_get_b(NULL, "SRMsg", "ShowButtonLine", TRUE) != 0; } else { doSmileyReplace = true; OldButtonPlace = false; showButtonLine = db_get_b(NULL, "SRMM", "ShowButtonLine", TRUE) != 0; } doSmileyButton &= OldButtonPlace || showButtonLine; if (ProtocolName[0] != 0) { INT_PTR cap = CallProtoService(ProtocolName, PS_GETCAPS, PFLAGNUM_1, 0); doSmileyButton &= ((cap & (PF1_IMSEND | PF1_CHAT)) != 0); doSmileyReplace &= ((cap & (PF1_IMRECV | PF1_CHAT)) != 0); } if (doSmileyButton && opt.PluginSupportEnabled) { //create smiley button RECT rect = CalcSmileyButtonPos(); hSmlButton = CreateWindowEx( WS_EX_LEFT | WS_EX_NOPARENTNOTIFY | WS_EX_TOPMOST, MIRANDABUTTONCLASS, _T("S"), WS_CHILD|WS_VISIBLE|WS_TABSTOP, // window style rect.left, // horizontal position of window rect.top, // vertical position of window rect.bottom - rect.top + 1, // window width rect.bottom - rect.top + 1, // window height GetParent(LButton), // handle to parent or owner window (HMENU) IDC_SMLBUTTON, // menu handle or child identifier NULL, // handle to application instance NULL); // window-creation data // Conversion to bitmap done to prevent Miranda from scaling the image SmileyType* sml = FindButtonSmiley(SmileyPack); if (sml != NULL) { hSmlBmp = sml->GetBitmap(GetSysColor(COLOR_BTNFACE), 0, 0); SendMessage(hSmlButton, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hSmlBmp); } else { hSmlIco = GetDefaultIcon(); SendMessage(hSmlButton, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hSmlIco); } SendMessage(hSmlButton, BUTTONADDTOOLTIP, (WPARAM)LPGEN("Show smiley selection window"), 0); SendMessage(hSmlButton, BUTTONSETASFLATBTN, TRUE, 0); } }