def __init__(self, connection=None, set_button_callback=None, dns_only=False, settings_obj=None, link_local=False):
        
        gtk.VBox.__init__(self)
        self.tab_name = _("IPv4 settings")
        self.connection = connection 
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        self.dns_only = dns_only

        # Ip configuration
         
        self.link_section = Title(_("Link-Local Only"), toggle_callback = self.link_local_callback, label_right=True)
        self.ip_table = gtk.Table(3, 2, False)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Subnet Mask:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)
        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])
        
        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0, "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1, "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])
        
        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        # Init Settings
        self.ip = ["","",""]
        self.dns = ["",""]
        names = ["ip4", "netmask", "gw"]
        for n in names:
            setattr(self, n + "_flag", False)
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)
        self.show_all()
    def __init__(self, connection=None, set_button_callback=None, settings_obj=None, link_local=False):
        
        gtk.VBox.__init__(self)
        self.connection = connection 
        self.tab_name = _("IPv6 settings")
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        # Ip configuration
        self.ip_table = gtk.Table(3, 2, False)
        #self.ip_section = SettingSection(_("Automatic get IP address"),text_size=CONTENT_FONT_SIZE, has_seperator=False, always_show=False, revert=True, label_right=True)
        self.link_section = Title(_("Link-Local Only"), toggle_callback = self.link_local_callback, label_right=True)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Prefix:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)
        
        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])

        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0, "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1, "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])
        
        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        self.show_all()

        self.ip = ["", "", ""]
        self.dns = ["", ""]
        self.setting =None
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)
class IPV4Conf(gtk.VBox):
    ENTRY_WIDTH = 222
    def __init__(self, connection=None, set_button_callback=None, dns_only=False, settings_obj=None, link_local=False):
        
        gtk.VBox.__init__(self)
        self.tab_name = _("IPv4 settings")
        self.connection = connection 
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        self.dns_only = dns_only

        # Ip configuration
         
        self.link_section = Title(_("Link-Local Only"), toggle_callback = self.link_local_callback, label_right=True)
        self.ip_table = gtk.Table(3, 2, False)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Subnet Mask:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)
        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])
        
        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0, "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1, "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])
        
        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        # Init Settings
        self.ip = ["","",""]
        self.dns = ["",""]
        names = ["ip4", "netmask", "gw"]
        for n in names:
            setattr(self, n + "_flag", False)
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)
        self.show_all()


    def __set_row(self, name, arg, types="ip"):
        label = Label(name, text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)

        label.set_can_focus(False)
        entry = IPV4Entry()
        if types == "ip":
            entry.connect("changed", self.set_ip_address, arg)
        else:
            entry.connect("changed", self.set_dns_address, arg)

        return (label, entry)

    def __table_attach(self, table, row_item, row):
        for i, item in enumerate(row_item):
            if i >=1:
                align = style.wrap_with_align(item, align="left")
                align.set_padding(0, 0, 1, 0)
            else:
                align = style.wrap_with_align(item)
                align.set_size_request(210, -1)
            table.attach(align, i, i +1, row, row + 1)
    
    def link_local_callback(self, widget):
        self._ip_group_sensitive(not widget.get_active())
        if widget.get_active():
            self.setting.method = 'link-local'
        else:
            self.setting.method = 'auto'
        self.settings_obj.set_button('save', True)

    def _ip_group_sensitive(self, state):
        self.ip_section.set_sensitive(state)
        self.dns_section.set_sensitive(state)
             
    def reset(self, connection):
        self.setting = connection.get_setting("ipv4")       
        if "ipv4" not in connection.settings_dict.iterkeys():
            log.debug("ipv4 not in settings dict, will create one")
            self.setting.method = "auto"
            connection.settings_dict["ipv4"] = self.setting.prop_dict

        if self.setting.method == 'link-local':
            self.link_section.switch.set_active(True)
        else:
            if self.setting.method == "auto":
                self.ip_section.set_active(True)
                    
            else:
                log.debug("get addresses", self.setting.addresses)
                self.ip_section.set_active(False)
                #self.set_group_sensitive("ip", True)
                if not self.setting.addresses == []:
                    #print self.setting.addresses[0][0]
                    addr, mask, gate = self.setting.addresses[0]
                    #self.ip_section.set_active(True)
                    self.addr_row[1].set_address(addr)
                    self.mask_row[1].set_address(mask)
                    self.gate_row[1].set_address(gate)
                    self.ip = self.setting.addresses[0]

        if self.setting.dns == []:
            self.dns_section.set_active(True)
        else:
            self.dns_section.set_active(False)
            if len(self.setting.dns) == 1:
                self.dns = self.setting.dns + [""]
            else:
                self.dns = self.setting.dns

            self.master_row[1].set_address(self.dns[0])
            
            if self.dns[1]:
                self.slave_row[1].set_address(self.dns[1])

        self.reset_table()

    def reset_table(self):
        pass
        self.queue_draw()

    def set_group_sensitive(self, group_name, sensitive):
        pass

    def set_ip_address(self, widget, content, index):
        # if you really want no gateway, just put a 0.0.0.0
        names = ["ip4", "netmask", "gw"]
        verbose_name = [_("IPv4"), _("Subnet Mask"), _("Gateway")]
        self.ip[index] = content

        if self.check_valid(names[index]):
            setattr(self, names[index] + "_flag", True)
            Dispatcher.set_tip(_("Valid %s address.")%verbose_name[index])
        else:
            setattr(self, names[index] + "_flag", False)
            Dispatcher.set_tip(_("Invalid %s address.")%verbose_name[index])

        ############
        # 检查ip、子网掩码、网关是否正确
        log.debug(widget, content, index)
        is_valid = True
        for n in names:
            if not getattr(self, "%s_flag"%n):
                is_valid = False
                break
        if is_valid:
            if self.setting.addresses:
                self.setting.clear_addresses()
            self.setting.add_address(self.ip)
        
        if self.settings_obj:
            self.settings_obj.ipv4_ip_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)

    def set_dns_address(self, widget, content, index):
        self.dns[index] = content
        names = ["master", "slaver"]
        dns = self.check_complete_dns()
        #print "set dns address:", dns, content
        if dns:
            is_valid = True
            self.setting.clear_dns()
            for d in dns:
                self.setting.add_dns(d)
        else:
            is_valid = False
            self.setting.clear_dns()

        if TypeConvert.is_valid_ip4(content):
            setattr(self, names[index] + "_flag", True)
        else:
            setattr(self, names[index] + "_flag", False)

        ############
        # 检查dns
        if self.settings_obj:
            self.settings_obj.ipv4_dns_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)

    def check_complete_dns(self):
        dns = []
        for address in self.dns:
            if TypeConvert.is_valid_ip4(address):
                dns.append(address)
            else:
                return dns
        return dns

    def check_valid(self, name):
        if name == "ip4":
            return TypeConvert.is_valid_ip4(self.ip[0])
        elif name == "netmask":
            return TypeConvert.is_valid_netmask(self.ip[1])
        elif name == "gw":
            return TypeConvert.is_valid_gw(self.ip[0], self.ip[1], self.ip[2])
    
    def dns_toggle_on(self):
        self.setting.clear_dns()
        self.set_group_sensitive("dns", False)
        ###########
        if self.settings_obj:
            self.settings_obj.ipv4_dns_is_valid = True
            self.settings_obj.set_button("save", True)

    def dns_toggle_off(self):
        self.set_group_sensitive("dns", True)
        master, slave = self.dns
        if master:
            self.master_row[1].emit('changed', master)
        if slave:
            self.slave_row[1].emit('changed', slave)
        # 统一调用shared_methods.Settings的set_button
        #if self.connection.check_setting_finish():
            #dns_is_valid = True
        #else:
            #dns_is_valid = False
        #if self.settings_obj:
            #self.settings_obj.ipv4_dns_is_valid = dns_is_valid
            #self.settings_obj.set_button("save", dns_is_valid)
        
    def ip_toggle_on(self):
        self.setting.clear_addresses()
        #self.ip = ["","",""]
        self.setting.method = 'auto'
        self.set_group_sensitive("ip", False)
        ########
        if self.settings_obj:
            self.settings_obj.ipv4_ip_is_valid = True
            self.settings_obj.set_button("save", True)

    def ip_toggle_off(self):
        self.setting.method = 'manual'
        addr, mask, gate = self.ip
        if addr:
            self.addr_row[1].emit("changed", addr)
        if mask:
            self.mask_row[1].emit("changed", mask)
        if gate:
            self.gate_row[1].emit("changed", gate)
class IPV6Conf(gtk.VBox):
    ENTRY_WIDTH = 300
    def __init__(self, connection=None, set_button_callback=None, settings_obj=None, link_local=False):
        
        gtk.VBox.__init__(self)
        self.connection = connection 
        self.tab_name = _("IPv6 settings")
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        # Ip configuration
        self.ip_table = gtk.Table(3, 2, False)
        #self.ip_section = SettingSection(_("Automatic get IP address"),text_size=CONTENT_FONT_SIZE, has_seperator=False, always_show=False, revert=True, label_right=True)
        self.link_section = Title(_("Link-Local Only"), toggle_callback = self.link_local_callback, label_right=True)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Prefix:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)
        
        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])

        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0, "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1, "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])
        
        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        self.show_all()

        self.ip = ["", "", ""]
        self.dns = ["", ""]
        self.setting =None
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)

        #if type(self.connection) is NMRemoteConnection:
            #Dispatcher.set_button("apply", True)
        #else:
            #if self.connection.check_setting_finish():
                #Dispatcher.set_button("save", True)
            #else:
                #Dispatcher.set_button("save", False)
    def link_local_callback(self, widget):
        self._ip_group_sensitive(not widget.get_active())
        if widget.get_active():
            self.setting.method = 'link-local'
        else:
            self.setting.method = 'auto'
        self.settings_obj.set_button('save', True)

    def _ip_group_sensitive(self, state):
        self.ip_section.set_sensitive(state)
        self.dns_section.set_sensitive(state)

    def __set_row(self, name, arg, types="ip"):
        label = Label(name, text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        entry = InputEntry()
        if types == "ip":
            #print "ip row changed"
            entry.entry.connect("changed", self.set_ip_address, arg)
        else:
            #print "dns row changed"
            entry.entry.connect("changed", self.set_dns_address, arg)
        entry.set_size(self.ENTRY_WIDTH, WIDGET_HEIGHT)

        return (label, entry)

    def __table_attach(self, table, row_item, row):
        for i, item in enumerate(row_item):
            if i >=1:
                align = style.wrap_with_align(item, align="left")
            else:
                align = style.wrap_with_align(item)
                align.set_size_request(210, -1)
            table.attach(align, i, i +1, row, row + 1)

    def reset_table(self):
        pass

    def reset(self, connection):
        self.setting = connection.get_setting("ipv6")       

        if "ipv6" not in connection.settings_dict.iterkeys():
            log.debug("ipv6 not in settings dict, will create one")
            self.setting.method = "auto"
            connection.settings_dict["ipv6"] = self.setting.prop_dict
        
        #  FIXME: ipv6 method刚开始为None并且还会记住上次操作,应该每次开始时为auto。
        if self.setting.method == 'link-local':
            self.link_section.switch.set_active(True)
        else:
            if self.setting.method == "auto" or self.setting.method is None:
                self.ip_section.set_active(True)
                self.set_group_sensitive("ip", False)
                
            else:
                self.ip_section.set_active(False)
                self.set_group_sensitive("ip", True)
                if not self.setting.addresses == []:
                    addr, mask, gate = self.setting.addresses[0]

                    self.addr_row[1].set_text(addr)
                    self.mask_row[1].set_text(mask)
                    self.gate_row[1].set_text(gate)
                    self.ip = self.setting.addresses

        if self.setting.dns == []:
            self.dns_section.set_active(True)
            self.set_group_sensitive("dns", False)
        else:
            #self.manual_dns.set_active(True)
            self.set_group_sensitive("dns", True)
            self.master_row[1].set_text(self.setting.dns[0])
            self.dns = self.setting_dns +[""]
            if len(self.setting.dns) > 1:
                self.slave_row[1].set_text(self.setting.dns[1])
                self.dns = self.setting.dns

        self.reset_table()

    def set_group_sensitive(self, group_name, sensitive):
        pass
        #if group_name is "ip":
            #self.addr_label.set_sensitive(sensitive)
            #self.mask_label.set_sensitive(sensitive)
            #self.gate_label.set_sensitive(sensitive)
            #self.addr_entry.set_sensitive(sensitive)
            #self.mask_entry.set_sensitive(sensitive)
            #self.gate_entry.set_sensitive(sensitive)
            #if not sensitive:
                #self.addr_entry.set_text("")
                #self.mask_entry.set_text("")
                #self.gate_entry.set_text("")
        #elif group_name is "dns":
            #self.master_dns.set_sensitive(sensitive)
            #self.slave_dns.set_sensitive(sensitive)
            #self.master_entry.set_sensitive(sensitive)
            #self.slave_entry.set_sensitive(sensitive)
            #if not sensitive:
                #self.master_entry.set_text("")
                #self.slave_entry.set_text("")

    def set_ip_address(self, widget, content, index):
        names = ["ip6", "netmask", "gw"]
        self.ip[index] = content
        if self.check_valid(names[index]):
            setattr(self, names[index] + "_flag", True)
        else:
            setattr(self, names[index] + "_flag", False)

        if self.check_valid("gw"):
            #print "update ip4"
            if self.setting.addresses:
                self.setting.clear_addresses()
            self.setting.add_address(self.ip)
        else:
            self.setting.clear_addresses()

        ############
        # 检查ip、子网掩码、网关是否正确
        for n in names:
            is_valid = self.check_valid(n)
            print "--------------------", n, is_valid
            if not is_valid:
                break
        if self.settings_obj:
            self.settings_obj.ipv6_ip_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)

    def set_dns_address(self, widget, content, index):
        self.dns[index] = content
        names = ["master", "slaver"]
        dns = self.check_complete_dns()
        if dns:
            is_valid = True
            self.setting.clear_dns()
            for d in dns:
                self.setting.add_dns(d)
        else:
            is_valid = False
            self.setting.clear_dns()

        if TypeConvert.is_valid_ip6(content):
            setattr(self, names[index] + "_flag", True)
        else:
            setattr(self, names[index] + "_flag", False)

        ############
        # 检查dns
        if self.settings_obj:
            self.settings_obj.ipv6_dns_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)
            
    def check_complete_dns(self):
        dns = []
        for address in self.dns:
            if TypeConvert.is_valid_ip6(address):
                dns.append(address)
            else:
                return dns
        return dns

    def check_valid(self, name):
        if name == "ip6":
            return TypeConvert.is_valid_ip6(self.ip[0])
        # FIXME 应该用ipv6的网关检查
        elif name == "netmask":
            #return TypeConvert.is_valid_netmask(self.ip[1])
            return self.ip[1].isdigit()
        elif name == "gw":
            #return TypeConvert.is_valid_gw(self.ip[0], self.ip[1], self.ip[2])
            return TypeConvert.is_valid_ip6(self.ip[2])

    def dns_toggle_on(self):
        self.setting.clear_dns()
        #self.dns = ["",""]
        self.set_group_sensitive("dns", False)
        ###########
        if self.settings_obj:
            self.settings_obj.ipv6_dns_is_valid = True
            self.settings_obj.set_button("save", True)

    def dns_toggle_off(self):
        self.set_group_sensitive("dns", True)
        master, slave = self.dns
        if master:
            self.master_row[1].entry.emit('changed', master)
        if slave:
            self.slave_row[1].entry.emit('changed', slave)
        #if self.connection.check_setting_finish():
            #dns_is_valid = True
        #else:
            #dns_is_valid = False
        ###########
        #if self.settings_obj:
            #self.settings_obj.ipv6_dns_is_valid = dns_is_valid
            #self.settings_obj.set_button("save", dns_is_valid)
    
    def ip_toggle_on(self):
        self.setting.clear_addresses()
        #self.ip = ["","",""]
        self.setting.method = 'auto'
        self.set_group_sensitive("ip", False)
        ########
        if self.settings_obj:
            self.settings_obj.ipv6_ip_is_valid = True
            self.settings_obj.set_button("save", True)

    def ip_toggle_off(self):
        self.setting.method = 'manual'
        self.set_group_sensitive("ip", True)
        addr, mask, gate = self.ip
        if addr:
            self.addr_row[1].entry.emit("changed", addr)
        if mask:
            self.mask_row[1].entry.emit("changed", mask)
        if gate:
            self.gate_row[1].entry.emit("changed", gate)
    def __init__(self,
                 connection=None,
                 set_button_callback=None,
                 dns_only=False,
                 settings_obj=None,
                 link_local=False):

        gtk.VBox.__init__(self)
        self.tab_name = _("IPv4 settings")
        self.connection = connection
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        self.dns_only = dns_only

        # Ip configuration

        self.link_section = Title(_("Link-Local Only"),
                                  toggle_callback=self.link_local_callback,
                                  label_right=True)
        self.ip_table = gtk.Table(3, 2, False)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Subnet Mask:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)
        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])

        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0,
                                         "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1,
                                        "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])

        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        # Init Settings
        self.ip = ["", "", ""]
        self.dns = ["", ""]
        names = ["ip4", "netmask", "gw"]
        for n in names:
            setattr(self, n + "_flag", False)
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)
        self.show_all()
class IPV4Conf(gtk.VBox):
    ENTRY_WIDTH = 222

    def __init__(self,
                 connection=None,
                 set_button_callback=None,
                 dns_only=False,
                 settings_obj=None,
                 link_local=False):

        gtk.VBox.__init__(self)
        self.tab_name = _("IPv4 settings")
        self.connection = connection
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        self.dns_only = dns_only

        # Ip configuration

        self.link_section = Title(_("Link-Local Only"),
                                  toggle_callback=self.link_local_callback,
                                  label_right=True)
        self.ip_table = gtk.Table(3, 2, False)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Subnet Mask:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)
        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])

        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0,
                                         "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1,
                                        "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])

        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        # Init Settings
        self.ip = ["", "", ""]
        self.dns = ["", ""]
        names = ["ip4", "netmask", "gw"]
        for n in names:
            setattr(self, n + "_flag", False)
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)
        self.show_all()

    def __set_row(self, name, arg, types="ip"):
        label = Label(name,
                      text_size=CONTENT_FONT_SIZE,
                      enable_select=False,
                      enable_double_click=False)

        label.set_can_focus(False)
        entry = IPV4Entry()
        if types == "ip":
            entry.connect("changed", self.set_ip_address, arg)
        else:
            entry.connect("changed", self.set_dns_address, arg)

        return (label, entry)

    def __table_attach(self, table, row_item, row):
        for i, item in enumerate(row_item):
            if i >= 1:
                align = style.wrap_with_align(item, align="left")
                align.set_padding(0, 0, 1, 0)
            else:
                align = style.wrap_with_align(item)
                align.set_size_request(210, -1)
            table.attach(align, i, i + 1, row, row + 1)

    def link_local_callback(self, widget):
        self._ip_group_sensitive(not widget.get_active())
        if widget.get_active():
            self.setting.method = 'link-local'
        else:
            self.setting.method = 'auto'
        self.settings_obj.set_button('save', True)

    def _ip_group_sensitive(self, state):
        self.ip_section.set_sensitive(state)
        self.dns_section.set_sensitive(state)

    def reset(self, connection):
        self.setting = connection.get_setting("ipv4")
        if "ipv4" not in connection.settings_dict.iterkeys():
            log.debug("ipv4 not in settings dict, will create one")
            self.setting.method = "auto"
            connection.settings_dict["ipv4"] = self.setting.prop_dict

        if self.setting.method == 'link-local':
            self.link_section.switch.set_active(True)
        else:
            if self.setting.method == "auto":
                self.ip_section.set_active(True)

            else:
                log.debug("get addresses", self.setting.addresses)
                self.ip_section.set_active(False)
                #self.set_group_sensitive("ip", True)
                if not self.setting.addresses == []:
                    #print self.setting.addresses[0][0]
                    addr, mask, gate = self.setting.addresses[0]
                    #self.ip_section.set_active(True)
                    self.addr_row[1].set_address(addr)
                    self.mask_row[1].set_address(mask)
                    self.gate_row[1].set_address(gate)
                    self.ip = self.setting.addresses[0]

        if self.setting.dns == []:
            self.dns_section.set_active(True)
        else:
            self.dns_section.set_active(False)
            if len(self.setting.dns) == 1:
                self.dns = self.setting.dns + [""]
            else:
                self.dns = self.setting.dns

            self.master_row[1].set_address(self.dns[0])

            if self.dns[1]:
                self.slave_row[1].set_address(self.dns[1])

        self.reset_table()

    def reset_table(self):
        pass
        self.queue_draw()

    def set_group_sensitive(self, group_name, sensitive):
        pass

    def set_ip_address(self, widget, content, index):
        # if you really want no gateway, just put a 0.0.0.0
        names = ["ip4", "netmask", "gw"]
        verbose_name = [_("IPv4"), _("Subnet Mask"), _("Gateway")]
        self.ip[index] = content

        if self.check_valid(names[index]):
            setattr(self, names[index] + "_flag", True)
            Dispatcher.set_tip(_("Valid %s address.") % verbose_name[index])
        else:
            setattr(self, names[index] + "_flag", False)
            Dispatcher.set_tip(_("Invalid %s address.") % verbose_name[index])

        ############
        # 检查ip、子网掩码、网关是否正确
        log.debug(widget, content, index)
        is_valid = True
        for n in names:
            if not getattr(self, "%s_flag" % n):
                is_valid = False
                break
        if is_valid:
            if self.setting.addresses:
                self.setting.clear_addresses()
            self.setting.add_address(self.ip)

        if self.settings_obj:
            self.settings_obj.ipv4_ip_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)

    def set_dns_address(self, widget, content, index):
        self.dns[index] = content
        names = ["master", "slaver"]
        dns = self.check_complete_dns()
        #print "set dns address:", dns, content
        if dns:
            is_valid = True
            self.setting.clear_dns()
            for d in dns:
                self.setting.add_dns(d)
        else:
            is_valid = False
            self.setting.clear_dns()

        if TypeConvert.is_valid_ip4(content):
            setattr(self, names[index] + "_flag", True)
        else:
            setattr(self, names[index] + "_flag", False)

        ############
        # 检查dns
        if self.settings_obj:
            self.settings_obj.ipv4_dns_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)

    def check_complete_dns(self):
        dns = []
        for address in self.dns:
            if TypeConvert.is_valid_ip4(address):
                dns.append(address)
            else:
                return dns
        return dns

    def check_valid(self, name):
        if name == "ip4":
            return TypeConvert.is_valid_ip4(self.ip[0])
        elif name == "netmask":
            return TypeConvert.is_valid_netmask(self.ip[1])
        elif name == "gw":
            return TypeConvert.is_valid_gw(self.ip[0], self.ip[1], self.ip[2])

    def dns_toggle_on(self):
        self.setting.clear_dns()
        self.set_group_sensitive("dns", False)
        ###########
        if self.settings_obj:
            self.settings_obj.ipv4_dns_is_valid = True
            self.settings_obj.set_button("save", True)

    def dns_toggle_off(self):
        self.set_group_sensitive("dns", True)
        master, slave = self.dns
        if master:
            self.master_row[1].emit('changed', master)
        if slave:
            self.slave_row[1].emit('changed', slave)
        # 统一调用shared_methods.Settings的set_button
        #if self.connection.check_setting_finish():
        #dns_is_valid = True
        #else:
        #dns_is_valid = False
        #if self.settings_obj:
        #self.settings_obj.ipv4_dns_is_valid = dns_is_valid
        #self.settings_obj.set_button("save", dns_is_valid)

    def ip_toggle_on(self):
        self.setting.clear_addresses()
        #self.ip = ["","",""]
        self.setting.method = 'auto'
        self.set_group_sensitive("ip", False)
        ########
        if self.settings_obj:
            self.settings_obj.ipv4_ip_is_valid = True
            self.settings_obj.set_button("save", True)

    def ip_toggle_off(self):
        self.setting.method = 'manual'
        addr, mask, gate = self.ip
        if addr:
            self.addr_row[1].emit("changed", addr)
        if mask:
            self.mask_row[1].emit("changed", mask)
        if gate:
            self.gate_row[1].emit("changed", gate)
    def __init__(self,
                 connection=None,
                 set_button_callback=None,
                 settings_obj=None,
                 link_local=False):

        gtk.VBox.__init__(self)
        self.connection = connection
        self.tab_name = _("IPv6 settings")
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        # Ip configuration
        self.ip_table = gtk.Table(3, 2, False)
        #self.ip_section = SettingSection(_("Automatic get IP address"),text_size=CONTENT_FONT_SIZE, has_seperator=False, always_show=False, revert=True, label_right=True)
        self.link_section = Title(_("Link-Local Only"),
                                  toggle_callback=self.link_local_callback,
                                  label_right=True)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Prefix:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)

        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])

        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0,
                                         "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1,
                                        "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])

        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        self.show_all()

        self.ip = ["", "", ""]
        self.dns = ["", ""]
        self.setting = None
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)
class IPV6Conf(gtk.VBox):
    ENTRY_WIDTH = 300

    def __init__(self,
                 connection=None,
                 set_button_callback=None,
                 settings_obj=None,
                 link_local=False):

        gtk.VBox.__init__(self)
        self.connection = connection
        self.tab_name = _("IPv6 settings")
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

        # Ip configuration
        self.ip_table = gtk.Table(3, 2, False)
        #self.ip_section = SettingSection(_("Automatic get IP address"),text_size=CONTENT_FONT_SIZE, has_seperator=False, always_show=False, revert=True, label_right=True)
        self.link_section = Title(_("Link-Local Only"),
                                  toggle_callback=self.link_local_callback,
                                  label_right=True)
        self.ip_section = DefaultToggle(_("Automatic IP address"))
        self.ip_section.toggle_on = self.ip_toggle_off
        self.ip_section.toggle_off = self.ip_toggle_on

        self.addr_row = self.__set_row(_("IP Address:"), 0)
        self.mask_row = self.__set_row(_("Prefix:"), 1)
        self.gate_row = self.__set_row(_("Gateway:"), 2)

        self.__table_attach(self.ip_table, self.addr_row, 0)
        self.__table_attach(self.ip_table, self.mask_row, 1)
        self.__table_attach(self.ip_table, self.gate_row, 2)
        self.ip_section.load([self.ip_table])

        #DNS configuration
        self.dns_table = gtk.Table(2, 2, False)
        self.dns_section = DefaultToggle(_("Automatic DNS server address"))
        self.dns_section.toggle_on = self.dns_toggle_off
        self.dns_section.toggle_off = self.dns_toggle_on

        self.master_row = self.__set_row(_("Primary DNS server address:"), 0,
                                         "dns")
        self.slave_row = self.__set_row(_("Slave DNS server address:"), 1,
                                        "dns")

        self.__table_attach(self.dns_table, self.master_row, 0)
        self.__table_attach(self.dns_table, self.slave_row, 1)
        self.dns_section.load([self.dns_table])

        # TODO UI change
        style.draw_background_color(self)
        style.set_table(self.ip_table)
        style.set_table(self.dns_table)

        self.show_all()

        self.ip = ["", "", ""]
        self.dns = ["", ""]
        self.setting = None
        self.pack_start(self.ip_section, False, False)
        self.pack_start(self.dns_section, False, False)
        if link_local:
            self.pack_start(self.link_section, False, False)
        self.reset(connection)

        #if type(self.connection) is NMRemoteConnection:
        #Dispatcher.set_button("apply", True)
        #else:
        #if self.connection.check_setting_finish():
        #Dispatcher.set_button("save", True)
        #else:
        #Dispatcher.set_button("save", False)
    def link_local_callback(self, widget):
        self._ip_group_sensitive(not widget.get_active())
        if widget.get_active():
            self.setting.method = 'link-local'
        else:
            self.setting.method = 'auto'
        self.settings_obj.set_button('save', True)

    def _ip_group_sensitive(self, state):
        self.ip_section.set_sensitive(state)
        self.dns_section.set_sensitive(state)

    def __set_row(self, name, arg, types="ip"):
        label = Label(name,
                      text_size=CONTENT_FONT_SIZE,
                      enable_select=False,
                      enable_double_click=False)
        entry = InputEntry()
        if types == "ip":
            #print "ip row changed"
            entry.entry.connect("changed", self.set_ip_address, arg)
        else:
            #print "dns row changed"
            entry.entry.connect("changed", self.set_dns_address, arg)
        entry.set_size(self.ENTRY_WIDTH, WIDGET_HEIGHT)

        return (label, entry)

    def __table_attach(self, table, row_item, row):
        for i, item in enumerate(row_item):
            if i >= 1:
                align = style.wrap_with_align(item, align="left")
            else:
                align = style.wrap_with_align(item)
                align.set_size_request(210, -1)
            table.attach(align, i, i + 1, row, row + 1)

    def reset_table(self):
        pass

    def reset(self, connection):
        self.setting = connection.get_setting("ipv6")

        if "ipv6" not in connection.settings_dict.iterkeys():
            log.debug("ipv6 not in settings dict, will create one")
            self.setting.method = "auto"
            connection.settings_dict["ipv6"] = self.setting.prop_dict

        #  FIXME: ipv6 method刚开始为None并且还会记住上次操作,应该每次开始时为auto。
        if self.setting.method == 'link-local':
            self.link_section.switch.set_active(True)
        else:
            if self.setting.method == "auto" or self.setting.method is None:
                self.ip_section.set_active(True)
                self.set_group_sensitive("ip", False)

            else:
                self.ip_section.set_active(False)
                self.set_group_sensitive("ip", True)
                if not self.setting.addresses == []:
                    addr, mask, gate = self.setting.addresses[0]

                    self.addr_row[1].set_text(addr)
                    self.mask_row[1].set_text(mask)
                    self.gate_row[1].set_text(gate)
                    self.ip = self.setting.addresses

        if self.setting.dns == []:
            self.dns_section.set_active(True)
            self.set_group_sensitive("dns", False)
        else:
            #self.manual_dns.set_active(True)
            self.set_group_sensitive("dns", True)
            self.master_row[1].set_text(self.setting.dns[0])
            self.dns = self.setting_dns + [""]
            if len(self.setting.dns) > 1:
                self.slave_row[1].set_text(self.setting.dns[1])
                self.dns = self.setting.dns

        self.reset_table()

    def set_group_sensitive(self, group_name, sensitive):
        pass
        #if group_name is "ip":
        #self.addr_label.set_sensitive(sensitive)
        #self.mask_label.set_sensitive(sensitive)
        #self.gate_label.set_sensitive(sensitive)
        #self.addr_entry.set_sensitive(sensitive)
        #self.mask_entry.set_sensitive(sensitive)
        #self.gate_entry.set_sensitive(sensitive)
        #if not sensitive:
        #self.addr_entry.set_text("")
        #self.mask_entry.set_text("")
        #self.gate_entry.set_text("")
        #elif group_name is "dns":
        #self.master_dns.set_sensitive(sensitive)
        #self.slave_dns.set_sensitive(sensitive)
        #self.master_entry.set_sensitive(sensitive)
        #self.slave_entry.set_sensitive(sensitive)
        #if not sensitive:
        #self.master_entry.set_text("")
        #self.slave_entry.set_text("")

    def set_ip_address(self, widget, content, index):
        names = ["ip6", "netmask", "gw"]
        self.ip[index] = content
        if self.check_valid(names[index]):
            setattr(self, names[index] + "_flag", True)
        else:
            setattr(self, names[index] + "_flag", False)

        if self.check_valid("gw"):
            #print "update ip4"
            if self.setting.addresses:
                self.setting.clear_addresses()
            self.setting.add_address(self.ip)
        else:
            self.setting.clear_addresses()

        ############
        # 检查ip、子网掩码、网关是否正确
        for n in names:
            is_valid = self.check_valid(n)
            print "--------------------", n, is_valid
            if not is_valid:
                break
        if self.settings_obj:
            self.settings_obj.ipv6_ip_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)

    def set_dns_address(self, widget, content, index):
        self.dns[index] = content
        names = ["master", "slaver"]
        dns = self.check_complete_dns()
        if dns:
            is_valid = True
            self.setting.clear_dns()
            for d in dns:
                self.setting.add_dns(d)
        else:
            is_valid = False
            self.setting.clear_dns()

        if TypeConvert.is_valid_ip6(content):
            setattr(self, names[index] + "_flag", True)
        else:
            setattr(self, names[index] + "_flag", False)

        ############
        # 检查dns
        if self.settings_obj:
            self.settings_obj.ipv6_dns_is_valid = is_valid
            self.settings_obj.set_button("save", is_valid)

    def check_complete_dns(self):
        dns = []
        for address in self.dns:
            if TypeConvert.is_valid_ip6(address):
                dns.append(address)
            else:
                return dns
        return dns

    def check_valid(self, name):
        if name == "ip6":
            return TypeConvert.is_valid_ip6(self.ip[0])
        # FIXME 应该用ipv6的网关检查
        elif name == "netmask":
            #return TypeConvert.is_valid_netmask(self.ip[1])
            return self.ip[1].isdigit()
        elif name == "gw":
            #return TypeConvert.is_valid_gw(self.ip[0], self.ip[1], self.ip[2])
            return TypeConvert.is_valid_ip6(self.ip[2])

    def dns_toggle_on(self):
        self.setting.clear_dns()
        #self.dns = ["",""]
        self.set_group_sensitive("dns", False)
        ###########
        if self.settings_obj:
            self.settings_obj.ipv6_dns_is_valid = True
            self.settings_obj.set_button("save", True)

    def dns_toggle_off(self):
        self.set_group_sensitive("dns", True)
        master, slave = self.dns
        if master:
            self.master_row[1].entry.emit('changed', master)
        if slave:
            self.slave_row[1].entry.emit('changed', slave)
        #if self.connection.check_setting_finish():
        #dns_is_valid = True
        #else:
        #dns_is_valid = False
        ###########
        #if self.settings_obj:
        #self.settings_obj.ipv6_dns_is_valid = dns_is_valid
        #self.settings_obj.set_button("save", dns_is_valid)

    def ip_toggle_on(self):
        self.setting.clear_addresses()
        #self.ip = ["","",""]
        self.setting.method = 'auto'
        self.set_group_sensitive("ip", False)
        ########
        if self.settings_obj:
            self.settings_obj.ipv6_ip_is_valid = True
            self.settings_obj.set_button("save", True)

    def ip_toggle_off(self):
        self.setting.method = 'manual'
        self.set_group_sensitive("ip", True)
        addr, mask, gate = self.ip
        if addr:
            self.addr_row[1].entry.emit("changed", addr)
        if mask:
            self.mask_row[1].entry.emit("changed", mask)
        if gate:
            self.gate_row[1].entry.emit("changed", gate)
    def __init__(self, connection, set_button, settings_obj=None):
        gtk.VBox.__init__(self)
        self.tab_name = _("Wired")
        self.set_button = set_button
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj
        self.connection = connection
        
        self.ethernet_setting = connection.get_setting("802-3-ethernet")

        table = gtk.Table(3, 2, False)
        
        mac_address = Label(_("Device Mac Address:"),
                            text_size=CONTENT_FONT_SIZE,
                            enable_select=False,
                            enable_double_click=False)
        mac_address.set_can_focus(False)

        self.mac_entry = MACEntry()

        clone_addr = Label(_("Cloned Mac Address:"),
                           text_size=CONTENT_FONT_SIZE,
                           enable_select=False,
                           enable_double_click=False)
        clone_addr.set_can_focus(False)
        self.clone_entry = MACEntry()

        mtu = Label("MTU:", 
                    text_size=CONTENT_FONT_SIZE,
                    enable_select=False,
                    enable_double_click=False)
        mtu.set_can_focus(False)
        self.mtu_spin = SpinBox(0,0, 1500, 1, 130)
        
        '''
        Park table
        '''
        table.attach(style.wrap_with_align(mac_address, width=self.LEFT_PADDING), 0, 1, 0, 1)
        table.attach(style.wrap_with_align(self.mac_entry), 1, 2, 0, 1)
        table.attach(style.wrap_with_align(clone_addr, width=self.LEFT_PADDING), 0, 1, 1, 2)
        table.attach(style.wrap_with_align(self.clone_entry), 1,2, 1, 2)
        table.attach(style.wrap_with_align(mtu, width=self.LEFT_PADDING), 0,1,2,3)
        table.attach(style.wrap_with_align(self.mtu_spin), 1,2,2,3)

        # TODO UI change
        style.draw_background_color(self)
        #align = style.set_box_with_align(table, "text")
        #self.add(align)
        style.set_table(table)
        table_align = gtk.Alignment(0, 0, 0, 0)
        default_button = DefaultToggle(_("Default Setting"))
        default_button.toggle_off = self.use_default_setting
        default_button.toggle_on = self.use_user_setting
        default_button.load([table])
        table_align.add(default_button)
        self.pack_start(table_align, False, False)

        self.mac_entry.set_size_request(130, 22)
        self.clone_entry.set_size_request(130, 22)
        ## retrieve wired info
        self._init = True
        self.mac_entry.connect("changed", self.save_settings, "mac_address")
        self.clone_entry.connect("changed", self.save_settings, "cloned_mac_address")
        self.mtu_spin.connect("value_changed", self.save_settings, "mtu")
        self.mtu_spin.value_entry.connect("changed", self.spin_user_set)

        setting_list = (mac, clone_mac, mtu) = self.ethernet_setting.mac_address, self.ethernet_setting.cloned_mac_address, self.ethernet_setting.mtu
        #print mac, clone_mac, mtu
        if mac != None:
            self.mac_entry.set_address(mac)
        if clone_mac !=None:
            self.clone_entry.set_address(clone_mac)
        if mtu != None:
            self.mtu_spin.set_value(int(mtu))
        
        if any(setting_list):
            default_button.set_active(False)
        self._init = False