source: dev/trunk/ab5.0/abdev/abdev/FileTree.cpp@ 705

Last change on this file since 705 was 705, checked in by イグトランス (egtra), 16 years ago

ファイルハンドルが解放されず困ることがあるのでCHandleへ入れた。

File size: 7.1 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5FileListTreeViewCtrl *pobj_FileTree;
6
7WNDPROC OldFileTreeViewProc;
8
9BOOL CALLBACK DlgProject_FileProperty(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
10 HTREEITEM hTreeItem;
11 int i;
12 char temporary[MAX_PATH];
13 FILETIME LastWriteTime,LocalTime;
14 SYSTEMTIME SystemTime;
15
16 switch(message){
17 case WM_INITDIALOG:
18 {
19 SetPosCenter(hwnd);
20
21 hTreeItem = pobj_FileTree->GetSelectedItem();
22
23 std::string tempPath = projectInfo.fileSystem.root.FindFile( hTreeItem ).GetRelationalPath();
24
25 //絶対パス、相対パスを表示
26 lstrcpy( temporary, tempPath.c_str() );
27 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
28 SetDlgItemText(hwnd,IDC_USING_FILE,temporary);
29 SetDlgItemText(hwnd,IDC_DEFINED_FILE,tempPath.c_str());
30
31 //最終更新日時を表示
32 ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
33 if(hFile==INVALID_HANDLE_VALUE){
34 hFile.Detach();
35 //"エラー"
36 lstrcpy(temporary,STRING_ERROR);
37 }
38 else{
39 GetFileTime(hFile,NULL,NULL,&LastWriteTime);
40 FileTimeToLocalFileTime(&LastWriteTime,&LocalTime);
41 FileTimeToSystemTime(&LocalTime,&SystemTime);
42 if(SystemTime.wHour>=12){
43 //"午後 "
44 lstrcpy(temporary,STRING_AFTERNOON);
45 lstrcat(temporary," ");
46 SystemTime.wHour-=12;
47 }
48 else{
49 //"午前 "
50 lstrcpy(temporary,STRING_MORNING);
51 lstrcat(temporary," ");
52 }
53 sprintf(temporary+5,"%02d:%02d:%02d %04d/%02d/%02d",
54 SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond,
55 SystemTime.wYear,SystemTime.wMonth,SystemTime.wDay);
56 }
57 SetDlgItemText(hwnd,IDC_UPDATE_TIME,temporary);
58
59
60 //////////////
61 // 形式を表示
62 //////////////
63 i=GetFileExtension(tempPath.c_str());
64
65 //"Basic プログラム"
66 if(i==FT_BASICPROGRAM) lstrcpy(temporary,STRING_FILETYPE_BASICPROGRAM);
67 //"サブ プログラム"
68 else if(i==FT_SUBPROGRAM) lstrcpy(temporary,STRING_FILETYPE_SUBPROGRAM);
69 //"テキスト ドキュメント"
70 else if(i==FT_TEXT) lstrcpy(temporary,STRING_FILETYPE_TEXT);
71 //"判別できません"
72 else lstrcpy(temporary,STRING_FILETYPE_UNKNOWN);
73
74 SetDlgItemText(hwnd,IDC_FILETYPE,temporary);
75
76 break;
77 }
78 case WM_COMMAND:
79 switch(LOWORD(wParam)){
80 case IDOK:
81 EndDialog(hwnd,0);
82 return 1;
83 case IDCANCEL:
84 EndDialog(hwnd,0);
85 return 1;
86 }
87 break;
88 }
89 return 0;
90}
91
92LRESULT CALLBACK FileTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
93 HTREEITEM hTreeItem;
94 char temporary[MAX_PATH];
95 switch(message){
96 case WM_COMMAND:
97 switch(LOWORD(wParam)){
98 case IDM_FILETREE_INSERT:
99 //"プロジェクトへ挿入するファイルを指定して下さい"
100 extern LPSTR DefFileFilter;
101 if(!GetFilePathDialog(hOwner,temporary,DefFileFilter,STRING_FILEOPENTITLE_INSERTEDPROJECT,1)) break;
102 Project_File_Insert(temporary);
103 break;
104 case IDM_FILETREE_OPEN:
105 {
106 hTreeItem=TreeView_GetSelection(hwnd);
107
108 if( !projectInfo.fileSystem.root.IsExistFile( hTreeItem ) )
109 {
110 // ツリーアイテムに対するファイルが存在しない(フォルダなどの場合)
111 break;
112 }
113
114 std::string tempPath = projectInfo.fileSystem.root.FindFile( hTreeItem ).GetRelationalPath();
115
116 lstrcpy( temporary, tempPath.c_str() );
117 lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
118 OpenFileWithExtension(temporary);
119 break;
120 }
121 case IDM_FILETREE_DELETE:
122 hTreeItem=TreeView_GetSelection(hwnd);
123 Project_File_Delete(hTreeItem);
124 break;
125 case IDM_FILETREE_PROPERTY:
126 DialogBox(hResInst,MAKEINTRESOURCE(IDD_PROJECT_FILEPROPERTY),hOwner,(DLGPROC)DlgProject_FileProperty);
127 break;
128 }
129 return 0;
130 case WM_CHAR:
131 if(wParam==VK_RETURN){
132 SendMessage(hwnd,WM_COMMAND,IDM_FILETREE_OPEN,0);
133 //デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
134 return 0;
135 }
136 break;
137 case WM_KEYDOWN:
138 if(wParam==VK_DELETE){
139 SendMessage(hwnd,WM_COMMAND,IDM_FILETREE_DELETE,0);
140 }
141 break;
142 case WM_LBUTTONDBLCLK:
143 SendMessage(hwnd,WM_COMMAND,IDM_FILETREE_OPEN,0);
144 break;
145 }
146 return CallWindowProc(OldFileTreeViewProc,hwnd,message,wParam,lParam);
147}
148
149FileListTreeViewCtrl::FileListTreeViewCtrl( HWND hParent )
150 : CTreeViewCtrl()
151{
152 this->Create( hParent, NULL, NULL,
153 WS_CHILD | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,
154 WS_EX_CLIENTEDGE
155 );
156
157 OldFileTreeViewProc=(WNDPROC)this->GetWindowLongPtr(GWLP_WNDPROC);
158 this->SetWindowLongPtr(GWLP_WNDPROC,(long)FileTreeViewProc);
159
160 //イメージリスト読み込み、設定
161 hImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,3,0);
162 ImageList_AddIcon(hImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
163 ImageList_AddIcon(hImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
164 ImageList_AddIcon(hImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT)));
165 this->SetImageList(hImageList,TVSIL_NORMAL);
166}
167FileListTreeViewCtrl::~FileListTreeViewCtrl()
168{
169 this->DestroyWindow();
170 ImageList_Destroy(hImageList);
171}
172
173void FileListTreeViewCtrl::ContextMenu(POINT *pPos)
174{
175 //右クリックによるメニューを表示
176 TV_HITTESTINFO tvHitTestInfo;
177 tvHitTestInfo.pt=*pPos;
178 this->ScreenToClient(&tvHitTestInfo.pt);
179
180 HTREEITEM hTreeItem = this->HitTest(&tvHitTestInfo);
181 if(hTreeItem){
182 this->SelectItem(hTreeItem);
183
184 extern HMENU hFileTreeMenuBase;
185 if(this->GetRootItem()==hTreeItem)
186 {
187 TrackPopupMenu(GetSubMenu(hFileTreeMenuBase,0),TPM_LEFTALIGN,pPos->x,pPos->y,0,this->m_hWnd,0);
188 }
189 else
190 {
191 TrackPopupMenu(GetSubMenu(hFileTreeMenuBase,1),TPM_LEFTALIGN,pPos->x,pPos->y,0,this->m_hWnd,0);
192 }
193 }
194}
195
196HTREEITEM FileListTreeViewCtrl::Insert( const std::string &str )
197{
198 return this->InsertItem( str.c_str(), 2, 2, this->GetRootItem(), TVI_SORT );
199}
200
201void FileListTreeViewCtrl::Reset( HTREEITEM hParent, ActiveBasic::PM::FM::Folder &folder )
202{
203 char temporary[MAX_PATH],temp2[MAX_PATH];
204
205 lstrcpy( temporary, folder.GetName().c_str() );
206
207 TV_INSERTSTRUCT tv;
208 tv.hInsertAfter=TVI_SORT;
209 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
210 tv.hParent = hParent;
211 tv.item.iImage=0;
212 tv.item.iSelectedImage=0;
213 tv.item.pszText = temporary;
214 HTREEITEM hFolder = this->InsertItem( &tv );
215
216 BOOST_FOREACH( ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
217 {
218 this->Reset( hFolder, childFolder );
219 }
220
221 BOOST_FOREACH( ActiveBasic::PM::FM::File &file, folder.files )
222 {
223 _splitpath(file.GetRelationalPath().c_str(),0,0,temporary,temp2);
224 lstrcat(temporary,temp2);
225
226 TV_INSERTSTRUCT tv;
227 tv.hInsertAfter=TVI_SORT;
228 tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
229 tv.hParent = hFolder;
230 tv.item.iImage=2;
231 tv.item.iSelectedImage=2;
232 tv.item.pszText=temporary;
233 file.SetTreeViewHandle( this->InsertItem( &tv ) );
234 }
235}
236void FileListTreeViewCtrl::Reset( ActiveBasic::PM::FM::FileSystem &fileSystem )
237{
238 this->DeleteAllItems();
239
240 this->Reset( TVI_ROOT, fileSystem.root );
241}
Note: See TracBrowser for help on using the repository browser.