source: filezilla/trunk/fuentes/src/interface/recursive_operation_status.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: 4.2 KB
Line 
1#include <filezilla.h>
2#include "recursive_operation_status.h"
3
4#include "recursive_operation.h"
5#include "themeprovider.h"
6
7#include <wx/bmpbuttn.h>
8#include <wx/dcclient.h>
9
10BEGIN_EVENT_TABLE(CRecursiveOperationStatus, wxWindow)
11EVT_PAINT(CRecursiveOperationStatus::OnPaint)
12EVT_BUTTON(wxID_ANY, CRecursiveOperationStatus::OnCancel)
13EVT_TIMER(wxID_ANY, CRecursiveOperationStatus::OnTimer)
14END_EVENT_TABLE()
15
16CRecursiveOperationStatus::CRecursiveOperationStatus(wxWindow* parent, CState* pState)
17        : wxWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize)
18        , CStateEventHandler(pState)
19{
20        Hide();
21        SetBackgroundStyle(wxBG_STYLE_SYSTEM);
22
23        m_pState->RegisterHandler(this, STATECHANGE_RECURSION_STATUS);
24
25        m_pTextCtrl[0] = new wxStaticText(this, wxID_ANY, _T("Recursive operation in progress"), wxPoint(10, 10));
26        m_pTextCtrl[1] = new wxStaticText(this, wxID_ANY, _T("Recursive operation in progress"), wxPoint(10, 20));
27
28        int const textHeight = m_pTextCtrl[0]->GetSize().GetHeight();
29
30        // Set own size
31        wxSize size = GetSize();
32        size.SetHeight(textHeight * 3.5);
33        SetSize(size);
34
35        // Position stop button
36        wxBitmap bmp = CThemeProvider::Get()->GetBitmap(_T("ART_CANCEL"), wxART_OTHER, CThemeProvider::GetIconSize(iconSizeSmall));
37        wxSize s = bmp.GetSize();
38        s.IncBy(s.GetHeight() / 2);
39        auto button = new wxBitmapButton(this, wxID_ANY, bmp, wxPoint(10, (size.GetHeight() - s.GetHeight()) / 2), s);
40        button->SetToolTip(_("Stop recursive operation"));
41
42        // Position labels
43        m_pTextCtrl[0]->SetPosition(wxPoint(20 + s.GetWidth(), textHeight /2));
44        m_pTextCtrl[1]->SetPosition(wxPoint(20 + s.GetWidth(), textHeight * 2));
45
46        m_timer.SetOwner(this);
47}
48
49
50bool CRecursiveOperationStatus::Show(bool show)
51{
52        bool ret = wxWindow::Show(show);
53
54        wxSizeEvent evt;
55        GetParent()->ProcessWindowEvent(evt);
56
57        return ret;
58}
59
60void CRecursiveOperationStatus::OnStateChange(CState*, enum t_statechange_notifications, const wxString&, const void*)
61{
62        auto const mode = m_pState->GetRecursiveOperationHandler()->GetOperationMode();
63        bool show = mode != CRecursiveOperation::recursive_none && mode != CRecursiveOperation::recursive_list;
64        if (IsShown() != show) {
65                Show(show);
66        }
67
68        if (show) {
69                if (!m_timer.IsRunning()) {
70                        UpdateText();
71                        m_timer.Start(200, true);
72                }
73                else {
74                        m_changed = true;
75                }
76        }
77}
78
79void CRecursiveOperationStatus::UpdateText()
80{
81        m_changed = false;
82        wxString text;
83
84        auto const mode = m_pState->GetRecursiveOperationHandler()->GetOperationMode();
85        bool show = mode != CRecursiveOperation::recursive_none && mode != CRecursiveOperation::recursive_list;
86        if (show) {
87                switch (mode) {
88                case CRecursiveOperation::recursive_addtoqueue:
89                case CRecursiveOperation::recursive_addtoqueue_flatten:
90                case CRecursiveOperation::recursive_download:
91                case CRecursiveOperation::recursive_download_flatten:
92                        text = _("Recursively adding files to queue.");
93                        break;
94                case CRecursiveOperation::recursive_delete:
95                        text = _("Recursively deleting files and directories.");
96                        break;
97                case CRecursiveOperation::recursive_chmod:
98                        text = _("Recursively changing permissions.");
99                        break;
100                default:
101                        break;
102                }
103                m_pTextCtrl[0]->SetLabel(text);
104
105                unsigned long long const countFiles = static_cast<unsigned long long>(m_pState->GetRecursiveOperationHandler()->GetProcessedFiles());
106                unsigned long long const countDirs = static_cast<unsigned long long>(m_pState->GetRecursiveOperationHandler()->GetProcessedDirectories());
107                const wxString files = wxString::Format(wxPLURAL_LL("%llu file", "%llu files", countFiles), countFiles);
108                const wxString dirs = wxString::Format(wxPLURAL_LL("%llu directory", "%llu directories", countDirs), countDirs);
109                // @translator: Example: Processed 5 files in 1 directory
110                m_pTextCtrl[1]->SetLabel(wxString::Format(_("Processed %s in %s."), files, dirs));
111        }
112}
113
114void CRecursiveOperationStatus::OnPaint(wxPaintEvent&)
115{
116        wxPaintDC dc(this);
117
118        wxSize const s = GetClientSize();
119
120        dc.DrawLine(wxPoint(0, 0), wxPoint(s.GetWidth(), 0));
121}
122
123void CRecursiveOperationStatus::OnCancel(wxCommandEvent&)
124{
125        m_pState->GetRecursiveOperationHandler()->StopRecursiveOperation();
126        m_pState->RefreshRemote();
127}
128
129void CRecursiveOperationStatus::OnTimer(wxTimerEvent&)
130{
131        if (m_changed) {
132                UpdateText();
133                m_timer.Start(200, true);
134        }
135}
Note: See TracBrowser for help on using the repository browser.