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

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

Update new version: 3.15.02

File size: 9.4 KB
Line 
1#include <filezilla.h>
2#include "filteredit.h"
3#include "customheightlistctrl.h"
4#include "window_state_manager.h"
5#include "Options.h"
6
7BEGIN_EVENT_TABLE(CFilterEditDialog, CFilterConditionsDialog)
8EVT_BUTTON(XRCID("wxID_OK"), CFilterEditDialog::OnOK)
9EVT_BUTTON(XRCID("wxID_CANCEL"), CFilterEditDialog::OnCancel)
10EVT_BUTTON(XRCID("ID_NEW"), CFilterEditDialog::OnNew)
11EVT_BUTTON(XRCID("ID_DELETE"), CFilterEditDialog::OnDelete)
12EVT_BUTTON(XRCID("ID_RENAME"), CFilterEditDialog::OnRename)
13EVT_BUTTON(XRCID("ID_COPY"), CFilterEditDialog::OnCopy)
14EVT_LISTBOX(XRCID("ID_FILTERS"), CFilterEditDialog::OnFilterSelect)
15END_EVENT_TABLE()
16
17CFilterEditDialog::CFilterEditDialog()
18        : m_pFilterListCtrl(0)
19        , m_currentSelection(-1)
20        , m_pWindowStateManager(0)
21{
22}
23
24CFilterEditDialog::~CFilterEditDialog()
25{
26        if (m_pWindowStateManager)
27        {
28                m_pWindowStateManager->Remember(OPTION_FILTEREDIT_SIZE);
29                delete m_pWindowStateManager;
30        }
31}
32
33void CFilterEditDialog::OnOK(wxCommandEvent&)
34{
35        if (!Validate())
36                return;
37
38        if (m_currentSelection != -1)
39        {
40                wxASSERT((unsigned int)m_currentSelection < m_filters.size());
41                SaveFilter(m_filters[m_currentSelection]);
42        }
43        for (unsigned int i = 0; i < m_filters.size(); i++)
44        {
45                if (!m_filters[i].HasConditionOfType(filter_permissions) && !m_filters[i].HasConditionOfType(filter_attributes))
46                        continue;
47
48                for (unsigned int j = 0; j < m_filterSets.size(); j++)
49                        m_filterSets[j].remote[i] = false;
50        }
51
52        EndModal(wxID_OK);
53}
54
55void CFilterEditDialog::OnCancel(wxCommandEvent&)
56{
57        EndModal(wxID_CANCEL);
58}
59
60bool CFilterEditDialog::Create(wxWindow* parent, const std::vector<CFilter>& filters, const std::vector<CFilterSet>& filterSets)
61{
62        bool has_foreign_type = false;
63        for (std::vector<CFilter>::const_iterator iter = filters.begin(); iter != filters.end(); ++iter)
64        {
65                const CFilter& filter = *iter;
66                if (!filter.HasConditionOfType(filter_foreign))
67                        continue;
68
69                has_foreign_type = true;
70                break;
71        }
72
73        if (!Load(parent, _T("ID_EDITFILTER")))
74                return false;
75
76        int conditions = filter_name | filter_size | filter_path | filter_meta | filter_date;
77        if (has_foreign_type)
78                conditions |= filter_foreign;
79        if (!CreateListControl(conditions))
80                return false;
81
82        m_pFilterListCtrl = XRCCTRL(*this, "ID_FILTERS", wxListBox);
83        if (!m_pFilterListCtrl)
84                return false;
85        m_currentSelection = -1;
86
87        m_filters = filters;
88        m_filterSets = filterSets;
89        for (std::vector<CFilter>::const_iterator iter = filters.begin(); iter != filters.end(); ++iter)
90                m_pFilterListCtrl->Append(iter->name);
91
92        m_pWindowStateManager = new CWindowStateManager(this);
93        m_pWindowStateManager->Restore(OPTION_FILTEREDIT_SIZE, wxSize(750, 500));
94
95        Layout();
96
97        SetCtrlState(false);
98
99        return true;
100}
101
102void CFilterEditDialog::SaveFilter(CFilter& filter)
103{
104        filter = GetFilter();
105
106        filter.matchCase = XRCCTRL(*this, "ID_CASE", wxCheckBox)->GetValue();
107
108        filter.filterFiles = XRCCTRL(*this, "ID_FILES", wxCheckBox)->GetValue();
109        filter.filterDirs = XRCCTRL(*this, "ID_DIRS", wxCheckBox)->GetValue();
110
111        filter.name = XRCCTRL(*this, "ID_NAME", wxTextCtrl)->GetValue();
112        if (filter.name != m_pFilterListCtrl->GetString(m_currentSelection))
113        {
114                int oldSelection = m_currentSelection;
115                m_pFilterListCtrl->Delete(oldSelection);
116                m_pFilterListCtrl->Insert(filter.name, oldSelection);
117                m_pFilterListCtrl->SetSelection(oldSelection);
118        }
119}
120
121void CFilterEditDialog::OnNew(wxCommandEvent&)
122{
123        if (m_currentSelection != -1)
124        {
125                if (!Validate())
126                        return;
127                SaveFilter(m_filters[m_currentSelection]);
128        }
129
130        int index = 1;
131        wxString name = _("New filter");
132        wxString newName = name;
133        while (m_pFilterListCtrl->FindString(newName) != wxNOT_FOUND)
134                newName = wxString::Format(_T("%s (%d)"), name, ++index);
135
136        wxTextEntryDialog dlg(this, _("Please enter a name for the new filter."), _("Enter filter name"), newName);
137        if (dlg.ShowModal() != wxID_OK)
138                return;
139        newName = dlg.GetValue();
140
141        if (newName.empty())
142        {
143                wxMessageBoxEx(_("No filter name given"), _("Cannot create new filter"), wxICON_INFORMATION);
144                return;
145        }
146
147        if (m_pFilterListCtrl->FindString(newName) != wxNOT_FOUND)
148        {
149                wxMessageBoxEx(_("The entered filter name already exists, please choose a different name."), _("Filter name already exists"), wxICON_ERROR, this);
150                return;
151        }
152
153        CFilter filter;
154        filter.name = newName;
155
156        m_filters.push_back(filter);
157
158        for (auto iter = m_filterSets.begin(); iter != m_filterSets.end(); ++iter)
159        {
160                CFilterSet& set = *iter;
161                set.local.push_back(false);
162                set.remote.push_back(false);
163        }
164
165        int item = m_pFilterListCtrl->Append(newName);
166        m_pFilterListCtrl->Select(item);
167        wxCommandEvent evt;
168        OnFilterSelect(evt);
169}
170
171void CFilterEditDialog::OnDelete(wxCommandEvent&)
172{
173        int item = m_pFilterListCtrl->GetSelection();
174        if (item == -1)
175                return;
176
177        m_currentSelection = -1;
178        m_pFilterListCtrl->Delete(item);
179        m_filters.erase(m_filters.begin() + item);
180
181        // Remote filter from all filter sets
182        for (auto iter = m_filterSets.begin(); iter != m_filterSets.end(); ++iter)
183        {
184                CFilterSet& set = *iter;
185                set.local.erase(set.local.begin() + item);
186                set.remote.erase(set.remote.begin() + item);
187        }
188
189        ClearFilter(true);
190        SetCtrlState(false);
191}
192
193void CFilterEditDialog::OnRename(wxCommandEvent&)
194{
195        const wxString& oldName = XRCCTRL(*this, "ID_NAME", wxTextCtrl)->GetValue();
196        wxTextEntryDialog *pDlg = new wxTextEntryDialog(this, _("Please enter a new name for the filter."), _("Enter filter name"), oldName);
197        if (pDlg->ShowModal() != wxID_OK)
198        {
199                delete pDlg;
200                return;
201        }
202
203        const wxString& newName = pDlg->GetValue();
204        delete pDlg;
205
206        if (newName.empty())
207        {
208                wxMessageBoxEx(_("Empty filter names are not allowed."), _("Empty name"), wxICON_ERROR, this);
209                return;
210        }
211
212        if (newName == oldName)
213                return;
214
215        if (m_pFilterListCtrl->FindString(newName) != wxNOT_FOUND)
216        {
217                wxMessageBoxEx(_("The entered filter name already exists, please choose a different name."), _("Filter name already exists"), wxICON_ERROR, this);
218                return;
219        }
220
221        m_pFilterListCtrl->Delete(m_currentSelection);
222        m_pFilterListCtrl->Insert(newName, m_currentSelection);
223        m_pFilterListCtrl->Select(m_currentSelection);
224}
225
226void CFilterEditDialog::OnCopy(wxCommandEvent&)
227{
228        if (m_currentSelection == -1)
229                return;
230
231        if (!Validate())
232                return;
233        SaveFilter(m_filters[m_currentSelection]);
234
235        CFilter filter = m_filters[m_currentSelection];
236
237        int index = 1;
238        const wxString& name = filter.name;
239        wxString newName = name;
240        while (m_pFilterListCtrl->FindString(newName) != wxNOT_FOUND)
241                newName = wxString::Format(_T("%s (%d)"), name, ++index);
242
243        wxTextEntryDialog dlg(this, _("Please enter a new name for the copied filter."), _("Enter filter name"), newName);
244        if (dlg.ShowModal() != wxID_OK)
245                return;
246
247        newName = dlg.GetValue();
248        if (newName.empty())
249        {
250                wxMessageBoxEx(_("Empty filter names are not allowed."), _("Empty name"), wxICON_ERROR, this);
251                return;
252        }
253
254        if (m_pFilterListCtrl->FindString(newName) != wxNOT_FOUND)
255        {
256                wxMessageBoxEx(_("The entered filter name already exists, please choose a different name."), _("Filter name already exists"), wxICON_ERROR, this);
257                return;
258        }
259
260        filter.name = newName;
261
262        m_filters.push_back(filter);
263
264        for (auto iter = m_filterSets.begin(); iter != m_filterSets.end(); ++iter)
265        {
266                CFilterSet& set = *iter;
267                set.local.push_back(false);
268                set.remote.push_back(false);
269        }
270
271        int item = m_pFilterListCtrl->Append(newName);
272        m_pFilterListCtrl->Select(item);
273        wxCommandEvent evt;
274        OnFilterSelect(evt);
275}
276
277void CFilterEditDialog::OnFilterSelect(wxCommandEvent&)
278{
279        int item = m_pFilterListCtrl->GetSelection();
280        if (item == -1) {
281                m_currentSelection = -1;
282                SetCtrlState(false);
283                return;
284        }
285        else
286                SetCtrlState(true);
287
288        if (item == m_currentSelection)
289                return;
290
291        if (m_currentSelection != -1) {
292                wxASSERT((unsigned int)m_currentSelection < m_filters.size());
293
294                if (!Validate())
295                        return;
296
297                SaveFilter(m_filters[m_currentSelection]);
298        }
299
300        m_currentSelection = item;
301        m_pFilterListCtrl->SetSelection(item); // In case SaveFilter has renamed an item
302        CFilter filter = m_filters[item];
303        EditFilter(filter);
304
305        XRCCTRL(*this, "ID_CASE", wxCheckBox)->SetValue(filter.matchCase);
306
307        XRCCTRL(*this, "ID_FILES", wxCheckBox)->SetValue(filter.filterFiles);
308        XRCCTRL(*this, "ID_DIRS", wxCheckBox)->SetValue(filter.filterDirs);
309
310        XRCCTRL(*this, "ID_NAME", wxTextCtrl)->SetValue(filter.name);
311}
312
313void CFilterEditDialog::SetCtrlState(bool enabled)
314{
315        XRCCTRL(*this, "ID_FILES", wxCheckBox)->Enable(enabled);
316        XRCCTRL(*this, "ID_DIRS", wxCheckBox)->Enable(enabled);
317}
318
319const std::vector<CFilter>& CFilterEditDialog::GetFilters() const
320{
321        return m_filters;
322}
323
324const std::vector<CFilterSet>& CFilterEditDialog::GetFilterSets() const
325{
326        return m_filterSets;
327}
328
329bool CFilterEditDialog::Validate()
330{
331        if (m_currentSelection == -1)
332                return true;
333
334        wxString error;
335        if (!ValidateFilter(error)) {
336                m_pFilterListCtrl->SetSelection(m_currentSelection);
337                wxMessageBoxEx(error, _("Filter validation failed"), wxICON_ERROR, this);
338                return false;
339        }
340
341        wxString name = XRCCTRL(*this, "ID_NAME", wxTextCtrl)->GetValue();
342        if (name.empty()) {
343                m_pFilterListCtrl->SetSelection(m_currentSelection);
344                XRCCTRL(*this, "ID_NAME", wxTextCtrl)->SetFocus();
345                wxMessageBoxEx(_("Need to enter filter name"), _("Filter validation failed"), wxICON_ERROR, this);
346                return false;
347        }
348
349        int pos = m_pFilterListCtrl->FindString(name);
350        if (pos != wxNOT_FOUND && pos != m_currentSelection) {
351                m_pFilterListCtrl->SetSelection(m_currentSelection);
352                XRCCTRL(*this, "ID_NAME", wxTextCtrl)->SetFocus();
353                wxMessageBoxEx(_("Filter name already exists"), _("Filter validation failed"), wxICON_ERROR, this);
354                return false;
355        }
356
357        return true;
358}
Note: See TracBrowser for help on using the repository browser.