メインページ | ファイル一覧 | ファイルメンバ

ColumnSelectDialog.cpp

00001 // ColumnSelect.cpp : インプリメンテーション ファイル 00002 // 00003 00004 #include "stdafx.h" 00005 #include "nexpcsv.h" 00006 #include "ColumnSelectDialog.h" 00007 #include "FormulaDialog.h" 00008 00009 #ifdef _DEBUG 00010 #define new DEBUG_NEW 00011 #undef THIS_FILE 00012 static char THIS_FILE[] = __FILE__; 00013 #endif 00014 00016 // CColumnSelectDialog ダイアログ 00017 00018 00019 CColumnSelectDialog::CColumnSelectDialog(CWnd* pParent /*=NULL*/) 00020 : CDialog(CColumnSelectDialog::IDD, pParent) 00021 { 00022 //{{AFX_DATA_INIT(CColumnSelectDialog) 00023 // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。 00024 //}}AFX_DATA_INIT 00025 SetItemChanged(TRUE); 00026 } 00027 00028 00029 void CColumnSelectDialog::DoDataExchange(CDataExchange* pDX) 00030 { 00031 CDialog::DoDataExchange(pDX); 00032 //{{AFX_DATA_MAP(CColumnSelectDialog) 00033 DDX_Control(pDX, IDC_UP, m_btnUp); 00034 DDX_Control(pDX, IDC_REMOVE, m_btnRemove); 00035 DDX_Control(pDX, IDC_EDIT, m_btnEdit); 00036 DDX_Control(pDX, IDC_DOWN, m_btnDown); 00037 DDX_Control(pDX, IDC_ADD, m_btnAdd); 00038 DDX_Control(pDX, IDC_COLUMN_LIST, m_lcColumnList); 00039 //}}AFX_DATA_MAP 00040 } 00041 00042 00043 BEGIN_MESSAGE_MAP(CColumnSelectDialog, CDialog) 00044 //{{AFX_MSG_MAP(CColumnSelectDialog) 00045 ON_NOTIFY(LVN_ENDLABELEDIT, IDC_COLUMN_LIST, OnEndlabeleditColumnList) 00046 ON_NOTIFY(LVN_KEYDOWN, IDC_COLUMN_LIST, OnKeydownColumnList) 00047 ON_BN_CLICKED(IDC_ADD, OnAdd) 00048 ON_NOTIFY(LVN_GETDISPINFO, IDC_COLUMN_LIST, OnGetdispinfoColumnList) 00049 ON_BN_CLICKED(IDC_UP, OnUp) 00050 ON_BN_CLICKED(IDC_DOWN, OnDown) 00051 ON_BN_CLICKED(IDC_EDIT, OnEdit) 00052 ON_BN_CLICKED(IDC_REMOVE, OnRemove) 00053 ON_NOTIFY(LVN_ITEMCHANGED, IDC_COLUMN_LIST, OnItemchangedColumnList) 00054 ON_BN_CLICKED(IDC_SAVE, OnSave) 00055 ON_BN_CLICKED(IDC_OPEN, OnOpen) 00056 //}}AFX_MSG_MAP 00057 END_MESSAGE_MAP() 00058 00060 // CColumnSelectDialog メッセージ ハンドラ 00061 00062 /*====================================================================== 00063 ダイアログ画面の設定 00064 ・リストコントロールの設定 00065 ・アプリケーションクラスからLADPの情報をリストへ追加 00066 00067 BOOL OnInitDialog() 00068 00069 引数:なし 00070 戻り:なし 00071 クラス変数: 00072 m_lcInfo ...... LDAP接続情報リストコントロール[i/o] 00073 ----------------------------------------------------------------------*/ 00074 BOOL CColumnSelectDialog::OnInitDialog() 00075 { 00076 CDialog::OnInitDialog(); 00077 00078 // TODO: この位置に初期化の補足処理を追加してください 00079 00080 //---------------------------------------- 00081 // 列情報を一時領域にコピー 00082 //---------------------------------------- 00083 CnExpCsvApp* app = (CnExpCsvApp*)AfxGetApp(); 00084 m_arrData.Copy( app->m_arrData ); 00085 00086 //---------------------------------------- 00087 // リストコントロールの設定 00088 //---------------------------------------- 00089 m_lcColumnList.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_INFOTIP | LVS_EX_GRIDLINES); 00090 00091 // リストコントロールのカラム定義 00092 static const struct 00093 { 00094 UINT nColHdrId; 00095 int nFormat; 00096 int nWidth; // パーセントで指定する(合計100) 00097 } colData[] = { 00098 {IDS_COLSEL_COLNAME1, LVCFMT_LEFT, 100}, 00099 // {IDS_COLSEL_COLNAME2, LVCFMT_LEFT, 50}, 00100 }; 00101 const int nColCount = sizeof colData / sizeof colData[0]; 00102 00103 // リストコントロールの幅 - スクロールバー 00104 CRect rc; 00105 m_lcColumnList.GetClientRect(&rc); 00106 int nCx = GetSystemMetrics(SM_CXVSCROLL); 00107 int nMaxWidth = rc.Width() - nCx; 00108 00109 // リストコントロールにアイコンのリソースを設定(OR/ANDアイコン) 00110 m_imlList.Create(IDB_COLUMN_TYPE, 16, 1, RGB(255,255,255) ); 00111 m_lcColumnList.SetImageList( &m_imlList, LVSIL_SMALL ); 00112 00113 //---------------------------------------- 00114 // リストコントロールにカラム追加 00115 //---------------------------------------- 00116 for (int nColumn = 0; nColumn < nColCount; nColumn++) 00117 { 00118 CString str; 00119 VERIFY(str.LoadString(colData[nColumn].nColHdrId)); 00120 int nWidth = nMaxWidth * colData[nColumn].nWidth / 100; 00121 m_lcColumnList.InsertColumn(nColumn, str, colData[nColumn].nFormat, nWidth); 00122 } 00123 00124 RefreshColumnList(); 00125 RefreshControl(); 00126 00127 return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります 00128 // 例外: OCX プロパティ ページの戻り値は FALSE となります 00129 } 00130 00131 void CColumnSelectDialog::OnOK() 00132 { 00133 // TODO: この位置にその他の検証用のコードを追加してください 00134 00135 //---------------------------------------- 00136 // 列情報を一時領域から書き戻し 00137 //---------------------------------------- 00138 RefreshColumnDataArray(); 00139 CnExpCsvApp* app = (CnExpCsvApp*)AfxGetApp(); 00140 app->m_arrData.Copy(m_arrData); 00141 00142 CDialog::OnOK(); 00143 } 00144 00145 void CColumnSelectDialog::OnEndlabeleditColumnList(NMHDR* pNMHDR, LRESULT* pResult) 00146 { 00147 LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 00148 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00149 // const unsigned int nItem = pDispInfo->item.iItem; 00150 const LPARAM lParam = pDispInfo->item.lParam; 00151 // const unsigned int nSubItem = pDispInfo->item.iSubItem; 00152 00153 CString strTitle; 00154 m_lcColumnList.GetEditControl()->GetWindowText(strTitle); 00155 m_arrData[lParam].SetTitle(strTitle); 00156 00157 *pResult = TRUE; 00158 } 00159 00160 void CColumnSelectDialog::OnKeydownColumnList(NMHDR* pNMHDR, LRESULT* pResult) 00161 { 00162 LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR; 00163 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00164 00165 //---------------------------------------- 00166 // カーソル位置のアイテムのエントリを取得 00167 // デフォルト値としてエントリに設定する 00168 //---------------------------------------- 00169 int nFcs = m_lcColumnList.GetNextItem(-1, LVNI_ALL | LVIS_FOCUSED); 00170 //--- -1 なら選択されていない 00171 if ( (nFcs >= 0)&&(pLVKeyDow->wVKey == VK_F2) ) 00172 m_lcColumnList.EditLabel(nFcs); 00173 00174 if ( pLVKeyDow->wVKey == VK_DELETE ) OnRemove(); 00175 *pResult = 0; 00176 } 00177 00178 void CColumnSelectDialog::OnAdd() 00179 { 00180 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00181 CFormulaDialog dlg; 00182 if ( IDOK == dlg.DoModal() ) { 00183 CColumnData column = dlg.GetColumnData(); 00184 CString strTitle; 00185 strTitle.Format(_T("式:%d"), m_arrData.GetSize()+1); 00186 column.SetTitle(strTitle); 00187 column.SetOutput(); 00188 int n = m_arrData.Add(column); 00189 00190 int nItem = m_lcColumnList.GetNextItem(-1, LVNI_ALL |LVIS_FOCUSED); 00191 if (nItem < 0) nItem = m_lcColumnList.GetItemCount(); 00192 //---------------------------------------- 00193 // エントリをユーザ一覧ビューに追加 00194 //---------------------------------------- 00195 LVITEM item; 00196 item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; 00197 item.pszText = LPSTR_TEXTCALLBACK; // コールバック 00198 item.iImage = I_IMAGECALLBACK; // コールバック 00199 item.lParam = (LPARAM) n; // データ配列の番号 00200 item.iItem = nItem; // 最終行に追加 00201 item.iSubItem = 0; 00202 00203 VERIFY( (nItem = m_lcColumnList.InsertItem(&item) ) >= 0); 00204 m_lcColumnList.SetCheck(nItem, column.IsOutput() ); 00205 } 00206 } 00207 00208 void CColumnSelectDialog::OnGetdispinfoColumnList(NMHDR* pNMHDR, LRESULT* pResult) 00209 { 00210 LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; 00211 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00212 // const unsigned int nItem = pDispInfo->item.iItem; 00213 // const LPARAM lParam = pDispInfo->item.lParam; 00214 CColumnData &column = GetColumnDataFromItem(pDispInfo->item.iItem); 00215 const unsigned int nSubItem = pDispInfo->item.iSubItem; 00216 //---------------------------------------- 00217 // AND/ORのイメージを表示 00218 //---------------------------------------- 00219 if (pDispInfo->item.mask & LVIF_IMAGE) 00220 { 00221 00222 if (column.IsFormula()) pDispInfo->item.iImage = 3; 00223 else if (column.IsIcon()) pDispInfo->item.iImage = 2; 00224 else if (column.IsHide()) pDispInfo->item.iImage = 1; 00225 else pDispInfo->item.iImage = 0; 00226 } 00227 //---------------------------------------- 00228 // 文字列を表示 00229 //---------------------------------------- 00230 if (pDispInfo->item.mask & LVIF_TEXT) 00231 { 00232 switch (nSubItem) 00233 { 00234 case 0: // 検索属性名 00235 pDispInfo->item.pszText = (LPTSTR)column.GetTitle(); 00236 break; 00237 default: 00238 pDispInfo->item.pszText = "-"; 00239 break; 00240 } 00241 } 00242 00243 *pResult = 0; 00244 } 00245 00246 void CColumnSelectDialog::OnUp() 00247 { 00248 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00249 00250 CUIntArray arrItem; 00251 int nItem = -1; 00252 while((nItem = m_lcColumnList.GetNextItem(nItem, LVNI_ALL |LVNI_SELECTED)) != -1) { 00253 arrItem.Add(nItem); 00254 } 00255 00256 for (int n=0; n<arrItem.GetSize(); n++) { 00257 nItem = arrItem[n]; 00258 if (nItem > n) SwapColumnListItem(nItem-1, nItem); 00259 } 00260 RefreshControl(); 00261 } 00262 00263 void CColumnSelectDialog::OnDown() 00264 { 00265 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00266 CUIntArray arrItem; 00267 int nItem = -1; 00268 while((nItem = m_lcColumnList.GetNextItem(nItem, LVNI_ALL |LVNI_SELECTED)) != -1) { 00269 arrItem.InsertAt(0, nItem); 00270 } 00271 00272 int nSize = m_lcColumnList.GetItemCount(); 00273 for (int n=0; n<arrItem.GetSize(); n++) { 00274 nItem = arrItem[n]; 00275 if (nItem < nSize-n-1) SwapColumnListItem(nItem, nItem+1); 00276 } 00277 RefreshControl(); 00278 } 00279 00280 void CColumnSelectDialog::SwapColumnListItem(int nItem1, int nItem2) 00281 { 00282 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00283 SetItemChanged(FALSE); 00284 00285 // CString strMsg; 00286 // strMsg.Format(_T("SwapColumnListItem(%d,%d)"), nItem1, nItem2); 00287 // AfxMessageBox(strMsg); 00288 00289 LPARAM lParam1 = m_lcColumnList.GetItemData(nItem1); 00290 LPARAM lParam2 = m_lcColumnList.GetItemData(nItem2); 00291 UINT uMask = LVIS_ACTIVATING | LVIS_CUT | LVIS_DROPHILITED | LVIS_FOCUSED | LVIS_OVERLAYMASK | LVIS_SELECTED | LVIS_STATEIMAGEMASK; 00292 UINT iState1 = m_lcColumnList.GetItemState(nItem1, uMask); 00293 UINT iState2 = m_lcColumnList.GetItemState(nItem2, uMask); 00294 00295 m_lcColumnList.SetItemData(nItem1, lParam2); 00296 m_lcColumnList.SetItemData(nItem2, lParam1); 00297 00298 m_lcColumnList.SetItemState(nItem1, iState2, uMask); 00299 m_lcColumnList.SetItemState(nItem2, iState1, uMask); 00300 00301 m_lcColumnList.SetItemText(nItem1, 0, LPSTR_TEXTCALLBACK ); 00302 m_lcColumnList.SetItemText(nItem2, 0, LPSTR_TEXTCALLBACK ); 00303 00304 SetItemChanged(); 00305 } 00306 00307 void CColumnSelectDialog::OnEdit() 00308 { 00309 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00310 int nItem = m_lcColumnList.GetNextItem(-1, LVNI_ALL |LVIS_FOCUSED); 00311 if (nItem < 0) return; 00312 00313 CFormulaDialog dlg; 00314 dlg.SetColumnData( GetColumnDataFromItem(nItem) ); 00315 if ( IDOK == dlg.DoModal() ) { 00316 SetColumnDataFromItem(nItem, dlg.GetColumnData()); 00317 } 00318 } 00319 00320 void CColumnSelectDialog::OnRemove() 00321 { 00322 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00323 CUIntArray arrItem; 00324 int nItem = -1; 00325 while((nItem = m_lcColumnList.GetNextItem(nItem, LVNI_ALL |LVNI_SELECTED)) != -1) { 00326 arrItem.InsertAt(0, nItem); 00327 } 00328 00329 for (int n=0; n<arrItem.GetSize(); n++) { 00330 nItem = arrItem[n]; 00331 if (GetColumnDataFromItem(nItem).IsFormula()) { 00332 SetColumnDataFromItem(nItem, CColumnData()); 00333 m_lcColumnList.DeleteItem(nItem); 00334 } 00335 } 00336 } 00337 00338 void CColumnSelectDialog::OnItemchangedColumnList(NMHDR* pNMHDR, LRESULT* pResult) 00339 { 00340 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 00341 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00342 if (!IsItemChanged()) return; 00343 00344 int nItem = pNMListView->iItem; 00345 if (nItem >= 0) { 00346 // アイテムのステータスが変化した場合 00347 if (pNMListView->uNewState != pNMListView->uOldState) { 00348 GetColumnDataFromItem(nItem).SetOutput( m_lcColumnList.GetCheck(nItem) ); 00349 } 00350 } 00351 00352 RefreshControl(); 00353 00354 *pResult = 0; 00355 } 00356 00357 void CColumnSelectDialog::RefreshControl() 00358 { 00359 // フォーカスがあるアイテムを取得 00360 int nItem = m_lcColumnList.GetNextItem(-1, LVNI_ALL |LVIS_FOCUSED); 00361 // なければ、ボタン無効 00362 BOOL bAdd = TRUE; 00363 BOOL bEdit = FALSE; 00364 BOOL bRemove = FALSE; 00365 if (nItem != -1) { 00366 // ただし、タイプが式の場合のみ有効 00367 bEdit = bRemove = GetColumnDataFromItem(nItem).IsFormula(); 00368 } 00369 if (m_btnAdd.IsWindowEnabled() != bAdd) m_btnAdd.EnableWindow(bAdd); 00370 if (m_btnEdit.IsWindowEnabled() != bEdit) m_btnEdit.EnableWindow(bEdit); 00371 if (m_btnRemove.IsWindowEnabled() != bRemove) m_btnRemove.EnableWindow(bRemove); 00372 00373 BOOL bUp = FALSE; 00374 BOOL bDown = FALSE; 00375 // 選択しているアイテムの一覧を取得 00376 CUIntArray arrItem; 00377 nItem = -1; 00378 while((nItem = m_lcColumnList.GetNextItem(nItem, LVNI_ALL |LVNI_SELECTED)) != -1) { 00379 arrItem.Add(nItem); 00380 } 00381 00382 if (arrItem.GetSize() > 0) { 00383 // 選択アイテムすべてが上に揃っている場合はボタン無効 00384 // 最下アイテムが何番目かで判別する 00385 int nLastItem = arrItem[arrItem.GetSize()-1]; 00386 bUp = ( nLastItem > arrItem.GetSize()-1 ); 00387 00388 // 選択アイテムすべてが下に揃っている場合はボタン無効 00389 // 最上アイテムが何番目かで判別する 00390 int nFirstItem = arrItem[0]; 00391 bDown = ( nFirstItem < m_lcColumnList.GetItemCount()-arrItem.GetSize() ); 00392 } 00393 00394 if (m_btnUp.IsWindowEnabled() && !bUp) GotoDlgCtrl( GetDlgItem(IDOK) ); 00395 m_btnUp.EnableWindow(bUp); 00396 00397 if (m_btnDown.IsWindowEnabled() && !bDown) GotoDlgCtrl( GetDlgItem(IDOK) ); 00398 m_btnDown.EnableWindow(bDown); 00399 } 00400 void CColumnSelectDialog::RefreshColumnDataArray() 00401 { 00402 CColumnDataArray arrData; 00403 for (int nItem=0; nItem<m_lcColumnList.GetItemCount(); nItem++) { 00404 CColumnData &column = GetColumnDataFromItem(nItem); 00405 if (column.IsNull()) continue; 00406 // column.SetOutput( m_lcColumnList.GetCheck(nItem) ); 00407 arrData.Add(column); 00408 } 00409 // m_arrData.RemoveAll(); 00410 m_arrData.Copy(arrData); 00411 } 00412 00413 void CColumnSelectDialog::RefreshColumnList() 00414 { 00415 SetItemChanged(FALSE); 00416 //---------------------------------------- 00417 // 列情報のアイテムを設定する 00418 //---------------------------------------- 00419 m_lcColumnList.DeleteAllItems(); 00420 int count = m_arrData.GetSize(); 00421 for (int n=0; n<count; n++) { 00422 CColumnData &column = m_arrData.ElementAt(n); 00423 00424 LVITEM item; 00425 item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; 00426 item.pszText = LPSTR_TEXTCALLBACK; // コールバック 00427 item.iImage = I_IMAGECALLBACK; // コールバック 00428 item.lParam = (LPARAM) n; // データ配列の番号 00429 item.iItem = m_lcColumnList.GetItemCount(); // 最終行に追加 00430 item.iSubItem = 0; 00431 00432 int nItem; 00433 VERIFY( (nItem = m_lcColumnList.InsertItem(&item) ) >= 0); 00434 m_lcColumnList.SetCheck(nItem, column.IsOutput() ); 00435 } 00436 00437 SetItemChanged(); 00438 } 00439 00440 void CColumnSelectDialog::OnSave() 00441 { 00442 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00443 00444 //---------------------------------------- 00445 // ファイル選択ダイアログ表示 00446 //---------------------------------------- 00447 static char szFileFilter[] = _T("CSVエクスポート定義ファイル(*.cef)|*.cef|すべてのファイル(*.*)|*.*||"); 00448 CFileDialog dlgFile(FALSE, _T("cef"), NULL, OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFileFilter); 00449 dlgFile.m_ofn.lpstrTitle = _T("CSVエクスポート定義ファイルの指定"); 00450 00451 switch ( dlgFile.DoModal() ) 00452 { 00453 case IDOK: 00454 RefreshColumnDataArray(); 00455 if ( m_arrData.Save(dlgFile.GetPathName()) ) { 00456 AfxMessageBox(_T("CSVエクスポート定義ファイルを保存しました。"), MB_ICONINFORMATION); 00457 } 00458 break; 00459 case -1: 00460 AfxMessageBox(_T("CFileDialogの構築に失敗しました。"), MB_ICONSTOP); 00461 case IDABORT: 00462 case IDCANCEL: 00463 default: 00464 break; 00465 }; 00466 } 00467 00468 void CColumnSelectDialog::OnOpen() 00469 { 00470 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください 00471 00472 //---------------------------------------- 00473 // ファイル選択ダイアログ表示 00474 //---------------------------------------- 00475 static char szFileFilter[] = _T("CSVエクスポート定義ファイル(*.cef)|*.cef|すべてのファイル(*.*)|*.*||"); 00476 CFileDialog dlgFile(TRUE, _T("cef"), NULL, OFN_EXPLORER | OFN_HIDEREADONLY |OFN_FILEMUSTEXIST, szFileFilter); 00477 dlgFile.m_ofn.lpstrTitle = _T("CSVエクスポート定義ファイルの選択"); 00478 00479 switch ( dlgFile.DoModal() ) 00480 { 00481 case IDOK: 00482 if ( m_arrData.Load(dlgFile.GetPathName()) ) { 00483 RefreshColumnList(); 00484 AfxMessageBox(_T("CSVエクスポート定義ファイルを開きました。"), MB_ICONINFORMATION); 00485 } 00486 break; 00487 case -1: 00488 AfxMessageBox(_T("CFileDialogの構築に失敗しました。"), MB_ICONSTOP); 00489 case IDABORT: 00490 case IDCANCEL: 00491 default: 00492 break; 00493 }; 00494 }

LotusNotes CSV Export Plug-inに対してWed Jun 30 15:53:52 2004に生成されました。 doxygen 1.3.7