1/* 2 * Copyright 2016-2017, Rene Gollent, rene@gollent.com. 3 * Distributed under the terms of the MIT License. 4 */ 5#include "NetworkConnectionConfigView.h" 6 7#include <stdio.h> 8#include <stdlib.h> 9 10#include <LayoutBuilder.h> 11#include <MenuField.h> 12#include <TextControl.h> 13 14#include "Settings.h" 15#include "SettingsDescription.h" 16#include "TargetHostInterfaceInfo.h" 17 18 19enum { 20 MSG_NET_CONFIG_INPUT_CHANGED = 'ncic' 21}; 22 23 24static const char* kHostSetting = "hostname"; 25static const char* kPortSetting = "port"; 26 27 28NetworkConnectionConfigView::NetworkConnectionConfigView() 29 : 30 ConnectionConfigView("NetworkConnectionConfig"), 31 fProtocolField(NULL), 32 fHostInput(NULL), 33 fPortInput(NULL), 34 fSettings(NULL), 35 fHostSetting(NULL), 36 fPortSetting(NULL) 37{ 38} 39 40 41NetworkConnectionConfigView::~NetworkConnectionConfigView() 42{ 43 if (fSettings != NULL) 44 fSettings->ReleaseReference(); 45} 46 47 48void 49NetworkConnectionConfigView::AttachedToWindow() 50{ 51 ConnectionConfigView::AttachedToWindow(); 52 53 fHostInput->SetTarget(this); 54 fPortInput->SetTarget(this); 55} 56 57 58void 59NetworkConnectionConfigView::MessageReceived(BMessage* message) 60{ 61 switch (message->what) { 62 case MSG_NET_CONFIG_INPUT_CHANGED: 63 { 64 fSettings->SetValue(fHostSetting, fHostInput->Text()); 65 uint16 port = (uint16)strtoul(fPortInput->Text(), NULL, 10); 66 fSettings->SetValue(fPortSetting, port); 67 NotifyConfigurationChanged(fSettings); 68 break; 69 } 70 default: 71 { 72 ConnectionConfigView::MessageReceived(message); 73 break; 74 } 75 } 76} 77 78 79status_t 80NetworkConnectionConfigView::InitSpecific() 81{ 82 SettingsDescription* description 83 = InterfaceInfo()->GetSettingsDescription(); 84 85 for (int32 i = 0; i < description->CountSettings(); i++) { 86 Setting* setting = description->SettingAt(i); 87 if (strcmp(setting->ID(), kPortSetting) == 0) 88 fPortSetting = setting; 89 else if (strcmp(setting->ID(), kHostSetting) == 0) 90 fHostSetting = setting; 91 } 92 93 if (fPortSetting == NULL || fHostSetting == NULL) 94 return B_BAD_VALUE; 95 96 fSettings = new Settings(description); 97 fPortInput = new BTextControl("port_input", "Port:", "", 98 new BMessage(MSG_NET_CONFIG_INPUT_CHANGED)); 99 100 BLayoutItem* textLayoutItem; 101 BLayoutBuilder::Group<>(this, B_HORIZONTAL) 102 .Add((fHostInput = new BTextControl("host_input", "Host:", "", 103 new BMessage(MSG_NET_CONFIG_INPUT_CHANGED)))) 104 .Add(fPortInput->CreateLabelLayoutItem()) 105 .Add((textLayoutItem = fPortInput->CreateTextViewLayoutItem())) 106 .End(); 107 108 // since port numbers are limited to 5 digits, there's no need for 109 // the port input to expand farther than that. Instead, let the 110 // host field take the extra space. 111 textLayoutItem->SetExplicitMaxSize(BSize( 112 be_plain_font->StringWidth("999999"), B_SIZE_UNSET)); 113 114 115 BString buffer; 116 buffer.SetToFormat("%" B_PRIu16, fPortSetting->DefaultValue().ToUInt16()); 117 fPortInput->SetText(buffer); 118 119 fHostInput->SetModificationMessage( 120 new BMessage(MSG_NET_CONFIG_INPUT_CHANGED)); 121 fPortInput->SetModificationMessage( 122 new BMessage(MSG_NET_CONFIG_INPUT_CHANGED)); 123 124 return B_OK; 125} 126 127 128