2 * Copyright 2007-2016 Haiku, Inc. All rights reserved.
3 * Copyright 2001-2003 Dr. Zoidberg Enterprises. All rights reserved.
5 * Distributed under the terms of the MIT License.
9 //! Main E-Mail config window
12 #include "ConfigWindow.h"
19 #include <AppFileInfo.h>
20 #include <Application.h>
26 #include <ControlLook.h>
27 #include <Directory.h>
29 #include <FindDirectory.h>
30 #include <LayoutBuilder.h>
33 #include <MailDaemon.h>
34 #include <MailSettings.h>
36 #include <MenuField.h>
39 #include <PopUpMenu.h>
41 #include <Resources.h>
44 #include <ScrollView.h>
45 #include <SeparatorView.h>
46 #include <StringView.h>
48 #include <TextControl.h>
51 #include <MailPrivate.h>
53 #include "AutoConfigWindow.h"
56 #undef B_TRANSLATION_CONTEXT
57 #define B_TRANSLATION_CONTEXT "Config Window"
62 // define if you want to have an apply button
63 //#define HAVE_APPLY_BUTTON
66 const uint32 kMsgAccountsRightClicked
= 'arcl';
67 const uint32 kMsgAccountSelected
= 'acsl';
68 const uint32 kMsgAddAccount
= 'adac';
69 const uint32 kMsgRemoveAccount
= 'rmac';
71 const uint32 kMsgIntervalUnitChanged
= 'iuch';
73 const uint32 kMsgShowStatusWindowChanged
= 'shst';
74 const uint32 kMsgStatusLookChanged
= 'lkch';
75 const uint32 kMsgStatusWorkspaceChanged
= 'wsch';
77 const uint32 kMsgSaveSettings
= 'svst';
78 const uint32 kMsgRevertSettings
= 'rvst';
79 const uint32 kMsgCancelSettings
= 'cnst';
83 AccountItem::AccountItem(const char* label
, BMailAccountSettings
* account
,
94 AccountItem::Update(BView
* owner
, const BFont
* font
)
96 if (fType
== ACCOUNT_ITEM
)
99 BStringItem::Update(owner
, font
);
104 AccountItem::DrawItem(BView
* owner
, BRect rect
, bool complete
)
107 if (fType
== ACCOUNT_ITEM
)
108 owner
->SetFont(be_bold_font
);
110 BStringItem::DrawItem(owner
, rect
, complete
);
118 class AccountsListView
: public BListView
{
120 AccountsListView(BHandler
* target
)
122 BListView(NULL
, B_SINGLE_SELECTION_LIST
),
128 KeyDown(const char *bytes
, int32 numBytes
)
133 if ((*bytes
== B_DELETE
) || (*bytes
== B_BACKSPACE
))
134 Window()->PostMessage(kMsgRemoveAccount
);
136 BListView::KeyDown(bytes
,numBytes
);
140 MouseDown(BPoint point
)
142 BListView::MouseDown(point
);
146 GetMouse(&dummy
, &buttons
);
147 if (buttons
!= B_SECONDARY_MOUSE_BUTTON
)
150 int32 index
= IndexOf(point
);
154 BMessage
message(kMsgAccountsRightClicked
);
155 ConvertToScreen(&point
);
156 message
.AddPoint("point", point
);
157 message
.AddInt32("index", index
);
158 BMessenger
messenger(fTarget
);
159 messenger
.SendMessage(&message
);
167 class BitmapView
: public BView
{
169 BitmapView(BBitmap
*bitmap
)
171 BView(NULL
, B_WILL_DRAW
)
175 SetDrawingMode(B_OP_ALPHA
);
176 SetBlendingMode(B_PIXEL_ALPHA
, B_ALPHA_OVERLAY
);
177 SetExplicitSize(bitmap
->Bounds().Size());
185 virtual void AttachedToWindow()
190 virtual void Draw(BRect updateRect
)
192 DrawBitmap(fBitmap
, updateRect
, updateRect
);
203 ConfigWindow::ConfigWindow()
205 BWindow(BRect(100, 100, 600, 540), B_TRANSLATE_SYSTEM_NAME("E-mail"),
207 B_ASYNCHRONOUS_CONTROLS
| B_NOT_ZOOMABLE
| B_AUTO_UPDATE_SIZE_LIMITS
),
208 fLastSelectedAccount(NULL
),
211 BTabView
* tabView
= new BTabView("tab", B_WIDTH_FROM_WIDEST
);
212 tabView
->SetBorder(B_NO_BORDER
);
216 BView
* view
= new BView("accounts", 0);
217 tabView
->AddTab(view
);
218 tabView
->TabAt(0)->SetLabel(B_TRANSLATE("Accounts"));
220 fAccountsListView
= new AccountsListView(this);
221 fAccountsListView
->SetExplicitPreferredSize(BSize(
222 fAccountsListView
->StringWidth("W") * 22, B_SIZE_UNSET
));
224 BButton
* addButton
= new BButton(NULL
, B_TRANSLATE("Add"),
225 new BMessage(kMsgAddAccount
));
226 fRemoveButton
= new BButton(NULL
, B_TRANSLATE("Remove"),
227 new BMessage(kMsgRemoveAccount
));
229 fConfigView
= new BView(NULL
, 0);
230 fConfigView
->SetLayout(new BGroupLayout(B_VERTICAL
));
231 fConfigView
->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED
, B_SIZE_UNLIMITED
));
232 fConfigView
->SetViewUIColor(B_PANEL_BACKGROUND_COLOR
);
234 BScrollView
* scroller
= new BScrollView(NULL
, fAccountsListView
, 0,
237 BLayoutBuilder::Group
<>(view
, B_HORIZONTAL
)
238 .SetInsets(B_USE_WINDOW_SPACING
, B_USE_WINDOW_SPACING
,
239 B_USE_WINDOW_SPACING
, B_USE_DEFAULT_SPACING
)
240 .AddGroup(B_VERTICAL
)
242 .AddGroup(B_HORIZONTAL
)
247 .Add(fConfigView
, 2.0f
);
249 _ReplaceConfigView(_BuildHowToView());
253 view
= new BView("general", 0);
254 view
->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED
, B_SIZE_UNLIMITED
));
255 tabView
->AddTab(view
);
256 tabView
->TabAt(1)->SetLabel(B_TRANSLATE("Settings"));
258 fCheckMailCheckBox
= new BCheckBox("check", B_TRANSLATE("Check every"),
260 fIntervalControl
= new BTextControl("time", B_TRANSLATE("minutes"), NULL
,
263 BPopUpMenu
* statusPopUp
= new BPopUpMenu(B_EMPTY_STRING
);
264 const char* statusModes
[] = {
265 B_TRANSLATE_COMMENT("Never", "show status window"),
266 B_TRANSLATE("While sending"),
267 B_TRANSLATE("While sending and receiving")};
268 for (size_t i
= 0; i
< sizeof(statusModes
) / sizeof(statusModes
[0]); i
++) {
269 BMessage
* msg
= new BMessage(kMsgShowStatusWindowChanged
);
270 BMenuItem
* item
= new BMenuItem(statusModes
[i
], msg
);
271 statusPopUp
->AddItem(item
);
272 msg
->AddInt32("ShowStatusWindow", i
);
275 fStatusModeField
= new BMenuField("show status",
276 B_TRANSLATE("Show notifications:"), statusPopUp
);
278 BMessage
* msg
= new BMessage(B_REFS_RECEIVED
);
279 BButton
* editMenuButton
= new BButton(B_EMPTY_STRING
,
280 B_TRANSLATE("Edit mailbox menu…"), msg
);
281 editMenuButton
->SetTarget(BMessenger("application/x-vnd.Be-TRAK"));
284 find_directory(B_USER_SETTINGS_DIRECTORY
, &path
);
285 path
.Append("Mail/Menu Links");
286 BEntry
entry(path
.Path());
287 if (entry
.InitCheck() == B_OK
&& entry
.Exists()) {
290 msg
->AddRef("refs", &ref
);
292 editMenuButton
->SetEnabled(false);
294 BLayoutBuilder::Group
<>(view
, B_VERTICAL
)
295 .SetInsets(B_USE_WINDOW_SPACING
, B_USE_WINDOW_SPACING
,
296 B_USE_WINDOW_SPACING
, B_USE_DEFAULT_SPACING
)
298 .AddGroup(B_HORIZONTAL
, 0.f
)
300 .Add(fCheckMailCheckBox
)
301 .AddStrut(be_control_look
->DefaultLabelSpacing())
302 .Add(fIntervalControl
->CreateTextViewLayoutItem())
303 .AddStrut(be_control_look
->DefaultLabelSpacing())
304 .Add(fIntervalControl
->CreateLabelLayoutItem())
307 .AddGroup(B_HORIZONTAL
, 0.f
)
309 .Add(fStatusModeField
->CreateLabelLayoutItem())
310 .Add(fStatusModeField
->CreateMenuBarLayoutItem())
316 // save/revert buttons
318 BButton
* applyButton
= new BButton("apply", B_TRANSLATE("Apply"),
319 new BMessage(kMsgSaveSettings
));
320 BButton
* revertButton
= new BButton("revert", B_TRANSLATE("Revert"),
321 new BMessage(kMsgRevertSettings
));
323 BLayoutBuilder::Group
<>(this, B_VERTICAL
, 0)
324 .SetInsets(0, B_USE_DEFAULT_SPACING
, 0, B_USE_WINDOW_SPACING
)
326 .Add(new BSeparatorView(B_HORIZONTAL
))
327 .AddGroup(B_HORIZONTAL
, 0)
331 .SetInsets(B_USE_WINDOW_SPACING
, B_USE_DEFAULT_SPACING
,
332 B_USE_WINDOW_SPACING
, 0);
336 fAccountsListView
->SetSelectionMessage(new BMessage(kMsgAccountSelected
));
337 fAccountsListView
->MakeFocus(true);
344 ConfigWindow::~ConfigWindow()
346 while (fAccounts
.CountItems() > 0)
347 _RemoveAccount(fAccounts
.ItemAt(0));
348 for (int32 i
= 0; i
< fToDeleteAccounts
.CountItems(); i
++)
349 delete fToDeleteAccounts
.ItemAt(i
);
354 ConfigWindow::_BuildHowToView()
356 BView
* groupView
= new BView("howTo", 0);
358 BitmapView
* bitmapView
= NULL
;
360 if (be_app
->GetAppInfo(&info
) == B_OK
) {
361 BFile
appFile(&info
.ref
, B_READ_ONLY
);
362 BAppFileInfo
appFileInfo(&appFile
);
363 if (appFileInfo
.InitCheck() == B_OK
) {
364 BBitmap
* bitmap
= new (std::nothrow
) BBitmap(BRect(0, 0, 63, 63),
366 if (appFileInfo
.GetIcon(bitmap
, B_LARGE_ICON
) == B_OK
)
367 bitmapView
= new BitmapView(bitmap
);
373 fHowToTextView
= new BTextView(NULL
, B_WILL_DRAW
);
374 fHowToTextView
->SetAlignment(B_ALIGN_CENTER
);
375 fHowToTextView
->SetText(B_TRANSLATE(
376 "Create a new account with the Add button.\n\n"
377 "Remove an account with the Remove button on the selected item.\n\n"
378 "Select an item in the list to change its settings."));
380 fHowToTextView
->MakeEditable(false);
381 fHowToTextView
->MakeSelectable(false);
383 BFont
font(be_plain_font
);
384 float fontFactor
= font
.Size() / 12.0f
;
386 fHowToTextView
->SetExplicitPreferredSize(
387 BSize(300 * fontFactor
,400 * fontFactor
));
389 rgb_color textColor
= ui_color(B_PANEL_TEXT_COLOR
);
390 fHowToTextView
->SetFontAndColor(&font
, B_FONT_ALL
, &textColor
);
392 BLayoutBuilder::Group
<>(groupView
, B_VERTICAL
)
397 if (bitmapView
!= NULL
)
398 groupView
->GetLayout()->AddView(1, bitmapView
);
400 fHowToTextView
->AdoptSystemColors();
407 ConfigWindow::_LoadSettings()
410 for (int i
= 0; i
< fAccounts
.CountItems(); i
++)
411 delete fAccounts
.ItemAt(i
);
412 fAccounts
.MakeEmpty();
416 // load in general settings
417 BMailSettings settings
;
418 status_t status
= _SetToGeneralSettings(&settings
);
419 if (status
!= B_OK
) {
420 fprintf(stderr
, B_TRANSLATE("Error retrieving general settings: %s\n"),
427 ConfigWindow::_LoadAccounts()
429 BMailAccounts accounts
;
430 for (int32 i
= 0; i
< accounts
.CountAccounts(); i
++)
431 fAccounts
.AddItem(new BMailAccountSettings(*accounts
.AccountAt(i
)));
433 for (int i
= 0; i
< fAccounts
.CountItems(); i
++) {
434 BMailAccountSettings
* account
= fAccounts
.ItemAt(i
);
435 _AddAccountToView(account
);
441 ConfigWindow::_SaveSettings()
443 // collect changed accounts
444 BMessage
changedAccounts(BPrivate::kMsgAccountsChanged
);
445 for (int32 i
= 0; i
< fAccounts
.CountItems(); i
++) {
446 BMailAccountSettings
* account
= fAccounts
.ItemAt(i
);
447 if (account
&& account
->HasBeenModified())
448 changedAccounts
.AddInt32("account", account
->AccountID());
450 for (int32 i
= 0; i
< fToDeleteAccounts
.CountItems(); i
++) {
451 BMailAccountSettings
* account
= fToDeleteAccounts
.ItemAt(i
);
452 changedAccounts
.AddInt32("account", account
->AccountID());
455 // cleanup account directory
456 for (int32 i
= 0; i
< fToDeleteAccounts
.CountItems(); i
++) {
457 BMailAccountSettings
* account
= fToDeleteAccounts
.ItemAt(i
);
458 BEntry
entry(account
->AccountFile());
462 fToDeleteAccounts
.MakeEmpty();
464 // Apply and save general settings
466 BMailSettings settings
;
468 bigtime_t interval
= 0;
469 if (fCheckMailCheckBox
->Value() == B_CONTROL_ON
) {
470 // figure out time interval
472 sscanf(fIntervalControl
->Text(), "%f", &floatInterval
);
473 interval
= bigtime_t(60000000L * floatInterval
);
476 settings
.SetAutoCheckInterval(interval
);
477 settings
.SetDaemonAutoStarts(!fAccounts
.IsEmpty());
479 // status mode (alway, fetching/retrieving, ...)
480 int32 index
= fStatusModeField
->Menu()->IndexOf(
481 fStatusModeField
->Menu()->FindMarked());
482 settings
.SetShowStatusWindow(index
);
490 for (int i
= 0; i
< fAccounts
.CountItems(); i
++)
491 fAccounts
.ItemAt(i
)->Save();
494 BMessenger
messenger(B_MAIL_DAEMON_SIGNATURE
);
495 if (messenger
.IsValid()) {
496 // server should reload general settings
497 messenger
.SendMessage(BPrivate::kMsgSettingsUpdated
);
498 // notify server about changed accounts
499 messenger
.SendMessage(&changedAccounts
);
502 // Start/stop the mail_daemon depending on the settings
505 if (settings
.DaemonAutoStarts() && !daemon
.IsRunning())
507 else if (!settings
.DaemonAutoStarts() && daemon
.IsRunning())
514 ConfigWindow::QuitRequested()
518 be_app
->PostMessage(B_QUIT_REQUESTED
);
524 ConfigWindow::MessageReceived(BMessage
*msg
)
526 float fontFactor
= be_plain_font
->Size() / 12.0f
;
527 BRect
autoConfigRect(0, 0, 400 * fontFactor
, 300 * fontFactor
);
530 AutoConfigWindow
*autoConfigWindow
= NULL
;
532 case B_COLORS_UPDATED
:
535 if (msg
->FindColor(ui_color_name(B_PANEL_TEXT_COLOR
), &textColor
)
538 fHowToTextView
->SetFontAndColor(&font
, 0, &textColor
);
543 case kMsgAccountsRightClicked
:
546 msg
->FindPoint("point", &point
);
547 int32 index
= msg
->FindInt32("index");
548 AccountItem
* clickedItem
= dynamic_cast<AccountItem
*>(
549 fAccountsListView
->ItemAt(index
));
550 if (clickedItem
== NULL
|| clickedItem
->Type() != ACCOUNT_ITEM
)
553 BPopUpMenu
rightClickMenu("accounts", false, false);
555 BMenuItem
* inMenuItem
= new BMenuItem(B_TRANSLATE("Incoming"),
557 BMenuItem
* outMenuItem
= new BMenuItem(B_TRANSLATE("Outgoing"),
559 rightClickMenu
.AddItem(inMenuItem
);
560 rightClickMenu
.AddItem(outMenuItem
);
562 BMailAccountSettings
* settings
= clickedItem
->Account();
563 if (settings
->IsInboundEnabled())
564 inMenuItem
->SetMarked(true);
565 if (settings
->IsOutboundEnabled())
566 outMenuItem
->SetMarked(true);
568 BMenuItem
* selectedItem
= rightClickMenu
.Go(point
);
569 if (selectedItem
== NULL
)
571 if (selectedItem
== inMenuItem
) {
572 AccountItem
* item
= dynamic_cast<AccountItem
*>(
573 fAccountsListView
->ItemAt(index
+ 1));
576 if (settings
->IsInboundEnabled()) {
577 settings
->SetInboundEnabled(false);
578 item
->SetEnabled(false);
580 settings
->SetInboundEnabled(true);
581 item
->SetEnabled(true);
584 AccountItem
* item
= dynamic_cast<AccountItem
*>(
585 fAccountsListView
->ItemAt(index
+ 2));
588 if (settings
->IsOutboundEnabled()) {
589 settings
->SetOutboundEnabled(false);
590 item
->SetEnabled(false);
592 settings
->SetOutboundEnabled(true);
593 item
->SetEnabled(true);
598 case kMsgAccountSelected
:
601 if (msg
->FindInt32("index", &index
) != B_OK
|| index
< 0) {
602 // deselect current item
603 _ReplaceConfigView(_BuildHowToView());
606 AccountItem
* item
= (AccountItem
*)fAccountsListView
->ItemAt(index
);
608 _AccountSelected(item
);
615 autoConfigRect
.OffsetTo(
616 frame
.left
+ (frame
.Width() - autoConfigRect
.Width()) / 2,
617 frame
.top
+ (frame
.Width() - autoConfigRect
.Height()) / 2);
618 autoConfigWindow
= new AutoConfigWindow(autoConfigRect
, this);
619 autoConfigWindow
->Show();
623 case kMsgRemoveAccount
:
625 int32 index
= fAccountsListView
->CurrentSelection();
627 AccountItem
*item
= (AccountItem
*)fAccountsListView
->ItemAt(
630 _RemoveAccount(item
->Account());
631 _ReplaceConfigView(_BuildHowToView());
637 case kMsgIntervalUnitChanged
:
640 if (msg
->FindInt32("index",&index
) == B_OK
)
641 fIntervalControl
->SetEnabled(index
!= 0);
645 case kMsgShowStatusWindowChanged
:
647 // the status window stuff is the only "live" setting
648 BMessenger
messenger("application/x-vnd.Be-POST");
649 if (messenger
.IsValid())
650 messenger
.SendMessage(msg
);
654 case kMsgRevertSettings
:
655 _RevertToLastSettings();
658 case kMsgSaveSettings
:
659 fSaveSettings
= true;
661 AccountUpdated(fLastSelectedAccount
);
662 _ReplaceConfigView(_BuildHowToView());
663 fAccountsListView
->DeselectAll();
667 BWindow::MessageReceived(msg
);
673 BMailAccountSettings
*
674 ConfigWindow::AddAccount()
676 BMailAccountSettings
* account
= new BMailAccountSettings
;
679 fAccounts
.AddItem(account
);
680 _AddAccountToView(account
);
686 ConfigWindow::AccountUpdated(BMailAccountSettings
* account
)
691 for (int i
= 0; i
< fAccountsListView
->CountItems(); i
++) {
692 AccountItem
* item
= (AccountItem
*)fAccountsListView
->ItemAt(i
);
693 if (item
->Account() == account
) {
694 if (item
->Type() == ACCOUNT_ITEM
) {
695 item
->SetText(account
->Name());
696 fAccountsListView
->Invalidate();
704 ConfigWindow::_SetToGeneralSettings(BMailSettings
* settings
)
706 if (settings
== NULL
)
709 status_t status
= settings
->InitCheck();
713 // retrieval frequency
714 uint32 interval
= uint32(settings
->AutoCheckInterval() / 60000000L);
715 fCheckMailCheckBox
->SetValue(interval
!= 0 ? B_CONTROL_ON
: B_CONTROL_OFF
);
720 BString intervalText
;
721 intervalText
.SetToFormat("%" B_PRIu32
, interval
);
722 fIntervalControl
->SetText(intervalText
.String());
724 int32 showStatusIndex
= settings
->ShowStatusWindow();
725 BMenuItem
* item
= fStatusModeField
->Menu()->ItemAt(showStatusIndex
);
727 item
->SetMarked(true);
728 // send live update to the server by simulating a menu click
729 BMessage
msg(kMsgShowStatusWindowChanged
);
730 msg
.AddInt32("ShowStatusWindow", showStatusIndex
);
739 ConfigWindow::_RevertToLastSettings()
741 // revert general settings
742 BMailSettings settings
;
744 status_t status
= _SetToGeneralSettings(&settings
);
745 if (status
!= B_OK
) {
747 sprintf(text
, B_TRANSLATE(
748 "\nThe general settings couldn't be reverted.\n\n"
749 "Error retrieving general settings:\n%s\n"),
751 BAlert
* alert
= new BAlert(B_TRANSLATE("Error"), text
,
752 B_TRANSLATE("OK"), NULL
, NULL
, B_WIDTH_AS_USUAL
, B_WARNING_ALERT
);
753 alert
->SetFlags(alert
->Flags() | B_CLOSE_ON_ESCAPE
);
757 // revert account data
759 if (fAccountsListView
->CurrentSelection() != -1)
760 _ReplaceConfigView(_BuildHowToView());
762 for (int32 i
= 0; i
< fAccounts
.CountItems(); i
++) {
763 BMailAccountSettings
* account
= fAccounts
.ItemAt(i
);
764 _RemoveAccountFromListView(account
);
768 fAccounts
.MakeEmpty();
774 ConfigWindow::_AddAccountToView(BMailAccountSettings
* account
)
777 label
<< account
->Name();
780 item
= new AccountItem(label
, account
, ACCOUNT_ITEM
);
781 fAccountsListView
->AddItem(item
);
783 item
= new AccountItem(B_TRANSLATE("\t\t· Incoming"), account
, INBOUND_ITEM
);
784 fAccountsListView
->AddItem(item
);
785 if (!account
->IsInboundEnabled())
786 item
->SetEnabled(false);
788 item
= new AccountItem(B_TRANSLATE("\t\t· Outgoing"), account
,
790 fAccountsListView
->AddItem(item
);
791 if (!account
->IsOutboundEnabled())
792 item
->SetEnabled(false);
794 item
= new AccountItem(B_TRANSLATE("\t\t· E-mail filters"), account
,
796 fAccountsListView
->AddItem(item
);
801 ConfigWindow::_RemoveAccount(BMailAccountSettings
* account
)
803 _RemoveAccountFromListView(account
);
804 fAccounts
.RemoveItem(account
);
805 fToDeleteAccounts
.AddItem(account
);
810 ConfigWindow::_RemoveAccountFromListView(BMailAccountSettings
* account
)
812 if (fLastSelectedAccount
== account
) {
813 _ReplaceConfigView(_BuildHowToView());
814 fLastSelectedAccount
= NULL
;
817 for (int i
= fAccountsListView
->CountItems(); i
-- > 0;) {
818 AccountItem
* item
= (AccountItem
*)fAccountsListView
->ItemAt(i
);
819 if (item
->Account() == account
) {
820 fAccountsListView
->RemoveItem(i
);
828 ConfigWindow::_AccountSelected(AccountItem
* item
)
830 AccountUpdated(fLastSelectedAccount
);
832 BMailAccountSettings
* account
= item
->Account();
833 fLastSelectedAccount
= account
;
836 switch (item
->Type()) {
838 view
= new AccountConfigView(account
);
842 view
= new ProtocolSettingsView(account
->InboundAddOnRef(),
843 *account
, account
->InboundSettings());
847 view
= new ProtocolSettingsView(account
->OutboundAddOnRef(),
848 *account
, account
->OutboundSettings());
852 view
= new FiltersConfigView(*account
);
856 _ReplaceConfigView(view
);
861 ConfigWindow::_ReplaceConfigView(BView
* view
)
863 while (BView
* child
= fConfigView
->ChildAt(0)) {
864 fConfigView
->RemoveChild(child
);
869 fConfigView
->AddChild(view
);