Skip to content

Commit 46f47d6

Browse files
authored
Merge pull request #2533 from berryzplus/feature/improve_traywnd_test
トレイウィンドウのメッセージ配送をテストする
2 parents 5d2d293 + a01decc commit 46f47d6

10 files changed

Lines changed: 552 additions & 51 deletions

File tree

sakura_core/_main/CControlTray.cpp

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -96,21 +96,21 @@ void CControlTray::DoGrep()
9696
m_cDlgGrep.m_strText = m_pShareData->m_sSearchKeywords.m_aSearchKeys[0];
9797
}
9898
if( 0 < m_pShareData->m_sSearchKeywords.m_aGrepFiles.size() ){
99-
wcscpy( m_cDlgGrep.m_szFile, m_pShareData->m_sSearchKeywords.m_aGrepFiles[0] ); /* 検索ファイル */
99+
m_cDlgGrep.m_szFile = m_pShareData->m_sSearchKeywords.m_aGrepFiles[0]; /* 検索ファイル */
100100
}
101101
if( 0 < m_pShareData->m_sSearchKeywords.m_aGrepFolders.size() ){
102-
wcscpy( m_cDlgGrep.m_szFolder, m_pShareData->m_sSearchKeywords.m_aGrepFolders[0] ); /* 検索フォルダー */
102+
m_cDlgGrep.m_szFolder = m_pShareData->m_sSearchKeywords.m_aGrepFolders[0]; /* 検索フォルダー */
103103
}
104104
if (0 < m_pShareData->m_sSearchKeywords.m_aExcludeFiles.size()) {
105-
wcscpy(m_cDlgGrep.m_szExcludeFile, m_pShareData->m_sSearchKeywords.m_aExcludeFiles[0]); /* 除外ファイル */
105+
m_cDlgGrep.m_szExcludeFile = m_pShareData->m_sSearchKeywords.m_aExcludeFiles[0]; /* 除外ファイル */
106106
}
107107
if (0 < m_pShareData->m_sSearchKeywords.m_aExcludeFolders.size()) {
108-
wcscpy(m_cDlgGrep.m_szExcludeFolder, m_pShareData->m_sSearchKeywords.m_aExcludeFolders[0]); /* 除外フォルダー */
108+
m_cDlgGrep.m_szExcludeFolder = m_pShareData->m_sSearchKeywords.m_aExcludeFolders[0]; /* 除外フォルダー */
109109
}
110110

111111
/* Grepダイアログの表示 */
112-
int nRet = m_cDlgGrep.DoModal( m_hInstance, nullptr, L"" );
113-
if( !nRet || GetTrayHwnd() == nullptr ){
112+
if (const auto nRet = m_cDlgGrep.DoModal(m_hInstance, nullptr, L"");
113+
!nRet || GetTrayHwnd() == nullptr ){
114114
return;
115115
}
116116
m_nCurSearchKeySequence = GetDllShareData().m_Common.m_sSearch.m_nSearchKeySequence;
@@ -384,7 +384,6 @@ LRESULT CControlTray::DispatchEvent(
384384

385385
int nId;
386386
HWND hwndWork;
387-
LPHELPINFO lphi;
388387

389388
int nRowNum;
390389
EditNode* pEditNodeArr;
@@ -461,7 +460,7 @@ LRESULT CControlTray::DispatchEvent(
461460
case MYWM_HTMLHELP:
462461
{
463462
auto &sWorkBuffer = m_pShareData->m_sWorkBuffer;
464-
WCHAR* pWork = sWorkBuffer.GetWorkBuffer<WCHAR>();
463+
const auto pWork = sWorkBuffer.GetWorkBuffer<WCHAR>();
465464

466465
// pszHelpFile取得
467466
const WCHAR* pszHelpFile = pWork;
@@ -470,6 +469,8 @@ LRESULT CControlTray::DispatchEvent(
470469
// pszKeywords取得
471470
const WCHAR* pszKeywords = &pWork[cchHelpFile + 1];
472471

472+
if (!*pszHelpFile) return 0L;
473+
473474
// Jul. 6, 2001 genta HtmlHelpの呼び出し方法変更
474475
hwndHtmlHelp = OpenHtmlHelp(
475476
nullptr,
@@ -564,13 +565,8 @@ LRESULT CControlTray::DispatchEvent(
564565

565566
// case WM_QUERYENDSESSION:
566567
case WM_HELP:
567-
lphi = (LPHELPINFO) lParam;
568-
switch( lphi->iContextType ){
569-
case HELPINFO_MENUITEM:
568+
if (const auto lphi = (LPHELPINFO) lParam; lphi && HELPINFO_MENUITEM == lphi->iContextType) {
570569
MyWinHelp( hwnd, HELP_CONTEXT, FuncID_To_HelpContextID( (EFunctionCode)lphi->iCtrlId ) );
571-
break;
572-
default:
573-
break;
574570
}
575571
return TRUE;
576572
case WM_COMMAND:
@@ -1442,24 +1438,23 @@ void CControlTray::TerminateApplication(
14421438
HWND hWndFrom //!< [in] 呼び出し元のウィンドウハンドル
14431439
)
14441440
{
1445-
DLLSHAREDATA* pShareData = &GetDllShareData(); /* 共有データ構造体のアドレスを返す */
1441+
const auto pShareData = &GetDllShareData(); /* 共有データ構造体のアドレスを返す */
14461442

14471443
/* 現在の編集ウィンドウの数を調べる */
1448-
if( pShareData->m_Common.m_sGeneral.m_bExitConfirm ){ //終了時の確認
1449-
if( 0 < CAppNodeGroupHandle(0).GetEditorWindowsNum() ){
1450-
if( IDYES != ::MYMESSAGEBOX(
1444+
if (pShareData->m_Common.m_sGeneral.m_bExitConfirm && //終了時の確認
1445+
0 < CAppNodeGroupHandle(0).GetEditorWindowsNum() &&
1446+
IDYES != ::MessageBoxF(
14511447
hWndFrom,
14521448
MB_YESNO | MB_APPLMODAL | MB_ICONQUESTION,
14531449
GSTR_APPNAME,
14541450
LS(STR_TRAY_EXITALL)
14551451
) ){
14561452
return;
1457-
}
1458-
}
14591453
}
1454+
14601455
/* 「すべてのウィンドウを閉じる」要求 */ //Oct. 7, 2000 jepro 「編集ウィンドウの全終了」という説明を左記のように変更
1461-
BOOL bCheckConfirm = (pShareData->m_Common.m_sGeneral.m_bExitConfirm)? FALSE: TRUE; // 2006.12.25 ryoji 終了確認済みならそれ以上は確認しない
1462-
if( CloseAllEditor( bCheckConfirm, hWndFrom, TRUE, 0 ) ){ // 2006.12.25, 2007.02.13 ryoji 引数追加
1456+
if (const auto bCheckConfirm = pShareData->m_Common.m_sGeneral.m_bExitConfirm; // 2006.12.25 ryoji 終了確認済みならそれ以上は確認しない
1457+
CloseAllEditor(bCheckConfirm, hWndFrom, TRUE, 0)) { // 2006.12.25, 2007.02.13 ryoji 引数追加
14631458
::PostMessageAny( pShareData->m_sHandles.m_hwndTray, WM_CLOSE, 0, 0 );
14641459
}
14651460
return;
@@ -1506,7 +1501,6 @@ int CControlTray::CreatePopUpMenu_L( void )
15061501
WCHAR szMenu[100 + MAX_PATH * 2]; // Jan. 19, 2001 genta
15071502
POINT po;
15081503
RECT rc;
1509-
EditInfo* pfi;
15101504

15111505
//本当はセマフォにしないとだめ
15121506
if( m_bUseTrayMenu ) return -1;
@@ -1568,7 +1562,7 @@ int CControlTray::CreatePopUpMenu_L( void )
15681562
if( IsSakuraMainWindow( m_pShareData->m_sNodes.m_pEditArr[i].GetHwnd() ) ){
15691563
/* トレイからエディタへの編集ファイル名要求通知 */
15701564
::SendMessage( m_pShareData->m_sNodes.m_pEditArr[i].GetHwnd(), MYWM_GETFILEINFO, 0, 0 );
1571-
pfi = (EditInfo*)&m_pShareData->m_sWorkBuffer.m_EditInfo_MYWM_GETFILEINFO;
1565+
const auto pfi = &m_pShareData->m_sWorkBuffer.m_EditInfo_MYWM_GETFILEINFO;
15721566

15731567
// メニューラベル。1からアクセスキーを振る
15741568
CFileNameManager::getInstance()->GetMenuFullLabel_WinList( szMenu, int(std::size(szMenu)), pfi, m_pShareData->m_sNodes.m_pEditArr[i].m_nId, i, dcFont.GetHDC() );

sakura_core/_main/CControlTray.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ class CControlTray
128128
bool OnAddTypeSetting(size_t index);
129129
bool OnDelTypeSetting(size_t index);
130130

131+
public: // テストできないのでアクセス権変更
131132
/*
132133
|| メンバ変数
133134
*/

sakura_core/env/CFileNameManager.h

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55
/*
66
Copyright (C) 2008, kobake
7-
Copyright (C) 2018-2022, Sakura Editor Organization
7+
Copyright (C) 2018-2026, Sakura Editor Organization
88
99
SPDX-License-Identifier: Zlib
1010
*/
@@ -22,15 +22,10 @@ struct EditInfo;
2222
DLLSHAREDATA& GetDllShareData();
2323

2424
//!ファイル名管理
25-
class CFileNameManager : public TSingleton<CFileNameManager>{
26-
friend class TSingleton<CFileNameManager>;
27-
CFileNameManager()
28-
{
29-
m_pShareData = &GetDllShareData();
30-
m_nTransformFileNameCount = -1;
31-
}
32-
25+
class CFileNameManager : public TSakuraSingleton<CFileNameManager> {
3326
public:
27+
CFileNameManager() = default;
28+
3429
//ファイル名関連
3530
LPWSTR GetTransformFileNameFast( LPCWSTR, LPWSTR, int nDestLen, HDC hDC, bool bFitMode = true, int cchMaxWidth = 0 ); // 2002.11.24 Moca Add
3631
int TransformFileName_MakeCache( void );
@@ -60,11 +55,12 @@ class CFileNameManager : public TSingleton<CFileNameManager>{
6055
static WCHAR GetAccessKeyByIndex(int index, bool bZeroOrigin);
6156

6257
private:
63-
DLLSHAREDATA* m_pShareData;
58+
DLLSHAREDATA* m_pShareData = &GetDllShareData();
6459

6560
// ファイル名簡易表示用キャッシュ
66-
int m_nTransformFileNameCount; // 有効数
61+
int m_nTransformFileNameCount = -1; // 有効数
6762
WCHAR m_szTransformFileNameFromExp[MAX_TRANSFORM_FILENAME][_MAX_PATH];
6863
int m_nTransformFileNameOrgId[MAX_TRANSFORM_FILENAME];
6964
};
65+
7066
#endif /* SAKURA_CFILENAMEMANAGER_2B89B426_470E_40D6_B62E_5321E383ECD6_H_ */

sakura_core/env/CShareData.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626

2727
#include "StdAfx.h"
2828
#include "env/CShareData.h"
29+
2930
#include "env/DLLSHAREDATA.h"
31+
#include "env/CFileNameManager.h"
3032
#include "env/CShareData_IO.h"
3133
#include "env/CSakuraEnvironment.h"
3234
#include "doc/CDocListener.h" // SLoadInfo
@@ -73,6 +75,8 @@ CShareData::CShareData() = default;
7375
*/
7476
CShareData::~CShareData()
7577
{
78+
CFileNameManager::resetInstance();
79+
7680
if( m_pShareData ){
7781
/* プロセスのアドレス空間から、 すでにマップされているファイル ビューをアンマップします */
7882
::UnmapViewOfFile( m_pShareData );

sakura_core/util/design_template.h

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88
/*
99
Copyright (C) 2008, kobake
10-
Copyright (C) 2018-2022, Sakura Editor Organization
10+
Copyright (C) 2018-2026, Sakura Editor Organization
1111
1212
SPDX-License-Identifier: Zlib
1313
*/
@@ -16,7 +16,10 @@
1616
#pragma once
1717

1818
#include <algorithm>
19+
#include <concepts>
20+
#include <memory>
1921
#include <stdexcept>
22+
#include <type_traits>
2023
#include <vector>
2124

2225
#include "debug/Debug2.h"
@@ -49,6 +52,63 @@ class TSingleton{
4952
DISALLOW_COPY_AND_ASSIGN(TSingleton);
5053
};
5154

55+
/*!
56+
* @brief サクラエディタの変則Singletonパターン。
57+
*
58+
* TSingletonを元に作成。
59+
* 生成したインスタンスをリセットできるようにしてある。
60+
*/
61+
template <class T>
62+
class TSakuraSingleton {
63+
private:
64+
using Me = TSakuraSingleton<T>;
65+
66+
//! 生成済みインスタンス
67+
static inline std::unique_ptr<T> gm_Instance = nullptr;
68+
69+
public:
70+
/*!
71+
* @brief インスタンスポインタを取得する
72+
*
73+
* @returns インスタンスポインタ
74+
* @note インスタンスが未生成の場合は生成する
75+
*/
76+
[[nodiscard]]
77+
static T* getInstance()
78+
{
79+
static_assert(
80+
std::default_initializable<T> && !std::is_array_v<T>,
81+
"T must be publicly default-initializable and must not be an array"
82+
);
83+
84+
if (!gm_Instance) {
85+
gm_Instance = std::make_unique<T>();
86+
}
87+
88+
return gm_Instance.get();
89+
}
90+
91+
/*!
92+
* @brief インスタンスを破棄する
93+
*
94+
* @note 取得したポインタを破棄後に使用しないこと
95+
*/
96+
static void resetInstance()
97+
{
98+
gm_Instance.reset();
99+
}
100+
101+
protected:
102+
TSakuraSingleton() = default;
103+
104+
public:
105+
TSakuraSingleton(const Me&) = delete;
106+
Me& operator = (const Me&) = delete;
107+
108+
TSakuraSingleton(Me&&) = delete;
109+
Me& operator = (Me&&) = delete;
110+
};
111+
52112
/*!
53113
複数インスタンスを生成しようとしたときのエラー
54114
*/

src/test/cpp/tests1/env/ShareDataTestSuite.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ namespace env {
1414
*/
1515
/* static */ void ShareDataTestSuite::SetUpShareData()
1616
{
17+
// 言語環境を初期化する
18+
CSelectLang::InitializeLanguageEnvironment();
19+
1720
pcShareData = std::make_unique<CShareData>();
1821

1922
EXPECT_THAT(pcShareData->InitShareData(), IsTrue());

src/test/cpp/tests1/test-design_template.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,32 @@
1111

1212
#include "util/design_template.h"
1313

14+
/*!
15+
* TSakuraSingletonの挙動を検証するためのクラス
16+
*/
17+
class CSakuraSingleton : public TSakuraSingleton<CSakuraSingleton>
18+
{
19+
public:
20+
CSakuraSingleton() = default;
21+
virtual ~CSakuraSingleton() noexcept = default;
22+
};
23+
24+
/*!
25+
* @brief TSakuraSingletonの挙動を検証するテスト
26+
*/
27+
TEST(CSakuraSingleton, CSakuraSingleton)
28+
{
29+
// いきなり呼び出してもNULLは返らない
30+
EXPECT_THAT(CSakuraSingleton::getInstance(), NotNull());
31+
32+
// 何度呼び出しても同じ値が返る
33+
const auto pInstance = CSakuraSingleton::getInstance();
34+
EXPECT_THAT(CSakuraSingleton::getInstance(), Eq(pInstance));
35+
EXPECT_THAT(CSakuraSingleton::getInstance(), Eq(pInstance));
36+
EXPECT_THAT(CSakuraSingleton::getInstance(), Eq(pInstance));
37+
38+
CSakuraSingleton::resetInstance();
39+
}
1440

1541
/*!
1642
* TSingleInstanceの挙動を検証するためのクラス

0 commit comments

Comments
 (0)