source: filezilla/trunk/fuentes/src/interface/context_control.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: 19.8 KB
Line 
1#include <filezilla.h>
2#include "commandqueue.h"
3#include "context_control.h"
4#include "filelist_statusbar.h"
5#include "filezillaapp.h"
6#include "LocalListView.h"
7#include "LocalTreeView.h"
8#include "Mainfrm.h"
9#include "Options.h"
10#include "queue.h"
11#include "recursive_operation.h"
12#include "recursive_operation_status.h"
13#include "RemoteListView.h"
14#include "RemoteTreeView.h"
15#include "sitemanager.h"
16#include "splitter.h"
17#include "view.h"
18#include "viewheader.h"
19
20#include <wx/wupdlock.h>
21
22DECLARE_EVENT_TYPE(fzEVT_TAB_CLOSING_DEFERRED, -1)
23DEFINE_EVENT_TYPE(fzEVT_TAB_CLOSING_DEFERRED)
24
25BEGIN_EVENT_TABLE(CContextControl, wxSplitterWindow)
26EVT_MENU(XRCID("ID_TABCONTEXT_REFRESH"), CContextControl::OnTabRefresh)
27EVT_COMMAND(wxID_ANY, fzEVT_TAB_CLOSING_DEFERRED, CContextControl::OnTabClosing_Deferred)
28EVT_MENU(XRCID("ID_TABCONTEXT_CLOSE"), CContextControl::OnTabContextClose)
29EVT_MENU(XRCID("ID_TABCONTEXT_CLOSEOTHERS"), CContextControl::OnTabContextCloseOthers)
30EVT_MENU(XRCID("ID_TABCONTEXT_NEW"), CContextControl::OnTabContextNew)
31END_EVENT_TABLE()
32
33CContextControl::CContextControl(CMainFrame& mainFrame)
34        : CStateEventHandler(0)
35        , m_mainFrame(mainFrame)
36{
37        wxASSERT(!CContextManager::Get()->HandlerCount(STATECHANGE_CHANGEDCONTEXT));
38        CContextManager::Get()->RegisterHandler(this, STATECHANGE_CHANGEDCONTEXT, false);
39        CContextManager::Get()->RegisterHandler(this, STATECHANGE_SERVER, false);
40}
41
42CContextControl::~CContextControl()
43{
44}
45
46void CContextControl::Create(wxWindow *parent)
47{
48        wxSplitterWindow::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_NOBORDER);
49}
50
51void CContextControl::CreateTab()
52{
53        wxGetApp().AddStartupProfileRecord(_T("CContextControl::CreateTab"));
54
55        {
56        #ifdef __WXMSW__
57                // Some reparenting is being done when creating tabs. Reparenting of frozen windows isn't working
58                // on OS X.
59                wxWindowUpdateLocker lock(this);
60        #endif
61
62                CState* pState = 0;
63
64                // See if we can reuse an existing context
65                for (size_t i = 0; i < m_context_controls.size(); i++) {
66                        if (m_context_controls[i].tab_index != -1)
67                                continue;
68
69                        if (m_context_controls[i].pState->IsRemoteConnected() ||
70                                !m_context_controls[i].pState->IsRemoteIdle())
71                                continue;
72
73                        pState = m_context_controls[i].pState;
74                        m_context_controls.erase(m_context_controls.begin() + i);
75                        if (m_current_context_controls > (int)i)
76                                m_current_context_controls--;
77                        break;
78                }
79                if (!pState) {
80                        pState = CContextManager::Get()->CreateState(m_mainFrame);
81                        if (!pState->CreateEngine()) {
82                                wxMessageBoxEx(_("Failed to initialize FTP engine"));
83                        }
84                }
85
86                // Restore last server and path
87                CServer last_server;
88                CServerPath last_path;
89                if (COptions::Get()->GetLastServer(last_server) && last_path.SetSafePath(COptions::Get()->GetOption(OPTION_LASTSERVERPATH)))
90                        pState->SetLastServer(last_server, last_path);
91
92                CreateContextControls(pState);
93
94                pState->GetRecursiveOperationHandler()->SetQueue(m_mainFrame.GetQueue());
95
96                wxString const localDir = COptions::Get()->GetOption(OPTION_LASTLOCALDIR);
97                if (!pState->SetLocalDir(localDir)) {
98                        wxString const homeDir = wxGetHomeDir();
99                        if (!pState->SetLocalDir(homeDir)) {
100                                pState->SetLocalDir(_T("/"));
101                        }
102                }
103
104                CContextManager::Get()->SetCurrentContext(pState);
105        }
106
107        if (!m_mainFrame.RestoreSplitterPositions())
108                m_mainFrame.SetDefaultSplitterPositions();
109
110        if (m_tabs)
111                m_tabs->SetSelection(m_tabs->GetPageCount() - 1);
112}
113
114void CContextControl::CreateContextControls(CState* pState)
115{
116        wxGetApp().AddStartupProfileRecord(_T("CContextControl::CreateContextControls"));
117        wxWindow* parent = this;
118
119#ifdef __WXGTK__
120        // This prevents some ugly flickering on tab creation.
121        const wxPoint initial_position(1000000, 1000000);
122#else
123        const wxPoint initial_position(wxDefaultPosition);
124#endif
125
126        if (!m_context_controls.empty()) {
127                if (!m_tabs) {
128                        m_tabs = new wxAuiNotebookEx();
129
130                        wxSize splitter_size = m_context_controls[m_current_context_controls].pViewSplitter->GetSize();
131                        m_tabs->Create(this, wxID_ANY, initial_position, splitter_size, wxNO_BORDER | wxAUI_NB_SCROLL_BUTTONS | wxAUI_NB_WINDOWLIST_BUTTON | wxAUI_NB_CLOSE_ON_ALL_TABS);
132                        m_tabs->SetExArtProvider();
133                        m_tabs->SetSelectedFont(*wxNORMAL_FONT);
134                        m_tabs->SetMeasuringFont(*wxNORMAL_FONT);
135
136                        m_context_controls[m_current_context_controls].pViewSplitter->Reparent(m_tabs);
137
138                        m_tabs->AddPage(m_context_controls[m_current_context_controls].pViewSplitter, m_context_controls[m_current_context_controls].pState->GetTitle());
139                        ReplaceWindow(m_context_controls[m_current_context_controls].pViewSplitter, m_tabs);
140
141                        m_tabs->Connect(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler(CContextControl::OnTabChanged), 0, this);
142                        m_tabs->Connect(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE, wxAuiNotebookEventHandler(CContextControl::OnTabClosing), 0, this);
143                        m_tabs->Connect(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, wxAuiNotebookEventHandler(CContextControl::OnTabBgDoubleclick), 0, this);
144                        m_tabs->Connect(wxEVT_COMMAND_AUINOTEBOOK_TAB_MIDDLE_UP, wxAuiNotebookEventHandler(CContextControl::OnTabClosing), 0, this);
145                        m_tabs->Connect(wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP, wxAuiNotebookEventHandler(CContextControl::OnTabRightclick), 0, this);
146
147#ifdef __WXMAC__
148                        // We need to select the first page as the default selection is -1. Not doing so prevents selecting other pages later on.
149                        m_tabs->SetSelection(0);
150#endif
151                }
152
153                m_mainFrame.RememberSplitterPositions();
154                m_context_controls[m_current_context_controls].pLocalListView->SaveColumnSettings(OPTION_LOCALFILELIST_COLUMN_WIDTHS, OPTION_LOCALFILELIST_COLUMN_SHOWN, OPTION_LOCALFILELIST_COLUMN_ORDER);
155                m_context_controls[m_current_context_controls].pRemoteListView->SaveColumnSettings(OPTION_REMOTEFILELIST_COLUMN_WIDTHS, OPTION_REMOTEFILELIST_COLUMN_SHOWN, OPTION_REMOTEFILELIST_COLUMN_ORDER);
156
157                parent = m_tabs;
158        }
159
160        struct CContextControl::_context_controls context_controls;
161
162        context_controls.pState = pState;
163        context_controls.pViewSplitter = new CSplitterWindowEx(parent, -1, initial_position, wxDefaultSize, wxSP_NOBORDER  | wxSP_LIVE_UPDATE);
164        context_controls.pViewSplitter->SetMinimumPaneSize(50, 100);
165        context_controls.pViewSplitter->SetSashGravity(0.5);
166
167        context_controls.pLocalSplitter = new CSplitterWindowEx(context_controls.pViewSplitter, -1, wxDefaultPosition, wxDefaultSize, wxSP_NOBORDER  | wxSP_LIVE_UPDATE);
168        context_controls.pLocalSplitter->SetMinimumPaneSize(50, 100);
169
170        context_controls.pRemoteSplitter = new CSplitterWindowEx(context_controls.pViewSplitter, -1, wxDefaultPosition, wxDefaultSize, wxSP_NOBORDER  | wxSP_LIVE_UPDATE);
171        context_controls.pRemoteSplitter->SetMinimumPaneSize(50, 100);
172
173        context_controls.pLocalTreeViewPanel = new CView(context_controls.pLocalSplitter);
174        context_controls.pLocalListViewPanel = new CView(context_controls.pLocalSplitter);
175        context_controls.pLocalTreeView = new CLocalTreeView(context_controls.pLocalTreeViewPanel, -1, pState, m_mainFrame.GetQueue());
176        context_controls.pLocalListView = new CLocalListView(context_controls.pLocalListViewPanel, pState, m_mainFrame.GetQueue());
177        context_controls.pLocalTreeViewPanel->SetWindow(context_controls.pLocalTreeView);
178        context_controls.pLocalListViewPanel->SetWindow(context_controls.pLocalListView);
179
180        context_controls.pRemoteTreeViewPanel = new CView(context_controls.pRemoteSplitter);
181        context_controls.pRemoteListViewPanel = new CView(context_controls.pRemoteSplitter);
182        context_controls.pRemoteTreeView = new CRemoteTreeView(context_controls.pRemoteTreeViewPanel, -1, pState, m_mainFrame.GetQueue());
183        context_controls.pRemoteListView = new CRemoteListView(context_controls.pRemoteListViewPanel, pState, m_mainFrame.GetQueue());
184        context_controls.pRemoteTreeViewPanel->SetWindow(context_controls.pRemoteTreeView);
185        context_controls.pRemoteListViewPanel->SetWindow(context_controls.pRemoteListView);
186
187        bool show_filelist_statusbars = COptions::Get()->GetOptionVal(OPTION_FILELIST_STATUSBAR) != 0;
188
189        CFilelistStatusBar* pLocalFilelistStatusBar = new CFilelistStatusBar(context_controls.pLocalListViewPanel);
190        if (!show_filelist_statusbars)
191                pLocalFilelistStatusBar->Hide();
192        context_controls.pLocalListViewPanel->SetStatusBar(pLocalFilelistStatusBar);
193        context_controls.pLocalListView->SetFilelistStatusBar(pLocalFilelistStatusBar);
194        pLocalFilelistStatusBar->SetConnected(true);
195
196        CFilelistStatusBar* pRemoteFilelistStatusBar = new CFilelistStatusBar(context_controls.pRemoteListViewPanel);
197        if (!show_filelist_statusbars)
198                pRemoteFilelistStatusBar->Hide();
199        context_controls.pRemoteListViewPanel->SetStatusBar(pRemoteFilelistStatusBar);
200        context_controls.pRemoteListView->SetFilelistStatusBar(pRemoteFilelistStatusBar);
201
202        auto recursiveStatus = new CRecursiveOperationStatus(context_controls.pRemoteListViewPanel, context_controls.pState);
203        context_controls.pRemoteListViewPanel->SetFooter(recursiveStatus);
204
205        const int layout = COptions::Get()->GetOptionVal(OPTION_FILEPANE_LAYOUT);
206        const int swap = COptions::Get()->GetOptionVal(OPTION_FILEPANE_SWAP);
207
208        if (layout == 1) {
209                if (swap)
210                        context_controls.pViewSplitter->SplitHorizontally(context_controls.pRemoteSplitter, context_controls.pLocalSplitter);
211                else
212                        context_controls.pViewSplitter->SplitHorizontally(context_controls.pLocalSplitter, context_controls.pRemoteSplitter);
213        }
214        else {
215                if (swap)
216                        context_controls.pViewSplitter->SplitVertically(context_controls.pRemoteSplitter, context_controls.pLocalSplitter);
217                else
218                        context_controls.pViewSplitter->SplitVertically(context_controls.pLocalSplitter, context_controls.pRemoteSplitter);
219        }
220
221        if (COptions::Get()->GetOptionVal(OPTION_SHOW_TREE_LOCAL)) {
222                context_controls.pLocalViewHeader = new CLocalViewHeader(context_controls.pLocalTreeViewPanel, pState);
223                context_controls.pLocalTreeViewPanel->SetHeader(context_controls.pLocalViewHeader);
224                if (layout == 3 && swap)
225                        context_controls.pLocalSplitter->SplitVertically(context_controls.pLocalListViewPanel, context_controls.pLocalTreeViewPanel);
226                else if (layout)
227                        context_controls.pLocalSplitter->SplitVertically(context_controls.pLocalTreeViewPanel, context_controls.pLocalListViewPanel);
228                else
229                        context_controls.pLocalSplitter->SplitHorizontally(context_controls.pLocalTreeViewPanel, context_controls.pLocalListViewPanel);
230        }
231        else {
232                context_controls.pLocalTreeViewPanel->Hide();
233                context_controls.pLocalViewHeader = new CLocalViewHeader(context_controls.pLocalListViewPanel, pState);
234                context_controls.pLocalListViewPanel->SetHeader(context_controls.pLocalViewHeader);
235                context_controls.pLocalSplitter->Initialize(context_controls.pLocalListViewPanel);
236        }
237
238        if (COptions::Get()->GetOptionVal(OPTION_SHOW_TREE_REMOTE)) {
239                context_controls.pRemoteViewHeader = new CRemoteViewHeader(context_controls.pRemoteTreeViewPanel, pState);
240                context_controls.pRemoteTreeViewPanel->SetHeader(context_controls.pRemoteViewHeader);
241                if (layout == 3 && !swap)
242                        context_controls.pRemoteSplitter->SplitVertically(context_controls.pRemoteListViewPanel, context_controls.pRemoteTreeViewPanel);
243                else if (layout)
244                        context_controls.pRemoteSplitter->SplitVertically(context_controls.pRemoteTreeViewPanel, context_controls.pRemoteListViewPanel);
245                else
246                        context_controls.pRemoteSplitter->SplitHorizontally(context_controls.pRemoteTreeViewPanel, context_controls.pRemoteListViewPanel);
247        }
248        else {
249                context_controls.pRemoteTreeViewPanel->Hide();
250                context_controls.pRemoteViewHeader = new CRemoteViewHeader(context_controls.pRemoteListViewPanel, pState);
251                context_controls.pRemoteListViewPanel->SetHeader(context_controls.pRemoteViewHeader);
252                context_controls.pRemoteSplitter->Initialize(context_controls.pRemoteListViewPanel);
253        }
254
255        if (layout == 3) {
256                if (!swap)
257                        context_controls.pRemoteSplitter->SetSashGravity(1.0);
258                else
259                        context_controls.pLocalSplitter->SetSashGravity(1.0);
260        }
261
262        m_mainFrame.ConnectNavigationHandler(context_controls.pLocalListView);
263        m_mainFrame.ConnectNavigationHandler(context_controls.pRemoteListView);
264        m_mainFrame.ConnectNavigationHandler(context_controls.pLocalTreeView);
265        m_mainFrame.ConnectNavigationHandler(context_controls.pRemoteTreeView);
266        m_mainFrame.ConnectNavigationHandler(context_controls.pLocalViewHeader);
267        m_mainFrame.ConnectNavigationHandler(context_controls.pRemoteViewHeader);
268
269        pState->GetComparisonManager()->SetListings(context_controls.pLocalListView, context_controls.pRemoteListView);
270
271        if (m_tabs) {
272                context_controls.tab_index = m_tabs->GetPageCount();
273                m_tabs->AddPage(context_controls.pViewSplitter, pState->GetTitle());
274
275                // Copy reconnect and bookmark information
276                pState->SetLastServer(
277                        m_context_controls[m_current_context_controls].pState->GetLastServer(),
278                        m_context_controls[m_current_context_controls].pState->GetLastServerPath());
279
280                context_controls.site_bookmarks = m_context_controls[m_current_context_controls].site_bookmarks;
281        }
282        else {
283                context_controls.tab_index = 0;
284                context_controls.site_bookmarks = std::make_shared<CContextControl::_context_controls::_site_bookmarks>();
285
286                context_controls.site_bookmarks->path = COptions::Get()->GetOption(OPTION_LAST_CONNECTED_SITE);
287                CSiteManager::GetBookmarks(context_controls.site_bookmarks->path,
288                        context_controls.site_bookmarks->bookmarks);
289
290                Initialize(context_controls.pViewSplitter);
291        }
292
293        m_context_controls.push_back(context_controls);
294}
295
296void CContextControl::OnTabRefresh(wxCommandEvent&)
297{
298        if (m_right_clicked_tab == -1)
299                return;
300
301        for (size_t j = 0; j < m_context_controls.size(); j++)
302        {
303                if (m_context_controls[j].tab_index != m_right_clicked_tab)
304                        continue;
305
306                m_context_controls[j].pState->RefreshLocal();
307                m_context_controls[j].pState->RefreshRemote();
308
309                break;
310        }
311}
312
313struct CContextControl::_context_controls* CContextControl::GetCurrentControls()
314{
315        if (m_current_context_controls == -1)
316                return 0;
317
318        return &m_context_controls[m_current_context_controls];
319}
320
321struct CContextControl::_context_controls* CContextControl::GetControlsFromState(CState* pState)
322{
323        size_t i = 0;
324        for (i = 0; i < m_context_controls.size(); i++)
325        {
326                if (m_context_controls[i].pState == pState)
327                        return &m_context_controls[i];
328        }
329        return 0;
330}
331
332bool CContextControl::CloseTab(int tab)
333{
334        if (!m_tabs)
335                return false;
336        if (tab < 0)
337                return false;
338
339        size_t i = 0;
340        for (i = 0; i < m_context_controls.size(); i++)
341        {
342                if (m_context_controls[i].tab_index == tab)
343                        break;
344        }
345        if (i == m_context_controls.size())
346                return false;
347
348        CState* pState = m_context_controls[i].pState;
349
350        if (!pState->m_pCommandQueue->Idle())
351        {
352                if (wxMessageBoxEx(_("Cannot close tab while busy.\nCancel current operation and close tab?"), _T("FileZilla"), wxYES_NO | wxICON_QUESTION) != wxYES)
353                        return false;
354        }
355
356#ifndef __WXMAC__
357        // Some reparenting is being done when closing tabs. Reparenting of frozen windows isn't working
358        // on OS X.
359        wxWindowUpdateLocker lock(this);
360#endif
361
362        pState->m_pCommandQueue->Cancel();
363        pState->GetRecursiveOperationHandler()->StopRecursiveOperation();
364
365        pState->GetComparisonManager()->SetListings(0, 0);
366
367        if (m_tabs->GetPageCount() == 2)
368        {
369                // Get rid again of tab bar
370                m_tabs->Disconnect(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler(CContextControl::OnTabChanged), 0, this);
371
372                int keep = tab ? 0 : 1;
373                m_tabs->RemovePage(keep);
374
375                size_t j;
376                for (j = 0; j < m_context_controls.size(); j++)
377                {
378                        if (m_context_controls[j].tab_index != keep)
379                                continue;
380
381                        break;
382                }
383
384                m_context_controls[j].pViewSplitter->Reparent(this);
385                ReplaceWindow(m_tabs, m_context_controls[j].pViewSplitter);
386                m_context_controls[j].pViewSplitter->Show();
387                m_context_controls[j].tab_index = 0;
388
389                wxAuiNotebookEx *tabs = m_tabs;
390                m_tabs = 0;
391
392                m_context_controls[i].tab_index = -1;
393                m_context_controls[i].site_bookmarks.reset();
394
395                CContextManager::Get()->SetCurrentContext(m_context_controls[j].pState);
396
397                tabs->Destroy();
398        }
399        else
400        {
401                if (pState == CContextManager::Get()->GetCurrentContext())
402                {
403                        int newsel = tab + 1;
404                        if (newsel >= (int)m_tabs->GetPageCount())
405                                newsel = m_tabs->GetPageCount() - 2;
406
407                        for (size_t j = 0; j < m_context_controls.size(); j++)
408                        {
409                                if (m_context_controls[j].tab_index != newsel)
410                                        continue;
411                                m_tabs->SetSelection(newsel);
412                                CContextManager::Get()->SetCurrentContext(m_context_controls[j].pState);
413                        }
414                }
415                for (size_t j = 0; j < m_context_controls.size(); j++)
416                {
417                        if (m_context_controls[j].tab_index > tab)
418                                m_context_controls[j].tab_index--;
419                }
420                m_context_controls[i].tab_index = -1;
421                m_context_controls[i].site_bookmarks.reset();
422                m_tabs->DeletePage(tab);
423        }
424
425        pState->Disconnect();
426
427        return true;
428}
429
430void CContextControl::OnTabBgDoubleclick(wxAuiNotebookEvent&)
431{
432        CreateTab();
433}
434
435void CContextControl::OnTabRightclick(wxAuiNotebookEvent& event)
436{
437        wxMenu* pMenu = wxXmlResource::Get()->LoadMenu(_T("ID_MENU_TABCONTEXT"));
438        if (!pMenu) {
439                wxBell();
440                return;
441        }
442
443        if (!m_tabs || m_tabs->GetPageCount() < 2) {
444                pMenu->Enable(XRCID("ID_TABCONTEXT_CLOSE"), false);
445                pMenu->Enable(XRCID("ID_TABCONTEXT_CLOSEOTHERS"), false);
446        }
447
448        m_right_clicked_tab = event.GetSelection();
449
450        PopupMenu(pMenu);
451
452        delete pMenu;
453}
454
455void CContextControl::OnTabContextClose(wxCommandEvent&)
456{
457        if (m_right_clicked_tab == -1)
458                return;
459
460        // Need to defer event, wxAUI would write to free'd memory
461        // if we'd actually delete tab and potenially the notebook with it
462        QueueEvent(new wxCommandEvent(fzEVT_TAB_CLOSING_DEFERRED, m_right_clicked_tab));
463}
464
465void CContextControl::OnTabContextCloseOthers(wxCommandEvent&)
466{
467        QueueEvent(new wxCommandEvent (fzEVT_TAB_CLOSING_DEFERRED, -m_right_clicked_tab - 1));
468}
469
470void CContextControl::OnTabClosing_Deferred(wxCommandEvent& event)
471{
472        int tab = event.GetId();
473        if (tab < 0)
474        {
475                tab++;
476                int count = GetTabCount();
477                for (int i = count - 1; i >= 0; i--)
478                {
479                        if (i != -tab)
480                                CloseTab(i);
481                }
482        }
483        else
484                CloseTab(tab);
485}
486
487
488void CContextControl::OnTabChanged(wxAuiNotebookEvent&)
489{
490        int i = m_tabs->GetSelection();
491        if (i < 0 || i >= (int)m_context_controls.size())
492                return;
493
494        for (size_t j = 0; j < m_context_controls.size(); j++)
495        {
496                if (m_context_controls[j].tab_index != i)
497                        continue;
498
499                CContextManager::Get()->SetCurrentContext(m_context_controls[j].pState);
500                break;
501        }
502}
503
504void CContextControl::OnTabClosing(wxAuiNotebookEvent& event)
505{
506        // Need to defer event, wxAUI would write to free'd memory
507        // if we'd actually delete tab and potenially the notebook with it
508        QueueEvent(new wxCommandEvent(fzEVT_TAB_CLOSING_DEFERRED, event.GetSelection()));
509
510        event.Veto();
511}
512
513int CContextControl::GetCurrentTab() const
514{
515        return m_tabs ? m_tabs->GetSelection() : (m_context_controls.empty() ? -1 : 0);
516}
517
518int CContextControl::GetTabCount() const
519{
520        return m_tabs ? m_tabs->GetPageCount() : (m_context_controls.empty() ? 0 : 1);
521}
522
523struct CContextControl::_context_controls* CContextControl::GetControlsFromTabIndex(int i)
524{
525        for (size_t j = 0; j < m_context_controls.size(); j++)
526        {
527                if (m_context_controls[j].tab_index == i)
528                        return &m_context_controls[j];
529        }
530
531        return 0;
532}
533
534bool CContextControl::SelectTab(int i)
535{
536        if (i < 0)
537                return false;
538
539        if (!m_tabs)
540        {
541                if (i != 0)
542                        return false;
543
544                return true;
545        }
546
547        if ((int)m_tabs->GetPageCount() <= i)
548                return false;
549
550        m_tabs->SetSelection(i);
551
552        return true;
553}
554
555void CContextControl::AdvanceTab(bool forward)
556{
557        if (!m_tabs)
558                return;
559
560        m_tabs->AdvanceTab(forward);
561}
562
563void CContextControl::OnStateChange(CState* pState, enum t_statechange_notifications notification, const wxString&, const void*)
564{
565        if (notification == STATECHANGE_CHANGEDCONTEXT)
566        {
567                if (!pState)
568                {
569                        m_current_context_controls = 0;
570                        return;
571                }
572
573                // Get current controls for new current context
574                for (m_current_context_controls = 0; m_current_context_controls < (int)m_context_controls.size(); m_current_context_controls++)
575                {
576                        if (m_context_controls[m_current_context_controls].pState == pState)
577                                break;
578                }
579                if (m_current_context_controls == (int)m_context_controls.size())
580                        m_current_context_controls = -1;
581        }
582        else if (notification == STATECHANGE_SERVER)
583        {
584                if (!m_tabs)
585                        return;
586
587                CContextControl::_context_controls* controls = GetControlsFromState(pState);
588                if (controls && controls->tab_index != -1)
589                        m_tabs->SetPageText(controls->tab_index, controls->pState->GetTitle());
590        }
591}
592
593void CContextControl::OnTabContextNew(wxCommandEvent&)
594{
595        CreateTab();
596}
Note: See TracBrowser for help on using the repository browser.