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

Last change on this file since 681 was 663, checked in by dai_9181, 15 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.