1 /*
2  * This file is part of the Code::Blocks IDE and licensed under the GNU Lesser General Public License, version 3
3  * http://www.gnu.org/licenses/lgpl-3.0.html
4  *
5  */
6 
7 #include "sdk_precomp.h"
8 
9 #ifndef CB_PRECOMP
10     #include <wx/frame.h> // wxFrame
11     #include <wx/menu.h>
12     #include <wx/statusbr.h>
13     #include "cbplugin.h"
14     #include "compiler.h" // GetSwitches
15     #include "sdk_events.h"
16     #include "manager.h"
17     #include "projectbuildtarget.h"
18     #include "cbproject.h"
19     #include "logmanager.h"
20 #endif
21 
22 #include "cbstatusbar.h"
23 
BEGIN_EVENT_TABLE(cbStatusBar,wxStatusBar)24 BEGIN_EVENT_TABLE(cbStatusBar, wxStatusBar)
25     EVT_SIZE(cbStatusBar::OnSize)
26 END_EVENT_TABLE()
27 
28 
29 cbStatusBar::cbStatusBar(wxWindow* parent, cb_unused  wxWindowID id, long style, const wxString& name) // TODO: Check if window id should be removed?
30     : wxStatusBar(parent, wxID_ANY, style, name)
31 {
32 }
33 
~cbStatusBar()34 cbStatusBar::~cbStatusBar()
35 {
36 }
37 
SetStatusTextByPlugin(const wxString & text,cbPlugin * plugin)38 void cbStatusBar::SetStatusTextByPlugin(const wxString& text, cbPlugin* plugin)
39 {
40     int pos = GetFieldNumberOfPlugin(plugin);
41     if (pos != -1)
42         wxStatusBar::SetStatusText(text, pos);
43 }
44 
GetStatusTextByPlugin(cbPlugin * plugin) const45 wxString cbStatusBar::GetStatusTextByPlugin(cbPlugin* plugin) const
46 {
47     int pos = GetFieldNumberOfPlugin(plugin);
48     if (pos != -1)
49         return wxStatusBar::GetStatusText(pos);
50     return wxEmptyString;
51 }
52 
GetFieldRectByPlugin(cbPlugin * plugin,wxRect & rect) const53 bool cbStatusBar::GetFieldRectByPlugin(cbPlugin* plugin, wxRect& rect) const
54 {
55     int pos = GetFieldNumberOfPlugin(plugin);
56     if (pos != -1)
57         return wxStatusBar::GetFieldRect(pos, rect);
58     return false;
59 }
60 
SetStatusWidths(int n,const int * widths)61 void cbStatusBar::SetStatusWidths(int n, const int* widths)
62 {
63     if (widths)
64     {
65         m_MainWidths.clear();
66         for (int i = 0 ; i < n ; i++)
67             m_MainWidths.push_back(widths[i]);
68         UpdateWidths();
69     }
70 }
71 
AddField(cbPlugin * plugin,wxWindow * ctrl,int width)72 void cbStatusBar::AddField(cbPlugin* plugin, wxWindow* ctrl, int width)
73 {
74     cbStatusBarElement elem;
75     elem.control = ctrl;
76     elem.width = width;
77     elem.plugin =  plugin;
78 
79     m_Elements.push_back(elem);
80 
81     UpdateWidths();
82 
83     return;
84 }
AddField(cbPlugin * plugin,int width)85 void cbStatusBar::AddField(cbPlugin* plugin, int width)
86 {
87     return AddField(plugin, (wxControl*)NULL, width);
88 }
89 
RemoveField(cbPlugin * plugin)90 void cbStatusBar::RemoveField(cbPlugin* plugin)
91 {
92     for (ElementVector::iterator it = m_Elements.begin() ; it != m_Elements.end() ; it++)
93     {
94         if (it->plugin == plugin)
95         {
96             if (it->control)
97                 it->control->Destroy();
98             m_Elements.erase(it);
99             break;
100         }
101     }
102     UpdateWidths();
103 }
104 
OnSize(wxSizeEvent & event)105 void cbStatusBar::OnSize(wxSizeEvent& event)
106 {
107     AdjustFieldsSize();
108     event.Skip();
109 }
110 
UpdateWidths()111 void cbStatusBar::UpdateWidths()
112 {
113     unsigned int n = m_MainWidths.size() + m_Elements.size();
114 
115     int *widths = new int[n];
116     unsigned int i = 0;
117     for (; i < m_MainWidths.size() ; i++)
118         widths[i] = m_MainWidths[i];
119     for (int k= 0 ; i < n ; i++, k++)
120         widths[i] = m_Elements[k].width;
121 
122     wxStatusBar::SetFieldsCount(n);
123     wxStatusBar::SetStatusWidths(n, widths);
124     delete[] widths;
125 }
126 
AdjustFieldsSize()127 void cbStatusBar::AdjustFieldsSize()
128 {
129     for (unsigned int i = 0 ; i < m_Elements.size(); i++)
130     {
131         wxWindow *ctrl = m_Elements[i].control;
132         if (ctrl)
133         {
134             wxRect rect;
135             GetFieldRectByPlugin(m_Elements[i].plugin, rect);
136             ctrl->SetSize(rect.x + 2, rect.y + 2, rect.width - 4, rect.height - 4);
137         }
138     }
139 }
140 
GetFieldNumberOfPlugin(cbPlugin * plugin) const141 int cbStatusBar::GetFieldNumberOfPlugin(cbPlugin* plugin) const
142 {
143     for (unsigned int i = 0 ; i < m_Elements.size() ; i++)
144     {
145         if (m_Elements[i].plugin == plugin)
146             return i+m_MainWidths.size();
147     }
148     // return -1 to indicate that the id does not exist
149     return -1;
150 }
151