1 /* 2 * Copyright 2015 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Axel Dörfler, <axeld@pinc-software.de> 7 */ 8 9 10 #include "ServiceView.h" 11 12 #include <Button.h> 13 #include <Catalog.h> 14 #include <LayoutBuilder.h> 15 #include <MessageRunner.h> 16 #include <StringView.h> 17 #include <TextView.h> 18 19 20 static const uint32 kMsgToggleService = 'tgls'; 21 static const uint32 kMsgEnableToggleButton = 'entg'; 22 23 static const bigtime_t kDisableDuration = 500000; 24 25 26 #undef B_TRANSLATION_CONTEXT 27 #define B_TRANSLATION_CONTEXT "ServiceView" 28 29 30 ServiceView::ServiceView(const char* name, const char* executable, 31 const char* title, const char* description, BNetworkSettings& settings) 32 : 33 BView("service", 0), 34 fName(name), 35 fExecutable(executable), 36 fSettings(settings) 37 { 38 BStringView* titleView = new BStringView("service", title); 39 titleView->SetFont(be_bold_font); 40 titleView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); 41 42 BTextView* descriptionView = new BTextView("description"); 43 descriptionView->SetText(description); 44 descriptionView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); 45 descriptionView->MakeEditable(false); 46 47 fEnableButton = new BButton("toggler", B_TRANSLATE("Enable"), 48 new BMessage(kMsgToggleService)); 49 50 BLayoutBuilder::Group<>(this, B_VERTICAL) 51 .Add(titleView) 52 .Add(descriptionView) 53 .AddGlue() 54 .AddGroup(B_HORIZONTAL) 55 .AddGlue() 56 .Add(fEnableButton); 57 58 SetExplicitMinSize(BSize(200, B_SIZE_UNSET)); 59 _UpdateEnableButton(); 60 61 fWasEnabled = IsEnabled(); 62 } 63 64 65 ServiceView::~ServiceView() 66 { 67 } 68 69 70 bool 71 ServiceView::IsRevertable() const 72 { 73 return IsEnabled() != fWasEnabled; 74 } 75 76 77 status_t 78 ServiceView::Revert() 79 { 80 if (IsRevertable()) 81 _Toggle(); 82 83 return B_OK; 84 } 85 86 87 void 88 ServiceView::SettingsUpdated(uint32 which) 89 { 90 if (which == BNetworkSettings::kMsgServiceSettingsUpdated) 91 _UpdateEnableButton(); 92 } 93 94 95 void 96 ServiceView::AttachedToWindow() 97 { 98 fEnableButton->SetTarget(this); 99 } 100 101 102 void 103 ServiceView::MessageReceived(BMessage* message) 104 { 105 switch (message->what) { 106 case kMsgToggleService: 107 _Toggle(); 108 break; 109 110 case kMsgEnableToggleButton: 111 fEnableButton->SetEnabled(true); 112 _UpdateEnableButton(); 113 break; 114 115 default: 116 BView::MessageReceived(message); 117 break; 118 } 119 } 120 121 122 bool 123 ServiceView::IsEnabled() const 124 { 125 return fSettings.Service(fName).IsRunning(); 126 } 127 128 129 void 130 ServiceView::Enable() 131 { 132 BNetworkServiceSettings settings; 133 settings.SetName(fName); 134 settings.AddArgument(fExecutable); 135 136 BMessage service; 137 if (settings.GetMessage(service) == B_OK) 138 fSettings.AddService(service); 139 } 140 141 142 void 143 ServiceView::Disable() 144 { 145 fSettings.RemoveService(fName); 146 } 147 148 149 void 150 ServiceView::_Toggle() 151 { 152 if (IsEnabled()) 153 Disable(); 154 else 155 Enable(); 156 157 fEnableButton->SetEnabled(false); 158 BMessage reenable(kMsgEnableToggleButton); 159 BMessageRunner::StartSending(this, &reenable, kDisableDuration, 1); 160 } 161 162 163 void 164 ServiceView::_UpdateEnableButton() 165 { 166 fEnableButton->SetLabel(IsEnabled() 167 ? B_TRANSLATE("Disable") : B_TRANSLATE("Enable")); 168 } 169