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

Last change on this file since 681 was 663, checked in by dai_9181, 16 years ago

ファイルツリー内のフォルダをダブルクリックすると、強制終了してしまう不具合を修正

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