source: filezilla/trunk/fuentes/src/interface/settings/settingsdialog.cpp @ 130

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

First release to xenial

File size: 7.1 KB
Line 
1#include <filezilla.h>
2#include "settingsdialog.h"
3#include "../Options.h"
4#include "optionspage.h"
5#include "optionspage_connection.h"
6#include "optionspage_connection_ftp.h"
7#include "optionspage_connection_active.h"
8#include "optionspage_connection_passive.h"
9#include "optionspage_ftpproxy.h"
10#include "optionspage_connection_sftp.h"
11#include "optionspage_filetype.h"
12#include "optionspage_fileexists.h"
13#include "optionspage_themes.h"
14#include "optionspage_language.h"
15#include "optionspage_transfer.h"
16#include "optionspage_updatecheck.h"
17#include "optionspage_logging.h"
18#include "optionspage_debug.h"
19#include "optionspage_interface.h"
20#include "optionspage_dateformatting.h"
21#include "optionspage_sizeformatting.h"
22#include "optionspage_edit.h"
23#include "optionspage_edit_associations.h"
24#include "optionspage_proxy.h"
25#include "optionspage_filelists.h"
26#include "../filezillaapp.h"
27#include "../Mainfrm.h"
28
29BEGIN_EVENT_TABLE(CSettingsDialog, wxDialogEx)
30EVT_TREE_SEL_CHANGING(XRCID("ID_TREE"), CSettingsDialog::OnPageChanging)
31EVT_TREE_SEL_CHANGED(XRCID("ID_TREE"), CSettingsDialog::OnPageChanged)
32EVT_BUTTON(XRCID("wxID_OK"), CSettingsDialog::OnOK)
33EVT_BUTTON(XRCID("wxID_CANCEL"), CSettingsDialog::OnCancel)
34END_EVENT_TABLE()
35
36CSettingsDialog::CSettingsDialog(CFileZillaEngineContext & engine_context)
37        : m_engine_context(engine_context)
38{
39        m_pOptions = COptions::Get();
40}
41
42CSettingsDialog::~CSettingsDialog()
43{
44}
45
46bool CSettingsDialog::Create(CMainFrame* pMainFrame)
47{
48        m_pMainFrame = pMainFrame;
49
50        SetExtraStyle(wxWS_EX_BLOCK_EVENTS);
51        SetParent(pMainFrame);
52        if (!Load(GetParent(), _T("ID_SETTINGS")))
53                return false;
54
55        if (!LoadPages())
56                return false;
57
58        return true;
59}
60
61void CSettingsDialog::AddPage(wxString const& name, COptionsPage* page, int nest)
62{
63        wxTreeCtrl* treeCtrl = XRCCTRL(*this, "ID_TREE", wxTreeCtrl);
64        wxTreeItemId parent = treeCtrl->GetRootItem();
65        while( nest-- ) {
66                parent = treeCtrl->GetLastChild(parent);
67                wxCHECK_RET( parent != wxTreeItemId(), "Nesting level too deep" );
68        }
69
70        t_page p;
71        p.page = page;
72        p.id = treeCtrl->AppendItem(parent, name);
73        if( parent != treeCtrl->GetRootItem() ) {
74                treeCtrl->Expand(parent);
75        }
76
77        m_pages.push_back(p);
78}
79
80bool CSettingsDialog::LoadPages()
81{
82        // Get the tree control.
83
84        wxTreeCtrl* treeCtrl = XRCCTRL(*this, "ID_TREE", wxTreeCtrl);
85        wxASSERT(treeCtrl);
86        if (!treeCtrl)
87                return false;
88
89        treeCtrl->AddRoot(wxString());
90
91        // Create the instances of the page classes and fill the tree.
92        AddPage(_("Connection"), new COptionsPageConnection, 0);
93        AddPage(_("FTP"), new COptionsPageConnectionFTP, 1);
94        AddPage(_("Active mode"), new COptionsPageConnectionActive, 2);
95        AddPage(_("Passive mode"), new COptionsPageConnectionPassive, 2);
96        AddPage(_("FTP Proxy"), new COptionsPageFtpProxy, 2);
97        AddPage(_("SFTP"), new COptionsPageConnectionSFTP, 1);
98        AddPage(_("Generic proxy"), new COptionsPageProxy, 1);
99        AddPage(_("Transfers"), new COptionsPageTransfer, 0);
100        AddPage(_("File Types"), new COptionsPageFiletype, 1);
101        AddPage(_("File exists action"), new COptionsPageFileExists, 1);
102        AddPage(_("Interface"), new COptionsPageInterface, 0);
103        AddPage(_("Themes"), new COptionsPageThemes, 1);
104        AddPage(_("Date/time format"), new COptionsPageDateFormatting, 1);
105        AddPage(_("Filesize format"), new COptionsPageSizeFormatting, 1);
106        AddPage(_("File lists"), new COptionsPageFilelists, 1);
107        AddPage(_("Language"), new COptionsPageLanguage, 0);
108        AddPage(_("File editing"), new COptionsPageEdit, 0);
109        AddPage(_("Filetype associations"), new COptionsPageEditAssociations, 1);
110#if FZ_MANUALUPDATECHECK && FZ_AUTOUPDATECHECK
111        if (!COptions::Get()->GetOptionVal(OPTION_DEFAULT_DISABLEUPDATECHECK)) {
112                AddPage(_("Updates"), new COptionsPageUpdateCheck, 0);
113        }
114#endif //FZ_MANUALUPDATECHECK && FZ_AUTOUPDATECHECK
115        AddPage(_("Logging"), new COptionsPageLogging, 0);
116        AddPage(_("Debug"), new COptionsPageDebug, 0);
117
118        treeCtrl->SetQuickBestSize(false);
119        treeCtrl->InvalidateBestSize();
120        treeCtrl->SetInitialSize();
121
122        // Compensate for scrollbar
123        wxSize size = treeCtrl->GetBestSize();
124        int scrollWidth = wxSystemSettings::GetMetric(wxSYS_VSCROLL_X, treeCtrl);
125        size.x += scrollWidth + 2;
126        size.y = 400;
127        treeCtrl->SetInitialSize(size);
128        Layout();
129
130        // Before we can initialize the pages, get the target panel in the settings
131        // dialog.
132        wxPanel* parentPanel = XRCCTRL(*this, "ID_PAGEPANEL", wxPanel);
133        wxASSERT(parentPanel);
134        if (!parentPanel)
135                return false;
136
137        // Keep track of maximum page size
138        size = wxSize();
139
140        for (auto const& page : m_pages) {
141                if (!page.page->CreatePage(m_pOptions, this, parentPanel, size))
142                        return false;
143        }
144
145        if (!LoadSettings()) {
146                wxMessageBoxEx(_("Failed to load panels, invalid resource files?"));
147                return false;
148        }
149
150        wxSize canvas;
151        canvas.x = GetSize().x - parentPanel->GetSize().x;
152        canvas.y = GetSize().y - parentPanel->GetSize().y;
153
154        // Wrap pages nicely
155        std::vector<wxWindow*> pages;
156        for (auto const& page : m_pages) {
157                pages.push_back(page.page);
158        }
159        wxGetApp().GetWrapEngine()->WrapRecursive(pages, 1.33, "Settings", canvas);
160
161#ifdef __WXGTK__
162        // Pre-show dialog under GTK, else panels won't get initialized properly
163        Show();
164#endif
165
166        // Keep track of maximum page size
167        size = wxSize(0, 0);
168        for (auto const& page : m_pages) {
169                size.IncTo(page.page->GetSizer()->GetMinSize());
170        }
171
172        wxSize panelSize = size;
173#ifdef __WXGTK__
174        panelSize.x += 1;
175#endif
176        parentPanel->SetInitialSize(panelSize);
177
178        // Adjust pages sizes according to maximum size
179        for (auto const& page : m_pages) {
180                page.page->GetSizer()->SetMinSize(size);
181                page.page->GetSizer()->Fit(page.page);
182                page.page->GetSizer()->SetSizeHints(page.page);
183                if( GetLayoutDirection() == wxLayout_RightToLeft ) {
184                        page.page->Move(wxPoint(1, 0));
185                }
186        }
187
188        GetSizer()->Fit(this);
189        GetSizer()->SetSizeHints(this);
190
191        for (auto const& page : m_pages) {
192                page.page->Hide();
193        }
194
195        // Select first page
196        treeCtrl->SelectItem(m_pages[0].id);
197        if (!m_activePanel)     {
198                m_activePanel = m_pages[0].page;
199                m_activePanel->Display();
200        }
201
202        return true;
203}
204
205bool CSettingsDialog::LoadSettings()
206{
207        for (auto const& page : m_pages) {
208                if (!page.page->LoadPage())
209                        return false;
210        }
211
212        return true;
213}
214
215void CSettingsDialog::OnPageChanged(wxTreeEvent& event)
216{
217        if (m_activePanel)
218                m_activePanel->Hide();
219
220        wxTreeItemId item = event.GetItem();
221
222        for( auto const& page : m_pages ) {
223                if (page.id == item) {
224                        m_activePanel = page.page;
225                        m_activePanel->Display();
226                        break;
227                }
228        }
229}
230
231void CSettingsDialog::OnOK(wxCommandEvent& event)
232{
233        for( auto const& page : m_pages ) {
234                if (!page.page->Validate()) {
235                        if (m_activePanel != page.page) {
236                                wxTreeCtrl* treeCtrl = XRCCTRL(*this, "ID_TREE", wxTreeCtrl);
237                                treeCtrl->SelectItem(page.id);
238                        }
239                        return;
240                }
241        }
242
243        for( auto const& page : m_pages ) {
244                page.page->SavePage();
245        }
246
247        EndModal(wxID_OK);
248}
249
250void CSettingsDialog::OnCancel(wxCommandEvent& event)
251{
252        EndModal(wxID_CANCEL);
253
254        for (auto const& saved : m_oldValues) {
255                m_pOptions->SetOption(saved.first, saved.second);
256        }
257}
258
259void CSettingsDialog::OnPageChanging(wxTreeEvent& event)
260{
261        if (!m_activePanel)
262                return;
263
264        if (!m_activePanel->Validate())
265                event.Veto();
266}
267
268void CSettingsDialog::RememberOldValue(int option)
269{
270        m_oldValues[option] = m_pOptions->GetOption(option);
271}
Note: See TracBrowser for help on using the repository browser.