1/* 2 * Copyright 2004-2015 Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include <NetworkSettingsAddOn.h> 8 9#include <stdio.h> 10#include <stdlib.h> 11 12#include <ControlLook.h> 13#include <NetworkAddress.h> 14#include <NetworkInterface.h> 15#include <NetworkSettings.h> 16 17#include "NetworkWindow.h" 18 19 20using namespace BNetworkKit; 21 22 23BNetworkSettingsItem::BNetworkSettingsItem() 24 : 25 fProfile(NULL) 26{ 27} 28 29 30BNetworkSettingsItem::~BNetworkSettingsItem() 31{ 32} 33 34 35status_t 36BNetworkSettingsItem::ProfileChanged(const BNetworkProfile* newProfile) 37{ 38 fProfile = newProfile; 39 return B_OK; 40} 41 42 43const BNetworkProfile* 44BNetworkSettingsItem::Profile() const 45{ 46 return fProfile; 47} 48 49 50void 51BNetworkSettingsItem::SettingsUpdated(uint32 type) 52{ 53} 54 55 56void 57BNetworkSettingsItem::ConfigurationUpdated(const BMessage& message) 58{ 59} 60 61 62void 63BNetworkSettingsItem::NotifySettingsUpdated() 64{ 65 // TODO: post to network window 66 BMessage updated(kMsgSettingsItemUpdated); 67 updated.AddPointer("item", this); 68 gNetworkWindow.SendMessage(&updated); 69} 70 71 72// #pragma mark - 73 74 75BNetworkSettingsInterfaceItem::BNetworkSettingsInterfaceItem( 76 const char* interface) 77 : 78 fInterface(interface) 79{ 80} 81 82 83BNetworkSettingsInterfaceItem::~BNetworkSettingsInterfaceItem() 84{ 85} 86 87 88BNetworkSettingsType 89BNetworkSettingsInterfaceItem::Type() const 90{ 91 return B_NETWORK_SETTINGS_TYPE_INTERFACE; 92} 93 94 95const char* 96BNetworkSettingsInterfaceItem::Interface() const 97{ 98 return fInterface; 99} 100 101 102// #pragma mark - 103 104 105BNetworkInterfaceListItem::BNetworkInterfaceListItem(int family, 106 const char* interface, const char* label, BNetworkSettings& settings) 107 : 108 fSettings(settings), 109 fFamily(family), 110 fInterface(interface), 111 fLabel(label), 112 fDisabled(false), 113 fLineOffset(0), 114 fSpacing(0) 115{ 116} 117 118 119BNetworkInterfaceListItem::~BNetworkInterfaceListItem() 120{ 121} 122 123 124const char* 125BNetworkInterfaceListItem::Label() const 126{ 127 return fLabel; 128} 129 130 131void 132BNetworkInterfaceListItem::DrawItem(BView* owner, BRect bounds, bool complete) 133{ 134 owner->PushState(); 135 136 if (IsSelected() || complete) { 137 if (IsSelected()) { 138 owner->SetHighColor(ui_color(B_LIST_SELECTED_BACKGROUND_COLOR)); 139 owner->SetLowColor(owner->HighColor()); 140 } else 141 owner->SetHighColor(owner->LowColor()); 142 143 owner->FillRect(bounds); 144 } 145 146 // Set the initial bounds of item contents 147 BPoint labelLocation = bounds.LeftTop() + BPoint(fSpacing, fLineOffset); 148 149 if (fDisabled) { 150 rgb_color textColor; 151 if (IsSelected()) 152 textColor = ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR); 153 else 154 textColor = ui_color(B_LIST_ITEM_TEXT_COLOR); 155 156 if (textColor.red + textColor.green + textColor.blue > 128 * 3) 157 owner->SetHighColor(tint_color(textColor, B_DARKEN_1_TINT)); 158 else 159 owner->SetHighColor(tint_color(textColor, B_LIGHTEN_1_TINT)); 160 } else { 161 if (IsSelected()) 162 owner->SetHighColor(ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR)); 163 else 164 owner->SetHighColor(ui_color(B_LIST_ITEM_TEXT_COLOR)); 165 } 166 167 owner->SetFont(be_plain_font); 168 owner->DrawString(fLabel, labelLocation); 169 170 if (!fAddress.IsEmpty()) { 171 BFont font = _AddressFont(); 172 owner->MovePenBy(fSpacing, 0); 173 owner->SetFont(&font); 174 owner->DrawString(fAddress); 175 } 176 177 owner->PopState(); 178} 179 180 181void 182BNetworkInterfaceListItem::Update(BView* owner, const BFont* font) 183{ 184 _UpdateState(); 185 186 fSpacing = be_control_look->DefaultLabelSpacing(); 187 188 BListItem::Update(owner, font); 189 font_height height; 190 font->GetHeight(&height); 191 192 float lineHeight = ceilf(height.ascent) + ceilf(height.descent) 193 + ceilf(height.leading); 194 fLineOffset = 2 + ceilf(height.ascent + height.leading / 2); 195 196 SetWidth(owner->StringWidth(fLabel) + 2 * fSpacing 197 + _AddressFont().StringWidth(fAddress.String())); 198 SetHeight(lineHeight + 4); 199} 200 201 202void 203BNetworkInterfaceListItem::ConfigurationUpdated(const BMessage& message) 204{ 205 _UpdateState(); 206} 207 208 209BFont 210BNetworkInterfaceListItem::_AddressFont() 211{ 212 BFont font; 213 font.SetFace(B_ITALIC_FACE); 214 font.SetSize(font.Size() * 0.9f); 215 return font; 216} 217 218 219void 220BNetworkInterfaceListItem::_UpdateState() 221{ 222 BNetworkInterfaceAddress address; 223 BNetworkInterface interface(fInterface); 224 225 bool autoConfigure = fSettings.Interface(fInterface).IsAutoConfigure( 226 fFamily); 227 228 fAddress = ""; 229 fDisabled = !autoConfigure; 230 231 int32 index = interface.FindFirstAddress(fFamily); 232 if (index < 0) 233 return; 234 235 interface.GetAddressAt(index, address); 236 237 fDisabled = address.Address().IsEmpty() && !autoConfigure; 238 if (!address.Address().IsEmpty()) 239 fAddress << "(" << address.Address().ToString() << ")"; 240} 241 242 243// #pragma mark - 244 245 246BNetworkSettingsAddOn::BNetworkSettingsAddOn(image_id image, 247 BNetworkSettings& settings) 248 : 249 fImage(image), 250 fResources(NULL), 251 fSettings(settings) 252{ 253} 254 255 256BNetworkSettingsAddOn::~BNetworkSettingsAddOn() 257{ 258 delete fResources; 259} 260 261 262BNetworkSettingsInterfaceItem* 263BNetworkSettingsAddOn::CreateNextInterfaceItem(uint32& cookie, 264 const char* interface) 265{ 266 return NULL; 267} 268 269 270BNetworkSettingsItem* 271BNetworkSettingsAddOn::CreateNextItem(uint32& cookie) 272{ 273 return NULL; 274} 275 276 277image_id 278BNetworkSettingsAddOn::Image() 279{ 280 return fImage; 281} 282 283 284BResources* 285BNetworkSettingsAddOn::Resources() 286{ 287 if (fResources == NULL) { 288 image_info info; 289 if (get_image_info(fImage, &info) != B_OK) 290 return NULL; 291 292 BResources* resources = new BResources(); 293 BFile file(info.name, B_READ_ONLY); 294 if (resources->SetTo(&file) == B_OK) 295 fResources = resources; 296 else 297 delete resources; 298 } 299 return fResources; 300} 301 302 303BNetworkSettings& 304BNetworkSettingsAddOn::Settings() 305{ 306 return fSettings; 307} 308