KiCad PCB EDA Suite
msgpanel.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
5  * Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
6  * Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24  */
25 
31 #include <widgets/msgpanel.h>
32 
33 #include <wx/dcscreen.h>
34 #include <wx/dcclient.h>
35 #include <wx/settings.h>
36 #include <wx/toplevel.h>
37 
38 
39 BEGIN_EVENT_TABLE( EDA_MSG_PANEL, wxPanel )
40  EVT_PAINT( EDA_MSG_PANEL::OnPaint )
41 END_EVENT_TABLE()
42 
43 
44 EDA_MSG_PANEL::EDA_MSG_PANEL( wxWindow* aParent, int aId,
45  const wxPoint& aPosition, const wxSize& aSize,
46  long style, const wxString &name ) :
47  wxPanel( aParent, aId, aPosition, aSize, style, name )
48 {
49  SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ) );
50  SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
51 
52  // informs wx not to paint the background itself as we will paint it later in erase()
53  SetBackgroundStyle( wxBG_STYLE_PAINT );
54 
55  m_last_x = 0;
56 
57  m_fontSize = computeFontSize();
58 }
59 
60 
62 {
63 }
64 
65 
67 {
68  // Get size of the wxSYS_DEFAULT_GUI_FONT
69  wxSize fontSizeInPixels;
70 
71  wxScreenDC dc;
72 
73  dc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ) );
74  dc.GetTextExtent( wxT( "W" ), &fontSizeInPixels.x, &fontSizeInPixels.y );
75 
76  return fontSizeInPixels;
77 }
78 
79 
81 {
82  // make space for two rows of text plus a number of pixels between them.
83  return 2 * computeFontSize().y + 0;
84 }
85 
86 
87 wxSize EDA_MSG_PANEL::computeTextSize( const wxString& aText ) const
88 {
89  // Get size of the wxSYS_DEFAULT_GUI_FONT
90  wxSize textSizeInPixels;
91 
92  wxScreenDC dc;
93 
94  dc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ) );
95  dc.GetTextExtent( aText, &textSizeInPixels.x, &textSizeInPixels.y );
96 
97  return textSizeInPixels;
98 }
99 
100 
101 void EDA_MSG_PANEL::OnPaint( wxPaintEvent& aEvent )
102 {
103  wxPaintDC dc( this );
104 
105  erase( &dc );
106 
107  dc.SetBackground( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
108  dc.SetBackgroundMode( wxSOLID );
109  dc.SetTextBackground( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
110  dc.SetFont( wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ) );
111 
112  for( const MSG_PANEL_ITEM& item : m_Items )
113  showItem( dc, item );
114 
115  aEvent.Skip();
116 }
117 
118 
119 void EDA_MSG_PANEL::AppendMessage( const wxString& aUpperText, const wxString& aLowerText,
120  int aPadding )
121 {
122  wxString text;
123  wxSize drawSize = GetClientSize();
124 
125  text = ( aUpperText.Len() > aLowerText.Len() ) ? aUpperText : aLowerText;
126  text.Append( ' ', aPadding );
127 
128  MSG_PANEL_ITEM item;
129 
130  /* Don't put the first message a window client position 0. Offset by
131  * one 'W' character width. */
132  if( m_last_x == 0 )
133  m_last_x = m_fontSize.x;
134 
135  item.m_X = m_last_x;
136 
137  item.m_UpperY = ( drawSize.y / 2 ) - m_fontSize.y;
138  item.m_LowerY = drawSize.y - m_fontSize.y;
139 
140  item.m_UpperText = aUpperText;
141  item.m_LowerText = aLowerText;
142  m_Items.push_back( item );
143  m_last_x += computeTextSize( text ).x;
144 
145  // Add an extra space between texts for a better look:
146  m_last_x += m_fontSize.x;
147 
148  Refresh();
149 }
150 
151 
152 void EDA_MSG_PANEL::SetMessage( int aXPosition, const wxString& aUpperText,
153  const wxString& aLowerText )
154 {
155  wxPoint pos;
156  wxSize drawSize = GetClientSize();
157 
158  if( aXPosition >= 0 )
159  m_last_x = pos.x = aXPosition * (m_fontSize.x + 2);
160  else
161  pos.x = m_last_x;
162 
163  MSG_PANEL_ITEM item;
164 
165  item.m_X = pos.x;
166 
167  item.m_UpperY = (drawSize.y / 2) - m_fontSize.y;
168  item.m_LowerY = drawSize.y - m_fontSize.y;
169 
170  item.m_UpperText = aUpperText;
171  item.m_LowerText = aLowerText;
172 
173  int ndx;
174 
175  // update the vector, which is sorted by m_X
176  int limit = m_Items.size();
177 
178  for( ndx=0; ndx<limit; ++ndx )
179  {
180  // replace any item with same X
181  if( m_Items[ndx].m_X == item.m_X )
182  {
183  m_Items[ndx] = item;
184  break;
185  }
186 
187  if( m_Items[ndx].m_X > item.m_X )
188  {
189  m_Items.insert( m_Items.begin() + ndx, item );
190  break;
191  }
192  }
193 
194  if( ndx == limit ) // mutually exclusive with two above if tests
195  m_Items.push_back( item );
196 
197  Refresh();
198 }
199 
200 
201 void EDA_MSG_PANEL::showItem( wxDC& aDC, const MSG_PANEL_ITEM& aItem )
202 {
203  COLOR4D color;
204 
205  // Change the text to a disabled color when the window isn't active
206  wxTopLevelWindow* tlw = dynamic_cast<wxTopLevelWindow*>( wxGetTopLevelParent( this ) );
207 
208  if( tlw && !tlw->IsActive() )
209  color = wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT );
210  else
211  color = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT );
212 
213  aDC.SetTextForeground( color.ToColour() );
214 
215  if( !aItem.m_UpperText.IsEmpty() )
216  aDC.DrawText( aItem.m_UpperText, aItem.m_X, aItem.m_UpperY );
217 
218  if( !aItem.m_LowerText.IsEmpty() )
219  aDC.DrawText( aItem.m_LowerText, aItem.m_X, aItem.m_LowerY );
220 }
221 
222 
224 {
225  m_Items.clear();
226  m_last_x = 0;
227  Refresh();
228 }
229 
230 
231 void EDA_MSG_PANEL::erase( wxDC* aDC )
232 {
233  wxPen pen;
234  wxBrush brush;
235 
236  wxSize size = GetClientSize();
237  wxColour color = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE );
238 
239  pen.SetColour( color );
240 
241  brush.SetColour( color );
242  brush.SetStyle( wxBRUSHSTYLE_SOLID );
243 
244  aDC->SetPen( pen );
245  aDC->SetBrush( brush );
246  aDC->DrawRectangle( 0, 0, size.x, size.y );
247 }
void showItem(wxDC &dc, const MSG_PANEL_ITEM &aItem)
Definition: msgpanel.cpp:201
MSG_PANEL_ITEMS m_Items
Definition: msgpanel.h:174
int color
Definition: DXF_plotter.cpp:60
void SetMessage(int aXPosition, const wxString &aUpperText, const wxString &aLowerText)
Set a message at aXPosition to aUpperText and aLowerText in the message panel.
Definition: msgpanel.cpp:152
wxString m_LowerText
Definition: msgpanel.h:92
A panel to display various information messages.
Definition: msgpanel.h:103
void OnPaint(wxPaintEvent &aEvent)
Definition: msgpanel.cpp:101
wxSize m_fontSize
Definition: msgpanel.h:176
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
wxSize computeTextSize(const wxString &text) const
Calculate the width and height of a text string using the system UI font.
Definition: msgpanel.cpp:87
void EraseMsgBox()
Definition: msgpanel.cpp:223
int m_last_x
the last used x coordinate
Definition: msgpanel.h:175
void erase(wxDC *DC)
Definition: msgpanel.cpp:231
const char * name
Definition: DXF_plotter.cpp:59
static wxSize computeFontSize()
Compute the height and width of a 'W' in the system font.
Definition: msgpanel.cpp:66
EDA_MSG_PANEL items for displaying messages.
Definition: msgpanel.h:53
void AppendMessage(const wxString &aUpperText, const wxString &aLowerText, int aPadding=6)
Append a message to the message panel.
Definition: msgpanel.cpp:119
Message panel definition file.
static int GetRequiredHeight()
Return the required height (in pixels) of a EDA_MSG_PANEL.
Definition: msgpanel.cpp:80
wxString m_UpperText
Definition: msgpanel.h:91
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:103