Fix typos
[TortoiseGit.git] / ext / ResizableLib / ResizableMinMax.cpp
blobe2ae97264a0227a850f9841351380a0fa6d0c595
1 /////////////////////////////////////////////////////////////////////////////
2 //
3 // This file is part of ResizableLib
4 // http://sourceforge.net/projects/resizablelib
5 //
6 // Copyright (C) 2000-2004 by Paolo Messina
7 // http://www.geocities.com/ppescher - mailto:ppescher@hotmail.com
8 //
9 // The contents of this file are subject to the Artistic License (the "License").
10 // You may not use this file except in compliance with the License.
11 // You may obtain a copy of the License at:
12 // http://www.opensource.org/licenses/artistic-license.html
14 // If you find this code useful, credits would be nice!
16 /////////////////////////////////////////////////////////////////////////////
18 /*!
19 * @file
20 * @brief Implementation of the CResizableMinMax class.
23 #include "stdafx.h"
24 #include "ResizableMinMax.h"
26 #ifdef _DEBUG
27 #undef THIS_FILE
28 static char THIS_FILE[]=__FILE__;
29 #define new DEBUG_NEW
30 #endif
32 //////////////////////////////////////////////////////////////////////
33 // Construction/Destruction
34 //////////////////////////////////////////////////////////////////////
36 CResizableMinMax::CResizableMinMax()
40 CResizableMinMax::~CResizableMinMax()
44 void CResizableMinMax::MinMaxInfo(LPMINMAXINFO lpMMI)
46 if (m_bUseMinTrack)
47 lpMMI->ptMinTrackSize = m_ptMinTrackSize;
49 if (m_bUseMaxTrack)
50 lpMMI->ptMaxTrackSize = m_ptMaxTrackSize;
52 if (m_bUseMaxRect)
54 lpMMI->ptMaxPosition = m_ptMaxPos;
55 lpMMI->ptMaxSize = m_ptMaxSize;
59 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI, CWnd* pParentFrame, CWnd* pWnd)
61 // get the extra size from child to parent
62 CRect rectClient, rectWnd;
63 if ((pParentFrame->GetStyle() & WS_CHILD) && pParentFrame->IsZoomed())
64 pParentFrame->GetClientRect(rectWnd);
65 else
66 pParentFrame->GetWindowRect(rectWnd);
67 pParentFrame->RepositionBars(0, 0xFFFF,
68 AFX_IDW_PANE_FIRST, CWnd::reposQuery, rectClient);
69 CSize sizeExtra = rectWnd.Size() - rectClient.Size();
71 ChainMinMaxInfo(lpMMI, pWnd->GetSafeHwnd(), sizeExtra);
74 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI, HWND hWndChild, CSize sizeExtra)
76 // ask the child window for track size
77 MINMAXINFO mmiChild = *lpMMI;
78 ::SendMessage(hWndChild, WM_GETMINMAXINFO, 0, (LPARAM)&mmiChild);
79 BOOL bRetMax = (lpMMI->ptMaxTrackSize.x != mmiChild.ptMaxTrackSize.x
80 || lpMMI->ptMaxTrackSize.y != mmiChild.ptMaxTrackSize.y);
81 BOOL bRetMin = (lpMMI->ptMinTrackSize.x != mmiChild.ptMinTrackSize.x
82 || lpMMI->ptMinTrackSize.y != mmiChild.ptMinTrackSize.y);
84 // add static extra size
85 mmiChild.ptMaxTrackSize = sizeExtra + mmiChild.ptMaxTrackSize;
86 mmiChild.ptMinTrackSize = sizeExtra + mmiChild.ptMinTrackSize;
88 // min size is the largest
89 if (bRetMin)
91 lpMMI->ptMinTrackSize.x = __max(lpMMI->ptMinTrackSize.x,
92 mmiChild.ptMinTrackSize.x);
93 lpMMI->ptMinTrackSize.y = __max(lpMMI->ptMinTrackSize.y,
94 mmiChild.ptMinTrackSize.y);
96 // max size is the shortest
97 if (bRetMax)
99 lpMMI->ptMaxTrackSize.x = __min(lpMMI->ptMaxTrackSize.x,
100 mmiChild.ptMaxTrackSize.x);
101 lpMMI->ptMaxTrackSize.y = __min(lpMMI->ptMaxTrackSize.y,
102 mmiChild.ptMaxTrackSize.y);
106 BOOL CResizableMinMax::CalcSizeExtra(HWND /*hWndChild*/, CSize /*sizeChild*/, CSize& /*sizeExtra*/)
108 // should be overridden if you use ChainMinMaxInfoCB
109 ASSERT(FALSE);
110 return FALSE;
113 void CResizableMinMax::ChainMinMaxInfoCB(LPMINMAXINFO lpMMI, HWND hWndChild)
115 // ask the child window for track size
116 MINMAXINFO mmiChild = *lpMMI;
117 ::SendMessage(hWndChild, WM_GETMINMAXINFO, 0, (LPARAM)&mmiChild);
118 BOOL bRetMax = (lpMMI->ptMaxTrackSize.x != mmiChild.ptMaxTrackSize.x
119 || lpMMI->ptMaxTrackSize.y != mmiChild.ptMaxTrackSize.y);
120 BOOL bRetMin = (lpMMI->ptMinTrackSize.x != mmiChild.ptMinTrackSize.x
121 || lpMMI->ptMinTrackSize.y != mmiChild.ptMinTrackSize.y);
123 // use a callback to determine extra size
124 CSize sizeExtra(0, 0);
125 bRetMax = bRetMax && CalcSizeExtra(hWndChild, mmiChild.ptMaxTrackSize, sizeExtra);
126 mmiChild.ptMaxTrackSize = sizeExtra + mmiChild.ptMaxTrackSize;
127 bRetMin = bRetMin && CalcSizeExtra(hWndChild, mmiChild.ptMinTrackSize, sizeExtra);
128 mmiChild.ptMinTrackSize = sizeExtra + mmiChild.ptMinTrackSize;
130 // min size is the largest
131 if (bRetMin)
133 lpMMI->ptMinTrackSize.x = __max(lpMMI->ptMinTrackSize.x,
134 mmiChild.ptMinTrackSize.x);
135 lpMMI->ptMinTrackSize.y = __max(lpMMI->ptMinTrackSize.y,
136 mmiChild.ptMinTrackSize.y);
138 // max size is the shortest
139 if (bRetMax)
141 lpMMI->ptMaxTrackSize.x = __min(lpMMI->ptMaxTrackSize.x,
142 mmiChild.ptMaxTrackSize.x);
143 lpMMI->ptMaxTrackSize.y = __min(lpMMI->ptMaxTrackSize.y,
144 mmiChild.ptMaxTrackSize.y);
148 void CResizableMinMax::SetMaximizedRect(const CRect& rc)
150 m_bUseMaxRect = TRUE;
152 m_ptMaxPos = rc.TopLeft();
153 m_ptMaxSize.x = rc.Width();
154 m_ptMaxSize.y = rc.Height();
157 void CResizableMinMax::ResetMaximizedRect()
159 m_bUseMaxRect = FALSE;
162 void CResizableMinMax::SetMinTrackSize(const CSize& size)
164 m_bUseMinTrack = TRUE;
166 m_ptMinTrackSize.x = size.cx;
167 m_ptMinTrackSize.y = size.cy;
170 void CResizableMinMax::ResetMinTrackSize()
172 m_bUseMinTrack = FALSE;
175 void CResizableMinMax::SetMaxTrackSize(const CSize& size)
177 m_bUseMaxTrack = TRUE;
179 m_ptMaxTrackSize.x = size.cx;
180 m_ptMaxTrackSize.y = size.cy;
183 void CResizableMinMax::ResetMaxTrackSize()
185 m_bUseMaxTrack = FALSE;