X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=Src%2FEditorFilepathBar.cpp;h=dcc6c4fdcc899f4e3aa7c03f7dd58b43d2475d1f;hb=5a478c4115f3ffeb35fb51df893912409c793bb0;hp=0906b6e18cd2b5b798fb3a8f69401c85e006503f;hpb=fa300697cff2c3e98b24b8ba35a89294b8583196;p=winmerge-jp%2Fwinmerge-jp.git diff --git a/Src/EditorFilepathBar.cpp b/Src/EditorFilepathBar.cpp index 0906b6e18..dcc6c4fdc 100644 --- a/Src/EditorFilepathBar.cpp +++ b/Src/EditorFilepathBar.cpp @@ -2,42 +2,25 @@ // 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) END_MESSAGE_MAP() @@ -45,7 +28,7 @@ END_MESSAGE_MAP() * @brief Constructor. */ CEditorFilePathBar::CEditorFilePathBar() -: m_pFont(NULL), m_nPanes(2) +: m_nPanes(2) { } @@ -65,62 +48,31 @@ CEditorFilePathBar::~CEditorFilePathBar() BOOL CEditorFilePathBar::Create(CWnd* pParentWnd) { if (! CDialogBar::Create(pParentWnd, CEditorFilePathBar::IDD, - CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY, 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++) + for (int pane = 0; pane < static_cast(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(4, 4); + } return TRUE; }; -void CEditorFilePathBar::SetPaneCount(int nPanes) -{ - 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) +CSize CEditorFilePathBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz) { - // 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()); - m_Edit[pane].SetMargins(4, 4); - } - } - } - } - - // 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); + return CSize(SHRT_MAX, tm.tmHeight + 6); } /** @@ -128,17 +80,18 @@ BOOL CEditorFilePathBar::LookLikeThisWnd(const CWnd * pWnd) */ void CEditorFilePathBar::Resize() { - if (m_hWnd == NULL) + if (m_hWnd == nullptr) return; - WINDOWPLACEMENT infoBar; + WINDOWPLACEMENT infoBar = {}; GetWindowPlacement(&infoBar); - int widths[3]; + int widths[3] = {}; for (int pane = 0; pane < m_nPanes; pane++) - widths[pane] = (infoBar.rcNormalPosition.right / m_nPanes) - 6; + widths[pane] = (infoBar.rcNormalPosition.right / m_nPanes); Resize(widths); } + /** * @brief Set widths. * This function resizes both controls to given size. The width is usually @@ -148,7 +101,7 @@ void CEditorFilePathBar::Resize() */ void CEditorFilePathBar::Resize(int widths[]) { - if (m_hWnd == NULL) + if (m_hWnd == nullptr) return; // resize left filename @@ -160,8 +113,8 @@ void CEditorFilePathBar::Resize(int widths[]) CRect rcOld; m_Edit[pane].GetClientRect(&rcOld); rc.left = x; - rc.right = x + widths[pane] + 4; - x += widths[pane] + 7; + rc.right = x + widths[pane] + (pane == 0 ? 5 : 7); + x = rc.right; if (rcOld.Width() != rc.Width()) { m_Edit[pane].MoveWindow(&rc); @@ -176,7 +129,7 @@ void CEditorFilePathBar::Resize(int widths[]) */ BOOL CEditorFilePathBar::OnToolTipNotify(UINT id, NMHDR * pTTTStruct, LRESULT * pResult) { - if (m_hWnd == NULL) + if (m_hWnd == nullptr) return FALSE; TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct; @@ -205,17 +158,41 @@ BOOL CEditorFilePathBar::OnToolTipNotify(UINT id, NMHDR * pTTTStruct, LRESULT * pTTT->lpszText = const_cast(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_callbackfunc) + m_callbackfunc(id - IDC_STATIC_TITLE_PANE0); +} + +/** + * @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(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); } /** @@ -226,10 +203,10 @@ BOOL CEditorFilePathBar::OnToolTipNotify(UINT id, NMHDR * pTTTStruct, LRESULT * */ void CEditorFilePathBar::SetText(int pane, const String& sString) { - ASSERT (pane >= 0 && pane < countof(m_Edit)); + ASSERT (pane >= 0 && pane < static_cast(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); @@ -239,14 +216,14 @@ void CEditorFilePathBar::SetText(int pane, const String& 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(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);