]> cygwin.com Git - cygwin-apps/setup.git/blame - ControlAdjuster.cc
2003-10-31 Frank Richter <frichter@gmx.li>
[cygwin-apps/setup.git] / ControlAdjuster.cc
CommitLineData
ee91d9be
RC
1/*
2 * Copyright (c) 2003, Frank Richter <frichter@gmx.li>
576a2b0b 3 * Copyright (c) 2003, Robert Collins <rbtcollins@hotmail.com>
ee91d9be
RC
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * A copy of the GNU General Public License can be found at
11 * http://www.gnu.org/
12 *
13 * Written by Frank Richter.
14 *
15 */
16
17#include "ControlAdjuster.h"
18#include "RECTWrapper.h"
19
20void ControlAdjuster::AdjustControls (HWND dlg,
21 const ControlInfo controlInfo[],
22 int widthChange, int heightChange)
23{
24 const ControlInfo* ci = controlInfo;
25
26 while (ci->control > 0)
27 {
576a2b0b 28 ci->adjust(dlg, widthChange,heightChange);
ee91d9be
RC
29 ci++;
30 }
31}
576a2b0b
RC
32
33void
34ControlAdjuster::ControlInfo::adjust(HWND dlg, int widthChange, int heightChange) const
35{
36 HWND ctl = GetDlgItem (dlg, control);
37 if (ctl == 0)
38 return;
39 RECTWrapper ctlRect;
40 GetWindowRect (ctl, &ctlRect);
41 // We want client coords.
42 ScreenToClient (dlg, (LPPOINT)&ctlRect.left);
43 ScreenToClient (dlg, (LPPOINT)&ctlRect.right);
44
45 ControlDimension horizontal(ctlRect.left, ctlRect.right);
46 ControlDimension vertical(ctlRect.top, ctlRect.bottom);
47 /*
48 Now adjust the rectangle coordinates.
49 */
50 adjust(horizontalPos, horizontal, widthChange);
51 adjust(verticalPos, vertical, heightChange);
52 /* update the windows window */
53 SetWindowPos (ctl, 0, ctlRect.left, ctlRect.top,
54 ctlRect.width (), ctlRect.height (), SWP_NOACTIVATE | SWP_NOZORDER);
55 // If not done, weird visual glitches can occur.
56 InvalidateRect (ctl, 0, false);
57}
58
59void
60ControlAdjuster::ControlInfo::adjust (ControlPosition const &how, ControlDimension &where, int by) const
61{
62 switch (how)
63 {
64 case CP_LEFT:
65 break;
66 case CP_MIDDLE:
67 where.left += by/2;
68 where.right += by - by/2;
69 break;
70 case CP_RIGHT:
71 where.left += by;
72 where.right += by;
73 break;
74 case CP_STRETCH:
75 where.right += by;
76 break;
77 }
78}
ee91d9be
RC
79
80SizeProcessor::SizeProcessor ()
81{
82 rectValid = false;
83}
84
85void SizeProcessor::AddControlInfo (
86 const ControlAdjuster::ControlInfo* controlInfo)
87{
88 controlInfos.push_back (controlInfo);
89}
90
91void SizeProcessor::UpdateSize (HWND dlg)
92{
93 RECTWrapper clientRect;
94 ::GetClientRect (dlg, &clientRect);
95
96 if (rectValid)
97 {
98 const int dX = clientRect.width () - lastRect.width ();
99 const int dY = clientRect.height () - lastRect.height ();
100
101 for (size_t i = 0; i < controlInfos.size (); i++)
102 ControlAdjuster::AdjustControls (dlg, controlInfos[i], dX, dY);
103 }
104 else
105 rectValid = true;
106
107 lastRect = clientRect;
108}
This page took 0.031614 seconds and 5 git commands to generate.