/* Copyright (c) 2005 Victor Pavlychko (nullbyte@sotline.net.ua) Copyright (C) 2012-24 Miranda NG team (https://miranda-ng.org) 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 version 2 of the License. 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, see . */ #include "stdafx.h" #pragma comment(lib, "gdiplus.lib") CMPlugin g_plugin; CMOption g_bOptGrouping(MODULENAME, "MessageGrouping", false); CMOption g_bOptDrawEdge(MODULENAME, "DrawEdge", true); CMOption g_bOptHppCompat(MODULENAME, "HppCompat", false); CMOption g_bShowType(MODULENAME, "ShowType", true); CMOption g_bShowPreview(MODULENAME, "ShowPreview", true); CMOption g_bShowDirection(MODULENAME, "ShowDirection", true); CMOption g_clCustom0(MODULENAME, "CustomColor0", -1); CMOption g_clCustom1(MODULENAME, "CustomColor1", -1); CMOption g_clCustom2(MODULENAME, "CustomColor2", -1); CMOption g_clCustom3(MODULENAME, "CustomColor3", -1); CMOption g_clCustom4(MODULENAME, "CustomColor4", -1); MWindowList g_hNewstoryWindows = 0, g_hNewstoryLogs = 0; ///////////////////////////////////////////////////////////////////////////////////////// PLUGININFOEX pluginInfoEx = { sizeof(PLUGININFOEX), __PLUGIN_NAME, PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), __DESCRIPTION, __AUTHOR, __COPYRIGHT, __AUTHORWEB, UNICODE_AWARE, // {1AD11C86-CAAB-4372-A0A4-8B1168D51B9E} { 0x1ad11c86, 0xcaab, 0x4372, { 0xa0, 0xa4, 0x8b, 0x11, 0x68, 0xd5, 0x1b, 0x9e } } }; CMPlugin::CMPlugin() : PLUGIN(MODULENAME, pluginInfoEx), bOptVScroll(MODULENAME, "VScroll", true), bSortAscending(MODULENAME, "SortAscending", true) {} ///////////////////////////////////////////////////////////////////////////////////////// extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_UIHISTORY, MIID_LAST }; ///////////////////////////////////////////////////////////////////////////////////////// static IconItem icons[] = { { LPGEN("Main icon"), "main", IDI_NEWSTORY }, { LPGEN("User info"), "userinfo", IDI_USERINFO }, { LPGEN("User menu"), "usermenu", IDI_USERMENU }, { LPGEN("Search"), "search", IDI_SEARCH }, { LPGEN("Options"), "options", IDI_OPTIONS }, { LPGEN("Filter"), "filter", IDI_FILTER }, { LPGEN("Export"), "export", IDI_EXPORT }, { LPGEN("Copy"), "copy", IDI_COPY }, { LPGEN("Reply"), "reply", IDI_REPLY }, { LPGEN("Bookmark"), "bookmark", IDI_BOOKMARK }, { LPGEN("Send message"), "message", IDI_SENDMSG }, { LPGEN("Incoming message"), "msgin", IDI_MSGIN }, { LPGEN("Outgoing message"), "msgout", IDI_MSGOUT }, { LPGEN("User signed in"), "signin", IDI_SIGNIN }, { LPGEN("Unknown event"), "unknown", IDI_UNKNOWN }, { LPGEN("Find previous"), "findprev", IDI_FINDPREV }, { LPGEN("Find next"), "findnext", IDI_FINDNEXT }, { LPGEN("Jump to date"), "calendar", IDI_CALENDAR }, { LPGEN("Conversations"), "timetree", IDI_TIMETREE }, { LPGEN("All results"), "users", IDI_USERS }, { LPGEN("Template group"), "tplgroup", IDI_TPLGROUP }, { LPGEN("Cancel edit"), "reset", IDI_RESET }, { LPGEN("Downloaded"), "downloaded", IDI_OK }, { LPGEN("Help"), "varhelp", IDI_VARHELP } }; static int SmartSendEvent(int iEvent, MCONTACT hContact, LPARAM lParam) { if (HWND hwnd = WindowList_Find(g_hNewstoryLogs, hContact)) SendMessage(hwnd, iEvent, hContact, lParam); if (db_mc_isMeta(hContact)) { // Send a message to a real contact too MCONTACT cc = db_event_getContact(lParam); if (cc != hContact) if (HWND hwnd = WindowList_Find(g_hNewstoryLogs, cc)) SendMessage(hwnd, iEvent, cc, lParam); } return 0; } static int evtEventAdded(WPARAM hContact, LPARAM lParam) { return SmartSendEvent(UM_ADD_EVENT, hContact, lParam); } static int evtEventDeleted(WPARAM hContact, LPARAM lParam) { return (g_plugin.bDisableDelete) ? 0 : SmartSendEvent(UM_REMOVE_EVENT, hContact, lParam); } static int evtEventEdited(WPARAM hContact, LPARAM lParam) { return SmartSendEvent(UM_EDIT_EVENT, hContact, lParam); } static int evtTopToolbar(WPARAM, LPARAM) { // TopToolbar button TTBButton ttb = {}; ttb.dwFlags = TTBBF_VISIBLE; ttb.pszService = "NewStory/GlobalSearch"; ttb.name = LPGEN("Global search"); ttb.hIconHandleUp = g_plugin.getIconHandle(IDI_NEWSTORY); g_plugin.addTTB(&ttb); return 0; } static int evtModuleLoaded(WPARAM, LPARAM) { g_plugin.bHasSmileys = ServiceExists(MS_SMILEYADD_BATCHPARSE); return 0; } static int evtModulesLoaded(WPARAM, LPARAM) { HookEvent(ME_TTB_MODULELOADED, evtTopToolbar); HookEvent(ME_SYSTEM_MODULELOAD, evtModuleLoaded); HookEvent(ME_SYSTEM_MODULEUNLOAD, evtModuleLoaded); evtModuleLoaded(0, 0); InitFonts(); InitNewstoryControl(); LoadTemplates(); return 0; } static int evtPreShutdown(WPARAM, LPARAM) { WindowList_Broadcast(g_hNewstoryWindows, WM_CLOSE, 0, 0); return 0; } void CMPlugin::LoadOptions() { bShowType = g_bShowType; bDrawEdge = g_bOptDrawEdge; bHppCompat = g_bOptHppCompat; bShowPreview = g_bShowPreview; bMsgGrouping = g_bOptGrouping; bShowDirection = g_bShowDirection; clCustom[0] = g_clCustom0; clCustom[1] = g_clCustom1; clCustom[2] = g_clCustom2; clCustom[3] = g_clCustom3; clCustom[4] = g_clCustom4; } int CMPlugin::Load() { registerIcon(MODULETITLE, icons); GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); m_pNoImage = LoadImageFromResource(getInst(), IDI_NO_IMAGE, L"PNG"); LoadOptions(); m_log = RegisterSrmmLog(this, MODULETITLE, _T(MODULENAME), NewStory_Stub); g_hNewstoryLogs = WindowList_Create(); g_hNewstoryWindows = WindowList_Create(); HookEvent(ME_DB_EVENT_ADDED, evtEventAdded); HookEvent(ME_DB_EVENT_DELETED, evtEventDeleted); HookEvent(ME_DB_EVENT_EDITED, evtEventEdited); HookEvent(ME_DB_EVENT_SETJSON, evtEventEdited); HookEvent(ME_OPT_INITIALISE, OptionsInitialize); HookEvent(ME_SYSTEM_MODULESLOADED, evtModulesLoaded); HookEvent(ME_SYSTEM_PRESHUTDOWN, evtPreShutdown); InitMenus(); InitHotkeys(); InitServices(); return 0; } int CMPlugin::Unload() { WindowList_Destroy(g_hNewstoryLogs); WindowList_Destroy(g_hNewstoryWindows); GdiplusShutdown(m_gdiplusToken); UnregisterSrmmLog(m_log); UnregisterClass(_T(NEWSTORYLIST_CLASS), g_plugin.getInst()); DestroyFonts(); return 0; }