KiCad PCB EDA Suite
common.h
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) 2014-2019 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2007-2015 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
6  * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
7  * Copyright (C) 1992-2019 KiCad Developers, see AUTHORS.txt for contributors.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, you may find one here:
21  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22  * or you may search the http://www.gnu.org website for the version 2 license,
23  * or you may write to the Free Software Foundation, Inc.,
24  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25  */
26 
32 #ifndef INCLUDE__COMMON_H_
33 #define INCLUDE__COMMON_H_
34 
35 #include <vector>
36 
37 #include <wx/wx.h>
38 #include <wx/confbase.h>
39 #include <wx/fileconf.h>
40 #include <wx/dir.h>
41 
42 #include <richio.h>
43 #include <gal/color4d.h>
44 
45 #include <atomic>
46 #include <limits>
47 #include <memory>
48 #include <type_traits>
49 #include <typeinfo>
50 
51 class wxAboutDialogInfo;
52 class SEARCH_STACK;
53 class REPORTER;
54 
55 
64 typedef uint32_t timestamp_t;
65 
66 
67 // Flag for special keys
68 // This type could be extended to 64 bits to add room for more flags.
69 // For compatibility with old code, keep flag bits out of the least
70 // significant nibble (0xF).
71 typedef uint32_t EDA_KEY;
72 #define EDA_KEY_C UINT32_C
73 
74 #define GR_KB_RIGHTSHIFT ( EDA_KEY_C( 0x01000000 ) )
75 #define GR_KB_LEFTSHIFT ( EDA_KEY_C( 0x02000000 ) )
76 #define GR_KB_CTRL ( EDA_KEY_C( 0x04000000 ) )
77 #define GR_KB_ALT ( EDA_KEY_C( 0x08000000 ) )
78 #define GR_KB_SHIFT ( GR_KB_LEFTSHIFT | GR_KB_RIGHTSHIFT )
79 #define GR_KB_SHIFTCTRL ( GR_KB_SHIFT | GR_KB_CTRL )
80 #define MOUSE_MIDDLE ( EDA_KEY_C( 0x10000000 ) )
81 #define GR_KEY_INVALID ( EDA_KEY_C( 0x80000000 ) )
82 #define GR_KEY_NONE ( EDA_KEY_C( 0 ) )
83 
85 #define NAMELESS_PROJECT wxT( "noname" )
86 
87 
89 enum pseudokeys {
97 };
98 
99 #define ESC 27
100 
103 #define TEXT_ANGLE_HORIZ 0
104 #define TEXT_ANGLE_VERT 900
105 
106 //-----<KiROUND KIT>------------------------------------------------------------
107 
113 template <typename fp_type, typename ret_type = int>
114 constexpr ret_type KiROUND( fp_type v )
115 {
116  using max_ret = long long int;
117  fp_type ret = v < 0 ? v - 0.5 : v + 0.5;
118 
120  std::numeric_limits<ret_type>::lowest() > ret )
121  {
122  wxLogDebug
123  ( "Overflow KiROUND converting value %f to %s", double( v ), typeid(ret_type).name() );
124  return 0;
125  }
126 
127  return ret_type( max_ret( ret ) );
128 }
129 
130 //-----</KiROUND KIT>-----------------------------------------------------------
131 
132 
134  INCHES = 0,
137  DEGREES = 3,
138  PERCENT = 4,
139 };
140 
141 
144 
145 
155 {
156 public:
157  LOCALE_IO();
158  ~LOCALE_IO();
159 
160 private:
161  // allow for nesting of LOCALE_IO instantiations
162  static std::atomic<unsigned int> m_c_count;
163 
164  // The locale in use before switching to the "C" locale
165  // (the locale can be set by user, and is not always the system locale)
166  std::string m_user_locale;
167 };
168 
173 wxSize GetTextSize( const wxString& aSingleLine, wxWindow* aWindow );
174 
189 bool EnsureTextCtrlWidth( wxTextCtrl* aCtrl, const wxString* aString = NULL );
190 
194 void SelectReferenceNumber( wxTextEntry* aTextEntry );
195 
207 int ProcessExecute( const wxString& aCommandLine, int aFlags = wxEXEC_ASYNC,
208  wxProcess *callback = NULL );
209 
214 
215 int GetCommandOptions( const int argc, const char** argv,
216  const char* stringtst, const char** optarg,
217  int* optind );
218 
227 double RoundTo0( double x, double precision );
228 
236 void wxStringSplit( const wxString& aText, wxArrayString& aStrings, wxChar aSplitter );
237 
257 wxString SearchHelpFileFullPath( const SEARCH_STACK& aSearchStack, const wxString& aBaseName );
258 
268 bool EnsureFileDirectoryExists( wxFileName* aTargetFullFileName,
269  const wxString& aBaseFilename,
270  REPORTER* aReporter = NULL );
271 
273 const wxString PrePendPath( const wxString& aEnvVar, const wxString& aPriorityPath );
274 
288 std::unique_ptr<wxConfigBase> GetNewConfig( const wxString& aProgName );
289 
302 wxString GetKicadConfigPath();
303 
310 const wxString ExpandEnvVarSubstitutions( const wxString& aString );
311 
315 const wxString ResolveUriByEnvVars( const wxString& aUri );
316 
317 
318 #ifdef __WXMAC__
319 
323 wxString GetOSXKicadUserDataDir();
324 
329 wxString GetOSXKicadMachineDataDir();
330 
335 wxString GetOSXKicadDataDir();
336 #endif
337 
338 // Some wxWidgets versions (for instance before 3.1.0) do not include
339 // this function, so add it if missing
340 #if !wxCHECK_VERSION( 3, 1, 0 )
341 #define USE_KICAD_WXSTRING_HASH // for common.cpp
342 namespace std
344 {
345  template<> struct hash<wxString>
346  {
347  size_t operator()( const wxString& s ) const;
348  };
349 }
350 #endif
351 
353 #define USE_KICAD_WXPOINT_LESS_AND_HASH // for common.cpp
354 namespace std
355 {
356  template <> struct hash<wxPoint>
357  {
358  size_t operator() ( const wxPoint& k ) const;
359  };
360 }
361 
362 namespace std
363 {
364  template<> struct less<wxPoint>
365  {
366  bool operator()( const wxPoint& aA, const wxPoint& aB ) const;
367  };
368 }
369 
376 std::ostream& operator<<( std::ostream& out, const wxSize& size );
377 
384 std::ostream& operator<<( std::ostream& out, const wxPoint& pt );
385 
386 
391 {
392 public:
393  WX_FILENAME( const wxString& aPath, const wxString& aFilename );
394 
395  void SetFullName( const wxString& aFileNameAndExtension );
396 
397  wxString GetName() const;
398  wxString GetFullName() const;
399  wxString GetPath() const;
400  wxString GetFullPath() const;
401 
402  // Avoid multiple calls to stat() on POSIX kernels.
403  long long GetTimestamp();
404 
405 private:
406  // Write cached values to the wrapped wxFileName. MUST be called before using m_fn.
407  void resolve();
408 
409  wxFileName m_fn;
410  wxString m_path;
411  wxString m_fullName;
412 };
413 
414 
415 long long TimestampDir( const wxString& aDirPath, const wxString& aFilespec );
416 
417 
418 
419 
420 #endif // INCLUDE__COMMON_H_
WX_FILENAME(const wxString &aPath, const wxString &aFilename)
Performance enhancements to file and directory operations.
Definition: common.cpp:644
~LOCALE_IO()
Definition: common.cpp:100
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: common.h:154
const wxString ResolveUriByEnvVars(const wxString &aUri)
Replace any environment variables in file-path uris (leaving network-path URIs alone).
Definition: common.cpp:471
const wxString PrePendPath(const wxString &aEnvVar, const wxString &aPriorityPath)
Put aPriorityPath in front of all paths in the value of aEnvVar.
Definition: prependpath.cpp:32
KIGFX::COLOR4D g_GhostColor
Draw color for moving objects.
Definition: common.cpp:58
pseudokeys
Pseudo key codes for command panning.
Definition: common.h:89
wxString GetName() const
Definition: common.cpp:657
Template specialization to enable wxStrings for certain containers (e.g. unordered_map)
wxString GetFullName() const
Definition: common.cpp:664
wxString m_path
Definition: common.h:410
Class SEARCH_STACK looks for files in a number of places.
Definition: search_stack.h:41
Class REPORTER is a pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:61
void SetFullName(const wxString &aFileNameAndExtension)
Definition: common.cpp:651
wxString GetKicadConfigPath()
Return the user configuration path used to store KiCad's configuration files.
Definition: common.cpp:267
long long TimestampDir(const wxString &aDirPath, const wxString &aFilespec)
A copy of ConvertFileTimeToWx() because wxWidgets left it as a static function private to src/common/...
Definition: common.cpp:850
wxFileName m_fn
Definition: common.h:409
static std::atomic< unsigned int > m_c_count
Definition: common.h:162
int ProcessExecute(const wxString &aCommandLine, int aFlags=wxEXEC_ASYNC, wxProcess *callback=NULL)
Run a command in a child process.
Definition: common.cpp:211
long long GetTimestamp()
Definition: common.cpp:691
wxString SearchHelpFileFullPath(const SEARCH_STACK &aSearchStack, const wxString &aBaseName)
Return the help file's full path.
void resolve()
Definition: common.cpp:683
std::unique_ptr< wxConfigBase > GetNewConfig(const wxString &aProgName)
Create a new wxConfig so we can put configuration files in a more proper place for each platform.
Definition: common.cpp:256
wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
Definition: common.cpp:115
std::ostream & operator<<(std::ostream &out, const wxSize &size)
Helper function to print the given wxSize to a stream.
Definition: common.cpp:615
Definition: common.h:134
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
Definition: common.cpp:188
uint32_t EDA_KEY
Definition: common.h:71
bool EnsureTextCtrlWidth(wxTextCtrl *aCtrl, const wxString *aString=NULL)
Set the minimum pixel width on a text control in order to make a text string be fully visible within ...
Definition: common.cpp:130
LOCALE_IO()
Definition: common.cpp:83
const wxString ExpandEnvVarSubstitutions(const wxString &aString)
Replace any environment variable references with their values.
Definition: common.cpp:458
wxString GetPath() const
Definition: common.cpp:670
double RoundTo0(double x, double precision)
Round to the nearest precision.
Definition: common.cpp:233
timestamp_t GetNewTimeStamp()
Definition: common.cpp:217
wxString GetFullPath() const
Definition: common.cpp:676
A wrapper around a wxFileName which is much more performant with a subset of the API.
Definition: common.h:390
const char * name
Definition: DXF_plotter.cpp:61
#define max(a, b)
Definition: auxiliary.h:86
void SelectReferenceNumber(wxTextEntry *aTextEntry)
Select the number (or "?") in a reference for ease of editing.
Definition: common.cpp:159
bool EnsureFileDirectoryExists(wxFileName *aTargetFullFileName, const wxString &aBaseFilename, REPORTER *aReporter=NULL)
Make aTargetFullFileName absolute and create the path of this file if it doesn't yet exist.
Definition: common.cpp:485
int GetCommandOptions(const int argc, const char **argv, const char *stringtst, const char **optarg, int *optind)
uint32_t timestamp_t
timestamp_t is our type to represent unique IDs for all kinds of elements; historically simply the ti...
Definition: common.h:53
wxString m_fullName
Definition: common.h:411
EDA_UNITS_T
Definition: common.h:133
std::string m_user_locale
Definition: common.h:166
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:114
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39