skyrope-mit-merge-hell-20040226
[openafs.git] / src / WINNT / client_exp / volumeinfo.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include "stdafx.h"
16 #include "afs_shl_ext.h"
17 #include "volume_info.h"
18 #include "partition_info_dlg.h"
19 #include "volume_inf.h"
20 #include "gui2fs.h"
21 #include <limits.h>
22 #include "msgs.h"
23
24 #ifdef _DEBUG
25 #define new DEBUG_NEW
26 #undef THIS_FILE
27 static char THIS_FILE[] = __FILE__;
28 #endif
29
30 /////////////////////////////////////////////////////////////////////////////
31 // CVolumeInfo dialog
32
33
34 CVolumeInfo::CVolumeInfo(CWnd* pParent /*=NULL*/)
35         : CDialog()
36 {
37         InitModalIndirect (TaLocale_GetDialogResource (CVolumeInfo::IDD), pParent);
38
39         //{{AFX_DATA_INIT(CVolumeInfo)
40         m_nNewQuota = 0;
41         //}}AFX_DATA_INIT
42         
43         m_pVolInfo = 0;
44         m_nCurIndex = -1;
45 }
46
47 CVolumeInfo::~CVolumeInfo()
48 {
49         if (m_pVolInfo != 0)
50                 delete [] m_pVolInfo;
51 }
52
53 void CVolumeInfo::DoDataExchange(CDataExchange* pDX)
54 {
55         CDialog::DoDataExchange(pDX);
56         //{{AFX_DATA_MAP(CVolumeInfo)
57         DDX_Control(pDX, IDC_QUOTA_SPIN, m_QuotaSpin);
58         DDX_Control(pDX, IDOK, m_Ok);
59         DDX_Control(pDX, IDC_PARTITION_INFO, m_ShowPartInfo);
60         DDX_Control(pDX, IDC_LIST, m_List);
61         DDX_Text(pDX, IDC_NEW_QUOTA, m_nNewQuota);
62         //}}AFX_DATA_MAP
63 }
64
65 BEGIN_MESSAGE_MAP(CVolumeInfo, CDialog)
66         //{{AFX_MSG_MAP(CVolumeInfo)
67         ON_LBN_SELCHANGE(IDC_LIST, OnSelChangeList)
68         ON_BN_CLICKED(IDC_PARTITION_INFO, OnPartitionInfo)
69         ON_EN_CHANGE(IDC_NEW_QUOTA, OnChangeNewQuota)
70         ON_NOTIFY(UDN_DELTAPOS, IDC_QUOTA_SPIN, OnDeltaPosQuotaSpin)
71         ON_BN_CLICKED(IDHELP, OnHelp)
72         //}}AFX_MSG_MAP
73 END_MESSAGE_MAP()
74
75 /////////////////////////////////////////////////////////////////////////////
76 // CVolumeInfo message handlers
77
78 BOOL CVolumeInfo::OnInitDialog() 
79 {
80         ASSERT(m_Files.GetSize() > 0);
81
82         CDialog::OnInitDialog();
83
84         int tabs[] = { 79, 164, 214, 260, 301 };
85         
86         m_List.SetTabStops(sizeof(tabs) / sizeof(int), tabs);
87
88         m_pVolInfo = new CVolInfo[m_Files.GetSize()];
89
90         for (int i = 0; i < m_Files.GetSize(); i++) {
91                 GetVolumeInfo(m_Files[i], m_pVolInfo[i]);
92                 // Check if this is a duplicate entry (same volume as earlier entry)
93                 for (int j = 0; j < i; j++) {
94                         if (m_pVolInfo[j].m_nID == m_pVolInfo[i].m_nID)
95                                 m_pVolInfo[i].m_nDup = j;
96                                 break;
97                 }
98         }
99
100         ShowInfo();
101
102         m_QuotaSpin.SetRange(UD_MINVAL, UD_MAXVAL);
103         m_QuotaSpin.SetPos(0);
104
105         return TRUE;  // return TRUE unless you set the focus to a control
106                       // EXCEPTION: OCX Property Pages should return FALSE
107 }
108
109 int CVolumeInfo::GetCurVolInfoIndex()
110 {
111         int nListIndex = m_List.GetCurSel();
112         ASSERT(nListIndex >= 0);
113
114         int nIndex = m_List.GetItemData(nListIndex);
115         ASSERT(nIndex >= 0);
116
117         if (m_pVolInfo[nIndex].m_nDup != -1)
118                 return m_pVolInfo[nIndex].m_nDup;
119
120         return nIndex;
121 }
122
123 void CVolumeInfo::OnSelChangeList() 
124 {
125         m_nCurIndex = GetCurVolInfoIndex();
126         if (m_nCurIndex < 0)
127                 return;
128
129         m_nNewQuota = m_pVolInfo[m_nCurIndex].m_nNewQuota;
130
131         m_ShowPartInfo.EnableWindow(TRUE);
132         CWnd *pNewQuota = GetDlgItem(IDC_NEW_QUOTA);
133         pNewQuota->EnableWindow(TRUE);
134
135         m_QuotaSpin.EnableWindow(TRUE);
136         m_QuotaSpin.SetPos(0);
137
138         UpdateData(FALSE);
139 }
140
141 void CVolumeInfo::OnPartitionInfo() 
142 {
143         CPartitionInfoDlg dlg;
144
145         ASSERT(m_nCurIndex >= 0);
146
147         dlg.SetValues(m_pVolInfo[m_nCurIndex].m_nPartSize, m_pVolInfo[m_nCurIndex].m_nPartFree);
148
149         dlg.DoModal();
150 }
151
152 void CVolumeInfo::SetFiles(const CStringArray& files)
153 {
154         m_Files.RemoveAll();
155
156         m_Files.Copy(files);
157 }
158
159 void CVolumeInfo::OnChangeNewQuota() 
160 {
161         if (m_List.m_hWnd == 0)
162                 return;
163
164         CString strQuota;
165         GetDlgItem(IDC_NEW_QUOTA)->GetWindowText(strQuota);
166
167         if (strQuota.IsEmpty())
168                 return;
169
170         if (!UpdateData(TRUE))
171                 return;
172
173         ASSERT(m_nCurIndex >= 0);
174
175         m_pVolInfo[m_nCurIndex].m_nNewQuota = m_nNewQuota;
176
177         if (m_pVolInfo[m_nCurIndex].m_nNewQuota != m_pVolInfo[m_nCurIndex].m_nQuota)
178                 m_Ok.EnableWindow(TRUE);
179
180         ShowInfo();
181 }
182
183 void CVolumeInfo::OnOK() 
184 {
185         for (int i = 0; i < m_Files.GetSize(); i++) {
186                 if ((m_pVolInfo[i].m_nDup == -1) && (m_pVolInfo[i].m_nQuota != m_pVolInfo[i].m_nNewQuota)) {
187 //                      CString strQuota;
188 //                      strQuota.Format("= %ld", m_pVolInfo[i].m_nNewQuota);
189 //                      AfxMessageBox("Setting quota for volume: " + m_pVolInfo[i].m_strName + strQuota);
190                         SetVolInfo(m_pVolInfo[i]);
191                 }
192         }
193         
194         CDialog::OnOK();
195 }
196
197 void CVolumeInfo::OnDeltaPosQuotaSpin(NMHDR* pNMHDR, LRESULT* pResult) 
198 {
199         NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
200         
201         LONG nNewQuota = m_nNewQuota + pNMUpDown->iDelta * 1024;
202         if (nNewQuota < 0)
203                 return;
204
205         m_nNewQuota = nNewQuota;
206         
207         UpdateData(FALSE);
208
209         OnChangeNewQuota();
210
211         *pResult = 0;
212 }
213
214 void CVolumeInfo::ShowInfo()
215 {
216         m_List.ResetContent();
217         
218         for (int i = 0; i < m_Files.GetSize(); i++) {
219
220                 CString strEntry;
221                 if (m_pVolInfo[i].m_strErrorMsg.GetLength() > 0)
222                         strEntry = m_pVolInfo[i].m_strFileName + "\t(Error:  " + m_pVolInfo[i].m_strErrorMsg + ")";
223                 else {
224
225                         LONG nQuota;
226                         if (m_pVolInfo[i].m_nDup == -1)
227                                 nQuota = m_pVolInfo[i].m_nNewQuota;
228                         else
229                                 nQuota = m_pVolInfo[m_pVolInfo[i].m_nDup].m_nNewQuota;
230
231                         if (nQuota != 0) {
232                                 LONG nPercentUsed = (m_pVolInfo[i].m_nUsed * 100) / nQuota;
233                                 strEntry.Format("%s\t%s\t%ld\t%ldK\t%ldK\t%ld%%", m_pVolInfo[i].m_strFileName, m_pVolInfo[i].m_strName,
234                                         m_pVolInfo[i].m_nID, nQuota, m_pVolInfo[i].m_nUsed, nPercentUsed);
235                         } else {
236                                 strEntry.Format("%s\t%s\t%ld\tUnlimited\t%ldK", m_pVolInfo[i].m_strFileName, m_pVolInfo[i].m_strName,
237                                         m_pVolInfo[i].m_nID, m_pVolInfo[i].m_nUsed);
238                         }
239                 }
240
241                 int nListIndex = m_List.AddString(strEntry);
242                 ASSERT(nListIndex >= 0);
243                 VERIFY(m_List.SetItemData(nListIndex, i) != LB_ERR);
244         }
245 }
246
247 void CVolumeInfo::OnHelp() 
248 {
249         ShowHelp(m_hWnd, VOLUME_INFO_HELP_ID);
250 }
251