// WinMerge: an interactive diff/merge utility
// Copyright (C) 1997-2000 Thingamahoochie Software
// Author: Dean Grimm
-//
-// 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; either version 2 of the License, or
-// (at your option) any later version.
-//
-// 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, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-//
+// SPDX-License-Identifier: GPL-2.0-or-later
/////////////////////////////////////////////////////////////////////////////
/**
- * @file DiffList.cpp
+ * @file EditorFilepathBar.cpp
*
* @brief Implementation file for CEditorFilepathBar class
*/
-// ID line follows -- this is updated by SVN
-// $Id: EditorFilepathBar.cpp 5401 2008-05-30 12:09:27Z kimmov $
#include "stdafx.h"
#include "EditorFilepathBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
-#undef THIS_FILE
-static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CEditorFilePathBar, CDialogBar)
ON_NOTIFY_EX (TTN_NEEDTEXT, 0, OnToolTipNotify)
+ ON_CONTROL_RANGE (EN_SETFOCUS, IDC_STATIC_TITLE_PANE0, IDC_STATIC_TITLE_PANE2, OnSetFocusEdit)
+ ON_CONTROL_RANGE (EN_USER_CAPTION_CHANGED, IDC_STATIC_TITLE_PANE0, IDC_STATIC_TITLE_PANE2, OnChangeEdit)
+ ON_CONTROL_RANGE (EN_USER_FILE_SELECTED, IDC_STATIC_TITLE_PANE0, IDC_STATIC_TITLE_PANE2, OnSelectEdit)
END_MESSAGE_MAP()
* @brief Constructor.
*/
CEditorFilePathBar::CEditorFilePathBar()
-: m_pFont(NULL)
+: m_nPanes(2)
{
- m_nPanes = 2;
}
/**
*/
BOOL CEditorFilePathBar::Create(CWnd* pParentWnd)
{
- if (! CDialogBar::Create(pParentWnd, CEditorFilePathBar::IDD,
- CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY, CEditorFilePathBar::IDD))
+ if (! __super::Create(pParentWnd, CEditorFilePathBar::IDD,
+ CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY, CEditorFilePathBar::IDD))
return FALSE;
+ NONCLIENTMETRICS ncm = { sizeof NONCLIENTMETRICS };
+ if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof NONCLIENTMETRICS, &ncm, 0))
+ m_font.CreateFontIndirect(&ncm.lfStatusFont);
+
// subclass the two custom edit boxes
- for (int pane = 0; pane < countof(m_Edit); pane++)
+ const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
+ auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
+ int cx = -pointToPixel(ncm.lfStatusFont.lfHeight);
+ int m = pointToPixel(3);
+ for (int pane = 0; pane < static_cast<int>(std::size(m_Edit)); pane++)
+ {
m_Edit[pane].SubClassEdit(IDC_STATIC_TITLE_PANE0 + pane, this);
-
+ m_Edit[pane].SetFont(&m_font);
+ m_Edit[pane].SetMargins(m, m + cx);
+ }
return TRUE;
};
-void CEditorFilePathBar::SetPaneCount(int nPanes)
+CSize CEditorFilePathBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
- m_nPanes = nPanes;
-}
-
-/**
- * @brief Set look of headerbars similar to other window.
- *
- * @param [in] pWnd Pointer to window we want to imitate
- * @return TRUE if parent must recompute layout
- */
-BOOL CEditorFilePathBar::LookLikeThisWnd(const CWnd * pWnd)
-{
- // Update font. Note that we must delete previous font
- // before creating a new one.
- CFont * pFont = pWnd->GetFont();
- if (pFont)
- {
- m_pFont.reset(new CFont);
- if (m_pFont != NULL)
- {
- LOGFONT lfFont = {0};
- if (pFont->GetLogFont(&lfFont))
- {
- m_pFont->CreateFontIndirect(&lfFont);
- for (int pane = 0; pane < m_nPanes; pane++)
- m_Edit[pane].SetFont(m_pFont.get());
- }
- }
- }
-
- // Set same dimensions (than window we imitate)
- CRect rectNew;
- pWnd->GetWindowRect(rectNew);
- CRect rectCurrent;
- GetWindowRect(rectCurrent);
- if (rectNew != rectCurrent)
- {
- SetWindowPos(NULL,0,0,rectNew.Width(), rectNew.Height(),
- SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE);
- return TRUE;
- }
- return FALSE;
+ TEXTMETRIC tm;
+ CClientDC dc(this);
+ CFont *pOldFont = dc.SelectObject(&m_font);
+ dc.GetTextMetrics(&tm);
+ dc.SelectObject(pOldFont);
+ const int lpx = dc.GetDeviceCaps(LOGPIXELSX);
+ auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
+ int cy = pointToPixel(4);
+ return CSize(SHRT_MAX, 1 + tm.tmHeight + cy);
}
/**
*/
void CEditorFilePathBar::Resize()
{
- if (m_hWnd == NULL)
+ if (m_hWnd == nullptr)
return;
- WINDOWPLACEMENT infoBar;
+ WINDOWPLACEMENT infoBar = {};
GetWindowPlacement(&infoBar);
- CRect rc;
- GetClientRect(&rc);
+ int widths[3] = {};
for (int pane = 0; pane < m_nPanes; pane++)
- {
- int width = infoBar.rcNormalPosition.right / m_nPanes;
- rc.left = pane * width;
- rc.right = rc.left + width;
- m_Edit[pane].MoveWindow(&rc);
- m_Edit[pane].RefreshDisplayText();
- }
+ widths[pane] = (infoBar.rcNormalPosition.right / m_nPanes) - ((pane == 0) ? 7 : 5);
+ Resize(widths);
}
+
/**
* @brief Set widths.
* This function resizes both controls to given size. The width is usually
*/
void CEditorFilePathBar::Resize(int widths[])
{
- if (m_hWnd == NULL)
+ if (m_hWnd == nullptr)
return;
// resize left filename
GetClientRect(&rc);
for (int pane = 0; pane < m_nPanes; pane++)
{
+ CRect rcOld;
+ m_Edit[pane].GetClientRect(&rcOld);
rc.left = x;
- rc.right = x + widths[pane] + 4;
- x += widths[pane] + 7;
- m_Edit[pane].MoveWindow(&rc);
- m_Edit[pane].RefreshDisplayText();
+ rc.right = x + widths[pane] + (pane == 0 ? 5 : 7);
+ x = rc.right;
+ if (rcOld.Width() != rc.Width())
+ {
+ m_Edit[pane].MoveWindow(&rc);
+ m_Edit[pane].RefreshDisplayText();
+ }
}
}
*/
BOOL CEditorFilePathBar::OnToolTipNotify(UINT id, NMHDR * pTTTStruct, LRESULT * pResult)
{
- if (m_hWnd == NULL)
+ if (m_hWnd == nullptr)
return FALSE;
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;
- int nID = static_cast<int>(pTTTStruct->idFrom);
if (pTTT->uFlags & TTF_IDISHWND)
{
// idFrom is actually the HWND of the CEdit
- nID = ::GetDlgCtrlID((HWND)nID);
+ int nID = ::GetDlgCtrlID((HWND)pTTTStruct->idFrom);
if(nID == IDC_STATIC_TITLE_PANE0 || nID == IDC_STATIC_TITLE_PANE1 || nID == IDC_STATIC_TITLE_PANE2)
{
// compute max width : 97% of application width or 80% or full screen width
HANDLE hOldFont = ::SelectObject(tempDC.GetSafeHdc(),hFont);
// fill in the returned structure
- CFilepathEdit * pItem = (CFilepathEdit*) GetDlgItem(nID);
+ CFilepathEdit * pItem = static_cast<CFilepathEdit*>(GetDlgItem(nID));
pTTT->lpszText = const_cast<TCHAR *>(pItem->GetUpdatedTipText(&tempDC, maxWidth).c_str());
// set old font back
- if (hOldFont)
+ if (hOldFont != nullptr)
::SelectObject(tempDC.GetSafeHdc(),hOldFont);
// we must set TTM_SETMAXTIPWIDTH to use \n in tooltips
// just to do the first time, but how to access the tooltip during init ?
::SendMessage(pTTTStruct->hwndFrom, TTM_SETMAXTIPWIDTH, 0, 5000);
- return(TRUE);
+ return TRUE;
}
}
- return(FALSE);
+ return FALSE;
+}
+
+void CEditorFilePathBar::OnSetFocusEdit(UINT id)
+{
+ if (m_setFocusCallbackfunc)
+ m_setFocusCallbackfunc(id - IDC_STATIC_TITLE_PANE0);
+}
+
+void CEditorFilePathBar::OnChangeEdit(UINT id)
+{
+ const int pane = id - IDC_STATIC_TITLE_PANE0;
+ if (m_captionChangedCallbackfunc)
+ {
+ CString text;
+ m_Edit[pane].GetWindowText(text);
+ m_captionChangedCallbackfunc(pane, (LPCTSTR)text);
+ }
+}
+
+void CEditorFilePathBar::OnSelectEdit(UINT id)
+{
+ const int pane = id - IDC_STATIC_TITLE_PANE0;
+ (m_fileSelectedCallbackfunc ? m_fileSelectedCallbackfunc : m_folderSelectedCallbackfunc)
+ (pane, m_Edit[pane].GetSelectedPath());
+}
+
+/**
+ * @brief Get the path for one side
+ *
+ * @param [in] pane Index (0-based) of pane to update.
+ */
+String CEditorFilePathBar::GetText(int pane) const
+{
+ ASSERT (pane >= 0 && pane < static_cast<int>(std::size(m_Edit)));
+
+ // Check for `nullptr` since window may be closing..
+ if (m_hWnd == nullptr)
+ return _T("");
+
+ CString str;
+ m_Edit[pane].GetWindowText(str);
+ return String(str);
}
/**
*/
void CEditorFilePathBar::SetText(int pane, const String& sString)
{
- ASSERT (pane >= 0 && pane < countof(m_Edit));
+ ASSERT (pane >= 0 && pane < static_cast<int>(std::size(m_Edit)));
- // Check for NULL since window may be closing..
- if (m_hWnd == NULL)
+ // Check for `nullptr` since window may be closing..
+ if (m_hWnd == nullptr)
return;
m_Edit[pane].SetOriginalText(sString);
* @brief Set the active status for one status (change the appearance)
*
* @param [in] pane Index (0-based) of pane to update.
- * @param [in] bActive If TRUE activates pane, FALSE deactivates.
+ * @param [in] bActive If `true` activates pane, `false` deactivates.
*/
void CEditorFilePathBar::SetActive(int pane, bool bActive)
{
- ASSERT (pane >= 0 && pane < countof(m_Edit));
+ ASSERT (pane >= 0 && pane < static_cast<int>(std::size(m_Edit)));
- // Check for NULL since window may be closing..
- if (m_hWnd == NULL)
+ // Check for `nullptr` since window may be closing..
+ if (m_hWnd == nullptr)
return;
m_Edit[pane].SetActive(bActive);