OSDN Git Service

78c75a39b44278eccec08395c2ddbbd7a10a7619
[tpi/lychee.git] / src / lychee / cls_filedroptarget.cpp
1 /*******************************************************************************\r
2   TPI - flexible but useless plug-in framework.\r
3   Copyright (C) 2002-2009 Silky\r
4 \r
5   This library is free software; you can redistribute it and/or modify it under\r
6   the terms of the GNU Lesser General Public License as published by the Free\r
7   Software Foundation; either version 2.1 of the License, or (at your option)\r
8   any later version.\r
9 \r
10   This library is distributed in the hope that it will be useful, but WITHOUT\r
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \r
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\r
13   for more details.\r
14 \r
15   You should have received a copy of the GNU Lesser General Public License along\r
16   with this library; if not, write to the Free Software Foundation, Inc.,\r
17   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
18 \r
19   $Id$\r
20 *******************************************************************************/\r
21 \r
22 #include "lychee.h"\r
23 \r
24 #include "frm_main.h"\r
25 #include "cls_filedroptarget.h"\r
26 \r
27 //******************************************************************************\r
28 // myFileDropTarget\r
29 //******************************************************************************\r
30 \r
31 myFileDropTarget::myFileDropTarget(MainFrame * mainFrame)\r
32 {\r
33         this->mainFrame = mainFrame;\r
34 }\r
35 \r
36 //******************************************************************************\r
37 // Event handler.\r
38 //******************************************************************************\r
39 \r
40 bool myFileDropTarget::OnDropFiles(wxCoord, wxCoord, const wxArrayString & asFiles)\r
41 {\r
42 #if wxCHECK_VERSION(2, 9, 0)\r
43         wxThreadEvent * e;\r
44 #else\r
45         wxCommandEvent * e;\r
46 #endif\r
47 \r
48         // ファイルが存在するか確認。\r
49         if (asFiles.GetCount() == 1 && ::wxFileExists(asFiles[0]))\r
50         {\r
51                 // 対応しているかどうか確認。\r
52                 wxULongLong_t llFileCount = 0;\r
53                 if (this->mainFrame->LoadTPI(asFiles[0], & llFileCount))\r
54                 {\r
55                         // 書庫を開く。\r
56 #if wxCHECK_VERSION(2, 9, 0)\r
57                         e = new wxThreadEvent(wxEVT_COMMAND_MENU_SELECTED, XRCID("Arc_Open"));\r
58 #else\r
59                         e = new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, XRCID("Arc_Open"));\r
60 #endif\r
61                         e->SetInt(2);\r
62                         e->SetExtraLong((long) llFileCount);\r
63                         this->mainFrame->fnArchive = wxFileName(asFiles[0]);\r
64 #if wxCHECK_VERSION(2, 9, 0)\r
65                         ::wxQueueEvent(this->mainFrame, e);\r
66 #else\r
67                         this->mainFrame->OnArcOpen(* e);\r
68                         delete e;\r
69 #endif\r
70                         return true;\r
71                 }\r
72         }\r
73 \r
74         // 対応していない場合は書庫の作成を試みる。\r
75         this->as = asFiles;\r
76 #if wxCHECK_VERSION(2, 9, 0)\r
77         e = new wxThreadEvent(wxEVT_COMMAND_MENU_SELECTED, XRCID("Arc_Create"));\r
78 #else\r
79         e = new wxCommandEvent(wxEVT_COMMAND_MENU_SELECTED, XRCID("Arc_Create"));\r
80 #endif\r
81         e->SetClientData(& this->as);\r
82 #if wxCHECK_VERSION(2, 9, 0)\r
83         ::wxQueueEvent(this->mainFrame, e);\r
84 #else\r
85         this->mainFrame->OnArcCreate(* e);\r
86         delete e;\r
87 #endif\r
88         return true;\r
89 }\r
90 \r
91 //******************************************************************************\r
92 // myFileDataObject\r
93 //******************************************************************************\r
94 \r
95 myFileDataObject::~myFileDataObject()\r
96 {\r
97         // ファイルを削除。\r
98         for (size_t i = 0; i < this->m_filenames.GetCount(); i++)\r
99         {\r
100                 chmod(this->m_filenames[i].ToUTF8(), 0600);\r
101                 ::wxRemoveFile(this->m_filenames[i]);\r
102         }\r
103 \r
104         // 一時ディレクトリを削除。\r
105         ::wxRmdir(this->szTempDir);\r
106 }\r
107 \r
108 #ifdef __LINUX__\r
109 // wxGTKのwxFileDataObjectでは多バイト文字の扱いに問題があるので代替。\r
110 bool myFileDataObject::GetDataHere(void * buf) const\r
111 {\r
112         wxString filenames;\r
113         for (size_t i = 0; i < m_filenames.GetCount(); i++)\r
114         {\r
115                 filenames += wxT("file:") + m_filenames[i] + wxT("\r\n");\r
116         }\r
117         memcpy(buf, filenames.mbc_str(), strlen(filenames.mbc_str()) + 1);\r
118         return true;\r
119 }\r
120 \r
121 size_t myFileDataObject::GetDataSize() const\r
122 {\r
123         size_t res = 1;\r
124         for (size_t i = 0; i < m_filenames.GetCount(); i++)\r
125         {\r
126                 res += strlen(m_filenames[i].mbc_str()) + 5 + 2; // "file:" (5) + "\r\n" (2)\r
127         }\r
128         return res;\r
129 }\r
130 \r
131 void myFileDataObject::AddFile(const wxString & filename)\r
132 {\r
133         m_filenames.Add(filename);\r
134 }\r
135 #endif\r