OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [tools/] [src/] [tools/] [configtool/] [standalone/] [wxwin/] [mainwin.cpp] - Blame information for rev 307

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
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
// mainwin.cpp :
27
//
28
//===========================================================================
29
//#####DESCRIPTIONBEGIN####
30
//
31
// Author(s):   julians, jld
32
// Contact(s):  julians, jld
33
// Date:        2000/08/24
34
// Version:     $Id: mainwin.cpp,v 1.1.1.1 2004-02-14 13:28:51 phoenix Exp $
35
// Purpose:
36
// Description: Implementation file for the ConfigTool main window
37
// Requires:
38
// Provides:
39
// See also:
40
// Known bugs:
41
// Usage:
42
//
43
//####DESCRIPTIONEND####
44
//
45
//===========================================================================
46
 
47
// ============================================================================
48
// declarations
49
// ============================================================================
50
 
51
// ----------------------------------------------------------------------------
52
// headers
53
// ----------------------------------------------------------------------------
54
#ifdef __GNUG__
55
#pragma implementation "mainwin.h"
56
#endif
57
 
58
// Includes other headers for precompiled compilation
59
#include "ecpch.h"
60
 
61
#ifdef __BORLANDC__
62
#pragma hdrstop
63
#endif
64
 
65
#include "wx/cshelp.h"
66
#include "wx/wxhtml.h"
67
#include "wx/filedlg.h"
68
#include "wx/wfstream.h"
69
 
70
#include "mainwin.h"
71
#include "configtool.h"
72
#include "configtree.h"
73
#include "propertywin.h"
74
#include "conflictwin.h"
75
#include "mltwin.h"
76
#include "outputwin.h"
77
#include "shortdescrwin.h"
78
#include "conflictsdlg.h"
79
#include "aboutdlg.h"
80
#include "finddlg.h"
81
#include "settingsdlg.h"
82
#include "platformsdlg.h"
83
#include "buildoptionsdlg.h"
84
#include "templatesdlg.h"
85
#include "admindlg.h"
86
#include "packagesdlg.h"
87
#include "configtooldoc.h"
88
#include "configtoolview.h"
89
#include "folderdlg.h"
90
#include "reposdlg.h"
91
#include "docsystem.h"
92
#include "symbols.h"
93
 
94
#ifdef __WXMSW__
95
#include "wx/msw/winundef.h"
96
#endif
97
 
98
// ----------------------------------------------------------------------------
99
// resources
100
// ----------------------------------------------------------------------------
101
// the application icon
102
#if defined(__WXGTK__) || defined(__WXMOTIF__)
103
#include "bitmaps/configtool.xpm"
104
#include "bitmaps/new.xpm"
105
#include "bitmaps/open.xpm"
106
#include "bitmaps/save.xpm"
107
#include "bitmaps/copy.xpm"
108
#include "bitmaps/paste.xpm"
109
#include "bitmaps/cut.xpm"
110
#include "bitmaps/delete.xpm"
111
#include "bitmaps/help.xpm"
112
#include "bitmaps/cshelp.xpm"
113
#include "bitmaps/search.xpm"
114
#include "bitmaps/stopbuild.xpm"
115
#include "bitmaps/buildlibrary.xpm"
116
#include "bitmaps/newregion.xpm"
117
#include "bitmaps/newsection.xpm"
118
#include "bitmaps/properties.xpm"
119
#endif
120
 
121
// ----------------------------------------------------------------------------
122
// event tables and other macros for wxWindows
123
// ----------------------------------------------------------------------------
124
 
125
BEGIN_EVENT_TABLE(ecMainFrame, wxDocParentFrame)
126
    EVT_MENU(wxID_EXIT,  ecMainFrame::OnQuit)
127
    EVT_MENU(wxID_ABOUT, ecMainFrame::OnAbout)
128
    EVT_MENU(ecID_REPOSITORY_INFO, ecMainFrame::OnRepositoryInfo)
129
    EVT_MENU(wxID_FIND, ecMainFrame::OnFind)
130
    EVT_MENU(ecID_FIND_NEXT, ecMainFrame::OnFindNext)
131
    EVT_SASH_DRAGGED_RANGE(ecID_CONFIG_SASH_WINDOW, ecID_OUTPUT_SASH_WINDOW, ecMainFrame::OnSashDrag)
132
    EVT_SIZE(ecMainFrame::OnSize)
133
    EVT_IDLE(ecMainFrame::OnIdle)
134
    EVT_CLOSE(ecMainFrame::OnCloseWindow)
135
    EVT_MENU(ecID_TOGGLE_CONFLICTS, ecMainFrame::OnToggleWindow)
136
    EVT_MENU(ecID_TOGGLE_PROPERTIES, ecMainFrame::OnToggleWindow)
137
    EVT_MENU(ecID_TOGGLE_MEMORY, ecMainFrame::OnToggleWindow)
138
    EVT_MENU(ecID_TOGGLE_SHORT_DESCR, ecMainFrame::OnToggleWindow)
139
    EVT_MENU(ecID_TOGGLE_OUTPUT, ecMainFrame::OnToggleWindow)
140
    EVT_MENU(ecID_TOOLBARS, ecMainFrame::OnToggleToolbar)
141
    EVT_MENU(ecID_CONFIGTOOL_HELP, ecMainFrame::OnHelpConfigtool)
142
    EVT_MENU(ecID_ECOS_HELP, ecMainFrame::OnHelpEcos)
143
    EVT_MENU(ecID_CONTEXT_HELP, ecMainFrame::OnHelpContext)
144
    EVT_MENU(ecID_RESOLVE_CONFLICTS, ecMainFrame::OnResolveConflicts)
145
    EVT_UPDATE_UI(ecID_RESOLVE_CONFLICTS, ecMainFrame::OnUpdateResolveConflicts)
146
    EVT_MENU(ecID_SETTINGS, ecMainFrame::OnSettings)
147
    EVT_MENU(ecID_PLATFORMS, ecMainFrame::OnPlatforms)
148
    EVT_MENU(ecID_BUILD_OPTIONS, ecMainFrame::OnBuildOptions)
149
    EVT_MENU(ecID_PATHS_BUILD_TOOLS, ecMainFrame::OnBuildToolsPath)
150
    EVT_MENU(ecID_PATHS_USER_TOOLS, ecMainFrame::OnUserToolsPath)
151
    EVT_MENU(ecID_BUILD_TEMPLATES, ecMainFrame::OnTemplates)
152
    EVT_MENU(ecID_ADMINISTRATION, ecMainFrame::OnAdmin)
153
    EVT_MENU(ecID_BUILD_PACKAGES, ecMainFrame::OnPackages)
154
    EVT_MENU(ecID_RUN_TESTS, ecMainFrame::OnRunTests)
155
    EVT_MENU(ecID_BUILD_REPOSITORY, ecMainFrame::OnChooseRepository)
156
    EVT_MENU(ecID_WHATS_THIS, ecMainFrame::OnWhatsThis)
157
    EVT_MENU(ecID_SAVE_OUTPUT, ecMainFrame::OnSaveOutput)
158
    EVT_MENU(ecID_IMPORT, ecMainFrame::OnImport)
159
    EVT_MENU(ecID_EXPORT, ecMainFrame::OnExport)
160
    EVT_MENU(ecID_REDHAT_WEB_HOME, ecMainFrame::OnWebRedHatHome)
161
    EVT_MENU(ecID_REDHAT_WEB_ECOS, ecMainFrame::OnWebEcos)
162
    EVT_MENU(ecID_REDHAT_WEB_NET_RELEASE, ecMainFrame::OnWebNetRelease)
163
    EVT_MENU(ecID_REDHAT_WEB_UITRON, ecMainFrame::OnWebUitron)
164
    EVT_MENU(ecID_STOP_BUILD, ecMainFrame::OnStopBuild)
165
    EVT_MENU(ecID_BUILD_LIBRARY, ecMainFrame::OnBuildLibrary)
166
    EVT_MENU(ecID_BUILD_TESTS, ecMainFrame::OnBuildTests)
167
    EVT_MENU(ecID_CLEAN, ecMainFrame::OnClean)
168
    EVT_MENU(ecID_SHELL, ecMainFrame::OnShell)
169
    EVT_MENU(ecID_INDEX_DOCS, ecMainFrame::OnIndexDocs)
170
    EVT_MENU(ecID_GENERATE_BUILD_TREE, ecMainFrame::OnGenerateBuildTree)
171
 
172
    EVT_UPDATE_UI(ecID_PLATFORMS, ecMainFrame::OnUpdatePlatforms)
173
    EVT_UPDATE_UI(ecID_BUILD_OPTIONS, ecMainFrame::OnUpdateBuildOptions)
174
    EVT_UPDATE_UI(ecID_PATHS_BUILD_TOOLS, ecMainFrame::OnUpdateBuildToolsPath)
175
    EVT_UPDATE_UI(ecID_PATHS_USER_TOOLS, ecMainFrame::OnUpdateUserToolsPath)
176
    EVT_UPDATE_UI(ecID_BUILD_TEMPLATES, ecMainFrame::OnUpdateTemplates)
177
    EVT_UPDATE_UI(ecID_ADMINISTRATION, ecMainFrame::OnUpdateAdmin)
178
    EVT_UPDATE_UI(ecID_BUILD_PACKAGES, ecMainFrame::OnUpdatePackages)
179
    EVT_UPDATE_UI(ecID_RUN_TESTS, ecMainFrame::OnUpdateRunTests)
180
    EVT_UPDATE_UI(ecID_BUILD_REPOSITORY, ecMainFrame::OnUpdateChooseRepository)
181
    EVT_UPDATE_UI(ecID_CLEAN, ecMainFrame::OnUpdateClean)
182
    EVT_UPDATE_UI(ecID_REPOSITORY_INFO, ecMainFrame::OnUpdateRepositoryInfo)
183
    EVT_UPDATE_UI(ecID_INDEX_DOCS, ecMainFrame::OnUpdateIndexDocs)
184
 
185
    EVT_UPDATE_UI(ecID_TOGGLE_CONFLICTS, ecMainFrame::OnUpdateToggleWindow)
186
    EVT_UPDATE_UI(ecID_TOGGLE_PROPERTIES, ecMainFrame::OnUpdateToggleWindow)
187
    EVT_UPDATE_UI(ecID_TOGGLE_MEMORY, ecMainFrame::OnUpdateToggleWindow)
188
    EVT_UPDATE_UI(ecID_TOGGLE_SHORT_DESCR, ecMainFrame::OnUpdateToggleWindow)
189
    EVT_UPDATE_UI(ecID_TOGGLE_OUTPUT, ecMainFrame::OnUpdateToggleWindow)
190
    EVT_UPDATE_UI(ecID_TOOLBARS, ecMainFrame::OnUpdateToggleToolbar)
191
 
192
    // Disable commands that don't make sense immediately or are not yet implemented.
193
    // Also, for text controls, disable if they are not being enabled by currently-focussed controls.
194
    EVT_UPDATE_UI(wxID_COPY, ecMainFrame::OnUpdateDisable)
195
    EVT_UPDATE_UI(wxID_CUT, ecMainFrame::OnUpdateDisable)
196
    EVT_UPDATE_UI(wxID_PASTE, ecMainFrame::OnUpdateDisable)
197
    EVT_UPDATE_UI(wxID_SELECTALL, ecMainFrame::OnUpdateSelectAll)
198
    EVT_UPDATE_UI(wxID_CLEAR, ecMainFrame::OnUpdateClear)
199
 
200
    EVT_UPDATE_UI(wxID_FIND, ecMainFrame::OnUpdateFind)
201
    EVT_UPDATE_UI(ecID_FIND_NEXT, ecMainFrame::OnUpdateFindNext)
202
 
203
    EVT_MENU(ecID_NEW_REGION, ecMainFrame::OnNewRegion)
204
    EVT_MENU(ecID_NEW_SECTION, ecMainFrame::OnNewSection)
205
    EVT_MENU(ecID_DELETE, ecMainFrame::OnDeleteRegionOrSection)
206
    EVT_MENU(ecID_PROPERTIES, ecMainFrame::OnRegionOrSectionProperties)
207
 
208
    EVT_UPDATE_UI(ecID_STOP_BUILD, ecMainFrame::OnUpdateStopBuild)
209
    EVT_UPDATE_UI(ecID_BUILD_LIBRARY, ecMainFrame::OnUpdateBuildLibrary)
210
    EVT_UPDATE_UI(ecID_BUILD_TESTS, ecMainFrame::OnUpdateBuildTests)
211
    EVT_UPDATE_UI(ecID_GENERATE_BUILD_TREE, ecMainFrame::OnUpdateGenerateBuildTree)
212
 
213
    EVT_UPDATE_UI(ecID_SHELL, ecMainFrame::OnUpdateShell)
214
 
215
    EVT_UPDATE_UI(ecID_NEW_REGION, ecMainFrame::OnUpdateNewRegion)
216
    EVT_UPDATE_UI(ecID_NEW_SECTION, ecMainFrame::OnUpdateNewSection)
217
    EVT_UPDATE_UI(ecID_DELETE, ecMainFrame::OnUpdateDeleteRegionOrSection)
218
    EVT_UPDATE_UI(ecID_PROPERTIES, ecMainFrame::OnUpdateRegionOrSectionProperties)
219
 
220
    EVT_UPDATE_UI(ecID_IMPORT, ecMainFrame::OnUpdateImport)
221
    EVT_UPDATE_UI(ecID_EXPORT, ecMainFrame::OnUpdateExport)
222
END_EVENT_TABLE()
223
 
224
// ----------------------------------------------------------------------------
225
// main frame
226
// ----------------------------------------------------------------------------
227
 
228
// Frame constructor
229
ecMainFrame::ecMainFrame(wxDocManager *manager, const wxString& title, const wxPoint& pos, const wxSize& size):
230
    wxDocParentFrame(manager, (wxFrame *)NULL, ecID_MAIN_FRAME, title, pos, size, wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE )
231
{
232
    m_splitter = NULL;
233
    m_scrolledWindow = NULL;
234
    m_tree = NULL;
235
    m_configSashWindow = NULL;
236
    m_valueWindow = NULL;
237
    m_outputWindow = NULL;
238
    m_shortDescrWindow = NULL;
239
    m_conflictsSashWindow = NULL;
240
    m_propertiesSashWindow = NULL;
241
    m_memorySashWindow = NULL;
242
    m_shortDescrSashWindow = NULL;
243
    m_outputSashWindow = NULL;
244
    m_propertyListWindow = NULL;
245
    m_findDialog = NULL;
246
    m_mltWindow = NULL;
247
 
248
#ifdef __WXMAC__
249
    // we need this in order to allow the about menu relocation, since ABOUT is
250
    // not the default id of the about menu
251
    wxApp::s_macAboutMenuItemId = wxID_EXIT;
252
#endif
253
 
254
    CreateWindows();
255
 
256
    wxIcon mainIcon(wxICON(configtool));
257
    wxGetApp().SetMainIcon(mainIcon);
258
 
259
    // set the frame icon
260
    SetIcon(mainIcon);
261
 
262
    // create a menu bar
263
 
264
    // File menu
265
    wxMenu *fileMenu = new wxMenu(wxT(""), wxMENU_TEAROFF);
266
 
267
    fileMenu->Append(wxID_NEW, _("&New\tCtrl+N"), _("Creates a new document"));
268
#if 0
269
    wxMenuItem* menuItem = new wxMenuItem(fileMenu, wxID_NEW, _("&New\tCtrl+N"), _("Creates a new document"));
270
    menuItem->SetBitmaps(wxBITMAP(new));
271
    fileMenu->Append(menuItem);
272
#endif
273
 
274
    fileMenu->Append(wxID_OPEN, _("&Open\tCtrl+O"), _("Opens an existing document"));
275
    fileMenu->Append(wxID_SAVE, _("&Save\tCtrl+S"), _("Saves the active document"));
276
    fileMenu->Append(wxID_SAVEAS, _("Save &As..."), _("Saves the active document with a new name"));
277
    fileMenu->AppendSeparator();
278
    fileMenu->Append(ecID_IMPORT, _("&Import..."), _("Imports a minimal configuration exported from another configuration"));
279
    fileMenu->Append(ecID_EXPORT, _("&Export..."), _("Exports a minimal configuration for importing into another configuration"));
280
    fileMenu->AppendSeparator();
281
    fileMenu->Append(wxID_EXIT, _("E&xit\tAlt+X"), _("Quits the application"));
282
 
283
    // A history of files visited. Use this menu.
284
    wxGetApp().GetDocManager()->FileHistoryUseMenu(fileMenu);
285
    // Load file history
286
    {
287
        wxConfig config(wxGetApp().GetSettings().GetConfigAppName());
288
        config.SetPath(wxT("FileHistory/"));
289
        wxGetApp().GetDocManager()->FileHistoryLoad(config);
290
    }
291
 
292
    // Edit menu
293
    wxMenu* editMenu = new wxMenu(wxT(""), wxMENU_TEAROFF);
294
 
295
    editMenu->Append(wxID_CUT, _("Cu&t\tCtrl+X"), _("Cuts the output pane selection and moves it to the Clipboard"));
296
    editMenu->Append(wxID_COPY, _("&Copy\tCtrl+C"), _("Copies the output pane selection to the clipboard"));
297
    editMenu->Append(wxID_PASTE, _("&Paste\tCtrl+V"), _("Inserts Clipboard contents"));
298
    editMenu->Append(wxID_CLEAR, _("&Clear"), _("Erases everything in the output pane"));
299
    editMenu->AppendSeparator();
300
    editMenu->Append(wxID_SELECTALL, _("&Select All\tCtrl+A"), _("Selects the entire output pane"));
301
    editMenu->AppendSeparator();
302
    editMenu->Append(wxID_FIND, _("&Find...\tCtrl+F"), _("Finds the specified text"));
303
    editMenu->Append(ecID_FIND_NEXT, _("Find &Next\tF3"), _("Finds the next item matching the Find text"));
304
    editMenu->AppendSeparator();
305
    editMenu->Append(ecID_SAVE_OUTPUT, _("Sa&ve Output..."), _("Saves the contents of the output pane"));
306
 
307
    // View menu
308
    wxMenu* viewMenu = new wxMenu(wxT(""), wxMENU_TEAROFF);
309
 
310
    viewMenu->Append(ecID_SETTINGS, _("&Settings...\tCtrl+T"), _("Shows the application settings dialog"));
311
    viewMenu->AppendSeparator();
312
    viewMenu->Append(ecID_TOOLBARS, _("&Toolbar"), _("Shows or hides the toolbar"), TRUE);
313
    viewMenu->Append(ecID_TOGGLE_PROPERTIES, _("&Properties\tAlt+1"), _("Shows or hides the properties window"), TRUE);
314
    viewMenu->Append(ecID_TOGGLE_OUTPUT, _("&Output\tAlt+2"), _("Shows the output window"), TRUE);
315
    viewMenu->Append(ecID_TOGGLE_SHORT_DESCR, _("&Short Description\tAlt+3"), _("Shows or hides the short description window"), TRUE);
316
 
317
    viewMenu->Append(ecID_TOGGLE_CONFLICTS, _("&Conflicts\tAlt+4"), _("Shows or hides the conflicts window"), TRUE);
318
#if ecUSE_MLT
319
    viewMenu->Append(ecID_TOGGLE_MEMORY, _("&Memory Layout\tAlt+5"), _("Shows or hides the memory layout window"), TRUE);
320
    //viewMenu->Enable(ecID_TOGGLE_MEMORY, FALSE);
321
#endif
322
 
323
    // Not clear what these do, so let's not have them.
324
    //viewMenu->Append(ecID_VIEW_NEXT, _("&Next\tAlt+F6"), _("Selects the next visible pane"));
325
    //viewMenu->Append(ecID_VIEW_PREVIOUS, _("&Previous\tShift+Alt+F6"), _("Selects the previous visible pane"));
326
 
327
    // Build menu
328
    wxMenu* buildMenu = new wxMenu(wxT(""), wxMENU_TEAROFF);
329
 
330
    buildMenu->Append(ecID_BUILD_LIBRARY, _("&Library\tF7"), _("Builds the library"));
331
    buildMenu->Append(ecID_BUILD_TESTS, _("&Tests\tShift+F7"), _("Builds the tests"));
332
    buildMenu->Append(ecID_CLEAN, _("&Clean"), _("Deletes intermediate and output files"));
333
    buildMenu->Append(ecID_STOP_BUILD, _("&Stop"), _("Stops the build"));
334
    buildMenu->AppendSeparator();
335
    buildMenu->Append(ecID_GENERATE_BUILD_TREE, _("&Generate Build Tree"), _("Explicitly recreates the build tree"));
336
    buildMenu->AppendSeparator();
337
    buildMenu->Append(ecID_BUILD_OPTIONS, _("&Options..."), _("Changes build options"));
338
    buildMenu->Append(ecID_BUILD_REPOSITORY, _("&Repository..."), _("Selects repository"));
339
    buildMenu->Append(ecID_BUILD_TEMPLATES, _("&Templates..."), _("Selects the package templates"));
340
    buildMenu->Append(ecID_BUILD_PACKAGES, _("&Packages..."), _("Selects individual packages"));
341
 
342
    // Tools menu
343
    wxMenu* toolsMenu = new wxMenu(wxT(""), wxMENU_TEAROFF);
344
 
345
    wxMenu* pathMenu = new wxMenu;
346
    pathMenu->Append(ecID_PATHS_BUILD_TOOLS, _("&Build Tools..."), _("Specifies the folder containing the build tools"));
347
    pathMenu->Append(ecID_PATHS_USER_TOOLS, _("&User Tools..."), _("Specifies the folder containing the user tools"));
348
    toolsMenu->Append(ecID_PATHS, _("&Paths"), pathMenu);
349
 
350
    toolsMenu->Append(ecID_SHELL, _("&Shell..."), _("Invokes a command shell"));
351
    toolsMenu->Append(ecID_RUN_TESTS, _("&Run Tests...\tCtrl+F5"), _("Runs the configuration tests"));
352
    toolsMenu->Append(ecID_PLATFORMS, _("&Platforms..."), _("Edits the platforms list"));
353
    toolsMenu->Append(ecID_RESOLVE_CONFLICTS, _("Resolve &Conflicts..."), _("Resolves conflicts"));
354
    toolsMenu->Append(ecID_ADMINISTRATION, _("&Administration..."), _("Performs repository administration tasks"));
355
#if 0
356
    toolsMenu->AppendSeparator();
357
    toolsMenu->Append(ecID_TOOLS_OPTIONS, _("&Options..."), _("Changes configuration options"));
358
#endif
359
    toolsMenu->Append(ecID_INDEX_DOCS, _("Regenerate Help &Index"), _("Regenerates the online help contents"));
360
 
361
    // Help menu
362
    wxMenu* helpMenu = new wxMenu;
363
    helpMenu->Append(ecID_CONFIGTOOL_HELP, _("&Configuration Tool Help\tShift+F1"), _("Displays help"));
364
    helpMenu->Append(ecID_ECOS_HELP, _("&eCos Documentation"), _("Displays the documentation home page"));
365
    helpMenu->Append(ecID_CONTEXT_HELP, _("&Help On..."), _("Displays help for clicked-on windows"));
366
    helpMenu->AppendSeparator();
367
 
368
    wxMenu* webMenu = new wxMenu;
369
    webMenu->Append(ecID_REDHAT_WEB_HOME, _("&Red Hat Home Page"), _("Opens the Red Hat home page"));
370
    webMenu->Append(ecID_REDHAT_WEB_ECOS, _("&eCos Product Page"), _("Opens the eCos product page"));
371
    webMenu->Append(ecID_REDHAT_WEB_NET_RELEASE, _("eCos &Net Release Page"), _("Opens the eCos net release page"));
372
    webMenu->AppendSeparator();
373
    webMenu->Append(ecID_REDHAT_WEB_UITRON, _("&ITRON"), _("Opens the ITRON specification page"));
374
 
375
//    helpMenu->Append(ecID_REDHAT_WEB, _("&Red Hat on the Web"), webMenu);
376
//    helpMenu->AppendSeparator();
377
    helpMenu->Append(ecID_REPOSITORY_INFO, _("Repository &Information...\tCtrl+I"), _("Displays information about the current repository"));
378
    helpMenu->Append(wxID_ABOUT, _("&About the Configuration Tool..."), _("Displays program information, version and copyright"));
379
 
380
    wxMenuBar *menuBar = new wxMenuBar();
381
    menuBar->Append(fileMenu, _("&File"));
382
    menuBar->Append(editMenu, _("&Edit"));
383
    menuBar->Append(viewMenu, _("&View"));
384
    menuBar->Append(buildMenu, _("&Build"));
385
    menuBar->Append(toolsMenu, _("&Tools"));
386
    menuBar->Append(helpMenu, _("&Help"));
387
 
388
    // ... and attach this menu bar to the frame
389
    SetMenuBar(menuBar);
390
 
391
    // Create the toolbar
392
    RecreateToolbar();
393
 
394
    if (!wxGetApp().GetSettings().m_showToolBar)
395
        GetToolBar()->Show( FALSE );
396
 
397
    // Create the status bar
398
    CreateStatusBar(4, wxST_SIZEGRIP);
399
 
400
    int* widths = new int[4];
401
    widths[0] = -1; widths[1] = 100; widths[2] = 40; widths[3] = 80;
402
    SetStatusWidths(4, widths);
403
    delete[] widths;
404
 
405
    SetStatusText(_("No conflicts"), ecFailRulePane);
406
    SetStatusText(_("Ready"), ecStatusPane);
407
}
408
 
409
// Create the windows
410
void ecMainFrame::CreateWindows()
411
{
412
    ecSettings& stg = wxGetApp().GetSettings();
413
 
414
    // Create the sash layout windows first
415
 
416
    // Sash window for the output window
417
    m_outputSashWindow = new wxSashLayoutWindow(this, ecID_OUTPUT_SASH_WINDOW, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxCLIP_SIBLINGS);
418
    m_outputSashWindow->SetDefaultSize(stg.m_outputSashSize);
419
    m_outputSashWindow->SetOrientation(wxLAYOUT_HORIZONTAL);
420
    m_outputSashWindow->SetAlignment(wxLAYOUT_BOTTOM);
421
    m_outputSashWindow->SetSashVisible(wxSASH_TOP, TRUE);
422
    m_outputWindow = new ecOutputWindow(m_outputSashWindow, ecID_OUTPUT_WINDOW, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxCLIP_CHILDREN|wxTE_READONLY|wxTE_RICH);
423
    m_outputWindow->SetHelpText(_("The output window displays various warning and informational messages."));
424
 
425
    // Sash window for the memory window
426
    m_memorySashWindow = new wxSashLayoutWindow(this, ecID_MEMORY_SASH_WINDOW, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxSW_3D|wxCLIP_SIBLINGS);
427
    m_memorySashWindow->SetDefaultSize(stg.m_memorySashSize);
428
    m_memorySashWindow->SetOrientation(wxLAYOUT_HORIZONTAL);
429
    m_memorySashWindow->SetAlignment(wxLAYOUT_BOTTOM);
430
    m_memorySashWindow->SetSashVisible(wxSASH_TOP, TRUE);
431
    //wxTextCtrl* memoryWindow = new wxTextCtrl(m_memorySashWindow, ecID_MEMORY_WINDOW, wxT("This will be the memory layout window."), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxCLIP_CHILDREN|wxTE_NO_VSCROLL|wxTE_READONLY);
432
    m_mltWindow = new ecMemoryLayoutWindow(m_memorySashWindow, ecID_MEMORY_WINDOW, wxDefaultPosition, wxDefaultSize, wxCLIP_CHILDREN|wxSUNKEN_BORDER);
433
    m_mltWindow->SetHelpText(_("The memory layout window presents a graphical view of the memory layout of the currently selected\ncombination of target architecture, platform and start-up type."));
434
 
435
    // Sash window for the config tree
436
    m_configSashWindow = new wxSashLayoutWindow(this, ecID_CONFIG_SASH_WINDOW, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxCLIP_CHILDREN/*|wxCLIP_SIBLINGS*/);
437
    m_configSashWindow->SetDefaultSize(stg.m_treeSashSize);
438
    m_configSashWindow->SetOrientation(wxLAYOUT_VERTICAL);
439
    m_configSashWindow->SetAlignment(wxLAYOUT_LEFT);
440
    m_configSashWindow->SetSashVisible(wxSASH_RIGHT, TRUE);
441
 
442
    // Sash window for the conflicts window
443
    m_conflictsSashWindow = new wxSashLayoutWindow(this, ecID_CONFLICTS_SASH_WINDOW, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxCLIP_SIBLINGS);
444
    m_conflictsSashWindow->SetDefaultSize(stg.m_conflictsSashSize);
445
    m_conflictsSashWindow->SetOrientation(wxLAYOUT_HORIZONTAL);
446
    m_conflictsSashWindow->SetAlignment(wxLAYOUT_TOP);
447
    m_conflictsSashWindow->SetSashVisible(wxSASH_BOTTOM, TRUE);
448
    m_conflictsWindow = new ecConflictListCtrl(m_conflictsSashWindow, ecID_CONFLICTS_WINDOW, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxCLIP_CHILDREN|wxSUNKEN_BORDER);
449
    m_conflictsWindow->SetHelpText(_("The conflicts window lists any outstanding conflicts in the configuration."));
450
 
451
    // Sash window for the properties window
452
    m_propertiesSashWindow = new wxSashLayoutWindow(this, ecID_PROPERTIES_SASH_WINDOW, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxCLIP_SIBLINGS);
453
    m_propertiesSashWindow->SetDefaultSize(stg.m_propertiesSashSize);
454
    m_propertiesSashWindow->SetOrientation(wxLAYOUT_HORIZONTAL);
455
    m_propertiesSashWindow->SetAlignment(wxLAYOUT_TOP);
456
    m_propertiesSashWindow->SetSashVisible(wxSASH_BOTTOM, TRUE);
457
//    wxTextCtrl* propertiesWindow = new wxTextCtrl(m_propertiesSashWindow, ecID_PROPERTIES_WINDOW, wxT("This will be the properties window."), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxCLIP_CHILDREN|wxTE_NO_VSCROLL|wxTE_READONLY);
458
    m_propertyListWindow = new ecPropertyListCtrl(m_propertiesSashWindow, ecID_PROPERTIES_WINDOW, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxCLIP_CHILDREN|wxLC_VRULES|wxLC_HRULES|wxSUNKEN_BORDER);
459
    m_propertyListWindow->SetHelpText(_("The properties window shows the properties of the selected configuration item."));
460
 
461
    // Sash window for the short description window
462
    m_shortDescrSashWindow = new wxSashLayoutWindow(this, ecID_SHORT_DESCR_SASH_WINDOW, wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxCLIP_SIBLINGS);
463
    m_shortDescrSashWindow->SetDefaultSize(stg.m_shortDescrSashSize);
464
    m_shortDescrSashWindow->SetOrientation(wxLAYOUT_HORIZONTAL);
465
    m_shortDescrSashWindow->SetAlignment(wxLAYOUT_TOP);
466
    //m_shortDescrSashWindow->SetSashVisible(wxSASH_TOP, TRUE);
467
    m_shortDescrWindow = new ecShortDescriptionWindow(m_shortDescrSashWindow, ecID_SHORT_DESCR_WINDOW, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxCLIP_CHILDREN/*|wxTE_NO_VSCROLL*/|wxTE_READONLY);
468
    m_shortDescrWindow->SetBackgroundColour(wxColour(255, 255, 225));
469
    m_shortDescrWindow->SetHelpText(_("The short description window displays brief help on a selected configuration item."));
470
 
471
    // Create a composite widget to represent the scrolling config window
472
    m_scrolledWindow = new ecSplitterScrolledWindow(m_configSashWindow, ecID_SCROLLED_WINDOW, wxDefaultPosition,
473
        wxSize(400, 100), wxNO_BORDER | wxCLIP_CHILDREN | wxVSCROLL);
474
    m_splitter = new wxThinSplitterWindow(m_scrolledWindow, ecID_SPLITTER_WINDOW, wxDefaultPosition,
475
        wxSize(400, 100), wxSP_3DBORDER | wxCLIP_CHILDREN /* | wxSP_LIVE_UPDATE */);
476
    m_splitter->SetSashSize(2);
477
    m_tree = new ecConfigTreeCtrl(m_splitter, ecID_TREE_CTRL, wxDefaultPosition,
478
        wxSize(200, 100), wxTR_HAS_BUTTONS | wxTR_NO_LINES | wxNO_BORDER );
479
    m_valueWindow = new ecValueWindow(m_splitter, ecID_VALUE_WINDOW, wxDefaultPosition,
480
        wxSize(200, 100), wxNO_BORDER);
481
    m_splitter->SplitVertically(m_tree, m_valueWindow);
482
    m_splitter->SetMinimumPaneSize(100);
483
    //m_splitter->AdjustScrollbars();
484
    m_splitter->SetSashPosition(wxGetApp().GetSettings().m_configPaneWidth);
485
    m_scrolledWindow->SetTargetWindow(m_tree);
486
    m_scrolledWindow->EnableScrolling(FALSE, FALSE);
487
    m_tree->SetHelpText(_("The configuration window is the principal window used to configure eCos.\nIt takes the form of a tree-based representation of the configuration items within the currently loaded eCos packages."));
488
    m_valueWindow->SetHelpText(m_tree->GetHelpText());
489
 
490
    // Let the two controls know about each other
491
    m_valueWindow->SetTreeCtrl(m_tree);
492
    m_tree->SetCompanionWindow(m_valueWindow);
493
 
494
    // Set visibility according to config settings
495
    if (!wxGetApp().GetSettings().m_showConflictsWindow)
496
        m_conflictsSashWindow->Show(FALSE);
497
    if (!wxGetApp().GetSettings().m_showPropertiesWindow)
498
        m_propertiesSashWindow->Show(FALSE);
499
    if (!wxGetApp().GetSettings().m_showShortDescrWindow)
500
        m_shortDescrSashWindow->Show(FALSE);
501
    if (!wxGetApp().GetSettings().m_showOutputWindow)
502
        m_outputSashWindow->Show(FALSE);
503
    if (!wxGetApp().GetSettings().m_showMemoryWindow)
504
        m_memorySashWindow->Show(FALSE);
505
}
506
// event handlers
507
 
508
void ecMainFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
509
{
510
    Close();
511
}
512
 
513
void ecMainFrame::OnFind(wxCommandEvent& event)
514
{
515
    if (m_findDialog)
516
    {
517
        m_findDialog->Raise();
518
        return;
519
    }
520
 
521
    m_findDialog = new ecFindDialog (this, ecID_FIND_DIALOG, _("Find in configuration"));
522
    m_findDialog->Show(TRUE);
523
 
524
    // For some reason, under Windows, the text control doesn't get the focus if we set the focus
525
    // and then call Show. We have to set the focus afterwards instead.
526
    m_findDialog->FindWindow(ecID_FIND_DIALOG_WHAT)->SetFocus();
527
}
528
 
529
void ecMainFrame::OnFindNext(wxCommandEvent& event)
530
{
531
    if (wxGetApp().GetConfigToolDoc())
532
    {
533
        ecConfigToolView* view = (ecConfigToolView*) wxGetApp().GetConfigToolDoc()->GetFirstView() ;
534
 
535
        view->DoFind(wxGetApp().GetSettings().m_findText, this);
536
    }
537
}
538
 
539
void ecMainFrame::OnUpdateFind(wxUpdateUIEvent& event)
540
{
541
    event.Enable( wxGetApp().GetConfigToolDoc() != NULL );
542
}
543
 
544
void ecMainFrame::OnUpdateFindNext(wxUpdateUIEvent& event)
545
{
546
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) && !wxGetApp().GetSettings().m_findText.IsEmpty() );
547
}
548
 
549
void ecMainFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
550
{
551
//    ecAboutDialog dialog(this, ecID_ABOUT_DIALOG, _("About eCos Configuration Tool"));
552
//    dialog.ShowModal();
553
        wxString msg;
554
        msg.Printf("eCos Configuration Tool %s (%s %s)\n\nCopyright (c) Red Hat, Inc. 1998-2002\nCopyright (c) John Dallaway 2003", ecCONFIGURATION_TOOL_VERSION, __DATE__, __TIME__);
555
    wxMessageBox(msg, _("About eCos Configuration Tool"), wxICON_INFORMATION | wxOK);
556
}
557
 
558
void ecMainFrame::OnSize(wxSizeEvent& WXUNUSED(event))
559
{
560
    // First, we need to resize the sash windows proportionately,
561
    // or we may end up with negative sizes, etc.
562
    wxRect rect = GetRect();
563
    if (rect != wxGetApp().GetSettings().m_frameSize)
564
    {
565
        double factorX = ((double) rect.GetWidth() / (double) wxGetApp().GetSettings().m_frameSize.GetWidth());
566
        double factorY = ((double) rect.GetHeight() / (double) wxGetApp().GetSettings().m_frameSize.GetHeight());
567
 
568
        wxNode* node = GetChildren().First();
569
        while (node)
570
        {
571
            wxWindow* win = (wxWindow*) node->Data();
572
            if (win->IsKindOf(CLASSINFO(wxSashLayoutWindow)))
573
            {
574
                wxSashLayoutWindow* sashWin = (wxSashLayoutWindow*) win;
575
                wxSize sz = sashWin->GetSize();
576
                sashWin->SetDefaultSize(wxSize((int) ((double) sz.x * factorX), (int) ((double) sz.y * factorY)));
577
            }
578
            node = node->Next();
579
        }
580
    }
581
 
582
    wxLayoutAlgorithm layout;
583
    layout.LayoutFrame(this);
584
 
585
    wxGetApp().GetSettings().m_frameSize = rect;
586
}
587
 
588
void ecMainFrame::RecreateToolbar()
589
{
590
    // delete and recreate the toolbar
591
    wxToolBarBase *toolBar = GetToolBar();
592
    if (toolBar)
593
    {
594
        delete toolBar;
595
        SetToolBar(NULL);
596
    }
597
 
598
    long style = wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL | wxTB_DOCKABLE;
599
 
600
    toolBar = CreateToolBar(style, ecID_TOOLBAR);
601
 
602
    toolBar->SetMargins( 4, 4 );
603
 
604
    // Set up toolbar
605
    wxBitmap toolBarBitmaps[20];
606
 
607
    toolBarBitmaps[0] = wxBITMAP(new);
608
    toolBarBitmaps[1] = wxBITMAP(open);
609
    toolBarBitmaps[2] = wxBITMAP(save);
610
    toolBarBitmaps[3] = wxBITMAP(copy);
611
    toolBarBitmaps[4] = wxBITMAP(cut);
612
    toolBarBitmaps[5] = wxBITMAP(paste);
613
    toolBarBitmaps[6] = wxBITMAP(search);
614
    toolBarBitmaps[7] = wxBITMAP(stopbuild);
615
    toolBarBitmaps[8] = wxBITMAP(buildlibrary);
616
    toolBarBitmaps[9] = wxBITMAP(help);
617
    toolBarBitmaps[10] = wxBITMAP(newregion);
618
    toolBarBitmaps[11] = wxBITMAP(newsection);
619
    toolBarBitmaps[12] = wxBITMAP(delete);
620
    toolBarBitmaps[13] = wxBITMAP(properties);
621
    toolBarBitmaps[14] = wxBITMAP(cshelp);
622
 
623
    toolBar->AddTool(wxID_NEW, toolBarBitmaps[0], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, wxT("New file"));
624
    toolBar->AddTool(wxID_OPEN, toolBarBitmaps[1], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, wxT("Open file"));
625
    toolBar->AddTool(wxID_SAVE, toolBarBitmaps[2], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, wxT("Save file"));
626
 
627
    toolBar->AddSeparator();
628
 
629
    toolBar->AddTool(wxID_CUT, toolBarBitmaps[4], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Cut");
630
    toolBar->AddTool(wxID_COPY, toolBarBitmaps[3], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Copy");
631
    toolBar->AddTool(wxID_PASTE, toolBarBitmaps[5], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Paste");
632
    toolBar->AddTool(wxID_FIND, toolBarBitmaps[6], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Search");
633
 
634
    toolBar->AddSeparator();
635
 
636
    toolBar->AddTool(ecID_STOP_BUILD, toolBarBitmaps[7], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Stop build");
637
    toolBar->AddTool(ecID_BUILD_LIBRARY, toolBarBitmaps[8], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Build library");
638
#if ecUSE_MLT
639
    toolBar->AddSeparator();
640
    toolBar->AddTool(ecID_NEW_REGION, toolBarBitmaps[10], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "New region");
641
    toolBar->AddTool(ecID_NEW_SECTION, toolBarBitmaps[11], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "New section");
642
    toolBar->AddTool(ecID_DELETE, toolBarBitmaps[12], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Delete");
643
    toolBar->AddTool(ecID_PROPERTIES, toolBarBitmaps[13], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Properties");
644
#endif
645
    toolBar->AddSeparator();
646
    toolBar->AddTool(ecID_CONTEXT_HELP, toolBarBitmaps[14], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Show help for clicked-on windows");
647
    toolBar->AddTool(ecID_ECOS_HELP, toolBarBitmaps[9], wxNullBitmap, FALSE, -1, -1, (wxObject *) NULL, "Show help");
648
 
649
    // after adding the buttons to the toolbar, must call Realize() to reflect
650
    // the changes
651
    toolBar->Realize();
652
 
653
    toolBar->SetHelpText(_("The toolbar allows quick access to commonly-used commands."));
654
}
655
 
656
// Toggle one of the windows
657
void ecMainFrame::OnToggleWindow(wxCommandEvent& event)
658
{
659
    ToggleWindow(event.GetId());
660
}
661
 
662
// Toggle the given window on or off
663
void ecMainFrame::ToggleWindow(int windowId)
664
{
665
    wxWindow* win = NULL;
666
    bool *configSetting = NULL;
667
    switch (windowId)
668
    {
669
    case ecID_TOGGLE_CONFLICTS:
670
        win = m_conflictsSashWindow;
671
        configSetting = & wxGetApp().GetSettings().m_showConflictsWindow;
672
        break;
673
    case ecID_TOGGLE_PROPERTIES:
674
        win = m_propertiesSashWindow;
675
        configSetting = & wxGetApp().GetSettings().m_showPropertiesWindow;
676
        break;
677
    case ecID_TOGGLE_MEMORY:
678
        win = m_memorySashWindow;
679
        configSetting = & wxGetApp().GetSettings().m_showMemoryWindow;
680
        break;
681
    case ecID_TOGGLE_SHORT_DESCR:
682
        win = m_shortDescrSashWindow;
683
        configSetting = & wxGetApp().GetSettings().m_showShortDescrWindow;
684
        break;
685
    case ecID_TOGGLE_OUTPUT:
686
        win = m_outputSashWindow;
687
        configSetting = & wxGetApp().GetSettings().m_showOutputWindow;
688
        break;
689
    }
690
    if (win)
691
    {
692
        bool showing = !win->IsShown();
693
 
694
        win->Show(showing);
695
        * configSetting = showing;
696
 
697
        // Make sure we don't have ridiculous sizes
698
        if (showing && (windowId == ecID_TOGGLE_CONFLICTS || windowId == ecID_TOGGLE_PROPERTIES || windowId == ecID_TOGGLE_SHORT_DESCR))
699
        {
700
            m_conflictsSashWindow->SetDefaultSize(wxSize(2000, 50));
701
            m_propertiesSashWindow->SetDefaultSize(wxSize(2000, 50));
702
            m_shortDescrSashWindow->SetDefaultSize(wxSize(2000, 50));
703
 
704
            wxSize frameSize = GetClientSize();
705
            wxSize configSize = m_configSashWindow->GetSize();
706
 
707
            if ((frameSize.x - configSize.x) < 5)
708
            {
709
                // We must resize the config window
710
                m_configSashWindow->SetDefaultSize(wxSize(frameSize.x/2, configSize.y));
711
            }
712
        }
713
 
714
        wxLayoutAlgorithm layout;
715
        layout.LayoutFrame(this);
716
    }
717
}
718
 
719
void ecMainFrame::OnUpdateToggleWindow(wxUpdateUIEvent& event)
720
{
721
    wxWindow* win = NULL;
722
    switch (event.GetId())
723
    {
724
    case ecID_TOGGLE_CONFLICTS:
725
        win = m_conflictsSashWindow;
726
        break;
727
    case ecID_TOGGLE_PROPERTIES:
728
        win = m_propertiesSashWindow;
729
        break;
730
    case ecID_TOGGLE_MEMORY:
731
        win = m_memorySashWindow;
732
        break;
733
    case ecID_TOGGLE_SHORT_DESCR:
734
        win = m_shortDescrSashWindow;
735
        break;
736
    case ecID_TOGGLE_OUTPUT:
737
        win = m_outputSashWindow;
738
        break;
739
    }
740
    if (win)
741
    {
742
        event.Enable( TRUE );
743
        event.Check( win->IsShown() );
744
 
745
        // Not implemented
746
#if !ecUSE_MLT
747
        if (event.GetId() == ecID_TOGGLE_MEMORY)
748
            event.Enable( FALSE );
749
#endif
750
    }
751
}
752
 
753
void ecMainFrame::OnUpdateDisable(wxUpdateUIEvent& event)
754
{
755
    event.Enable( FALSE );
756
}
757
 
758
void ecMainFrame::OnToggleToolbar(wxCommandEvent& event)
759
{
760
    GetToolBar()->Show( ! GetToolBar()->IsShown() );
761
 
762
    wxSizeEvent sizeEvent(GetSize(), GetId());
763
    GetEventHandler()->ProcessEvent(sizeEvent);
764
#ifdef __WXGTK__
765
    GtkOnSize( GetPosition().x, GetPosition().y, GetSize().x, GetSize().y);
766
#endif
767
}
768
 
769
void ecMainFrame::OnUpdateToggleToolbar(wxUpdateUIEvent& event)
770
{
771
    event.Check( GetToolBar()->IsShown() );
772
}
773
 
774
// Respond to a sash drag operation, by setting the new size
775
// for this window and then recalculating the layout.
776
void ecMainFrame::OnSashDrag(wxSashEvent& event)
777
{
778
    if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
779
        return;
780
 
781
    switch (event.GetId())
782
    {
783
    case ecID_CONFIG_SASH_WINDOW:
784
        {
785
            m_configSashWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 2000));
786
            break;
787
        }
788
    case ecID_CONFLICTS_SASH_WINDOW:
789
        {
790
            // Change the height of the properties window so we don't affect the
791
            // short description window
792
            int deltaY = event.GetDragRect().height - m_conflictsSashWindow->GetSize().y;
793
            int propertiesHeight = 0;
794
            if (m_propertiesSashWindow->IsShown())
795
            {
796
                propertiesHeight = m_propertiesSashWindow->GetSize().y - deltaY ;
797
                if (propertiesHeight <= 0)
798
                    return;
799
                else
800
                    m_propertiesSashWindow->SetDefaultSize(wxSize(2000, propertiesHeight));
801
            }
802
            m_conflictsSashWindow->SetDefaultSize(wxSize(2000, event.GetDragRect().height));
803
            break;
804
        }
805
    case ecID_PROPERTIES_SASH_WINDOW:
806
        {
807
            m_propertiesSashWindow->SetDefaultSize(wxSize(2000, event.GetDragRect().height));
808
            break;
809
        }
810
    case ecID_SHORT_DESCR_SASH_WINDOW:
811
        {
812
            m_shortDescrSashWindow->SetDefaultSize(wxSize(2000, event.GetDragRect().height));
813
            break;
814
        }
815
    case ecID_MEMORY_SASH_WINDOW:
816
        {
817
            m_memorySashWindow->SetDefaultSize(wxSize(2000, event.GetDragRect().height));
818
            break;
819
        }
820
    case ecID_OUTPUT_SASH_WINDOW:
821
        {
822
            m_outputSashWindow->SetDefaultSize(wxSize(2000, event.GetDragRect().height));
823
            break;
824
        }
825
    default:
826
        {
827
            wxFAIL_MSG( _("Shouldn't get here.") );
828
            break;
829
        }
830
    }
831
 
832
    if (event.GetId() == ecID_MEMORY_SASH_WINDOW || event.GetId() == ecID_OUTPUT_SASH_WINDOW)
833
    {
834
        // Special processing so we don't spoil the layout of the
835
        // conflicts/properties/short description windows
836
        wxList minorWindows;
837
        GetMinorWindows(minorWindows);
838
 
839
        int memoryLayoutHeight = m_memorySashWindow->IsShown() ? m_memorySashWindow->GetSize().y : 0;
840
        int outputHeight = m_memorySashWindow->IsShown() ? m_outputSashWindow->GetSize().y : 0;
841
        int cx, cy;
842
        GetClientSize(& cx, & cy);
843
 
844
        // Calculate how much space will be left after this drag operation.
845
        int heightLeft;
846
        if (event.GetId() == ecID_MEMORY_SASH_WINDOW)
847
            heightLeft = cy - outputHeight - event.GetDragRect().height;
848
        else
849
            heightLeft = cy - memoryLayoutHeight - event.GetDragRect().height;
850
 
851
        DivideSpaceEvenly(minorWindows, wxSize(0, heightLeft), wxVERTICAL);
852
        RestoreDefaultWindowSizes(minorWindows);
853
    }
854
 
855
    wxLayoutAlgorithm layout;
856
    if (!layout.LayoutFrame(this))
857
    {
858
        // If layout failed, restored default sizes.
859
        wxNode* node = GetChildren().First();
860
        while (node)
861
        {
862
            wxWindow* win = (wxWindow*) node->Data();
863
            if (win->IsKindOf(CLASSINFO(wxSashLayoutWindow)))
864
            {
865
                wxSashLayoutWindow* sashWin = (wxSashLayoutWindow*) win;
866
                wxSize sz = sashWin->GetSize();
867
                sashWin->SetDefaultSize(sz);
868
            }
869
            node = node->Next();
870
        }
871
    }
872
 
873
}
874
 
875
void ecMainFrame::OnIdle(wxIdleEvent& event)
876
{
877
    // Normal idle processing
878
    wxFrame::OnIdle(event);
879
 
880
    wxString text;
881
    if (GetStatusBar())
882
        text = GetStatusBar()->GetStatusText(0);
883
 
884
    // Set the title if we have no document
885
    if (!wxGetApp().GetConfigToolDoc() && GetTitle() != wxGetApp().GetSettings().GetAppName())
886
        SetTitle(wxGetApp().GetSettings().GetAppName());
887
 
888
    if ( wxGetApp().m_pipedProcess && wxGetApp().m_pipedProcess->HasInput() )
889
    {
890
        event.RequestMore();
891
    }
892
 
893
    if ( wxGetApp().m_pipedProcess )
894
    {
895
        if (text != _("Building..."))
896
            SetStatusText(_("Building..."), 0);
897
    }
898
    else if (text != _("Ready"))
899
        SetStatusText(_("Ready"), 0);
900
}
901
 
902
void ecMainFrame::OnCloseWindow(wxCloseEvent& event)
903
{
904
    wxBusyCursor busy;
905
 
906
    if (!wxGetApp().GetDocManager()->Clear(FALSE) && event.CanVeto())
907
    {
908
        event.Veto();
909
        return;
910
    }
911
    if (wxGetApp().m_pipedProcess)
912
        wxGetApp().m_pipedProcess->Detach();
913
 
914
    if (m_findDialog)
915
        m_findDialog->Close(TRUE);
916
 
917
    wxGetApp().DestroyHelpController();
918
 
919
    if (IsMaximized())
920
        wxGetApp().GetSettings().m_frameStatus = ecSHOW_STATUS_MAXIMIZED ;
921
    else if (IsIconized())
922
        wxGetApp().GetSettings().m_frameStatus = ecSHOW_STATUS_MINIMIZED ;
923
    else
924
        wxGetApp().GetSettings().m_frameStatus = ecSHOW_STATUS_NORMAL ;
925
 
926
    if (!IsMaximized() && !IsIconized())
927
        wxGetApp().GetSettings().m_frameSize = GetRect();
928
 
929
    wxGetApp().GetSettings().m_showToolBar = GetToolBar()->IsShown();
930
 
931
    wxGetApp().GetSettings().m_treeSashSize = m_configSashWindow->GetSize();
932
    wxGetApp().GetSettings().m_propertiesSashSize = m_propertiesSashWindow->GetSize();
933
    wxGetApp().GetSettings().m_conflictsSashSize = m_conflictsSashWindow->GetSize();
934
    wxGetApp().GetSettings().m_shortDescrSashSize = m_shortDescrSashWindow->GetSize();
935
    wxGetApp().GetSettings().m_memorySashSize = m_memorySashWindow->GetSize();
936
    wxGetApp().GetSettings().m_outputSashSize = m_outputSashWindow->GetSize();
937
    wxGetApp().GetSettings().m_configPaneWidth = m_splitter->GetSashPosition();
938
 
939
    event.Skip();
940
}
941
 
942
// Enumerate the visible 'minor' sash windows,
943
// i.e. those in the top-right segment of the frame
944
void ecMainFrame::GetMinorWindows(wxList& list)
945
{
946
    if (m_conflictsSashWindow->IsShown())
947
        list.Append(m_conflictsSashWindow);
948
    if (m_propertiesSashWindow->IsShown())
949
        list.Append(m_propertiesSashWindow);
950
    if (m_shortDescrSashWindow->IsShown())
951
        list.Append(m_shortDescrSashWindow);
952
}
953
 
954
// Get all visible sash windows
955
void ecMainFrame::GetSashWindows(wxList& list)
956
{
957
    wxNode* node = GetChildren().First();
958
    while (node)
959
    {
960
        wxWindow* win = (wxWindow*) node->Data();
961
        if (win->IsKindOf(CLASSINFO(wxSashLayoutWindow)) && win->IsShown())
962
        {
963
            list.Append(win);
964
        }
965
        node = node->Next();
966
    }
967
}
968
 
969
// Divide the given space evenly amongst some windows
970
void ecMainFrame::DivideSpaceEvenly(wxList& list, const wxSize& space, int orient)
971
{
972
    if (list.Number() == 0)
973
        return;
974
 
975
    // Find total size first
976
    int totalSize = 0;
977
    double proportion = 0.0;
978
    wxNode* node = list.First();
979
    while (node)
980
    {
981
        wxWindow* win = (wxWindow*) node->Data();
982
        wxSize sz = win->GetSize();
983
        if (orient == wxHORIZONTAL)
984
            totalSize += sz.x;
985
        else
986
            totalSize += sz.y;
987
        node = node->Next();
988
    }
989
    if (orient == wxHORIZONTAL)
990
    {
991
        if (totalSize == 0)
992
            return;
993
 
994
        proportion = ((double) space.x / (double) totalSize);
995
    }
996
    else
997
    {
998
        if (totalSize == 0)
999
            return;
1000
 
1001
        proportion = ((double) space.y / (double) totalSize);
1002
    }
1003
    node = list.First();
1004
    while (node)
1005
    {
1006
        wxWindow* win = (wxWindow*) node->Data();
1007
        wxSize sz = win->GetSize();
1008
        if (orient == wxHORIZONTAL)
1009
            sz.x = (int) (sz.x * proportion);
1010
        else
1011
            sz.y = (int) (sz.y * proportion);
1012
        win->SetSize(sz);
1013
        node = node->Next();
1014
    }
1015
}
1016
 
1017
// Restore the sash window default size from the actual window size
1018
void ecMainFrame::RestoreDefaultWindowSizes(wxList& list)
1019
{
1020
    wxNode* node = list.First();
1021
    while (node)
1022
    {
1023
        wxSashLayoutWindow* sashWin = (wxSashLayoutWindow*) node->Data();
1024
        wxSize sz = sashWin->GetSize();
1025
        sashWin->SetDefaultSize(sz);
1026
        node = node->Next();
1027
    }
1028
}
1029
 
1030
void ecMainFrame::OnHelpEcos(wxCommandEvent& event)
1031
{
1032
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1033
    if (doc)
1034
    {
1035
        wxString strURL(wxT("index.html"));
1036
        doc->QualifyDocURL(strURL, FALSE);
1037
        switch (wxGetApp().GetSettings().m_eUseCustomBrowser)
1038
        {
1039
        case ecInternal:
1040
            {
1041
                if (wxGetApp().HasHelpController())
1042
                    wxGetApp().GetHelpController().DisplayContents();
1043
                break;
1044
            }
1045
        default:
1046
            {
1047
                doc->ShowURL(strURL);
1048
            }
1049
        }
1050
    }
1051
}
1052
 
1053
void ecMainFrame::OnHelpConfigtool(wxCommandEvent& event)
1054
{
1055
    //wxString strURL(wxT("redirect/the-ecos-configuration-tool.html"));
1056
    wxString strURL(wxGetApp().GetFullAppPath(wxT("manual/user-guides.2.html")));
1057
    if (!wxFileExists(strURL))
1058
        strURL = wxT("user-guide/the-ecos-configuration-tool.html");
1059
 
1060
    if (wxGetApp().GetConfigToolDoc())
1061
    {
1062
        wxGetApp().GetConfigToolDoc()->ShowURL(strURL);
1063
    }
1064
}
1065
 
1066
void ecMainFrame::OnHelpContext(wxCommandEvent& event)
1067
{
1068
    wxContextHelp contextHelp;
1069
}
1070
 
1071
void ecMainFrame::OnResolveConflicts(wxCommandEvent& event)
1072
{
1073
/*
1074
    ecResolveConflictsDialog dialog(this);
1075
    dialog.ShowModal();
1076
*/
1077
    if ( ecConfigToolDoc::NotDone == wxGetApp().GetConfigToolDoc()->ResolveGlobalConflicts() )
1078
    {
1079
        // Global inference handler was never invoked.  Say something
1080
        wxString msg;
1081
        msg.Printf(_("No solutions can be automatically determined for the current set of conflicts."));
1082
        wxMessageBox(msg, wxGetApp().GetSettings().GetAppName(), wxICON_EXCLAMATION|wxOK);
1083
    }
1084
}
1085
 
1086
void ecMainFrame::OnUpdateResolveConflicts(wxUpdateUIEvent& event)
1087
{
1088
    if (!wxGetApp().GetConfigToolDoc() || !wxGetApp().GetConfigToolDoc()->GetCdlInterpreter())
1089
    {
1090
        event.Enable(FALSE);
1091
        return;
1092
    }
1093
 
1094
    event.Enable(wxGetApp().GetConfigToolDoc()->GetCdlInterpreter()->get_toplevel()->get_all_conflicts().size()>0);
1095
}
1096
 
1097
void ecMainFrame::OnSettings(wxCommandEvent& event)
1098
{
1099
    ecSettingsDialog dialog(this);
1100
    dialog.ShowModal();
1101
}
1102
 
1103
void ecMainFrame::OnPlatforms(wxCommandEvent& event)
1104
{
1105
    ecPlatformsDialog dialog(this);
1106
    if (dialog.ShowModal() == wxID_OK)
1107
    {
1108
        CeCosTestPlatform::RemoveAllPlatforms();
1109
        unsigned int i ;
1110
        for(i=0; i < dialog.PlatformCount();i++){
1111
            CeCosTestPlatform::Add(*dialog.Platform(i));
1112
        }
1113
        CeCosTestPlatform::Save();
1114
    }
1115
}
1116
 
1117
void ecMainFrame::OnBuildOptions(wxCommandEvent& event)
1118
{
1119
    ecBuildOptionsDialog dialog(this);
1120
    dialog.ShowModal();
1121
}
1122
 
1123
void ecMainFrame::OnTemplates(wxCommandEvent& event)
1124
{
1125
    ecTemplatesDialog dialog(this);
1126
    if (dialog.ShowModal() == wxID_OK)
1127
        {
1128
#ifdef __WXMSW__
1129
        // Ensure display gets updated
1130
        ::UpdateWindow((HWND) GetHWND());
1131
        //wxYield();
1132
#endif
1133
        ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1134
 
1135
                doc->SelectHardware(dialog.GetSelectedHardware());
1136
                doc->SelectTemplate(dialog.GetSelectedTemplate(), dialog.GetSelectedTemplateVersion());
1137
        }
1138
}
1139
 
1140
void ecMainFrame::OnAdmin(wxCommandEvent& event)
1141
{
1142
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1143
 
1144
    wxASSERT (doc) ;
1145
 
1146
    if (wxYES == wxMessageBox(_("This command will close the current document.\n\nDo you wish to continue?"),
1147
        wxGetApp().GetAppName(), wxYES_NO, this))
1148
    {
1149
        wxString shellCommands;
1150
        // ensure that the user tools are on the path for use by ecosadmin.tcl
1151
        // TODO: need to something else for Linux (since it returns settings in shellCommands)
1152
        if (wxGetApp().PrepareEnvironment(FALSE, & shellCommands))
1153
        {
1154
            // make sure we use doc data before the doc is destroyed
1155
 
1156
            ecAdminDialog dlg(this, doc->GetPackagesDir(), wxGetApp().GetSettings().GetUserToolsDir());
1157
 
1158
            if (dlg.ShowModal() == wxID_OK)
1159
            {
1160
                // Create new document
1161
                wxGetApp().GetDocManager()->CreateDocument(wxEmptyString, wxDOC_NEW);
1162
            }
1163
        }
1164
    }
1165
}
1166
 
1167
void ecMainFrame::OnPackages(wxCommandEvent& event)
1168
{
1169
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1170
    if (doc)
1171
        doc->SelectPackages();
1172
}
1173
 
1174
void ecMainFrame::OnRunTests(wxCommandEvent& event)
1175
{
1176
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1177
    if (doc)
1178
        doc->RunTests();
1179
}
1180
 
1181
void ecMainFrame::OnChooseRepository(wxCommandEvent& event)
1182
{
1183
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1184
    if (doc && !doc->OnSaveModified())
1185
        return;
1186
 
1187
    if (!doc)
1188
    {
1189
        doc = (ecConfigToolDoc*) wxGetApp().GetDocManager()->CreateDocument(wxString(""), wxDOC_NEW|ecDOC_PROMPT_FOR_REPOSITORY);
1190
        return;
1191
    }
1192
 
1193
    if (doc)
1194
        doc->m_bRepositoryOpen = FALSE;
1195
 
1196
    if (wxGetApp().GetConfigToolDoc()->OpenRepository(wxEmptyString, TRUE))
1197
    {
1198
        // TODO
1199
#if 0
1200
        // reset the document title as shown in the frame window
1201
        GetDocTemplate ()->SetDefaultTitle (this);
1202
 
1203
        // load the memory layout for the default target-platform-startup from the new repository
1204
        NewMemoryLayout (CFileName (m_strPackagesDir, m_strMemoryLayoutFolder, _T("include\\pkgconf")));
1205
#endif
1206
 
1207
        doc->UpdateAllViews(NULL);
1208
        doc->UpdateFailingRuleCount();
1209
    }
1210
    else
1211
    {
1212
        if (doc)
1213
            doc->m_bRepositoryOpen = TRUE;
1214
    }
1215
}
1216
 
1217
void ecMainFrame::OnBuildToolsPath(wxCommandEvent& event)
1218
{
1219
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1220
    if (!doc)
1221
        return;
1222
 
1223
    // add the current build tools dir to the drop-down list box
1224
    wxArrayString arstrPaths;
1225
    if (!wxGetApp().GetSettings().m_buildToolsDir.IsEmpty())
1226
        arstrPaths.Add(wxGetApp().GetSettings().m_buildToolsDir);
1227
 
1228
    // also add the sub-directory containing tools for the current command prefix
1229
    wxString value;
1230
    wxStringToStringMap& map = wxGetApp().GetSettings().GetBinDirs();
1231
    const wxString strPrefix(doc->GetCurrentTargetPrefix());
1232
    if (map.Find(strPrefix, value) && (wxNOT_FOUND == arstrPaths.Index(value)))
1233
        arstrPaths.Add(value);
1234
 
1235
    wxString msg;
1236
    msg.Printf(_("Enter the location of the %s build tools\n"
1237
          "folder. You can type in a path or use the\n"
1238
          "Browse button to navigate to a folder."),
1239
          (const wxChar*) (strPrefix.IsEmpty() ? wxString(wxT("native")) : strPrefix));
1240
    wxString caption(_("Build Tools Path"));
1241
 
1242
    ecFolderDialog dialog(wxGetApp().GetSettings().m_buildToolsDir, arstrPaths, msg, this, ecID_BUILD_TOOLS_DIALOG, caption);
1243
    if (dialog.ShowModal() == wxID_OK)
1244
    {
1245
        wxString path (dialog.GetPath());
1246
 
1247
        // look for *objcopy under the user-specified build tools directory
1248
        wxArrayString objcopyFiles;
1249
        wxString objcopyFileSpec(wxT("objcopy"));
1250
#ifdef __WXMSW__
1251
        objcopyFileSpec += wxT(".exe");
1252
#endif
1253
        size_t objcopyCount = wxDir::GetAllFiles(path, &objcopyFiles, wxT("*") + objcopyFileSpec, wxDIR_FILES | wxDIR_DIRS);
1254
        bool bPrefixFound = false;
1255
        for (int count=0; count < objcopyCount; count++)
1256
        {
1257
            wxFileName file (objcopyFiles [count]);
1258
            wxString new_prefix (file.GetFullName().Left (file.GetFullName().Find(objcopyFileSpec)));
1259
            if ((! new_prefix.IsEmpty()) && ('-' == new_prefix.Last()))
1260
                new_prefix = new_prefix.Left (new_prefix.Len() - 1); // strip off trailing hyphen 
1261
            if (new_prefix == strPrefix)
1262
                bPrefixFound = true;
1263
        }
1264
 
1265
        wxString msg;
1266
        msg.Printf(wxT("%s does not appear to contain the build tools - use this folder anyway?"), (const wxChar*) path);
1267
 
1268
        if(bPrefixFound ||
1269
            (wxYES == wxMessageBox(msg, wxGetApp().GetSettings().GetAppName(), wxICON_QUESTION|wxYES_NO)))
1270
        {
1271
            for (int count=0; count < objcopyCount; count++)
1272
            {
1273
                wxFileName file (objcopyFiles [count]);
1274
                wxString new_prefix (file.GetFullName().Left (file.GetFullName().Find(objcopyFileSpec)));
1275
                if ((! new_prefix.IsEmpty()) && ('-' == new_prefix.Last()))
1276
                    new_prefix = new_prefix.Left (new_prefix.Len() - 1); // strip off trailing hyphen
1277
                map.Set(new_prefix, file.GetPath(wxPATH_GET_VOLUME));
1278
            }
1279
            wxGetApp().GetSettings().m_buildToolsDir = path;
1280
        }
1281
    }
1282
}
1283
 
1284
void ecMainFrame::OnUserToolsPath(wxCommandEvent& event)
1285
{
1286
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1287
    if (!doc)
1288
        return;
1289
 
1290
    wxArrayString paths = wxGetApp().GetSettings().m_userToolPaths;
1291
    if (!wxGetApp().GetSettings().m_userToolsDir.IsEmpty())
1292
        paths.Add(wxGetApp().GetSettings().m_userToolsDir);
1293
 
1294
    wxString msg(_("Enter the location of the user tools folder,\n"
1295
          "which should contain cat and ls. You can type in\n"
1296
          "a path or use the Browse button to navigate to a\n"
1297
          "folder."));
1298
 
1299
    wxString caption(_("User Tools Path"));
1300
    wxString defaultPath(wxGetApp().GetSettings().m_userToolsDir);
1301
 
1302
    ecFolderDialog dialog(defaultPath, paths, msg, this, ecID_USER_TOOLS_DIALOG, caption);
1303
    if (dialog.ShowModal() == wxID_OK)
1304
    {
1305
        wxString path(dialog.GetPath());
1306
        ecFileName strFile(path);
1307
 
1308
#ifdef __WXMSW__
1309
        wxString exeSuffix(wxT(".exe"));
1310
#else
1311
        wxString exeSuffix(wxEmptyString);
1312
#endif
1313
        wxString prog(wxString(wxT("ls")) + exeSuffix);
1314
 
1315
        strFile += (const wxChar*) prog;
1316
 
1317
        wxString msg;
1318
        msg.Printf(wxT("%s does not appear to contain the user tools - use this folder anyway?"), (const wxChar*) path);
1319
 
1320
        if(strFile.Exists() ||
1321
            (wxYES == wxMessageBox(msg, wxGetApp().GetSettings().GetAppName(), wxICON_QUESTION|wxYES_NO)))
1322
        {
1323
            wxGetApp().GetSettings().m_userToolsDir = path;
1324
        }
1325
    }
1326
}
1327
 
1328
// Process events for the window with the focus first.
1329
bool ecMainFrame::ProcessEvent(wxEvent& event)
1330
{
1331
    static wxEvent* s_lastEvent = NULL;
1332
 
1333
    if (& event == s_lastEvent)
1334
        return FALSE;
1335
 
1336
    if (event.IsCommandEvent() && !event.IsKindOf(CLASSINFO(wxChildFocusEvent)))
1337
    {
1338
        s_lastEvent = & event;
1339
 
1340
        wxWindow* focusWin = wxFindFocusDescendant(this);
1341
        bool success = FALSE;
1342
        if (focusWin)
1343
        {
1344
            //long windowId = focusWin->GetId();
1345
            //wxLogDebug("Found focus window %d", windowId);
1346
            success = focusWin->GetEventHandler()->ProcessEvent(event);
1347
        }
1348
        if (!success)
1349
            success = wxDocParentFrame::ProcessEvent(event);
1350
 
1351
        s_lastEvent = NULL;
1352
        return success;
1353
    }
1354
    else
1355
    {
1356
        return wxDocParentFrame::ProcessEvent(event);
1357
    }
1358
}
1359
 
1360
void ecMainFrame::SetFailRulePane(int nCount)
1361
{
1362
    wxString strCount;
1363
    switch (nCount)
1364
    {
1365
    case 0:
1366
        strCount = wxT("No conflicts");
1367
        break;
1368
    case 1:
1369
        strCount = wxT("1 conflict");
1370
        break;
1371
    default:
1372
        strCount.Printf (_("%d conflicts"), nCount);
1373
        break;
1374
    }
1375
    if (GetStatusBar())
1376
    {
1377
        GetStatusBar()->SetStatusText(strCount, ecFailRulePane);
1378
    }
1379
}
1380
 
1381
// Update the title, either via the document's view or explicitly if no doc
1382
void ecMainFrame::UpdateFrameTitle()
1383
{
1384
    if (wxGetApp().GetConfigToolDoc())
1385
        wxGetApp().GetConfigToolDoc()->GetFirstView()->OnChangeFilename();
1386
    else
1387
        SetTitle(wxGetApp().GetSettings().GetAppName());
1388
}
1389
 
1390
void ecMainFrame::OnUpdatePlatforms(wxUpdateUIEvent& event)
1391
{
1392
    event.Enable(TRUE);
1393
}
1394
 
1395
void ecMainFrame::OnUpdateBuildOptions(wxUpdateUIEvent& event)
1396
{
1397
    event.Enable(wxGetApp().GetConfigToolDoc() != NULL);
1398
}
1399
 
1400
void ecMainFrame::OnUpdateBuildToolsPath(wxUpdateUIEvent& event)
1401
{
1402
    event.Enable(wxGetApp().GetConfigToolDoc() != NULL);
1403
}
1404
 
1405
void ecMainFrame::OnUpdateUserToolsPath(wxUpdateUIEvent& event)
1406
{
1407
    event.Enable(wxGetApp().GetConfigToolDoc() != NULL);
1408
}
1409
 
1410
void ecMainFrame::OnUpdateTemplates(wxUpdateUIEvent& event)
1411
{
1412
    event.Enable(wxGetApp().GetConfigToolDoc() != NULL);
1413
}
1414
 
1415
void ecMainFrame::OnUpdateAdmin(wxUpdateUIEvent& event)
1416
{
1417
    event.Enable(wxGetApp().GetConfigToolDoc() != NULL);
1418
}
1419
 
1420
void ecMainFrame::OnUpdatePackages(wxUpdateUIEvent& event)
1421
{
1422
    event.Enable(wxGetApp().GetConfigToolDoc() != NULL);
1423
}
1424
 
1425
void ecMainFrame::OnUpdateRunTests(wxUpdateUIEvent& event)
1426
{
1427
    event.Enable(wxGetApp().GetConfigToolDoc() != NULL && !wxGetApp().GetConfigToolDoc()->GetInstallTree().IsEmpty() && (wxGetApp().m_pipedProcess == NULL));
1428
}
1429
 
1430
void ecMainFrame::OnUpdateChooseRepository(wxUpdateUIEvent& event)
1431
{
1432
    event.Enable(TRUE);
1433
}
1434
 
1435
void ecMainFrame::OnWhatsThis(wxCommandEvent& event)
1436
{
1437
    wxGetApp().OnWhatsThis(event);
1438
}
1439
 
1440
void ecMainFrame::OnSaveOutput(wxCommandEvent& event)
1441
{
1442
    ecOutputWindow* win = GetOutputWindow();
1443
    if (!win)
1444
        return;
1445
 
1446
    wxFileDialog dialog(this, _("Choose a file for saving the output window contents"),
1447
        wxT(""), wxT("output.txt"), wxT("*.txt"), wxSAVE|wxOVERWRITE_PROMPT);
1448
    if (dialog.ShowModal() == wxID_OK)
1449
    {
1450
        if (!win->SaveFile(dialog.GetPath()))
1451
        {
1452
            wxMessageBox(_("Sorry, there was a problem saving the file."), wxGetApp().GetSettings().GetAppName(),
1453
                wxICON_EXCLAMATION|wxID_OK);
1454
        }
1455
    }
1456
}
1457
 
1458
void ecMainFrame::OnUpdateSelectAll(wxUpdateUIEvent& event)
1459
{
1460
    wxWindow* win = wxWindow::FindFocus();
1461
    event.Enable (win && win->IsKindOf(CLASSINFO(wxTextCtrl)) );
1462
}
1463
 
1464
void ecMainFrame::OnUpdateClear(wxUpdateUIEvent& event)
1465
{
1466
    wxWindow* win = wxWindow::FindFocus();
1467
    event.Enable (win && win->IsKindOf(CLASSINFO(wxTextCtrl)) );
1468
}
1469
 
1470
void ecMainFrame::OnImport(wxCommandEvent& event)
1471
{
1472
    if (wxGetApp().GetConfigToolDoc())
1473
    {
1474
        wxGetApp().GetConfigToolDoc()->ImportFile();
1475
    }
1476
}
1477
 
1478
void ecMainFrame::OnExport(wxCommandEvent& event)
1479
{
1480
    if (wxGetApp().GetConfigToolDoc())
1481
    {
1482
        wxGetApp().GetConfigToolDoc()->ExportFile();
1483
    }
1484
}
1485
 
1486
void ecMainFrame::OnUpdateImport(wxUpdateUIEvent& event)
1487
{
1488
    event.Enable ( wxGetApp().GetConfigToolDoc() != NULL );
1489
}
1490
 
1491
void ecMainFrame::OnUpdateExport(wxUpdateUIEvent& event)
1492
{
1493
    event.Enable ( wxGetApp().GetConfigToolDoc() != NULL );
1494
}
1495
 
1496
void ecMainFrame::OnWebRedHatHome(wxCommandEvent& event)
1497
{
1498
    wxString strURL(wxT("http://www.redhat.com"));
1499
    if (wxGetApp().GetConfigToolDoc())
1500
        wxGetApp().GetConfigToolDoc()->ShowURL(strURL);
1501
}
1502
 
1503
void ecMainFrame::OnWebEcos(wxCommandEvent& event)
1504
{
1505
    wxString strURL(wxT("http://www.redhat.com/products/ecos"));
1506
    if (wxGetApp().GetConfigToolDoc())
1507
        wxGetApp().GetConfigToolDoc()->ShowURL(strURL);
1508
}
1509
 
1510
void ecMainFrame::OnWebNetRelease(wxCommandEvent& event)
1511
{
1512
    wxString strURL(wxT("http://sources.redhat.com/ecos"));
1513
    if (wxGetApp().GetConfigToolDoc())
1514
        wxGetApp().GetConfigToolDoc()->ShowURL(strURL);
1515
}
1516
 
1517
void ecMainFrame::OnWebUitron(wxCommandEvent& event)
1518
{
1519
    wxString strURL(wxT("http://www.itron.gr.jp/"));
1520
    if (wxGetApp().GetConfigToolDoc())
1521
        wxGetApp().GetConfigToolDoc()->ShowURL(strURL);
1522
}
1523
 
1524
void ecMainFrame::OnBuildLibrary(wxCommandEvent& event)
1525
{
1526
    // TODO: possibly add wxT("clean build") to ensure library is
1527
    // cleanly built. No, can't do that because it would clean
1528
    // out any user code too :-(
1529
 
1530
    bool regenerateBuildTree = FALSE;
1531
 
1532
    if (wxGetApp().GetSettings().m_editSaveFileOnly)
1533
    {
1534
        int ans = wxMessageBox(wxT("Running in --edit-only mode so there may not be an up-to-date build tree.\nBuild the tree now?"), wxGetApp().GetSettings().GetAppName(), wxICON_QUESTION|wxYES_NO|wxCANCEL);
1535
 
1536
        if (ans == wxYES)
1537
        {
1538
            regenerateBuildTree = TRUE;
1539
        }
1540
        else if (ans == wxCANCEL)
1541
            return;
1542
    }
1543
 
1544
    if (regenerateBuildTree)
1545
    {
1546
        ecConfigToolDoc* pDoc = wxGetApp().GetConfigToolDoc();
1547
        if (!pDoc)
1548
            return;
1549
 
1550
        if (!pDoc->GenerateBuildTree())
1551
            return ;
1552
    }
1553
 
1554
    wxGetApp().Build();
1555
}
1556
 
1557
void ecMainFrame::OnBuildTests(wxCommandEvent& event)
1558
{
1559
    bool regenerateBuildTree = FALSE;
1560
 
1561
    if (wxGetApp().GetSettings().m_editSaveFileOnly)
1562
    {
1563
        int ans = wxMessageBox(wxT("Running in --edit-only mode so there may not be an up-to-date build tree.\nBuild the tree now?"), wxGetApp().GetSettings().GetAppName(), wxICON_QUESTION|wxYES_NO|wxCANCEL);
1564
 
1565
        if (ans == wxYES)
1566
        {
1567
            regenerateBuildTree = TRUE;
1568
        }
1569
        else if (ans == wxCANCEL)
1570
            return;
1571
    }
1572
 
1573
    if (regenerateBuildTree)
1574
    {
1575
        ecConfigToolDoc* pDoc = wxGetApp().GetConfigToolDoc();
1576
        if (!pDoc)
1577
            return;
1578
 
1579
        if (!pDoc->GenerateBuildTree())
1580
            return ;
1581
    }
1582
 
1583
    wxGetApp().Build(wxT("tests"));
1584
}
1585
 
1586
void ecMainFrame::OnStopBuild(wxCommandEvent& event)
1587
{
1588
    if (wxGetApp().m_pipedProcess)
1589
    {
1590
        long pid = wxGetApp().m_pipedProcess->GetPid();
1591
        wxGetApp().m_pipedProcess->Detach();
1592
 
1593
        wxProcessKiller pKiller(pid);
1594
        pKiller.Kill(TRUE);
1595
    }
1596
}
1597
 
1598
void ecMainFrame::OnClean(wxCommandEvent& event)
1599
{
1600
    wxGetApp().Build(wxT("clean"));
1601
}
1602
 
1603
void ecMainFrame::OnShell(wxCommandEvent& event)
1604
{
1605
    ecConfigToolDoc *pDoc=wxGetApp().GetConfigToolDoc();
1606
    if (!pDoc)
1607
        return;
1608
 
1609
    wxString variableSettings;
1610
    if (wxGetApp().PrepareEnvironment(TRUE, & variableSettings))
1611
    {
1612
#ifdef __WXMSW__
1613
        wxString currentDir = wxGetCwd();
1614
        wxSetWorkingDirectory(pDoc->GetBuildTree());
1615
 
1616
        wxExecute("bash.exe");
1617
 
1618
        if (!currentDir.IsEmpty()) // if the current directory was changed
1619
        {
1620
            wxSetWorkingDirectory(currentDir); // restore the previous current directory
1621
        }
1622
#else
1623
        wxString cmdLine = wxString(wxT("xterm"));
1624
 
1625
        // TODO: query an appropriate variable, and/or have a setting for this
1626
        wxExecute(cmdLine);
1627
#endif
1628
    }
1629
}
1630
 
1631
void ecMainFrame::OnUpdateBuildLibrary(wxUpdateUIEvent& event)
1632
{
1633
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) && (wxGetApp().m_pipedProcess == NULL ));
1634
}
1635
 
1636
void ecMainFrame::OnUpdateBuildTests(wxUpdateUIEvent& event)
1637
{
1638
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) && (wxGetApp().m_pipedProcess == NULL ));
1639
}
1640
 
1641
void ecMainFrame::OnUpdateStopBuild(wxUpdateUIEvent& event)
1642
{
1643
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) && (wxGetApp().m_pipedProcess != NULL ));
1644
}
1645
 
1646
void ecMainFrame::OnUpdateClean(wxUpdateUIEvent& event)
1647
{
1648
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) && (wxGetApp().m_pipedProcess == NULL ));
1649
}
1650
 
1651
void ecMainFrame::OnRepositoryInfo(wxCommandEvent& event)
1652
{
1653
    ecRepositoryInfoDialog dialog(this, ecID_REPOSITORY_INFO, _("Repository Information"));
1654
    dialog.ShowModal();
1655
}
1656
 
1657
void ecMainFrame::OnUpdateShell(wxUpdateUIEvent& event)
1658
{
1659
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) );
1660
}
1661
 
1662
void ecMainFrame::OnUpdateRepositoryInfo(wxUpdateUIEvent& event)
1663
{
1664
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) );
1665
}
1666
 
1667
void ecMainFrame::OnNewRegion(wxCommandEvent& event)
1668
{
1669
#if ecUSE_MLT
1670
#endif
1671
}
1672
 
1673
void ecMainFrame::OnNewSection(wxCommandEvent& event)
1674
{
1675
#if ecUSE_MLT
1676
#endif
1677
}
1678
 
1679
void ecMainFrame::OnDeleteRegionOrSection(wxCommandEvent& event)
1680
{
1681
#if ecUSE_MLT
1682
#endif
1683
}
1684
 
1685
void ecMainFrame::OnRegionOrSectionProperties(wxCommandEvent& event)
1686
{
1687
#if ecUSE_MLT
1688
#endif
1689
}
1690
 
1691
void ecMainFrame::OnUpdateNewRegion(wxUpdateUIEvent& event)
1692
{
1693
#if ecUSE_MLT
1694
#else
1695
    event.Enable( FALSE );
1696
#endif
1697
}
1698
 
1699
void ecMainFrame::OnUpdateNewSection(wxUpdateUIEvent& event)
1700
{
1701
#if ecUSE_MLT
1702
#else
1703
    event.Enable( FALSE );
1704
#endif
1705
}
1706
 
1707
void ecMainFrame::OnUpdateDeleteRegionOrSection(wxUpdateUIEvent& event)
1708
{
1709
#if ecUSE_MLT
1710
#else
1711
    event.Enable( FALSE );
1712
#endif
1713
}
1714
 
1715
void ecMainFrame::OnUpdateRegionOrSectionProperties(wxUpdateUIEvent& event)
1716
{
1717
#if ecUSE_MLT
1718
#else
1719
    event.Enable( FALSE );
1720
#endif
1721
}
1722
 
1723
void ecMainFrame::OnIndexDocs(wxCommandEvent& event)
1724
{
1725
    ecConfigToolDoc* doc = wxGetApp().GetConfigToolDoc();
1726
    if (doc)
1727
    {
1728
        doc->RebuildHelpIndex(TRUE) ;
1729
    }
1730
}
1731
 
1732
void ecMainFrame::OnUpdateIndexDocs(wxUpdateUIEvent& event)
1733
{
1734
    event.Enable( wxGetApp().GetConfigToolDoc() != NULL );
1735
}
1736
 
1737
void ecMainFrame::OnGenerateBuildTree(wxCommandEvent& event)
1738
{
1739
    if (wxGetApp().GetConfigToolDoc() && wxGetApp().GetConfigToolDoc()->CanGenerateBuildTree())
1740
    {
1741
        if (!wxGetApp().GetConfigToolDoc()->GenerateBuildTree())
1742
        {
1743
            // Error probably already reported
1744
        }
1745
    }
1746
}
1747
 
1748
void ecMainFrame::OnUpdateGenerateBuildTree(wxUpdateUIEvent& event)
1749
{
1750
    event.Enable( (wxGetApp().GetConfigToolDoc() != NULL) && wxGetApp().GetConfigToolDoc()->CanGenerateBuildTree());
1751
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.