source: filezilla/trunk/fuentes/src/interface/fileexistsdlg.cpp @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 3 years ago

Update new version: 3.15.02

File size: 7.7 KB
Line 
1#include <filezilla.h>
2#include "fileexistsdlg.h"
3#include "Options.h"
4#include "sizeformatting.h"
5#include "timeformatting.h"
6#include "themeprovider.h"
7#include "xrc_helper.h"
8
9#include <wx/display.h>
10
11BEGIN_EVENT_TABLE(CFileExistsDlg, wxDialogEx)
12EVT_BUTTON(XRCID("wxID_OK"), CFileExistsDlg::OnOK)
13EVT_BUTTON(XRCID("wxID_CANCEL"), CFileExistsDlg::OnCancel)
14EVT_CHECKBOX(wxID_ANY, CFileExistsDlg::OnCheck)
15END_EVENT_TABLE()
16
17CFileExistsDlg::CFileExistsDlg(CFileExistsNotification *pNotification)
18{
19        m_pNotification = pNotification;
20        m_action = CFileExistsNotification::overwrite;
21}
22
23bool CFileExistsDlg::Create(wxWindow* parent)
24{
25        wxASSERT(parent);
26
27        SetExtraStyle(wxWS_EX_BLOCK_EVENTS);
28        SetParent(parent);
29        if (!CreateControls()) {
30                return false;
31        }
32        GetSizer()->Fit(this);
33        GetSizer()->SetSizeHints(this);
34
35        return true;
36}
37
38void CFileExistsDlg::DisplayFile(bool left, wxString name, int64_t size, fz::datetime const& time, wxString const& iconFile)
39{
40        name = GetPathEllipsis(name, FindWindow(left ? XRCID("ID_FILE1_NAME") : XRCID("ID_FILE2_NAME")));
41        name.Replace(_T("&"), _T("&&"));
42
43        wxString sizeStr = _("Size unknown");
44        if (size >= 0) {
45                bool const thousands_separator = COptions::Get()->GetOptionVal(OPTION_SIZE_USETHOUSANDSEP) != 0;
46                sizeStr = CSizeFormat::Format(size, true, CSizeFormat::bytes, thousands_separator, 0);
47        }
48
49        wxString timeStr = _("Date/time unknown");
50        if (time.empty())
51                timeStr = CTimeFormat::Format(time);
52
53        xrc_call(*this, left ? "ID_FILE1_NAME" : "ID_FILE2_NAME", &wxStaticText::SetLabel, name);
54        xrc_call(*this, left ? "ID_FILE1_SIZE" : "ID_FILE2_SIZE", &wxStaticText::SetLabel, sizeStr);
55        xrc_call(*this, left ? "ID_FILE1_TIME" : "ID_FILE2_TIME", &wxStaticText::SetLabel, timeStr);
56
57        LoadIcon(left ? XRCID("ID_FILE1_ICON") : XRCID("ID_FILE2_ICON"), iconFile);
58}
59
60bool CFileExistsDlg::CreateControls()
61{
62        if (!Load(GetParent(), _T("ID_FILEEXISTSDLG"))) {
63                return false;
64        }
65
66        wxString localFile = m_pNotification->localFile;
67        wxString remoteFile = m_pNotification->remotePath.FormatFilename(m_pNotification->remoteFile);
68
69        DisplayFile(m_pNotification->download, localFile, m_pNotification->localSize, m_pNotification->localTime, m_pNotification->localFile);
70        DisplayFile(!m_pNotification->download, remoteFile, m_pNotification->remoteSize, m_pNotification->remoteTime, m_pNotification->remoteFile);
71
72        xrc_call(*this, "ID_UPDOWNONLY", &wxCheckBox::SetLabel, m_pNotification->download ? _("A&pply only to downloads") : _("A&pply only to uploads"));
73
74        return true;
75}
76
77void CFileExistsDlg::LoadIcon(int id, const wxString &file)
78{
79        wxStaticBitmap *pStatBmp = static_cast<wxStaticBitmap *>(FindWindow(id));
80        if (!pStatBmp)
81                return;
82
83        wxSize size = CThemeProvider::GetIconSize(iconSizeNormal);
84        pStatBmp->SetInitialSize(size);
85        pStatBmp->InvalidateBestSize();
86        pStatBmp->SetBitmap(CThemeProvider::GetBitmap(_T("ART_FILE"), wxART_OTHER, size));
87
88#ifdef __WXMSW__
89        SHFILEINFO fileinfo;
90        memset(&fileinfo, 0, sizeof(fileinfo));
91        if (SHGetFileInfo(file.wc_str(), FILE_ATTRIBUTE_NORMAL, &fileinfo, sizeof(fileinfo), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES)) {
92                wxBitmap bmp;
93                bmp.Create(size.x, size.y);
94
95                wxMemoryDC *dc = new wxMemoryDC;
96
97                wxPen pen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
98                wxBrush brush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
99
100                dc->SelectObject(bmp);
101
102                dc->SetPen(pen);
103                dc->SetBrush(brush);
104                dc->DrawRectangle(0, 0, size.x, size.y);
105
106                wxIcon icon;
107                icon.SetHandle(fileinfo.hIcon);
108                icon.SetSize(size.x, size.y);
109
110                dc->DrawIcon(icon, 0, 0);
111                delete dc;
112
113                pStatBmp->SetBitmap(bmp);
114
115                return;
116        }
117
118#endif //__WXMSW__
119
120        wxFileName fn(file);
121        wxString ext = fn.GetExt();
122        if (ext.empty())
123                return;
124
125        wxFileType *pType = wxTheMimeTypesManager->GetFileTypeFromExtension(ext);
126        if (pType) {
127                wxIconLocation loc;
128                if (pType->GetIcon(&loc) && loc.IsOk()) {
129                        wxLogNull *tmp = new wxLogNull;
130                        wxIcon icon(loc);
131                        delete tmp;
132                        if (!icon.Ok()) {
133                                delete pType;
134                                return;
135                        }
136
137                        int width = icon.GetWidth();
138                        int height = icon.GetHeight();
139                        if (width && height) {
140                                wxBitmap bmp;
141                                bmp.Create(icon.GetWidth(), icon.GetHeight());
142
143                                wxMemoryDC *dc = new wxMemoryDC;
144
145                                wxPen pen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
146                                wxBrush brush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
147
148                                dc->SelectObject(bmp);
149
150                                dc->SetPen(pen);
151                                dc->SetBrush(brush);
152                                dc->DrawRectangle(0, 0, width, height);
153
154                                dc->DrawIcon(icon, 0, 0);
155                                delete dc;
156
157                                pStatBmp->SetBitmap(bmp);
158
159                                return;
160                        }
161                }
162                delete pType;
163        }
164}
165
166void CFileExistsDlg::OnOK(wxCommandEvent&)
167{
168        if (xrc_call(*this, "ID_ACTION1", &wxRadioButton::GetValue))
169                m_action = CFileExistsNotification::overwrite;
170        else if (xrc_call(*this, "ID_ACTION2", &wxRadioButton::GetValue))
171                m_action = CFileExistsNotification::overwriteNewer;
172        else if (xrc_call(*this, "ID_ACTION3", &wxRadioButton::GetValue))
173                m_action = CFileExistsNotification::resume;
174        else if (xrc_call(*this, "ID_ACTION4", &wxRadioButton::GetValue))
175                m_action = CFileExistsNotification::rename;
176        else if (xrc_call(*this, "ID_ACTION5", &wxRadioButton::GetValue))
177                m_action = CFileExistsNotification::skip;
178        else if (xrc_call(*this, "ID_ACTION6", &wxRadioButton::GetValue))
179                m_action = CFileExistsNotification::overwriteSizeOrNewer;
180        else if (xrc_call(*this, "ID_ACTION7", &wxRadioButton::GetValue))
181                m_action = CFileExistsNotification::overwriteSize;
182        else
183                m_action = CFileExistsNotification::overwrite;
184
185        m_always = xrc_call(*this, "ID_ALWAYS", &wxCheckBox::GetValue);
186        m_directionOnly = xrc_call(*this, "ID_UPDOWNONLY", &wxCheckBox::GetValue);
187        m_queueOnly = xrc_call(*this, "ID_QUEUEONLY", &wxCheckBox::GetValue);
188        EndModal(wxID_OK);
189}
190
191enum CFileExistsNotification::OverwriteAction CFileExistsDlg::GetAction() const
192{
193        return m_action;
194}
195
196void CFileExistsDlg::OnCancel(wxCommandEvent&)
197{
198        m_action = CFileExistsNotification::skip;
199        EndModal(wxID_CANCEL);
200}
201
202bool CFileExistsDlg::Always(bool &directionOnly, bool &queueOnly) const
203{
204        directionOnly = m_directionOnly;
205        queueOnly = m_queueOnly;
206        return m_always;
207}
208
209wxString CFileExistsDlg::GetPathEllipsis(wxString path, wxWindow *window)
210{
211        int dn = wxDisplay::GetFromWindow(GetParent()); // Use parent window as the dialog isn't realized yet.
212        if (dn < 0) {
213                return path;
214        }
215
216        int string_width; // width of the path string in pixels
217        int y;                  // dummy variable
218        window->GetTextExtent(path, &string_width, &y);
219
220        wxDisplay display(dn);
221        wxRect rect = display.GetClientArea();
222        const int DESKTOP_WIDTH = rect.GetWidth(); // width of the desktop in pixels
223        const int maxWidth = (int)(DESKTOP_WIDTH * 0.75);
224
225        // If the path is already short enough, don't change it
226        if (string_width <= maxWidth || path.Length() < 20)
227                return path;
228
229        wxString fill = _T(" ");
230        fill += 0x2026; //unicode ellipsis character
231        fill += _T(" ");
232
233        int fillWidth;
234        window->GetTextExtent(fill, &fillWidth, &y);
235
236        // Do initial split roughly in the middle of the string
237        int middle = path.Length() / 2;
238        wxString left = path.Left(middle);
239        wxString right = path.Mid(middle);
240
241        int leftWidth, rightWidth;
242        window->GetTextExtent(left, &leftWidth, &y);
243        window->GetTextExtent(right, &rightWidth, &y);
244
245        // continue removing one character at a time around the fill until path string is small enough
246        while ((leftWidth + fillWidth + rightWidth) > maxWidth) {
247                if (leftWidth > rightWidth && left.Len() > 10) {
248                        left.RemoveLast();
249                        window->GetTextExtent(left, &leftWidth, &y);
250                }
251                else {
252                        if (right.Len() <= 10)
253                                break;
254
255                        right = right.Mid(1);
256                        window->GetTextExtent(right, &rightWidth, &y);
257                }
258        }
259
260        return left + fill + right;
261}
262
263void CFileExistsDlg::OnCheck(wxCommandEvent& event)
264{
265        if (event.GetId() != XRCID("ID_UPDOWNONLY") && event.GetId() != XRCID("ID_QUEUEONLY"))
266                return;
267
268        if (event.IsChecked())
269                XRCCTRL(*this, "ID_ALWAYS", wxCheckBox)->SetValue(true);
270}
Note: See TracBrowser for help on using the repository browser.