Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netedit/dialogs/GNEDialog.cpp
193911 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2006-2026 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file GNEDialog.cpp
15
/// @author Pablo Alvarez Lopez
16
/// @date Jul 2025
17
///
18
// Custom FXDialogBox used in Netedit that supports internal tests
19
/****************************************************************************/
20
21
#include <fxkeys.h>
22
#include <netedit/GNEApplicationWindow.h>
23
#include <netedit/GNEInternalTest.h>
24
#include <utils/gui/div/GUIDesigns.h>
25
26
#include "GNEDialog.h"
27
28
// ===========================================================================
29
// FOX callback mapping
30
// ===========================================================================
31
32
FXDEFMAP(GNEDialog) MFXDialogBoxMap[] = {
33
// interaction
34
FXMAPFUNC(SEL_KEYPRESS, 0, GNEDialog::onKeyPress),
35
FXMAPFUNC(SEL_KEYRELEASE, 0, GNEDialog::onKeyRelease),
36
// buttons
37
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ACCEPT, GNEDialog::onCmdAccept),
38
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_CANCEL, GNEDialog::onCmdCancel),
39
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_RESET, GNEDialog::onCmdReset),
40
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_RUN, GNEDialog::onCmdRun),
41
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_BACK, GNEDialog::onCmdBack),
42
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_ADVANCED, GNEDialog::onCmdAdvanced),
43
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_COPY, GNEDialog::onCmdCopy),
44
FXMAPFUNC(SEL_COMMAND, MID_GNE_BUTTON_REPORT, GNEDialog::onCmdReport),
45
// abort dialog
46
FXMAPFUNC(SEL_CLOSE, 0, GNEDialog::onCmdAbort),
47
FXMAPFUNC(SEL_COMMAND, MID_HOTKEY_ESC, GNEDialog::onCmdAbort),
48
FXMAPFUNC(SEL_CHORE, MID_GNE_ABORT, GNEDialog::onCmdAbort),
49
FXMAPFUNC(SEL_TIMEOUT, MID_GNE_ABORT, GNEDialog::onCmdAbort),
50
FXMAPFUNC(SEL_COMMAND, MID_GNE_ABORT, GNEDialog::onCmdAbort),
51
};
52
53
// Object implementation
54
FXIMPLEMENT_ABSTRACT(GNEDialog, FXDialogBox, MFXDialogBoxMap, ARRAYNUMBER(MFXDialogBoxMap))
55
56
// ===========================================================================
57
// method definitions
58
// ===========================================================================
59
60
GNEDialog::GNEDialog(GNEApplicationWindow* applicationWindow,
61
const std::string& name, GUIIcon titleIcon, DialogType type, Buttons buttons,
62
OpenType openType, ResizeMode resizeMode) :
63
FXDialogBox(applicationWindow->getApp(), name.c_str(),
64
(resizeMode == ResizeMode::STATIC) ? GUIDesignGNEDialogStatic : GUIDesignGNEDialogResizable,
65
0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
66
myApplicationWindow(applicationWindow),
67
myType(type),
68
myOpenType(openType) {
69
// build dialog only if applicationWindow was created
70
if (applicationWindow->id()) {
71
buildDialog(titleIcon, buttons);
72
}
73
}
74
75
76
GNEDialog::GNEDialog(GNEApplicationWindow* applicationWindow, GNEDialog* parentDialog,
77
const std::string& name, GUIIcon titleIcon, DialogType type, Buttons buttons,
78
OpenType openType, ResizeMode resizeMode) :
79
FXDialogBox(applicationWindow->getApp(), name.c_str(),
80
(resizeMode == ResizeMode::STATIC) ? GUIDesignGNEDialogStatic : GUIDesignGNEDialogResizable,
81
0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
82
myApplicationWindow(applicationWindow),
83
myParentDialog(parentDialog),
84
myType(type),
85
myOpenType(openType) {
86
// build dialog only if applicationWindow was created
87
if (applicationWindow->id()) {
88
buildDialog(titleIcon, buttons);
89
}
90
}
91
92
93
GNEDialog::GNEDialog(GNEApplicationWindow* applicationWindow, const std::string& name,
94
GUIIcon titleIcon, DialogType type, Buttons buttons, OpenType openType,
95
ResizeMode resizeMode, const int width, const int height) :
96
FXDialogBox(applicationWindow->getApp(), name.c_str(),
97
(resizeMode == ResizeMode::STATIC) ? GUIDesignGNEDialogStaticExplicit : GUIDesignGNEDialogResizableExplicit,
98
0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
99
myApplicationWindow(applicationWindow),
100
myType(type),
101
myOpenType(openType) {
102
// build dialog only if applicationWindow was created
103
if (applicationWindow->id()) {
104
// build dialog
105
buildDialog(titleIcon, buttons);
106
// set explicit size
107
resize(width, height);
108
}
109
}
110
111
112
GNEDialog::GNEDialog(GNEApplicationWindow* applicationWindow, GNEDialog* parentDialog,
113
const std::string& name, GUIIcon titleIcon, DialogType type, Buttons buttons,
114
OpenType openType, ResizeMode resizeMode, const int width, const int height) :
115
FXDialogBox(applicationWindow->getApp(), name.c_str(),
116
(resizeMode == ResizeMode::STATIC) ? GUIDesignGNEDialogStaticExplicit : GUIDesignGNEDialogResizableExplicit,
117
0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
118
myApplicationWindow(applicationWindow),
119
myParentDialog(parentDialog),
120
myType(type),
121
myOpenType(openType) {
122
// build dialog only if applicationWindow was created
123
if (applicationWindow->id()) {
124
// build dialog
125
buildDialog(titleIcon, buttons);
126
// set explicit size
127
resize(width, height);
128
}
129
}
130
131
132
GNEDialog::Result
133
GNEDialog::getResult() const {
134
return myResult;
135
}
136
137
138
GNEApplicationWindow*
139
GNEDialog::getApplicationWindow() const {
140
return myApplicationWindow;
141
}
142
143
144
FXVerticalFrame*
145
GNEDialog::getContentFrame() const {
146
return myContentFrame;
147
}
148
149
150
long
151
GNEDialog::onCmdAccept(FXObject*, FXSelector, void*) {
152
return closeDialogAccepting();
153
}
154
155
156
long
157
GNEDialog::onCmdCancel(FXObject*, FXSelector, void*) {
158
return closeDialogCanceling();
159
}
160
161
162
long
163
GNEDialog::onCmdAbort(FXObject*, FXSelector, void*) {
164
return closeDialogAborting();
165
}
166
167
168
long
169
GNEDialog::onCmdReset(FXObject*, FXSelector, void*) {
170
throw ProcessError("onCmdReset function must be reimplemented in GNEDialog children");
171
}
172
173
174
long
175
GNEDialog::onCmdRun(FXObject*, FXSelector, void*) {
176
throw ProcessError("onCmdRun function must be reimplemented in GNEDialog children");
177
}
178
179
180
long
181
GNEDialog::onCmdBack(FXObject*, FXSelector, void*) {
182
throw ProcessError("onCmdBack function must be reimplemented in GNEDialog children");
183
}
184
185
186
long
187
GNEDialog::onCmdAdvanced(FXObject*, FXSelector, void*) {
188
throw ProcessError("onCmdAdvanced function must be reimplemented in GNEDialog children");
189
}
190
191
192
long
193
GNEDialog::onCmdCopy(FXObject*, FXSelector, void*) {
194
throw ProcessError("onCmdyCopy function must be reimplemented in GNEDialog children");
195
}
196
197
198
long
199
GNEDialog::onCmdReport(FXObject*, FXSelector, void*) {
200
throw ProcessError("onCmdyReport function must be reimplemented in GNEDialog children");
201
}
202
203
204
long
205
GNEDialog::onKeyPress(FXObject* obj, FXSelector sel, void* ptr) {
206
if (myTesting && (obj != myApplicationWindow->getInternalTest())) {
207
return 1;
208
} else {
209
// if ESC key is pressed, close dialog aborting
210
FXEvent* event = (FXEvent*)ptr;
211
if (event->code == KEY_Escape) {
212
return closeDialogAborting();
213
} else if (event->code == KEY_Return) {
214
if (myAcceptButton->hasFocus()) {
215
return closeDialogAccepting();
216
} else if (myCancelButton->hasFocus()) {
217
return closeDialogCanceling();
218
} else if (myAbortButton && myAbortButton->hasFocus()) {
219
return closeDialogAborting();
220
}
221
}
222
return FXDialogBox::onKeyPress(obj, sel, ptr);
223
}
224
}
225
226
227
long
228
GNEDialog::onKeyRelease(FXObject* obj, FXSelector sel, void* ptr) {
229
if (myTesting && (obj != myApplicationWindow->getInternalTest())) {
230
return 1;
231
} else {
232
return FXDialogBox::onKeyRelease(obj, sel, ptr);
233
}
234
}
235
236
237
void
238
GNEDialog::openDialog(FXWindow* focusableElement) {
239
// create dialog
240
create();
241
// check if set focus in button
242
if (focusableElement) {
243
focusableElement->setFocus();
244
} else {
245
myFocusButton->setFocus();
246
}
247
// show in the center of app
248
show(PLACEMENT_OWNER);
249
// continue depending on whether we are testing or not
250
const auto internalTest = myApplicationWindow->getInternalTest();
251
if (internalTest) {
252
myTesting = true;
253
bool closeDialog = false;
254
// execute every dialog step
255
while (internalTest->getCurrentStep() && !closeDialog &&
256
(internalTest->getCurrentStep()->getCategory() == InternalTestStep::Category::DIALOG) &&
257
(internalTest->getCurrentStep()->getDialogArgument()->getType() == myType)) {
258
// set next step
259
const auto testStep = internalTest->setNextStep();
260
// continue depending on the dialog argument action
261
switch (testStep->getDialogArgument()->getAction()) {
262
case InternalTestStep::DialogArgument::Action::ACCEPT:
263
onCmdAccept(internalTest, 0, nullptr);
264
closeDialog = true;
265
break;
266
case InternalTestStep::DialogArgument::Action::CANCEL:
267
onCmdCancel(internalTest, 0, nullptr);
268
closeDialog = true;
269
break;
270
case InternalTestStep::DialogArgument::Action::RESET:
271
onCmdReset(internalTest, 0, nullptr);
272
break;
273
case InternalTestStep::DialogArgument::Action::ABORT:
274
onCmdAbort(nullptr, 0, nullptr);
275
break;
276
default:
277
runInternalTest(testStep->getDialogArgument());
278
break;
279
}
280
}
281
} else {
282
myTesting = false;
283
// continue depending on the dialog type
284
if (myOpenType == OpenType::MODAL) {
285
// run modal dialog
286
getApp()->runModalFor(this);
287
}
288
}
289
}
290
291
292
long
293
GNEDialog::closeDialogAccepting() {
294
// check if stopping modal dialog
295
if (!myTesting && (myOpenType == OpenType::MODAL)) {
296
getApp()->stopModal(this, TRUE);
297
}
298
// hide dialog
299
hide();
300
// set result
301
myResult = Result::ACCEPT;
302
// restore focus
303
if (myParentDialog) {
304
myParentDialog->setFocus();
305
} else {
306
myApplicationWindow->setFocus();
307
}
308
return 1;
309
}
310
311
312
long
313
GNEDialog::closeDialogCanceling() {
314
// check if stopping modal dialog
315
if (!myTesting && (myOpenType == OpenType::MODAL)) {
316
getApp()->stopModal(this, TRUE);
317
}
318
// hide dialog
319
hide();
320
// set result
321
myResult = Result::CANCEL;
322
// restore focus
323
if (myParentDialog) {
324
myParentDialog->setFocus();
325
} else {
326
myApplicationWindow->setFocus();
327
}
328
return 0;
329
}
330
331
332
long
333
GNEDialog::closeDialogAborting() {
334
// check if stopping modal dialog
335
if (!myTesting && (myOpenType == OpenType::MODAL)) {
336
getApp()->stopModal(this, TRUE);
337
}
338
// hide dialog
339
hide();
340
// set result
341
myResult = Result::ABORT;
342
// restore focus
343
if (myParentDialog) {
344
myParentDialog->setFocus();
345
} else {
346
myApplicationWindow->setFocus();
347
}
348
return 0;
349
}
350
351
352
void
353
GNEDialog::updateTitle(const std::string& newTitle) {
354
setTitle(newTitle.c_str());
355
}
356
357
358
void
359
GNEDialog::updateIcon(GUIIcon newIcon) {
360
setIcon(GUIIconSubSys::getIcon(newIcon));
361
}
362
363
364
void
365
GNEDialog::buildDialog(GUIIcon titleIcon, GNEDialog::Buttons buttons) {
366
// set dialog icon
367
setIcon(GUIIconSubSys::getIcon(titleIcon));
368
// create main frame
369
auto mainFrame = new FXVerticalFrame(this, GUIDesignAuxiliarFrame);
370
// create content frame
371
myContentFrame = new FXVerticalFrame(mainFrame, GUIDesignDialogContentFrame);
372
// add separator
373
new FXHorizontalSeparator(mainFrame, GUIDesignHorizontalSeparator);
374
// Create frame for buttons
375
FXHorizontalFrame* buttonsFrame = new FXHorizontalFrame(mainFrame, GUIDesignDialogButtonsHorizontalFrame);
376
// add horizontal frame used to center buttons horizontally
377
new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
378
// create buttons according to the type
379
switch (buttons) {
380
case Buttons::OK: {
381
// ok button
382
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("OK"), "", TL("OK"),
383
GUIIconSubSys::getIcon(GUIIcon::YES), this,
384
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
385
// set focus button
386
myFocusButton = myAcceptButton;
387
break;
388
}
389
case Buttons::YES_NO: {
390
// yes button
391
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Yes"), "", TL("Yes"),
392
GUIIconSubSys::getIcon(GUIIcon::YES), this,
393
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
394
// no button
395
myCancelButton = GUIDesigns::buildFXButton(buttonsFrame, TL("No"), "", TL("No"),
396
GUIIconSubSys::getIcon(GUIIcon::NO), this,
397
MID_GNE_BUTTON_CANCEL, GUIDesignButtonDialog);
398
// set focus button
399
myFocusButton = myAcceptButton;
400
break;
401
}
402
case Buttons::YES_NO_CANCEL: {
403
// yes button
404
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Yes"), "", TL("Yes"),
405
GUIIconSubSys::getIcon(GUIIcon::YES), this,
406
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
407
// no button
408
myCancelButton = GUIDesigns::buildFXButton(buttonsFrame, TL("No"), "", TL("No"),
409
GUIIconSubSys::getIcon(GUIIcon::NO), this,
410
MID_GNE_BUTTON_CANCEL, GUIDesignButtonDialog);
411
// cancel button
412
myAbortButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Cancel"), "", TL("Cancel"),
413
GUIIconSubSys::getIcon(GUIIcon::CANCEL), this,
414
MID_GNE_ABORT, GUIDesignButtonDialog);
415
// set focus button
416
myFocusButton = myAcceptButton;
417
break;
418
}
419
case Buttons::SAVE_DONTSAVE_CANCEL: {
420
// save button
421
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Save"), "", TL("Save"),
422
GUIIconSubSys::getIcon(GUIIcon::SAVE), this,
423
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
424
// don't save button
425
myCancelButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Don't Save"), "", TL("Don't Save"),
426
GUIIconSubSys::getIcon(GUIIcon::NO), this,
427
MID_GNE_BUTTON_CANCEL, GUIDesignButtonDialog);
428
// cancel button
429
myAbortButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Cancel"), "", TL("Cancel"),
430
GUIIconSubSys::getIcon(GUIIcon::CANCEL), this,
431
MID_GNE_ABORT, GUIDesignButtonDialog);
432
// set focus button
433
myFocusButton = myAcceptButton;
434
break;
435
}
436
case Buttons::ACCEPT: {
437
// accept button
438
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Accept"), "", TL("Accept"),
439
GUIIconSubSys::getIcon(GUIIcon::YES), this,
440
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
441
// set focus button
442
myFocusButton = myAcceptButton;
443
break;
444
}
445
case Buttons::ACCEPT_CANCEL: {
446
// accept button
447
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Accept"), "", TL("Accept"),
448
GUIIconSubSys::getIcon(GUIIcon::YES), this,
449
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
450
// cancel button
451
myCancelButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Cancel"), "", TL("Cancel"),
452
GUIIconSubSys::getIcon(GUIIcon::NO), this,
453
MID_GNE_BUTTON_CANCEL, GUIDesignButtonDialog);
454
// set focus button
455
myFocusButton = myAcceptButton;
456
break;
457
}
458
case Buttons::ACCEPT_CANCEL_RESET: {
459
// accept button
460
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Accept"), "", TL("Accept"),
461
GUIIconSubSys::getIcon(GUIIcon::YES), this,
462
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
463
// cancel button
464
myCancelButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Cancel"), "", TL("Cancel"),
465
GUIIconSubSys::getIcon(GUIIcon::NO), this,
466
MID_GNE_BUTTON_CANCEL, GUIDesignButtonDialog);
467
// reset button
468
myResetButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Reset"), "", TL("Reset changes"),
469
GUIIconSubSys::getIcon(GUIIcon::RESET), this,
470
MID_GNE_BUTTON_RESET, GUIDesignButtonDialog);
471
// set focus button
472
myFocusButton = myAcceptButton;
473
break;
474
}
475
case Buttons::RUN_CANCEL_RESET: {
476
// run button
477
myRunButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Run"), "", TL("Run"),
478
GUIIconSubSys::getIcon(GUIIcon::START), this,
479
MID_GNE_BUTTON_RUN, GUIDesignButtonDialog);
480
// reset button
481
myCancelButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Cancel"), "", TL("Cancel"),
482
GUIIconSubSys::getIcon(GUIIcon::NO), this,
483
MID_GNE_BUTTON_CANCEL, GUIDesignButtonDialog);
484
// reset button
485
myResetButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Reset"), "", TL("Reset changes"),
486
GUIIconSubSys::getIcon(GUIIcon::RESET), this,
487
MID_GNE_BUTTON_RESET, GUIDesignButtonDialog);
488
// set focus button
489
myFocusButton = myRunButton;
490
break;
491
}
492
case Buttons::RUN_ADVANCED_CANCEL: {
493
// run button
494
myRunButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Run"), "", TL("Run"),
495
GUIIconSubSys::getIcon(GUIIcon::START), this,
496
MID_GNE_BUTTON_RUN, GUIDesignButtonDialog);
497
// cancel button
498
myAdvancedButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Advanced"), "", TL("Advanced options"),
499
GUIIconSubSys::getIcon(GUIIcon::OPTIONS), this,
500
MID_GNE_BUTTON_ADVANCED, GUIDesignButtonDialog);
501
// cancel button
502
myCancelButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Cancel"), "", TL("Cancel"),
503
GUIIconSubSys::getIcon(GUIIcon::CANCEL), this,
504
MID_GNE_BUTTON_CANCEL, GUIDesignButtonDialog);
505
// set focus button
506
myFocusButton = myRunButton;
507
break;
508
}
509
case Buttons::RERUN_BACK_OK: {
510
// run/abort button
511
myRunButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Rerun"), "", TL("Rerun tool"),
512
GUIIconSubSys::getIcon(GUIIcon::RESET), this,
513
MID_GNE_BUTTON_RUN, GUIDesignButtonDialog);
514
// back button
515
myBackButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Back"), "", TL("Back to tool dialog"),
516
GUIIconSubSys::getIcon(GUIIcon::BACK), this,
517
MID_GNE_BUTTON_BACK, GUIDesignButtonDialog);
518
// cancel button
519
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("OK"), "", TL("OK"),
520
GUIIconSubSys::getIcon(GUIIcon::YES), this,
521
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
522
// set focus button
523
myFocusButton = myAcceptButton;
524
break;
525
}
526
case Buttons::OK_COPY_REPORT: {
527
// run/abort button
528
myAcceptButton = GUIDesigns::buildFXButton(buttonsFrame, TL("OK"), "", TL("OK"),
529
GUIIconSubSys::getIcon(GUIIcon::YES), this,
530
MID_GNE_BUTTON_ACCEPT, GUIDesignButtonDialog);
531
// copy button
532
myCopyButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Copy"), "", TL("Copy error trace to clipboard"),
533
GUIIconSubSys::getIcon(GUIIcon::COPY), this,
534
MID_GNE_BUTTON_COPY, GUIDesignButtonDialog);
535
// cancel button
536
myReportButton = GUIDesigns::buildFXButton(buttonsFrame, TL("Report"), "", TL("Report bug to github"),
537
GUIIconSubSys::getIcon(GUIIcon::GITHUB), this,
538
MID_GNE_BUTTON_REPORT, GUIDesignButtonDialog);
539
// set focus button
540
myFocusButton = myAcceptButton;
541
break;
542
}
543
default:
544
throw ProcessError("Invalid buttons combination in GNEDialog");
545
}
546
// add horizontal frame used to center buttons horizontally
547
new FXHorizontalFrame(buttonsFrame, GUIDesignAuxiliarHorizontalFrame);
548
}
549
550