OSDN Git Service

Get Remote To Fetch\Pull Dialog Remote List
[tortoisegit/TortoiseGitJp.git] / ext / ResizableLib / ResizableMinMax.cpp
1 /////////////////////////////////////////////////////////////////////////////\r
2 //\r
3 // This file is part of ResizableLib\r
4 // http://sourceforge.net/projects/resizablelib\r
5 //\r
6 // Copyright (C) 2000-2004 by Paolo Messina\r
7 // http://www.geocities.com/ppescher - mailto:ppescher@hotmail.com\r
8 //\r
9 // The contents of this file are subject to the Artistic License (the "License").\r
10 // You may not use this file except in compliance with the License. \r
11 // You may obtain a copy of the License at:\r
12 // http://www.opensource.org/licenses/artistic-license.html\r
13 //\r
14 // If you find this code useful, credits would be nice!\r
15 //\r
16 /////////////////////////////////////////////////////////////////////////////\r
17 \r
18 /*!\r
19  *  @file\r
20  *  @brief Implementation of the CResizableMinMax class.\r
21  */\r
22 \r
23 #include "stdafx.h"\r
24 #include "ResizableMinMax.h"\r
25 \r
26 #ifdef _DEBUG\r
27 #undef THIS_FILE\r
28 static char THIS_FILE[]=__FILE__;\r
29 #define new DEBUG_NEW\r
30 #endif\r
31 \r
32 //////////////////////////////////////////////////////////////////////\r
33 // Construction/Destruction\r
34 //////////////////////////////////////////////////////////////////////\r
35 \r
36 CResizableMinMax::CResizableMinMax()\r
37 {\r
38         m_bUseMinTrack = FALSE;\r
39         m_bUseMaxTrack = FALSE;\r
40         m_bUseMaxRect = FALSE;\r
41 }\r
42 \r
43 CResizableMinMax::~CResizableMinMax()\r
44 {\r
45 \r
46 }\r
47 \r
48 void CResizableMinMax::MinMaxInfo(LPMINMAXINFO lpMMI)\r
49 {\r
50         if (m_bUseMinTrack)\r
51                 lpMMI->ptMinTrackSize = m_ptMinTrackSize;\r
52 \r
53         if (m_bUseMaxTrack)\r
54                 lpMMI->ptMaxTrackSize = m_ptMaxTrackSize;\r
55 \r
56         if (m_bUseMaxRect)\r
57         {\r
58                 lpMMI->ptMaxPosition = m_ptMaxPos;\r
59                 lpMMI->ptMaxSize = m_ptMaxSize;\r
60         }\r
61 }\r
62 \r
63 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI, CWnd* pParentFrame, CWnd* pWnd)\r
64 {\r
65         // get the extra size from child to parent\r
66         CRect rectClient, rectWnd;\r
67         if ((pParentFrame->GetStyle() & WS_CHILD) && pParentFrame->IsZoomed())\r
68                 pParentFrame->GetClientRect(rectWnd);\r
69         else\r
70                 pParentFrame->GetWindowRect(rectWnd);\r
71         pParentFrame->RepositionBars(0, 0xFFFF,\r
72                 AFX_IDW_PANE_FIRST, CWnd::reposQuery, rectClient);\r
73         CSize sizeExtra = rectWnd.Size() - rectClient.Size();\r
74 \r
75         ChainMinMaxInfo(lpMMI, pWnd->GetSafeHwnd(), sizeExtra);\r
76 }\r
77 \r
78 void CResizableMinMax::ChainMinMaxInfo(LPMINMAXINFO lpMMI, HWND hWndChild, CSize sizeExtra)\r
79 {\r
80         // ask the child window for track size\r
81         MINMAXINFO mmiChild = *lpMMI;\r
82         ::SendMessage(hWndChild, WM_GETMINMAXINFO, 0, (LPARAM)&mmiChild);\r
83         BOOL bRetMax = (lpMMI->ptMaxTrackSize.x != mmiChild.ptMaxTrackSize.x\r
84                 || lpMMI->ptMaxTrackSize.y != mmiChild.ptMaxTrackSize.y);\r
85         BOOL bRetMin = (lpMMI->ptMinTrackSize.x != mmiChild.ptMinTrackSize.x\r
86                 || lpMMI->ptMinTrackSize.y != mmiChild.ptMinTrackSize.y);\r
87 \r
88         // add static extra size\r
89         mmiChild.ptMaxTrackSize = sizeExtra + mmiChild.ptMaxTrackSize;\r
90         mmiChild.ptMinTrackSize = sizeExtra + mmiChild.ptMinTrackSize;\r
91 \r
92         // min size is the largest\r
93         if (bRetMin)\r
94         {\r
95                 lpMMI->ptMinTrackSize.x = __max(lpMMI->ptMinTrackSize.x,\r
96                         mmiChild.ptMinTrackSize.x);\r
97                 lpMMI->ptMinTrackSize.y = __max(lpMMI->ptMinTrackSize.y,\r
98                         mmiChild.ptMinTrackSize.y);\r
99         }\r
100         // max size is the shortest\r
101         if (bRetMax)\r
102         {\r
103                 lpMMI->ptMaxTrackSize.x = __min(lpMMI->ptMaxTrackSize.x,\r
104                         mmiChild.ptMaxTrackSize.x);\r
105                 lpMMI->ptMaxTrackSize.y = __min(lpMMI->ptMaxTrackSize.y,\r
106                         mmiChild.ptMaxTrackSize.y);\r
107         }\r
108 }\r
109 \r
110 BOOL CResizableMinMax::CalcSizeExtra(HWND /*hWndChild*/, CSize /*sizeChild*/, CSize& /*sizeExtra*/)\r
111 {\r
112         // should be overridden if you use ChainMinMaxInfoCB\r
113         ASSERT(FALSE);\r
114         return FALSE;\r
115 }\r
116 \r
117 void CResizableMinMax::ChainMinMaxInfoCB(LPMINMAXINFO lpMMI, HWND hWndChild)\r
118 {\r
119         // ask the child window for track size\r
120         MINMAXINFO mmiChild = *lpMMI;\r
121         ::SendMessage(hWndChild, WM_GETMINMAXINFO, 0, (LPARAM)&mmiChild);\r
122         BOOL bRetMax = (lpMMI->ptMaxTrackSize.x != mmiChild.ptMaxTrackSize.x\r
123                 || lpMMI->ptMaxTrackSize.y != mmiChild.ptMaxTrackSize.y);\r
124         BOOL bRetMin = (lpMMI->ptMinTrackSize.x != mmiChild.ptMinTrackSize.x\r
125                 || lpMMI->ptMinTrackSize.y != mmiChild.ptMinTrackSize.y);\r
126 \r
127         // use a callback to determine extra size\r
128         CSize sizeExtra(0, 0);\r
129         bRetMax = bRetMax && CalcSizeExtra(hWndChild, mmiChild.ptMaxTrackSize, sizeExtra);\r
130         mmiChild.ptMaxTrackSize = sizeExtra + mmiChild.ptMaxTrackSize;\r
131         bRetMin = bRetMin && CalcSizeExtra(hWndChild, mmiChild.ptMinTrackSize, sizeExtra);\r
132         mmiChild.ptMinTrackSize = sizeExtra + mmiChild.ptMinTrackSize;\r
133 \r
134         // min size is the largest\r
135         if (bRetMin)\r
136         {\r
137                 lpMMI->ptMinTrackSize.x = __max(lpMMI->ptMinTrackSize.x,\r
138                         mmiChild.ptMinTrackSize.x);\r
139                 lpMMI->ptMinTrackSize.y = __max(lpMMI->ptMinTrackSize.y,\r
140                         mmiChild.ptMinTrackSize.y);\r
141         }\r
142         // max size is the shortest\r
143         if (bRetMax)\r
144         {\r
145                 lpMMI->ptMaxTrackSize.x = __min(lpMMI->ptMaxTrackSize.x,\r
146                         mmiChild.ptMaxTrackSize.x);\r
147                 lpMMI->ptMaxTrackSize.y = __min(lpMMI->ptMaxTrackSize.y,\r
148                         mmiChild.ptMaxTrackSize.y);\r
149         }\r
150 }\r
151 \r
152 void CResizableMinMax::SetMaximizedRect(const CRect& rc)\r
153 {\r
154         m_bUseMaxRect = TRUE;\r
155 \r
156         m_ptMaxPos = rc.TopLeft();\r
157         m_ptMaxSize.x = rc.Width();\r
158         m_ptMaxSize.y = rc.Height();\r
159 }\r
160 \r
161 void CResizableMinMax::ResetMaximizedRect()\r
162 {\r
163         m_bUseMaxRect = FALSE;\r
164 }\r
165 \r
166 void CResizableMinMax::SetMinTrackSize(const CSize& size)\r
167 {\r
168         m_bUseMinTrack = TRUE;\r
169 \r
170         m_ptMinTrackSize.x = size.cx;\r
171         m_ptMinTrackSize.y = size.cy;\r
172 }\r
173 \r
174 void CResizableMinMax::ResetMinTrackSize()\r
175 {\r
176         m_bUseMinTrack = FALSE;\r
177 }\r
178 \r
179 void CResizableMinMax::SetMaxTrackSize(const CSize& size)\r
180 {\r
181         m_bUseMaxTrack = TRUE;\r
182 \r
183         m_ptMaxTrackSize.x = size.cx;\r
184         m_ptMaxTrackSize.y = size.cy;\r
185 }\r
186 \r
187 void CResizableMinMax::ResetMaxTrackSize()\r
188 {\r
189         m_bUseMaxTrack = FALSE;\r
190 }\r