1 |
26 |
unneback |
//####COPYRIGHTBEGIN####
|
2 |
|
|
//
|
3 |
|
|
// ----------------------------------------------------------------------------
|
4 |
|
|
// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
|
5 |
|
|
// Copyright (C) 2003 John Dallaway
|
6 |
|
|
//
|
7 |
|
|
// This program is part of the eCos host tools.
|
8 |
|
|
//
|
9 |
|
|
// This program is free software; you can redistribute it and/or modify it
|
10 |
|
|
// under the terms of the GNU General Public License as published by the Free
|
11 |
|
|
// Software Foundation; either version 2 of the License, or (at your option)
|
12 |
|
|
// any later version.
|
13 |
|
|
//
|
14 |
|
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
15 |
|
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
16 |
|
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
17 |
|
|
// more details.
|
18 |
|
|
//
|
19 |
|
|
// You should have received a copy of the GNU General Public License along with
|
20 |
|
|
// this program; if not, write to the Free Software Foundation, Inc.,
|
21 |
|
|
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
22 |
|
|
//
|
23 |
|
|
// ----------------------------------------------------------------------------
|
24 |
|
|
//
|
25 |
|
|
//####COPYRIGHTEND####
|
26 |
|
|
//===========================================================================
|
27 |
|
|
//#####DESCRIPTIONBEGIN####
|
28 |
|
|
//
|
29 |
|
|
// Author(s): sdf, jld
|
30 |
|
|
// Contact(s): sdf
|
31 |
|
|
// Date: 1998/08/11
|
32 |
|
|
// Version: 0.01
|
33 |
|
|
// Purpose:
|
34 |
|
|
// Description: Interface to various global utility functions. Everything in this
|
35 |
|
|
// class is static (there are no instances).
|
36 |
|
|
// Modified by julians for wxWindows (originally CTUtils.h)
|
37 |
|
|
// Requires:
|
38 |
|
|
// Provides:
|
39 |
|
|
// See also:
|
40 |
|
|
// Known bugs:
|
41 |
|
|
// Usage:
|
42 |
|
|
//
|
43 |
|
|
//####DESCRIPTIONEND####
|
44 |
|
|
//
|
45 |
|
|
//===========================================================================
|
46 |
|
|
|
47 |
|
|
#ifndef _ECUTILS_H_
|
48 |
|
|
#define _ECUTILS_H_
|
49 |
|
|
|
50 |
|
|
#ifdef __GNUG__
|
51 |
|
|
#pragma interface "ecutils.cpp"
|
52 |
|
|
#endif
|
53 |
|
|
|
54 |
|
|
#include "wx/hash.h"
|
55 |
|
|
#include "wx/confbase.h"
|
56 |
|
|
#include "wx/dynarray.h"
|
57 |
|
|
|
58 |
|
|
#include "filename.h"
|
59 |
|
|
#include "cdl.hxx"
|
60 |
|
|
|
61 |
|
|
//#define INCLUDEFILE <string>
|
62 |
|
|
//#include "IncludeSTL.h"
|
63 |
|
|
|
64 |
|
|
//#include <stdarg.h> // vsnprintf
|
65 |
|
|
|
66 |
|
|
/*
|
67 |
|
|
* ecUtils
|
68 |
|
|
* This class implements a miscellany of utility functions.
|
69 |
|
|
* They are being implemented as and when they are required during Configtool
|
70 |
|
|
* development.
|
71 |
|
|
*/
|
72 |
|
|
|
73 |
|
|
class ecUtils {
|
74 |
|
|
public:
|
75 |
|
|
#if 0
|
76 |
|
|
static bool Launch (const ecFileName &strFileName,const ecFileName &strViewer);
|
77 |
|
|
static wxString GetLastErrorMessageString ();
|
78 |
|
|
#endif
|
79 |
|
|
|
80 |
|
|
static const wxString PosixToNativePath(const wxString & posix);
|
81 |
|
|
static const wxString NativeToPosixPath(const wxString & native);
|
82 |
|
|
static bool AddToPath (const ecFileName &strFolder, bool bAtFront=true);
|
83 |
|
|
|
84 |
|
|
#if 0
|
85 |
|
|
static const wxString LoadString (UINT id);
|
86 |
|
|
|
87 |
|
|
// Messagebox functions
|
88 |
|
|
|
89 |
|
|
// Vararg message box compositor
|
90 |
|
|
static int MessageBoxF (LPCTSTR pszFormat, ...);
|
91 |
|
|
// Same, with type
|
92 |
|
|
static int MessageBoxFT (UINT nType, LPCTSTR pszFormat, ...);
|
93 |
|
|
// As above but with resource
|
94 |
|
|
static int MessageBoxFR (UINT nID, UINT nType, LPCTSTR pszFormat, ...);
|
95 |
|
|
// Same, with type
|
96 |
|
|
static int MessageBoxFR (UINT nID, LPCTSTR pszFormat, ...);
|
97 |
|
|
// vararg form
|
98 |
|
|
static int vMessageBox(UINT nType, LPCTSTR pszFormat, va_list marker);
|
99 |
|
|
|
100 |
|
|
#endif
|
101 |
|
|
// String functions
|
102 |
|
|
|
103 |
|
|
// Chop the string into pieces using separator cSep.
|
104 |
|
|
// The Boolean controls whether " and \ make a difference
|
105 |
|
|
static int Chop(const wxString& psz,wxArrayString &ar, wxChar cSep=wxT(' '),
|
106 |
|
|
bool bObserveStrings = FALSE, bool bBackslashQuotes = FALSE);
|
107 |
|
|
|
108 |
|
|
static int Chop(const wxString& psz,wxArrayString &ar, const wxString& pszSep,
|
109 |
|
|
bool bObserveStrings=FALSE, bool bBackslashQuotes = FALSE);
|
110 |
|
|
|
111 |
|
|
// String -> Integer, observing the current hex/decimal setting
|
112 |
|
|
//static BOOL StrToItemIntegerType(const wxString &str, __int64 &d);
|
113 |
|
|
static bool StrToItemIntegerType(const wxString &str, long &d);
|
114 |
|
|
static bool StrToDouble (const wxString &strValue, double &dValue);
|
115 |
|
|
|
116 |
|
|
// Integer -> String, observing the current hex/decimal setting
|
117 |
|
|
static const wxString IntToStr(long d,bool bHex=false);
|
118 |
|
|
static const wxString DoubleToStr (double dValue);
|
119 |
|
|
static wxString StripExtraWhitespace (const wxString & strInput);
|
120 |
|
|
|
121 |
|
|
static void UnicodeToCStr(const wxChar* str,char *&psz);
|
122 |
|
|
static std::string UnicodeToStdStr(const wxChar* str);
|
123 |
|
|
|
124 |
|
|
#if 0
|
125 |
|
|
// Provide a failure explanation for what just went wrong
|
126 |
|
|
static const wxString Explanation (CFileException &exc);
|
127 |
|
|
static ecFileName WPath(const std::string &str);
|
128 |
|
|
static bool CopyFile (LPCTSTR pszSource,LPCTSTR pszDest);
|
129 |
|
|
#endif
|
130 |
|
|
};
|
131 |
|
|
|
132 |
|
|
/*
|
133 |
|
|
* wxStringToStringMap
|
134 |
|
|
*
|
135 |
|
|
* Stores string values keyed by strings.
|
136 |
|
|
* Note that only one value is allowed per key.
|
137 |
|
|
*/
|
138 |
|
|
|
139 |
|
|
class wxStringToStringMap: public wxObject
|
140 |
|
|
{
|
141 |
|
|
public:
|
142 |
|
|
wxStringToStringMap(): m_hashTable(wxKEY_STRING) {}
|
143 |
|
|
~wxStringToStringMap() { Clear(); }
|
144 |
|
|
|
145 |
|
|
//// Operations
|
146 |
|
|
|
147 |
|
|
// Remove the key/value pair
|
148 |
|
|
bool Remove(const wxString& key);
|
149 |
|
|
|
150 |
|
|
// Clear the map
|
151 |
|
|
void Clear();
|
152 |
|
|
|
153 |
|
|
// Begin a search through the whole map: use Next to find key/value pairs
|
154 |
|
|
void BeginFind();
|
155 |
|
|
|
156 |
|
|
// Retrieve the next key/value pair, FALSE indicates end of data
|
157 |
|
|
bool Next(wxString& key, wxString& value);
|
158 |
|
|
|
159 |
|
|
//// Accessors
|
160 |
|
|
|
161 |
|
|
// Replaces the value (if any) associated with the key
|
162 |
|
|
void Set(const wxString& key, const wxString& value);
|
163 |
|
|
|
164 |
|
|
// Finds a value associated with the key, returns FALSE if none
|
165 |
|
|
bool Find(const wxString& key, wxString& value);
|
166 |
|
|
|
167 |
|
|
protected:
|
168 |
|
|
wxHashTable m_hashTable;
|
169 |
|
|
};
|
170 |
|
|
|
171 |
|
|
// Is str a member of arr?
|
172 |
|
|
bool wxArrayStringIsMember(const wxArrayString& arr, const wxString& str);
|
173 |
|
|
|
174 |
|
|
// Eliminate .. and .
|
175 |
|
|
wxString wxGetRealPath(const wxString& path);
|
176 |
|
|
|
177 |
|
|
// A version of the above but prepending the cwd (current path) first
|
178 |
|
|
// if 'path' is relative
|
179 |
|
|
wxString wxGetRealPath(const wxString& cwd, const wxString& path);
|
180 |
|
|
|
181 |
|
|
// Find the absolute path where this application has been run from.
|
182 |
|
|
// argv0 is wxTheApp->argv[0]
|
183 |
|
|
// cwd is the current working directory (at startup)
|
184 |
|
|
// appVariableName is the name of a variable containing the directory for this app, e.g.
|
185 |
|
|
// MYAPPDIR. This is used as a last resort. Or should it be a first resort?
|
186 |
|
|
wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxString& appVariableName = wxEmptyString);
|
187 |
|
|
|
188 |
|
|
// Find the text of the list control item at the given column
|
189 |
|
|
class WXDLLEXPORT wxListCtrl;
|
190 |
|
|
wxString wxListCtrlGetItemTextColumn(wxListCtrl& listCtrl, long item, int col);
|
191 |
|
|
|
192 |
|
|
// Select the given item
|
193 |
|
|
void wxListCtrlSelectItem(wxListCtrl& listCtrl, long sel, bool deselectOther = TRUE);
|
194 |
|
|
|
195 |
|
|
// Find the selection
|
196 |
|
|
long wxListCtrlGetSelection(wxListCtrl& listCtrl);
|
197 |
|
|
|
198 |
|
|
// Find which column the cursor is on
|
199 |
|
|
int wxListCtrlFindColumn(wxListCtrl& listCtrl, int noCols, int x);
|
200 |
|
|
|
201 |
|
|
// Refresh children of this window (e.g. on Windows, laying out a window containing
|
202 |
|
|
// controls can cause screen corruption)
|
203 |
|
|
void wxRefreshControls(wxWindow* win);
|
204 |
|
|
|
205 |
|
|
// Make a path name with no separators, out of a full pathname,
|
206 |
|
|
// e.g. opt_ecos_ecos-1.4.5 out of /opt/ecos/ecos-1.4.5
|
207 |
|
|
wxString ecMakeNameFromPath(const wxString& path);
|
208 |
|
|
|
209 |
|
|
// Kill a process
|
210 |
|
|
int ecKill(long pid, wxSignal sig);
|
211 |
|
|
|
212 |
|
|
class WXDLLEXPORT wxOutputStream;
|
213 |
|
|
|
214 |
|
|
wxOutputStream& operator <<(wxOutputStream&, const wxString& s);
|
215 |
|
|
wxOutputStream& operator <<(wxOutputStream&, const char c);
|
216 |
|
|
wxOutputStream& operator <<(wxOutputStream&, long l);
|
217 |
|
|
|
218 |
|
|
/*
|
219 |
|
|
* Class for recursively killing a process and its children.
|
220 |
|
|
* This has been taken from CSubprocess, but we can't use CSubprocess
|
221 |
|
|
* directly for killing a process because it assumes it's been used to create
|
222 |
|
|
* the process.
|
223 |
|
|
*/
|
224 |
|
|
|
225 |
|
|
class wxProcessKiller
|
226 |
|
|
{
|
227 |
|
|
|
228 |
|
|
public:
|
229 |
|
|
const wxString ErrorString() const;
|
230 |
|
|
|
231 |
|
|
wxProcessKiller(int pid);
|
232 |
|
|
~wxProcessKiller();
|
233 |
|
|
|
234 |
|
|
void SetVerbose (bool b) { m_bVerbose=b; }
|
235 |
|
|
|
236 |
|
|
int Pid() const { return m_idProcess; } // returns process id (even when process is terminated)
|
237 |
|
|
|
238 |
|
|
// Get the process exit code. This can be:
|
239 |
|
|
// exit code of process (if terminated)
|
240 |
|
|
// 0xffffffff (if process not yet run)
|
241 |
|
|
// GetLastError result (if process could not be run)
|
242 |
|
|
int GetExitCode() { return m_nExitCode; }
|
243 |
|
|
|
244 |
|
|
// Kill the process:
|
245 |
|
|
bool Kill(bool bRecurse = true);
|
246 |
|
|
|
247 |
|
|
// Is the process running?
|
248 |
|
|
bool ProcessAlive();
|
249 |
|
|
|
250 |
|
|
protected:
|
251 |
|
|
static const wxString Name (int pid); // for debugging - only works under NT
|
252 |
|
|
|
253 |
|
|
struct wxPInfo;
|
254 |
|
|
struct wxPInfo {
|
255 |
|
|
wxPInfo *pParent;
|
256 |
|
|
#ifdef _WIN32
|
257 |
|
|
wxLongLong_t tCreation;
|
258 |
|
|
#endif
|
259 |
|
|
long tCpu;
|
260 |
|
|
int PID;
|
261 |
|
|
int PPID;
|
262 |
|
|
bool IsChildOf(int pid) const;
|
263 |
|
|
};
|
264 |
|
|
|
265 |
|
|
typedef std::vector<wxPInfo> wxPInfoArray;
|
266 |
|
|
|
267 |
|
|
static bool PSExtract(wxPInfoArray &arPinfo);
|
268 |
|
|
static void SetParents(wxPInfoArray &arPinfo);
|
269 |
|
|
|
270 |
|
|
#ifdef _WIN32
|
271 |
|
|
static long GetPlatform();
|
272 |
|
|
WXHANDLE m_hrPipe;
|
273 |
|
|
WXHANDLE m_hwPipe;
|
274 |
|
|
WXHANDLE m_hProcess; // This handle is "owned" by the ThreadFunc
|
275 |
|
|
static WXHINSTANCE hInstLib1, hInstLib2;
|
276 |
|
|
int m_nErr;
|
277 |
|
|
#else
|
278 |
|
|
int m_tty;
|
279 |
|
|
wxString m_strCmd;
|
280 |
|
|
#endif
|
281 |
|
|
|
282 |
|
|
bool m_bVerbose;
|
283 |
|
|
int m_nExitCode;
|
284 |
|
|
int m_idProcess;
|
285 |
|
|
|
286 |
|
|
static const unsigned int PROCESS_KILL_EXIT_CODE;
|
287 |
|
|
};
|
288 |
|
|
|
289 |
|
|
/*
|
290 |
|
|
* ecDialog
|
291 |
|
|
* Supports features we want to have for all dialogs in the application.
|
292 |
|
|
* So far, this just allows dialogs to be resizeable under MSW by
|
293 |
|
|
* refreshing the controls in OnSize (otherwise there's a mess)
|
294 |
|
|
*/
|
295 |
|
|
|
296 |
|
|
class ecDialog: public wxDialog
|
297 |
|
|
{
|
298 |
|
|
public:
|
299 |
|
|
DECLARE_CLASS(ecDialog)
|
300 |
|
|
|
301 |
|
|
ecDialog() {};
|
302 |
|
|
|
303 |
|
|
ecDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition,
|
304 |
|
|
const wxSize& sz = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE)
|
305 |
|
|
{
|
306 |
|
|
Create(parent, id, title, pos, sz, style);
|
307 |
|
|
}
|
308 |
|
|
/*
|
309 |
|
|
bool Create(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition,
|
310 |
|
|
const wxSize& sz = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE);
|
311 |
|
|
*/
|
312 |
|
|
|
313 |
|
|
void OnSize(wxSizeEvent& event);
|
314 |
|
|
|
315 |
|
|
DECLARE_EVENT_TABLE()
|
316 |
|
|
};
|
317 |
|
|
|
318 |
|
|
/*
|
319 |
|
|
* Implements saving/loading of window settings - fonts only for now
|
320 |
|
|
*/
|
321 |
|
|
|
322 |
|
|
class wxWindowSettingsObject: public wxObject
|
323 |
|
|
{
|
324 |
|
|
public:
|
325 |
|
|
wxWindowSettingsObject(const wxString& name, wxWindow* win) { m_windowName = name; if (win) m_arrWindow.Add(win); }
|
326 |
|
|
wxString m_windowName;
|
327 |
|
|
wxFont m_font;
|
328 |
|
|
wxArrayPtrVoid m_arrWindow;
|
329 |
|
|
};
|
330 |
|
|
|
331 |
|
|
class wxWindowSettings: public wxObject
|
332 |
|
|
{
|
333 |
|
|
public:
|
334 |
|
|
wxWindowSettings() { m_useDefaults = TRUE; };
|
335 |
|
|
~wxWindowSettings() { Clear(); }
|
336 |
|
|
|
337 |
|
|
//// Operations
|
338 |
|
|
wxWindowSettingsObject* FindSettings(const wxString& windowName) const;
|
339 |
|
|
void Add(const wxString& name, wxWindow* win = NULL) { m_settings.Append(new wxWindowSettingsObject(name, win)); }
|
340 |
|
|
|
341 |
|
|
bool LoadConfig(wxConfigBase& config);
|
342 |
|
|
bool SaveConfig(wxConfigBase& config);
|
343 |
|
|
|
344 |
|
|
bool LoadFont(wxConfigBase& config, const wxString& windowName, wxFont& font);
|
345 |
|
|
bool SaveFont(wxConfigBase& config, const wxString& windowName, const wxFont& font);
|
346 |
|
|
|
347 |
|
|
void Clear() { m_settings.DeleteContents(TRUE); m_settings.Clear(); m_settings.DeleteContents(FALSE); }
|
348 |
|
|
|
349 |
|
|
bool ApplyFontsToWindows();
|
350 |
|
|
|
351 |
|
|
//// Accessors
|
352 |
|
|
wxFont GetFont(const wxString& name) const;
|
353 |
|
|
void SetFont(const wxString& name, const wxFont& font);
|
354 |
|
|
|
355 |
|
|
wxWindow* GetWindow(const wxString& name) const;
|
356 |
|
|
void SetWindow(const wxString& name, wxWindow* win);
|
357 |
|
|
|
358 |
|
|
wxArrayPtrVoid* GetWindows(const wxString& name) const;
|
359 |
|
|
void SetWindows(const wxString& name, wxArrayPtrVoid& arr);
|
360 |
|
|
|
361 |
|
|
int GetCount() const { return m_settings.Number(); }
|
362 |
|
|
wxWindowSettingsObject* GetNth(int i) const { return (wxWindowSettingsObject*) m_settings.Nth(i)->Data(); }
|
363 |
|
|
wxString GetName(int i) const { return GetNth(i)->m_windowName; }
|
364 |
|
|
|
365 |
|
|
void SetUseDefaults(bool useDefaults) { m_useDefaults = useDefaults; }
|
366 |
|
|
bool GetUseDefaults() const { return m_useDefaults; }
|
367 |
|
|
|
368 |
|
|
public:
|
369 |
|
|
wxList m_settings;
|
370 |
|
|
bool m_useDefaults;
|
371 |
|
|
};
|
372 |
|
|
|
373 |
|
|
#endif
|
374 |
|
|
// _ECUTILS_H_
|