From d0b107f3110baf1799df4c488c64848a1e232d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 16 Mar 2015 23:31:08 +0000 Subject: [PATCH] Network: added IPAddressControl. * Based on Adrien's previous work in the DNS settings view. * The IPv* and DNS add-ons are now using it. --- .../dnsclient/DNSSettingsView.cpp | 15 +--- .../network_settings/dnsclient/Jamfile | 1 + .../ipv4/InterfaceAddressView.cpp | 24 ++++-- .../ipv4/InterfaceAddressView.h | 7 +- src/add-ons/network_settings/ipv4/Jamfile | 1 + src/add-ons/network_settings/ipv6/Jamfile | 1 + src/preferences/network/IPAddressControl.cpp | 84 +++++++++++++++++++ src/preferences/network/IPAddressControl.h | 36 ++++++++ src/preferences/network/Jamfile | 1 + 9 files changed, 148 insertions(+), 22 deletions(-) create mode 100644 src/preferences/network/IPAddressControl.cpp create mode 100644 src/preferences/network/IPAddressControl.h diff --git a/src/add-ons/network_settings/dnsclient/DNSSettingsView.cpp b/src/add-ons/network_settings/dnsclient/DNSSettingsView.cpp index 4b26e5876a..19ac4068a7 100644 --- a/src/add-ons/network_settings/dnsclient/DNSSettingsView.cpp +++ b/src/add-ons/network_settings/dnsclient/DNSSettingsView.cpp @@ -26,14 +26,14 @@ #include #include #include -#include + +#include "IPAddressControl.h" static const int32 kMsgAddServer = 'adds'; static const int32 kMsgDeleteServer = 'dels'; static const int32 kMsgMoveUp = 'mvup'; static const int32 kMsgMoveDown = 'mvdn'; -static const int32 kMsgEditServer = 'edit'; static const int32 kMsgApply = 'aply'; @@ -46,8 +46,7 @@ DNSSettingsView::DNSSettingsView() BView("dns", 0) { fServerListView = new BListView("nameservers"); - fTextControl = new BTextControl("", "", NULL); - fTextControl->SetModificationMessage(new BMessage(kMsgEditServer)); + fTextControl = new IPAddressControl(AF_UNSPEC, "server", ""); fTextControl->SetExplicitMinSize(BSize(fTextControl->StringWidth("5") * 18, B_SIZE_UNSET)); @@ -158,14 +157,6 @@ DNSSettingsView::MessageReceived(BMessage* message) fServerListView->SwapItems(index, index + 1); break; } - case kMsgEditServer: - { - struct in_addr dummy; - bool success = inet_aton(fTextControl->Text(), &dummy); - fTextControl->MarkAsInvalid(!success); - fAddButton->SetEnabled(success); - break; - } case kMsgApply: _SaveDNSConfiguration(); break; diff --git a/src/add-ons/network_settings/dnsclient/Jamfile b/src/add-ons/network_settings/dnsclient/Jamfile index da720eece4..9cd2991f17 100644 --- a/src/add-ons/network_settings/dnsclient/Jamfile +++ b/src/add-ons/network_settings/dnsclient/Jamfile @@ -2,6 +2,7 @@ SubDir HAIKU_TOP src add-ons network_settings dnsclient ; UsePublicHeaders [ FDirName add-ons network_settings ] ; UsePrivateHeaders app libroot kernel net ; +UseHeaders [ FDirName $(HAIKU_TOP) src preferences network ] : false ; Addon DNSClientService : DNSClientServiceAddOn.cpp diff --git a/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp b/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp index e0c7d5ddb8..0ca4ff3eec 100644 --- a/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp +++ b/src/add-ons/network_settings/ipv4/InterfaceAddressView.cpp @@ -24,6 +24,8 @@ #include #include +#include "IPAddressControl.h" + #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "IntefaceAddressView" @@ -74,15 +76,23 @@ InterfaceAddressView::InterfaceAddressView(int family, float minimumWidth = be_control_look->DefaultItemSpacing() * 16; - fAddressField = new BTextControl(B_TRANSLATE("IP Address:"), NULL, NULL); + fAddressField = new IPAddressControl(fFamily, B_TRANSLATE("IP Address:"), + NULL); fAddressField->SetToolTip(B_TRANSLATE("Your IP address")); - fAddressField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); - fNetmaskField = new BTextControl(B_TRANSLATE("Netmask:"), NULL, NULL); - fNetmaskField->SetToolTip(B_TRANSLATE("The netmask defines your local network")); - fNetmaskField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); - fGatewayField = new BTextControl(B_TRANSLATE("Gateway:"), NULL, NULL); + fAddressField->TextView()->SetExplicitMinSize( + BSize(minimumWidth, B_SIZE_UNSET)); + fAddressField->SetAllowEmpty(false); + fNetmaskField = new IPAddressControl(fFamily, B_TRANSLATE("Netmask:"), + NULL); + fNetmaskField->SetToolTip(B_TRANSLATE( + "The netmask defines your local network")); + fNetmaskField->TextView()->SetExplicitMinSize( + BSize(minimumWidth, B_SIZE_UNSET)); + fGatewayField = new IPAddressControl(fFamily, B_TRANSLATE("Gateway:"), + NULL); fGatewayField->SetToolTip(B_TRANSLATE("Your gateway to the internet")); - fGatewayField->TextView()->SetExplicitMinSize(BSize(minimumWidth, B_SIZE_UNSET)); + fGatewayField->TextView()->SetExplicitMinSize( + BSize(minimumWidth, B_SIZE_UNSET)); fApplyButton = new BButton("apply", B_TRANSLATE("Apply"), new BMessage(kMsgApply)); diff --git a/src/add-ons/network_settings/ipv4/InterfaceAddressView.h b/src/add-ons/network_settings/ipv4/InterfaceAddressView.h index a8b8f99002..408f166da7 100644 --- a/src/add-ons/network_settings/ipv4/InterfaceAddressView.h +++ b/src/add-ons/network_settings/ipv4/InterfaceAddressView.h @@ -22,6 +22,7 @@ class BMessage; class BPopUpMenu; class BRect; class BTextControl; +class IPAddressControl; using namespace BNetworkKit; @@ -65,9 +66,9 @@ private: BPopUpMenu* fModePopUpMenu; BMenuField* fModeField; - BTextControl* fAddressField; - BTextControl* fNetmaskField; - BTextControl* fGatewayField; + IPAddressControl* fAddressField; + IPAddressControl* fNetmaskField; + IPAddressControl* fGatewayField; BButton* fApplyButton; }; diff --git a/src/add-ons/network_settings/ipv4/Jamfile b/src/add-ons/network_settings/ipv4/Jamfile index 0d8250ce67..884c0d4294 100644 --- a/src/add-ons/network_settings/ipv4/Jamfile +++ b/src/add-ons/network_settings/ipv4/Jamfile @@ -2,6 +2,7 @@ SubDir HAIKU_TOP src add-ons network_settings ipv4 ; UsePublicHeaders [ FDirName add-ons network_settings ] ; UsePrivateHeaders shared ; +UseHeaders [ FDirName $(HAIKU_TOP) src preferences network ] : false ; Addon IPv4Interface : IPv4InterfaceAddOn.cpp diff --git a/src/add-ons/network_settings/ipv6/Jamfile b/src/add-ons/network_settings/ipv6/Jamfile index 34a79c38ad..787cba697f 100644 --- a/src/add-ons/network_settings/ipv6/Jamfile +++ b/src/add-ons/network_settings/ipv6/Jamfile @@ -2,6 +2,7 @@ SubDir HAIKU_TOP src add-ons network_settings ipv6 ; UsePublicHeaders [ FDirName add-ons network_settings ] ; UsePrivateHeaders shared ; +UseHeaders [ FDirName $(HAIKU_TOP) src preferences network ] : false ; SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons network_settings ipv4 ] ; diff --git a/src/preferences/network/IPAddressControl.cpp b/src/preferences/network/IPAddressControl.cpp new file mode 100644 index 0000000000..643e2c4035 --- /dev/null +++ b/src/preferences/network/IPAddressControl.cpp @@ -0,0 +1,84 @@ +/* + * Copyright 2015 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Axel Dörfler, + */ + + +#include "IPAddressControl.h" + +#include + + +static const uint32 kMsgModified = 'txmd'; + + +IPAddressControl::IPAddressControl(int family, const char* label, + const char* name) + : + BTextControl(name, label, "", NULL), + fFamily(family), + fAllowEmpty(true) +{ + SetModificationMessage(new BMessage(kMsgModified)); +} + + +IPAddressControl::~IPAddressControl() +{ +} + + +bool +IPAddressControl::AllowEmpty() const +{ + return fAllowEmpty; +} + + +void +IPAddressControl::SetAllowEmpty(bool empty) +{ + fAllowEmpty = empty; +} + + +void +IPAddressControl::AttachedToWindow() +{ + BTextControl::AttachedToWindow(); + SetTarget(this); + _UpdateMark(); +} + + +void +IPAddressControl::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kMsgModified: + _UpdateMark(); + break; + + default: + BTextControl::MessageReceived(message); + break; + } +} + + +void +IPAddressControl::_UpdateMark() +{ + if (TextLength() == 0) { + MarkAsInvalid(!fAllowEmpty); + return; + } + + BNetworkAddress address; + bool success = address.SetTo(fFamily, Text()) == B_OK; + + MarkAsInvalid(!success); +} diff --git a/src/preferences/network/IPAddressControl.h b/src/preferences/network/IPAddressControl.h new file mode 100644 index 0000000000..ec1fc0caad --- /dev/null +++ b/src/preferences/network/IPAddressControl.h @@ -0,0 +1,36 @@ +/* + * Copyright 2015 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Axel Dörfler, + */ +#ifndef IP_ADDRESS_CONTROL_H +#define IP_ADDRESS_CONTROL_H + + +#include + + +class IPAddressControl : public BTextControl { +public: + IPAddressControl(int family, const char* label, + const char* name); + virtual ~IPAddressControl(); + + bool AllowEmpty() const; + void SetAllowEmpty(bool empty); + + virtual void AttachedToWindow(); + virtual void MessageReceived(BMessage* message); + +private: + void _UpdateMark(); + +private: + int fFamily; + bool fAllowEmpty; +}; + + +#endif // IP_ADDRESS_CONTROL_H diff --git a/src/preferences/network/Jamfile b/src/preferences/network/Jamfile index 1ec2ddade0..f844aabd36 100644 --- a/src/preferences/network/Jamfile +++ b/src/preferences/network/Jamfile @@ -13,6 +13,7 @@ Preference Network : NetworkSettingsAddOn.cpp InterfaceListItem.cpp InterfaceView.cpp + IPAddressControl.cpp # from NetworkStatus RadioView.cpp