summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-07-25 13:11:06 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-07-25 13:11:06 +0300
commit69581b8648e0c2fe96f454455763359ebeeba46a (patch)
tree524a4088b16ad99993b4ca9994ccc55b554c49db /src
parent1acef408decb2450ce8cea52b37674f1972b9f82 (diff)
SRMM: automatic RTF log redraw on event's change/removal
Diffstat (limited to 'src')
-rw-r--r--src/core/stdmsg/src/msgs.h2
-rw-r--r--src/mir_app/mir_app.vcxproj1
-rw-r--r--src/mir_app/mir_app.vcxproj.filters3
-rw-r--r--src/mir_app/src/srmm_base.cpp20
-rw-r--r--src/mir_app/src/srmm_main.cpp122
-rw-r--r--src/mir_app/src/srmm_statusicon.cpp85
-rw-r--r--src/mir_app/src/srmm_util.cpp2
7 files changed, 150 insertions, 85 deletions
diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h
index 79140be1b0..51662e669d 100644
--- a/src/core/stdmsg/src/msgs.h
+++ b/src/core/stdmsg/src/msgs.h
@@ -96,7 +96,6 @@ public:
LRESULT WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam) override;
void OnActivate();
- void RemakeLog();
void UpdateAvatar();
void UserTyping(int nSecs);
@@ -143,6 +142,7 @@ public:
bool GetFirstEvent() override;
bool IsActive() const override;
void LoadSettings() override;
+ void RemakeLog() override;
void SetStatusText(const wchar_t *, HICON) override;
void ShowFilterMenu() override;
void UpdateFilterButton() override;
diff --git a/src/mir_app/mir_app.vcxproj b/src/mir_app/mir_app.vcxproj
index c0855b8ea5..fa8e33adfb 100644
--- a/src/mir_app/mir_app.vcxproj
+++ b/src/mir_app/mir_app.vcxproj
@@ -160,6 +160,7 @@
<ClCompile Include="src\srmm_log.cpp" />
<ClCompile Include="src\srmm_log_hpp.cpp" />
<ClCompile Include="src\srmm_log_rtf.cpp" />
+ <ClCompile Include="src\srmm_main.cpp" />
<ClCompile Include="src\srmm_statusicon.cpp" />
<ClCompile Include="src\srmm_toolbar.cpp" />
<ClCompile Include="src\srmm_util.cpp" />
diff --git a/src/mir_app/mir_app.vcxproj.filters b/src/mir_app/mir_app.vcxproj.filters
index 69928a983f..bcc2243516 100644
--- a/src/mir_app/mir_app.vcxproj.filters
+++ b/src/mir_app/mir_app.vcxproj.filters
@@ -428,6 +428,9 @@
<ClCompile Include="src\fileutils.cpp">
<Filter>Source Files\File</Filter>
</ClCompile>
+ <ClCompile Include="src\srmm_main.cpp">
+ <Filter>Source Files\SRMM</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\filter.h">
diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp
index 1fe703958a..34f57f0b16 100644
--- a/src/mir_app/src/srmm_base.cpp
+++ b/src/mir_app/src/srmm_base.cpp
@@ -31,6 +31,7 @@ CSrmmBaseDialog::CSrmmBaseDialog(CMPluginBase &pPlugin, int idDialog, SESSION_IN
timerFlash(this, 1),
timerType(this, 2),
timerNickList(this, 3),
+ timerRedraw(this, 4),
m_message(this, IDC_SRMM_MESSAGE),
m_nickList(this, IDC_SRMM_NICKLIST),
@@ -61,6 +62,8 @@ CSrmmBaseDialog::CSrmmBaseDialog(CMPluginBase &pPlugin, int idDialog, SESSION_IN
m_nickList.OnDblClick = Callback(this, &CSrmmBaseDialog::onDblClick_List);
+ timerRedraw.OnEvent = Callback(this, &CSrmmBaseDialog::OnRedrawTimer);
+
if (si) {
m_hContact = si->hContact;
@@ -652,6 +655,23 @@ void CSrmmBaseDialog::RedrawLog()
ClearLog();
}
+void CSrmmBaseDialog::OnRedrawTimer(CTimer *pTimer)
+{
+ pTimer->Stop();
+
+ if (isChat())
+ RedrawLog();
+ else
+ RemakeLog();
+}
+
+void CSrmmBaseDialog::ScheduleRedrawLog()
+{
+ timerRedraw.Start(100);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
void CSrmmBaseDialog::UpdateChatLog()
{
if (!m_si->pMI->bDatabase || m_si->bHistoryInit)
diff --git a/src/mir_app/src/srmm_main.cpp b/src/mir_app/src/srmm_main.cpp
new file mode 100644
index 0000000000..9de2c1bdb0
--- /dev/null
+++ b/src/mir_app/src/srmm_main.cpp
@@ -0,0 +1,122 @@
+/*
+
+Copyright (C) 2012-23 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include "stdafx.h"
+
+HCURSOR g_hCurHyperlinkHand;
+HANDLE hHookIconsChanged, hHookIconPressedEvt, hHookSrmmEvent;
+
+static HANDLE hHookEmptyHistory;
+static HGENMENU hmiEmpty;
+
+void LoadSrmmToolbarModule();
+void UnloadSrmmToolbarModule();
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Empty history service for main menu
+
+static INT_PTR svcEmptyHistory(WPARAM hContact, LPARAM lParam)
+{
+ if (NotifyEventHooks(hHookEmptyHistory))
+ return 2;
+
+ if (lParam == 0)
+ if (IDYES != MessageBoxW(nullptr, TranslateT("Are you sure to remove all events from history?"), L"Miranda", MB_YESNO | MB_ICONQUESTION))
+ return 1;
+
+ DB::ECPTR pCursor(DB::Events(hContact));
+ while (pCursor.FetchNext())
+ pCursor.DeleteEvent();
+ return 0;
+}
+
+static int OnPrebuildContactMenu(WPARAM hContact, LPARAM)
+{
+ Menu_ShowItem(hmiEmpty, db_event_first(hContact) != 0);
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// Built-in hook to redraw RTF-based event logs on event's change/deletion
+
+static int OnRedrawLog(WPARAM hContact, LPARAM)
+{
+ if (auto *pDlg = Srmm_FindDialog(hContact))
+ pDlg->ScheduleRedrawLog();
+
+ if (db_mc_isSub(hContact))
+ if (auto *pDlg = Srmm_FindDialog(db_mc_getMeta(hContact)))
+ pDlg->ScheduleRedrawLog();
+
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+void SrmmModulesLoaded()
+{
+ // menu item
+ CMenuItem mi(&g_plugin);
+ SET_UID(mi, 0x0d4306aa, 0xe31e, 0x46ee, 0x89, 0x88, 0x3a, 0x2e, 0x05, 0xa6, 0xf3, 0xbc);
+ mi.pszService = MS_HISTORY_EMPTY;
+ mi.name.a = LPGEN("Empty history");
+ mi.position = 1000090001;
+ mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE);
+ hmiEmpty = Menu_AddContactMenuItem(&mi);
+
+ // create menu item in main menu for empty system history
+ SET_UID(mi, 0x633AD23C, 0x24B5, 0x4914, 0xB2, 0x40, 0xAD, 0x9F, 0xAC, 0xB5, 0x64, 0xED);
+ mi.position = 500060002;
+ mi.name.a = LPGEN("Empty system history");
+ mi.pszService = MS_HISTORY_EMPTY;
+ mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE);
+ Menu_AddMainMenuItem(&mi);
+
+ HookEvent(ME_CLIST_PREBUILDCONTACTMENU, OnPrebuildContactMenu);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+int LoadSrmmModule()
+{
+ g_hCurHyperlinkHand = LoadCursor(nullptr, IDC_HAND);
+
+ LoadSrmmToolbarModule();
+
+ CreateServiceFunction(MS_HISTORY_EMPTY, svcEmptyHistory);
+ hHookEmptyHistory = CreateHookableEvent(ME_HISTORY_EMPTY);
+
+ hHookSrmmEvent = CreateHookableEvent(ME_MSG_WINDOWEVENT);
+ hHookIconsChanged = CreateHookableEvent(ME_MSG_ICONSCHANGED);
+ hHookIconPressedEvt = CreateHookableEvent(ME_MSG_ICONPRESSED);
+
+ HookEvent(ME_DB_EVENT_EDITED, OnRedrawLog);
+ HookEvent(ME_DB_EVENT_DELETED, OnRedrawLog);
+ return 0;
+}
+
+void UnloadSrmmModule()
+{
+ DestroyHookableEvent(hHookIconsChanged);
+ DestroyHookableEvent(hHookSrmmEvent);
+ DestroyHookableEvent(hHookIconPressedEvt);
+
+ DestroyCursor(g_hCurHyperlinkHand);
+
+ UnloadSrmmToolbarModule();
+}
diff --git a/src/mir_app/src/srmm_statusicon.cpp b/src/mir_app/src/srmm_statusicon.cpp
index 94de15aa2f..508a9a4ba8 100644
--- a/src/mir_app/src/srmm_statusicon.cpp
+++ b/src/mir_app/src/srmm_statusicon.cpp
@@ -23,15 +23,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
-HCURSOR g_hCurHyperlinkHand;
-HANDLE hHookSrmmEvent;
-
-static HANDLE hHookIconsChanged, hHookIconPressedEvt, hHookEmptyHistory;
+extern HANDLE hHookIconsChanged, hHookIconPressedEvt, hHookEmptyHistory;
static mir_cs csIcons;
-void LoadSrmmToolbarModule();
-void UnloadSrmmToolbarModule();
-
void SafeDestroyIcon(HICON hIcon)
{
if (hIcon != nullptr)
@@ -265,80 +259,3 @@ void KillModuleSrmmIcons(CMPluginBase *pPlugin)
if (it->pPlugin == pPlugin)
arIcons.removeItem(&it);
}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-static HGENMENU hmiEmpty;
-
-static INT_PTR svcEmptyHistory(WPARAM hContact, LPARAM lParam)
-{
- if (NotifyEventHooks(hHookEmptyHistory))
- return 2;
-
- if (lParam == 0)
- if (IDYES != MessageBoxW(nullptr, TranslateT("Are you sure to remove all events from history?"), L"Miranda", MB_YESNO | MB_ICONQUESTION))
- return 1;
-
- DB::ECPTR pCursor(DB::Events(hContact));
- while (pCursor.FetchNext())
- pCursor.DeleteEvent();
- return 0;
-}
-
-static int OnPrebuildContactMenu(WPARAM hContact, LPARAM)
-{
- Menu_ShowItem(hmiEmpty, db_event_first(hContact) != 0);
- return 0;
-}
-
-void SrmmModulesLoaded()
-{
- // menu item
- CMenuItem mi(&g_plugin);
- SET_UID(mi, 0x0d4306aa, 0xe31e, 0x46ee, 0x89, 0x88, 0x3a, 0x2e, 0x05, 0xa6, 0xf3, 0xbc);
- mi.pszService = MS_HISTORY_EMPTY;
- mi.name.a = LPGEN("Empty history");
- mi.position = 1000090001;
- mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE);
- hmiEmpty = Menu_AddContactMenuItem(&mi);
-
- // create menu item in main menu for empty system history
- SET_UID(mi, 0x633AD23C, 0x24B5, 0x4914, 0xB2, 0x40, 0xAD, 0x9F, 0xAC, 0xB5, 0x64, 0xED);
- mi.position = 500060002;
- mi.name.a = LPGEN("Empty system history");
- mi.pszService = MS_HISTORY_EMPTY;
- mi.hIcon = Skin_LoadIcon(SKINICON_OTHER_DELETE);
- Menu_AddMainMenuItem(&mi);
-
- HookEvent(ME_CLIST_PREBUILDCONTACTMENU, OnPrebuildContactMenu);
-}
-
-/////////////////////////////////////////////////////////////////////////////////////////
-
-int LoadSrmmModule()
-{
- g_hCurHyperlinkHand = LoadCursor(nullptr, IDC_HAND);
-
- LoadSrmmToolbarModule();
-
- CreateServiceFunction(MS_HISTORY_EMPTY, svcEmptyHistory);
- hHookEmptyHistory = CreateHookableEvent(ME_HISTORY_EMPTY);
-
- hHookSrmmEvent = CreateHookableEvent(ME_MSG_WINDOWEVENT);
- hHookIconsChanged = CreateHookableEvent(ME_MSG_ICONSCHANGED);
- hHookIconPressedEvt = CreateHookableEvent(ME_MSG_ICONPRESSED);
- return 0;
-}
-
-void UnloadSrmmModule()
-{
- arIcons.destroy();
-
- DestroyHookableEvent(hHookIconsChanged);
- DestroyHookableEvent(hHookSrmmEvent);
- DestroyHookableEvent(hHookIconPressedEvt);
-
- DestroyCursor(g_hCurHyperlinkHand);
-
- UnloadSrmmToolbarModule();
-}
diff --git a/src/mir_app/src/srmm_util.cpp b/src/mir_app/src/srmm_util.cpp
index bd2897bef1..955eafa6c0 100644
--- a/src/mir_app/src/srmm_util.cpp
+++ b/src/mir_app/src/srmm_util.cpp
@@ -120,6 +120,8 @@ void OFDTHREAD::Finish()
dbv.pwszVal = wszPath.GetBuffer();
db_event_setJson(hDbEvent, "lf", &dbv);
+ NotifyEventHooks(g_hevEventEdited, db_event_getContact(hDbEvent), hDbEvent);
+
if (bOpen)
ShellExecuteW(nullptr, L"open", wszPath, nullptr, nullptr, SW_SHOWDEFAULT);
}