Skip to content

Commit 844163f

Browse files
committed
Main Menu toggle Show/Hide (WinMerge#2509) (2)
1 parent 8cb4c33 commit 844163f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+202
-66
lines changed

Src/MainFrm.cpp

+37-49
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,6 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
224224
ON_WM_NCCALCSIZE()
225225
ON_WM_SIZE()
226226
ON_WM_SYSCOMMAND()
227-
ON_WM_ENTERMENULOOP()
228-
ON_WM_EXITMENULOOP()
229227
ON_UPDATE_COMMAND_UI_RANGE(CMenuBar::FIRST_MENUID, CMenuBar::FIRST_MENUID + 10, OnUpdateMenuBarMenuItem)
230228
// [File] menu
231229
ON_COMMAND(ID_FILE_NEW, (OnFileNew<2, ID_MERGE_COMPARE_TEXT>))
@@ -253,6 +251,8 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
253251
// [View] menu
254252
ON_COMMAND(ID_VIEW_SELECTFONT, OnViewSelectfont)
255253
ON_COMMAND(ID_VIEW_USEDEFAULTFONT, OnViewUsedefaultfont)
254+
ON_COMMAND(ID_VIEW_MENU_BAR, OnViewMenuBar)
255+
ON_UPDATE_COMMAND_UI(ID_VIEW_MENU_BAR, OnUpdateViewMenuBar)
256256
ON_COMMAND(ID_VIEW_STATUS_BAR, OnViewStatusBar)
257257
ON_COMMAND(ID_VIEW_TAB_BAR, OnViewTabBar)
258258
ON_UPDATE_COMMAND_UI(ID_VIEW_TAB_BAR, OnUpdateViewTabBar)
@@ -325,9 +325,6 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
325325
ON_MESSAGE(WMU_CHILDFRAMEREMOVED, &CMainFrame::OnChildFrameRemoved)
326326
ON_MESSAGE(WMU_CHILDFRAMEACTIVATE, &CMainFrame::OnChildFrameActivate)
327327
ON_MESSAGE(WMU_CHILDFRAMEACTIVATED, &CMainFrame::OnChildFrameActivated)
328-
// Main menu toggle switch
329-
ON_COMMAND(ID_VIEW_MAIN_MENU, OnToggleMainMenu)
330-
ON_UPDATE_COMMAND_UI(ID_VIEW_MAIN_MENU, OnUpdateToggleMainMenu)
331328
//}}AFX_MSG_MAP
332329
END_MESSAGE_MAP()
333330

@@ -2253,6 +2250,26 @@ BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
22532250
return __super::PreTranslateMessage(pMsg);
22542251
}
22552252

2253+
/**
2254+
* @brief Show/hide menubar.
2255+
*/
2256+
void CMainFrame::OnViewMenuBar()
2257+
{
2258+
const bool bMenuVisible = !GetOptionsMgr()->GetBool(OPT_SHOW_MENUBAR);
2259+
__super::ShowControlBar(&m_wndMenuBar, bMenuVisible, 0);
2260+
GetOptionsMgr()->SaveOption(OPT_SHOW_MENUBAR, bMenuVisible);
2261+
m_wndMenuBar.SetAlwaysVisible(bMenuVisible);
2262+
UpdateSystemMenu();
2263+
}
2264+
2265+
/**
2266+
* @brief Updates "Menu Bar" menuitem.
2267+
*/
2268+
void CMainFrame::OnUpdateViewMenuBar(CCmdUI* pCmdUI)
2269+
{
2270+
pCmdUI->SetCheck(GetOptionsMgr()->GetBool(OPT_SHOW_MENUBAR));
2271+
}
2272+
22562273
/**
22572274
* @brief Show/hide statusbar.
22582275
*/
@@ -2620,9 +2637,10 @@ BOOL CMainFrame::CreateToolbar()
26202637
__super::ShowControlBar(&m_wndToolBar, false, 0);
26212638
}
26222639

2623-
if (GetOptionsMgr()->GetBool(OPT_HIDE_MAINMENU))
2640+
if (!GetOptionsMgr()->GetBool(OPT_SHOW_MENUBAR))
26242641
{
26252642
__super::ShowControlBar(&m_wndMenuBar, false, 0);
2643+
m_wndMenuBar.SetAlwaysVisible(false);
26262644
}
26272645

26282646
m_wndReBar.LoadStateFromString(GetOptionsMgr()->GetString(OPT_REBAR_STATE).c_str());
@@ -3728,61 +3746,31 @@ LRESULT CMainFrame::OnChildFrameActivated(WPARAM wParam, LPARAM lParam)
37283746
return 1;
37293747
}
37303748

3731-
void CMainFrame::OnToggleMainMenu()
3732-
{
3733-
const bool bMenuVisible = static_cast<bool>(m_wndMenuBar.IsVisible());
3734-
__super::ShowControlBar(&m_wndMenuBar, !bMenuVisible, 0);
3735-
GetOptionsMgr()->SaveOption(OPT_HIDE_MAINMENU, bMenuVisible);
3736-
UpdateSystemMenu();
3737-
}
3738-
3739-
void CMainFrame::OnUpdateToggleMainMenu(CCmdUI* pCmdUI)
3740-
{
3741-
pCmdUI->SetCheck(!GetOptionsMgr()->GetBool(OPT_HIDE_MAINMENU));
3742-
}
3743-
37443749
void CMainFrame::UpdateSystemMenu()
37453750
{
37463751
CMenu* pSysMenu = GetSystemMenu(FALSE);
37473752
if (pSysMenu == nullptr)
37483753
return;
3749-
BOOL bChecked = !GetOptionsMgr()->GetBool(OPT_HIDE_MAINMENU);
3754+
bool bFound = false;
37503755
const int cnt = pSysMenu->GetMenuItemCount();
37513756
for (int i = 0; i < cnt; ++i)
3752-
if (pSysMenu->GetMenuItemID(i) == ID_SHOW_MAIN_MENU)
3753-
{
3754-
pSysMenu->CheckMenuItem(i, MF_BYPOSITION | (bChecked ? MF_CHECKED : MF_UNCHECKED));
3755-
return; // Add only once
3756-
}
3757-
String menuTxt = theApp.LoadString(static_cast<UINT>(IDS_SHOW_MAIN_MENU));
3758-
pSysMenu->AppendMenu(MF_SEPARATOR);
3759-
pSysMenu->AppendMenu(MF_STRING, ID_SHOW_MAIN_MENU, menuTxt.c_str());
3760-
pSysMenu->CheckMenuItem(ID_SHOW_MAIN_MENU, MF_BYCOMMAND | (bChecked ? MF_CHECKED : MF_UNCHECKED));
3757+
if (pSysMenu->GetMenuItemID(i) == ID_VIEW_MENU_BAR)
3758+
bFound = true;
3759+
if (!bFound)
3760+
{
3761+
pSysMenu->AppendMenu(MF_SEPARATOR);
3762+
pSysMenu->AppendMenu(MF_STRING, ID_VIEW_MENU_BAR, _("Men&u Bar").c_str());
3763+
}
3764+
const bool bChecked = GetOptionsMgr()->GetBool(OPT_SHOW_MENUBAR);
3765+
pSysMenu->CheckMenuItem(ID_VIEW_MENU_BAR, MF_BYCOMMAND | (bChecked ? MF_CHECKED : MF_UNCHECKED));
37613766
}
37623767

37633768
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
37643769
{
3765-
if (nID == ID_SHOW_MAIN_MENU) {
3766-
OnToggleMainMenu();
3770+
if (nID == ID_VIEW_MENU_BAR)
3771+
{
3772+
OnViewMenuBar();
37673773
return;
37683774
}
37693775
__super::OnSysCommand(nID, lParam);
37703776
}
3771-
3772-
void CMainFrame::OnEnterMenuLoop(BOOL bMainMenu)
3773-
{
3774-
__super::OnEnterMenuLoop(bMainMenu);
3775-
if (!bMainMenu)
3776-
return;
3777-
if (GetOptionsMgr()->GetBool(OPT_HIDE_MAINMENU) && !m_wndMenuBar.IsVisible())
3778-
__super::ShowControlBar(&m_wndMenuBar, true, 0);
3779-
}
3780-
3781-
void CMainFrame::OnExitMenuLoop(BOOL bMainMenu)
3782-
{
3783-
__super::OnExitMenuLoop(bMainMenu);
3784-
if (!bMainMenu)
3785-
return;
3786-
if (GetOptionsMgr()->GetBool(OPT_HIDE_MAINMENU) && m_wndMenuBar.IsVisible())
3787-
__super::ShowControlBar(&m_wndMenuBar, false, 0);
3788-
}

Src/MainFrm.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -435,11 +435,9 @@ class CMainFrame : public CMDIFrameWnd
435435
afx_msg LRESULT OnChildFrameActivate(WPARAM wParam, LPARAM lParam);
436436
afx_msg LRESULT OnChildFrameActivated(WPARAM wParam, LPARAM lParam);
437437
afx_msg void OnUpdateMenuBarMenuItem(CCmdUI* pCmdUI);
438-
afx_msg void OnToggleMainMenu();
439-
afx_msg void OnUpdateToggleMainMenu(CCmdUI* pCmdUI);
438+
afx_msg void OnViewMenuBar();
439+
afx_msg void OnUpdateViewMenuBar(CCmdUI* pCmdUI);
440440
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
441-
afx_msg void OnEnterMenuLoop(BOOL bMainMenu);
442-
afx_msg void OnExitMenuLoop(BOOL bMainMenu);
443441
//}}AFX_MSG
444442
DECLARE_MESSAGE_MAP()
445443

Src/MenuBar.cpp

+34-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include "StdAfx.h"
1010
#include "MenuBar.h"
1111

12-
static const UINT UWM_SHOWPOPUPMENU = WM_APP + 1;
1312
HHOOK CMenuBar::m_hHook = nullptr;
1413
CMenuBar* CMenuBar::m_pThis = nullptr;
1514

@@ -21,6 +20,7 @@ IMPLEMENT_DYNAMIC(CMenuBar, CToolBar)
2120

2221
BEGIN_MESSAGE_MAP(CMenuBar, CToolBar)
2322
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
23+
ON_WM_TIMER()
2424
ON_WM_KILLFOCUS()
2525
ON_WM_SETFOCUS()
2626
ON_WM_MOUSEMOVE()
@@ -32,6 +32,7 @@ END_MESSAGE_MAP()
3232

3333
CMenuBar::CMenuBar()
3434
: m_hMenu(nullptr)
35+
, m_bAlwaysVisible(true)
3536
, m_bActive(false)
3637
, m_bMouseTracking(false)
3738
, m_nMDIButtonDown(-1)
@@ -192,21 +193,41 @@ void CMenuBar::LoseFocus()
192193
m_hwndOldFocus = nullptr;
193194
ShowKeyboardCues(false);
194195
GetToolBarCtrl().SetHotItem(-1);
196+
if (!m_bAlwaysVisible)
197+
SetTimer(MENUBAR_TIMER_ID, 200, nullptr);
198+
}
199+
200+
void CMenuBar::Show(bool visible)
201+
{
202+
static_cast<CFrameWnd*>(AfxGetMainWnd())->ShowControlBar(this, visible, 0);
195203
}
196204

197205
void CMenuBar::OnSetFocus(CWnd* pOldWnd)
198206
{
199207
m_bActive = true;
200208
m_hwndOldFocus = pOldWnd->m_hWnd;
209+
if (!m_bAlwaysVisible)
210+
{
211+
KillTimer(MENUBAR_TIMER_ID);
212+
Show(true);
213+
}
201214
__super::OnSetFocus(pOldWnd);
202-
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_ENTERMENULOOP, 1, 0);
215+
}
216+
217+
void CMenuBar::OnTimer(UINT_PTR nIDEvent)
218+
{
219+
if (nIDEvent == MENUBAR_TIMER_ID)
220+
{
221+
KillTimer(MENUBAR_TIMER_ID);
222+
if (!m_bAlwaysVisible)
223+
Show(false);
224+
}
203225
}
204226

205227
void CMenuBar::OnKillFocus(CWnd* pNewWnd)
206228
{
207229
LoseFocus();
208230
__super::OnKillFocus(pNewWnd);
209-
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_EXITMENULOOP, 1, 0);
210231
}
211232

212233
void CMenuBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
@@ -323,6 +344,12 @@ void CMenuBar::OnMenuBarMenuItem(UINT nID)
323344
AfxGetMainWnd()->PostMessage(WM_KEYUP, VK_DOWN, 0);
324345
}
325346

347+
if (!m_bAlwaysVisible)
348+
{
349+
KillTimer(MENUBAR_TIMER_ID);
350+
Show(true);
351+
}
352+
326353
m_hHook = SetWindowsHookEx(WH_MSGFILTER, MsgFilterProc, nullptr, GetCurrentThreadId());
327354

328355
CRect rc;
@@ -331,6 +358,10 @@ void CMenuBar::OnMenuBarMenuItem(UINT nID)
331358
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rc.left, rc.bottom, AfxGetMainWnd());
332359

333360
UnhookWindowsHookEx(m_hHook);
361+
m_hHook = nullptr;
362+
363+
if (!m_bAlwaysVisible)
364+
SetTimer(MENUBAR_TIMER_ID, 200, nullptr);
334365
}
335366

336367
void CMenuBar::OnUpdateMenuBarMenuItem(CCmdUI* pCmdUI)

Src/MenuBar.h

+6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class CMenuBar : public CToolBar
1515
DECLARE_DYNAMIC(CMenuBar)
1616
public:
1717
constexpr static int FIRST_MENUID = 10000;
18+
constexpr static UINT UWM_SHOWPOPUPMENU = WM_APP + 1;
19+
constexpr static UINT MENUBAR_TIMER_ID = 100;
1820

1921
CMenuBar();
2022

@@ -23,10 +25,12 @@ class CMenuBar : public CToolBar
2325
void OnMenuBarMenuItem(UINT nID);
2426
void OnUpdateMenuBarMenuItem(CCmdUI* pCmdUI);
2527
BOOL PreTranslateMessage(MSG* pMsg);
28+
void SetAlwaysVisible(bool visible) { m_bAlwaysVisible = visible; }
2629

2730
protected:
2831
//{{AFX_MSG(CMenuBar)
2932
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
33+
afx_msg void OnTimer(UINT_PTR nIDEvent);
3034
afx_msg void OnSetFocus(CWnd* pOldWnd);
3135
afx_msg void OnKillFocus(CWnd* pNewWnd);
3236
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
@@ -44,9 +48,11 @@ class CMenuBar : public CToolBar
4448
CRect GetMDIButtonRect(int nItem) const;
4549
void ShowKeyboardCues(bool show);
4650
void LoseFocus();
51+
void Show(bool visible);
4752

4853
HMENU m_hMenu;
4954
bool m_bActive;
55+
bool m_bAlwaysVisible;
5056
bool m_bMouseTracking;
5157
bool m_bShowKeyboardCues;
5258
int m_nMDIButtonDown;

Src/Merge.rc

+4-4
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ BEGIN
361361
MENUITEM "&Big", ID_TOOLBAR_BIG
362362
MENUITEM "&Huge", ID_TOOLBAR_HUGE
363363
END
364-
MENUITEM "Main Men&u", ID_VIEW_MAIN_MENU
364+
MENUITEM "Men&u Bar", ID_VIEW_MENU_BAR
365365
MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR
366366
END
367367
POPUP "&Tools"
@@ -508,7 +508,7 @@ BEGIN
508508
MENUITEM "&Big", ID_TOOLBAR_BIG
509509
MENUITEM "&Huge", ID_TOOLBAR_HUGE
510510
END
511-
MENUITEM "Main Men&u", ID_VIEW_MAIN_MENU
511+
MENUITEM "Men&u Bar", ID_VIEW_MENU_BAR
512512
MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR
513513
MENUITEM SEPARATOR
514514
MENUITEM "Com&pare Statistics...", ID_VIEW_DIR_STATISTICS
@@ -750,7 +750,7 @@ BEGIN
750750
MENUITEM "&Big", ID_TOOLBAR_BIG
751751
MENUITEM "&Huge", ID_TOOLBAR_HUGE
752752
END
753-
MENUITEM "Main Men&u", ID_VIEW_MAIN_MENU
753+
MENUITEM "Men&u Bar", ID_VIEW_MENU_BAR
754754
MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR
755755
MENUITEM "Diff &Pane", ID_VIEW_DETAIL_BAR
756756
MENUITEM "Lo&cation Pane", ID_VIEW_LOCATION_BAR
@@ -4577,7 +4577,7 @@ END
45774577

45784578
STRINGTABLE
45794579
BEGIN
4580-
IDS_SHOW_MAIN_MENU "Main Men&u"
4580+
IDS_VIEW_MENU_BAR "Men&u Bar"
45814581
END
45824582

45834583
#endif // English (United States) resources

Src/OptionsDef.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ inline const String OPT_SHOW_MISSING_LEFT_ONLY {_T("Settings/ShowMissingLeftOnly
2525
inline const String OPT_SHOW_MISSING_MIDDLE_ONLY {_T("Settings/ShowMissingMiddleOnly"s)};
2626
inline const String OPT_SHOW_MISSING_RIGHT_ONLY {_T("Settings/ShowMissingRightOnly"s)};
2727
inline const String OPT_TREE_MODE {_T("Settings/TreeMode"s)};
28-
inline const String OPT_HIDE_MAINMENU {_T("Settings/HideMainMenu"s)};
2928

3029
// Show/hide toolbar/statusbar/tabbar
30+
inline const String OPT_SHOW_MENUBAR {_T("Settings/ShowMenubar"s)};
3131
inline const String OPT_SHOW_TOOLBAR {_T("Settings/ShowToolbar"s)};
3232
inline const String OPT_SHOW_STATUSBAR {_T("Settings/ShowStatusbar"s)};
3333
inline const String OPT_SHOW_TABBAR {_T("Settings/ShowTabbar"s)};

Src/OptionsInit.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ void Init(COptionsMgr *pOptions)
6060
pOptions->InitOption(OPT_SHOW_MISSING_LEFT_ONLY, true);
6161
pOptions->InitOption(OPT_SHOW_MISSING_MIDDLE_ONLY, true);
6262
pOptions->InitOption(OPT_SHOW_MISSING_RIGHT_ONLY, true);
63-
pOptions->InitOption(OPT_HIDE_MAINMENU, false);
6463

64+
pOptions->InitOption(OPT_SHOW_MENUBAR, true);
6565
pOptions->InitOption(OPT_SHOW_TOOLBAR, true);
6666
pOptions->InitOption(OPT_SHOW_STATUSBAR, true);
6767
pOptions->InitOption(OPT_SHOW_TABBAR, true);

Src/resource.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -1038,9 +1038,7 @@
10381038
#define ID_SEL_DIFF_COPY_2ND_3WAY 33274
10391039
#define ID_MICE_L2RNEXT 33275
10401040
#define ID_MICE_R2LNEXT 33276
1041-
#define ID_VIEW_MAIN_MENU 33277
1042-
#define ID_SHOW_MAIN_MENU 33278
1043-
#define IDS_SHOW_MAIN_MENU 33279
1041+
#define ID_VIEW_MENU_BAR 33277
10441042
#define ID_TABBAR_AUTO_MAXWIDTH 33351
10451043
#define ID_IMG_VIEWDIFFERENCES 33353
10461044
#define ID_IMG_ZOOM_25 33354
@@ -1791,6 +1789,7 @@
17911789
#define IDS_COPY_GRANULARITY_INLINE 44542
17921790
#define IDS_COPY_GRANULARITY_LINE 44543
17931791
#define IDS_COPY_GRANULARITY_Character 44544
1792+
#define IDS_VIEW_MENU_BAR 44545
17941793

17951794
// Next default values for new objects
17961795
//

Translations/WinMerge/Arabic.po

+3
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,9 @@ msgstr "&كبير"
383383
msgid "&Huge"
384384
msgstr "&ضخم"
385385

386+
msgid "Men&u Bar"
387+
msgstr ""
388+
386389
msgid "&Status Bar"
387390
msgstr "شريط ال&حالة"
388391

Translations/WinMerge/Basque.po

+3
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,9 @@ msgstr "&Handia"
431431
msgid "&Huge"
432432
msgstr ""
433433

434+
msgid "Men&u Bar"
435+
msgstr ""
436+
434437
#, c-format
435438
msgid "&Status Bar"
436439
msgstr "&Egoera Barra"

Translations/WinMerge/Brazilian.po

+3
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,9 @@ msgstr "&Grande"
382382
msgid "&Huge"
383383
msgstr "&Enorme"
384384

385+
msgid "Men&u Bar"
386+
msgstr ""
387+
385388
msgid "&Status Bar"
386389
msgstr "&Barra de Status"
387390

Translations/WinMerge/Bulgarian.po

+3
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ msgstr "&Голям"
379379
msgid "&Huge"
380380
msgstr "&Огромен"
381381

382+
msgid "Men&u Bar"
383+
msgstr ""
384+
382385
msgid "&Status Bar"
383386
msgstr "&Лента за състоянието"
384387

0 commit comments

Comments
 (0)