comparison host/tools/configtool/common/win32/AddRemoveDialog.cpp @ 76:435cced73e2f ecos-v1_3_1-release

eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
author jlarmour
date Tue, 28 Mar 2000 14:10:45 +0000
parents
children
comparison
equal deleted inserted replaced
75:41bf073c0c32 76:435cced73e2f
1 //####COPYRIGHTBEGIN####
2 //
3 // ----------------------------------------------------------------------------
4 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
5 //
6 // This program is part of the eCos host tools.
7 //
8 // This program is free software; you can redistribute it and/or modify it
9 // under the terms of the GNU General Public License as published by the Free
10 // Software Foundation; either version 2 of the License, or (at your option)
11 // any later version.
12 //
13 // This program is distributed in the hope that it will be useful, but WITHOUT
14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 // more details.
17 //
18 // You should have received a copy of the GNU General Public License along with
19 // this program; if not, write to the Free Software Foundation, Inc.,
20 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 //
22 // ----------------------------------------------------------------------------
23 //
24 //####COPYRIGHTEND####
25 // AddRemoveDialog.cpp : implementation file
26 //
27
28 #include "stdafx.h"
29
30 #include "AddRemoveDialog.h"
31 #ifdef _DEBUG
32 #define new DEBUG_NEW
33 #undef THIS_FILE
34 static char THIS_FILE[] = __FILE__;
35 #endif
36
37 /////////////////////////////////////////////////////////////////////////////
38 // CAddRemoveDialog dialog
39
40 void CAddRemoveDialog::AfxDataInit()
41 {
42 //{{AFX_DATA_INIT(CAddRemoveDialog)
43 // NOTE: the ClassWizard will add member initialization here
44 //}}AFX_DATA_INIT
45 }
46
47 CAddRemoveDialog::CAddRemoveDialog(CWnd* pParent /*=NULL*/)
48 : CeCosDialog(IDD, pParent),
49 m_bSort(false),
50 m_arbSel(NULL),
51 m_bHaveDescs(false),
52 m_nHorizontalResizingLimit(0)
53 {
54 AfxDataInit ();
55 }
56
57 CAddRemoveDialog::CAddRemoveDialog(UINT nIDTemplate, CWnd* pParent /*=NULL*/)
58 : CeCosDialog(nIDTemplate, pParent),
59 m_bSort(false),
60 m_arbSel(NULL),
61 m_nHorizontalResizingLimit(0)
62 {
63 AfxDataInit ();
64 }
65
66 void CAddRemoveDialog::DoDataExchange(CDataExchange* pDX)
67 {
68 CeCosDialog::DoDataExchange(pDX);
69 //{{AFX_DATA_MAP(CAddRemoveDialog)
70 DDX_Control(pDX, IDC_PACKAGE_DESC, m_wndDesc);
71 DDX_Control(pDX, IDC_ADDREMOVE_LIST2, m_List2);
72 DDX_Control(pDX, IDC_ADDREMOVE_LIST1, m_List1);
73 DDX_Control(pDX, IDC_ADDREMOVE_ADD, m_Add);
74 DDX_Control(pDX, IDC_ADDREMOVE_REMOVE,m_Remove);
75 //}}AFX_DATA_MAP
76 }
77
78
79 BEGIN_MESSAGE_MAP(CAddRemoveDialog, CeCosDialog)
80 //{{AFX_MSG_MAP(CAddRemoveDialog)
81 ON_BN_CLICKED(IDC_ADDREMOVE_ADD, OnAdd)
82 ON_BN_CLICKED(IDC_ADDREMOVE_REMOVE, OnRemove)
83 ON_LBN_DBLCLK(IDC_ADDREMOVE_LIST1, OnDblclkList1)
84 ON_LBN_DBLCLK(IDC_ADDREMOVE_LIST2, OnDblclkList2)
85 ON_LBN_SELCHANGE(IDC_ADDREMOVE_LIST1, OnSelchangeList1)
86 ON_LBN_SELCHANGE(IDC_ADDREMOVE_LIST2, OnSelchangeList2)
87 ON_WM_DESTROY()
88 //}}AFX_MSG_MAP
89 END_MESSAGE_MAP()
90
91 /////////////////////////////////////////////////////////////////////////////
92 // CAddRemoveDialog message handlers
93
94 void CAddRemoveDialog::OnAdd()
95 {
96 Add(m_List1,m_List2);
97 m_Add.EnableWindow(FALSE);
98 m_Remove.EnableWindow(TRUE);
99 }
100
101 void CAddRemoveDialog::OnRemove()
102 {
103 Add(m_List2,m_List1);
104 m_Add.EnableWindow(TRUE);
105 m_Remove.EnableWindow(FALSE);
106 }
107
108 void CAddRemoveDialog::Insert(LPCTSTR pszItem, bool bAdded, LPCTSTR pszDesc/*=NULL*/)
109 {
110 m_bHaveDescs|=(NULL!=pszDesc);
111 m_arnItems. Add(bAdded);
112 m_arstrItems.Add(pszItem);
113 m_arstrDescs.Add(pszDesc?pszDesc:_T(""));
114 }
115
116 BOOL CAddRemoveDialog::OnInitDialog()
117 {
118 CeCosDialog::OnInitDialog();
119
120 m_arbSel=new int[GetCount()];
121
122 SetWindowText(m_strCaption);
123 SetSortMode(m_List1);
124 SetSortMode(m_List2);
125
126 int cxExtent=0;
127 CDC *pDC=m_List1.GetDC();
128 CFont *pOldFont=pDC->SelectObject(m_List1.GetFont());
129 for(int i=GetCount()-1;i>=0;--i) {
130 const CString &str=m_arstrItems[i];
131 cxExtent=max(cxExtent,pDC->GetTextExtent(str).cx);
132 CListBox &lb=m_arnItems[i]?m_List2:m_List1;
133 lb.SetItemData(lb.AddString(str),(DWORD)i);
134 }
135 pDC->SelectObject(pOldFont);
136
137 SetDlgItemText(IDC_ADDREMOVE_TEXT1,m_strMessage1);
138 SetDlgItemText(IDC_ADDREMOVE_TEXT2,m_strMessage2);
139
140 CRect rcLb1;
141 m_List1.GetWindowRect(rcLb1);
142 CRect rcDialog;
143 GetWindowRect(rcDialog);
144
145 int nExpand=cxExtent-(rcLb1.Width()-GetSystemMetrics(SM_CXVSCROLL)-2*GetSystemMetrics(SM_CXBORDER)-5);
146 nExpand=min(nExpand,m_nHorizontalResizingLimit);
147 if(nExpand>0){
148 MoveChild(IDOK,2*nExpand,Move);
149 MoveChild(IDCANCEL,2*nExpand,Move);
150 MoveChild(IDC_ADDREMOVE_ADD,nExpand,Move);
151 MoveChild(IDC_ADDREMOVE_REMOVE,nExpand,Move);
152 MoveChild(IDC_ADDREMOVE_LIST1,nExpand,Stretch);
153 MoveChild(IDC_ADDREMOVE_TEXT2,nExpand,Move);
154 MoveChild(IDC_ADDREMOVE_LIST2,nExpand,Move);
155 MoveChild(IDC_ADDREMOVE_LIST2,nExpand,Stretch);
156 MoveChild(IDC_PACKAGE_DESC,2*nExpand,Stretch);
157 rcDialog.right+=2*nExpand; // MoveWindow call is below
158 }
159
160 // enable horizontal scrolling if necessary, assuming the
161 // listboxes have identical widths and accommodating a
162 // 2 pixel border at each side of each listbox
163 m_List1.SetHorizontalExtent (cxExtent + 4);
164 m_List2.SetHorizontalExtent (cxExtent + 4);
165
166 m_Add.EnableWindow(m_List1.GetCount()>0);
167 m_Remove.EnableWindow(m_List2.GetCount()>0);
168
169 if(!m_bHaveDescs){
170 // Remove the description pane if not used:
171 CRect rcDesc;
172 m_wndDesc.GetWindowRect(rcDesc);
173 m_wndDesc.ShowWindow(SW_HIDE);
174 int delta=(rcDesc.Height()+(rcDesc.top-rcLb1.bottom));
175 MoveChild(IDOK,delta,Up);
176 MoveChild(IDCANCEL,delta,Up);
177 rcDialog.bottom-=delta;
178 }
179
180 // Finally, adjust dialog size according to calculations:
181 MoveWindow(rcDialog);
182
183 return TRUE; // return TRUE unless you set the focus to a control
184 // EXCEPTION: OCX Property Pages should return FALSE
185 }
186
187 void CAddRemoveDialog::OnDblclkList1()
188 {
189 OnDblclk(m_List1,m_List2);
190 m_Add.EnableWindow(FALSE);
191 m_Remove.EnableWindow(TRUE);
192 }
193
194 void CAddRemoveDialog::OnDblclkList2()
195 {
196 OnDblclk(m_List2,m_List1);
197 m_Add.EnableWindow(TRUE);
198 m_Remove.EnableWindow(FALSE);
199 }
200
201 int CAddRemoveDialog::Add(CListBox &lb1,CListBox &lb2)
202 {
203 int nSelCount=lb1.GetSelItems(lb1.GetCount(),m_arbSel);
204 for(int i=nSelCount-1;i>=0;--i){
205 Xfer(lb1,lb2,m_arbSel[i]);
206 }
207 ClearSel(lb1);
208 lb2.SetFocus();
209 return nSelCount;
210 }
211
212 void CAddRemoveDialog::OnDblclk(CListBox &lb1,CListBox &lb2)
213 {
214 BOOL bOutside;
215 DWORD dwPos=GetMessagePos();
216 POINTS pts=MAKEPOINTS(dwPos);
217 CRect rc(pts.x,pts.y,0,0);
218 lb1.ScreenToClient(rc);
219 CPoint pt(rc.left,rc.top);
220 int nItem=lb1.ItemFromPoint(pt,bOutside);
221 if(!bOutside){
222 Xfer(lb1,lb2,nItem);
223 }
224 ClearSel(lb1);
225 lb2.SetFocus();
226 }
227
228 void CAddRemoveDialog::ClearSel(CListBox &lb)
229 {
230 for(int i=lb.GetCount()-1;i>=0;--i){
231 lb.SetSel(i,FALSE);
232 }
233 }
234
235 void CAddRemoveDialog::OnSelchangeList1()
236 {
237 ClearSel(m_List2);
238 m_Add.EnableWindow(m_List1.GetSelCount()>0);
239 UpdateDescription(m_List1);
240 m_Remove.EnableWindow(FALSE);
241 }
242
243 void CAddRemoveDialog::OnSelchangeList2()
244 {
245 ClearSel(m_List1);
246 m_Remove.EnableWindow(m_List2.GetSelCount()>0);
247 UpdateDescription(m_List2);
248 m_Add.EnableWindow(FALSE);
249 }
250
251 void CAddRemoveDialog::Xfer(CListBox &lb1, CListBox &lb2, int nItem)
252 {
253 CString strItem;
254 lb1.GetText(nItem,strItem);
255 int nNewItem=lb2.AddString(strItem);
256 lb2.SetSel(nNewItem,TRUE);
257 DWORD nIndex=lb1.GetItemData(nItem);
258 lb2.SetItemData(nNewItem,nIndex);
259 m_arnItems[(int)nIndex]^=1;
260 lb1.DeleteString(nItem);
261 }
262
263 bool CAddRemoveDialog::IsAdded(LPCTSTR pszItem) const
264 {
265 for(int i=GetCount()-1;i>=0;--i){
266 if(m_arstrItems[i]==pszItem){
267 return 0!=m_arnItems[i];
268 }
269 }
270 ASSERT(false);
271 return false;
272 }
273
274
275 void CAddRemoveDialog::SetCaption(LPCTSTR pszCaption)
276 {
277 m_strCaption=pszCaption;
278 }
279
280 void CAddRemoveDialog::SetMessage(LPCTSTR pszText1,LPCTSTR pszText2)
281 {
282 m_strMessage1=pszText1;
283 m_strMessage2=pszText2;
284 }
285
286 void CAddRemoveDialog::OnDestroy()
287 {
288 CeCosDialog::OnDestroy();
289 deleteZA(m_arbSel);
290 }
291
292 // Add the "sort" property to the listboxes. Unfortunately this entails
293 // recreating them.
294 void CAddRemoveDialog::SetSortMode(CListBox &lb)
295 {
296 DWORD dwStyle=lb.GetStyle();
297 if(m_bSort!=(0!=(dwStyle&LBS_SORT))){
298 if(m_bSort){
299 dwStyle|=LBS_SORT;
300 } else {
301 dwStyle&=~LBS_SORT;
302 }
303 dwStyle|=WS_HSCROLL; // For some reason this doesn't come through GetStyle()
304 CRect rect;
305 lb.GetWindowRect(rect);
306 ScreenToClient(rect);
307 DWORD dwStyleEx=lb.GetExStyle();
308 CFont *pFont=lb.GetFont();
309 DWORD id=lb.GetDlgCtrlID();
310 lb.DestroyWindow();
311 lb.Detach();
312 // CreateEx not Create to get ourselves a 3D border
313 lb.CreateEx(dwStyleEx,_T("LISTBOX"),NULL,dwStyle,rect,this,id);
314 lb.SetFont(pFont);
315 }
316 }
317
318 // Implement ctrl/A on listboxes
319 BOOL CAddRemoveDialog::PreTranslateMessage(MSG* pMsg)
320 {
321 if(WM_CHAR==pMsg->message && 1==pMsg->wParam){
322 if(pMsg->hwnd==m_List1.m_hWnd){
323 m_List1.SelItemRange(TRUE,0,m_List1.GetCount()-1);
324 ClearSel(m_List2);
325 m_Add.EnableWindow(m_List1.GetCount()>0);
326 m_Remove.EnableWindow(FALSE);
327 return TRUE;
328 } else if(pMsg->hwnd==m_List2.m_hWnd){
329 m_List2.SelItemRange(TRUE,0,m_List2.GetCount()-1);
330 ClearSel(m_List1);
331 m_Remove.EnableWindow(m_List2.GetCount()>0);
332 m_Add.EnableWindow(FALSE);
333 return TRUE;
334 }
335 }
336
337 return CeCosDialog::PreTranslateMessage(pMsg);
338 }
339
340 void CAddRemoveDialog::MoveChild(UINT id,int delta,MoveType how)
341 {
342 CWnd *pWnd=GetDlgItem(id);
343 CRect rect;
344 pWnd->GetWindowRect(rect);
345 ScreenToClient(rect);
346 switch(how){
347 case Move:
348 rect.left+=delta;
349 rect.right+=delta;
350 break;
351 case Stretch:
352 rect.right+=delta;
353 break;
354 case Up:
355 rect.top-=delta;
356 rect.bottom-=delta;
357 break;
358 }
359 pWnd->MoveWindow(rect);
360 }
361
362 void CAddRemoveDialog::UpdateDescription(CListBox &lb)
363 {
364 CString strDesc;
365 // Set the description if the listbox has exactly one item selected
366 if(1==lb.GetSelCount()){
367 int nIndex;
368 lb.GetSelItems(1,&nIndex);
369 strDesc=m_arstrDescs[lb.GetItemData(nIndex)];
370 }
371 m_wndDesc.SetWindowText(strDesc);
372 }
373
374 void CAddRemoveDialog::SetHorizontalResizingLimit(int nPercent)
375 {
376 m_nHorizontalResizingLimit=nPercent;
377 }