class PPPConf(gtk.VBox):
    TABLE_WIDTH = 1
    def __init__(self, connection, set_button_callback, settings_obj=None):
        gtk.VBox.__init__(self)
        self.tab_name = _("PPP")
        self.connection = connection
        self.set_button = set_button_callback
        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj
        self.ppp_setting = self.connection.get_setting("ppp")

        self.method_title = TitleBar(None,
                                     _("Configure Method"),
                                     width=self.TABLE_WIDTH,
                                     has_separator=False)

        self.method_table = TableAsm()
        self.method_table.row_attach(self.method_title)
        self.refuse_eap = self.method_table.row_toggle(_("EAP"))
        self.refuse_pap = self.method_table.row_toggle(_("PAP"))
        self.refuse_chap = self.method_table.row_toggle(_("CHAP"))
        self.refuse_mschap = self.method_table.row_toggle(_("MSCHAP"))
        self.refuse_mschapv2 = self.method_table.row_toggle(_("MSCHAP v2"))
        # visible settings
        self.compression_title = TitleBar(None,
                                          _("Compression"),
                                          width=self.TABLE_WIDTH,
                                          has_separator=False)
        self.echo_title = TitleBar(None,
                                   _("Echo"),
                                   width=self.TABLE_WIDTH,
                                   has_separator=False)

        self.comp_table = TableAsm()
        self.sub_item = []

        #compressio))n = Label(_("Compression"), text_size=TITLE_FONT_SIZE)
        self.comp_table.row_attach(self.compression_title)
        self.require_mppe = self.comp_table.row_toggle(_("Use point-to-point encryption(mppe)"))
        self.require_mppe_128 = self.comp_table.row_toggle(_("Require 128-bit encryption"), self.sub_item)
        self.mppe_stateful = self.comp_table.row_toggle(_("Use stateful MPPE"), self.sub_item)
        self.nobsdcomp = self.comp_table.row_toggle(_("Allow BSD data Compression"))
        self.nodeflate = self.comp_table.row_toggle(_("Allow Deflate data compression"))
        self.no_vj_comp = self.comp_table.row_toggle(_("Use TCP header compression"))

        self.echo_table = TableAsm()
        self.echo_table.row_attach(self.echo_title)
        self.ppp_echo = self.echo_table.row_toggle(_("Send PPP echo packets"))

        self.method_table.table_build()
        self.echo_table.table_build()
        vbox = gtk.VBox()
        table_align = gtk.Alignment(0, 0, 0, 0)
        
        table_align.add(vbox)
        self.pack_start(table_align)
        vbox.pack_start(self.method_table, False, False)
        vbox.pack_start(self.comp_table, False, False)
        vbox.pack_start(self.echo_table, False, False)

        self.refresh()

        self.refuse_eap.connect("toggled", self.check_button_cb, "refuse_eap")
        self.refuse_pap.connect("toggled", self.check_button_cb, "refuse_pap")
        self.refuse_chap.connect("toggled", self.check_button_cb, "refuse_chap")
        self.refuse_mschap.connect("toggled", self.check_button_cb, "refuse_mschap")
        self.refuse_mschapv2.connect("toggled", self.check_button_cb, "refuse_mschapv2")
        self.require_mppe.connect("toggled", self.check_button_cb, "require_mppe")
        self.require_mppe_128.connect("toggled", self.check_button_cb, "require_mppe_128")
        self.mppe_stateful.connect("toggled", self.check_button_cb,"mppe_stateful")
        self.nobsdcomp.connect("toggled", self.check_button_cb, "nobsdcomp")
        self.nodeflate.connect("toggled", self.check_button_cb, "nodeflate")
        self.no_vj_comp.connect("toggled", self.check_button_cb, "no_vj_comp")
        self.ppp_echo.connect("toggled", self.check_button_cb, "echo")


    def refresh_table(self, require_mppe):
        self.comp_table.table_clear()
        if require_mppe:
            #log.debug("comp_table items", self.comp_table.shared, self.sub_item)
            self.comp_table.table_build(self.sub_item, 2)
        else:
            #log.debug("comp_table items", self.comp_table.shared)
            self.comp_table.table_build()
            self.require_mppe_128.set_active(False)
            self.mppe_stateful.set_active(False)
        self.show_all()

    def refresh(self):
        #=========================
        # retreieve settings
        refuse_eap = self.ppp_setting.refuse_eap
        refuse_pap = self.ppp_setting.refuse_pap
        refuse_chap = self.ppp_setting.refuse_chap
        refuse_mschap = self.ppp_setting.refuse_mschap
        refuse_mschapv2 = self.ppp_setting.refuse_mschapv2

        require_mppe = self.ppp_setting.require_mppe
        require_mppe_128 = self.ppp_setting.require_mppe_128
        mppe_stateful = self.ppp_setting.mppe_stateful

        nobsdcomp = self.ppp_setting.nobsdcomp
        nodeflate = self.ppp_setting.nodeflate
        no_vj_comp = self.ppp_setting.no_vj_comp

        lcp_echo_failure = self.ppp_setting.lcp_echo_failure
        lcp_echo_interval = self.ppp_setting.lcp_echo_interval

        self.refuse_eap.set_active( not refuse_eap)
        self.refuse_pap.set_active(not refuse_pap)
        self.refuse_chap.set_active(not refuse_chap)
        self.refuse_mschap.set_active(not refuse_mschap)
        self.refuse_mschapv2.set_active(not refuse_mschapv2)

        self.require_mppe.set_active(require_mppe)
        self.require_mppe_128.set_active(require_mppe_128)
        self.mppe_stateful.set_active(mppe_stateful)
        self.nobsdcomp.set_active(not nobsdcomp)
        self.nodeflate.set_active(not nodeflate)
        self.no_vj_comp.set_active(not no_vj_comp)

        if not lcp_echo_failure and not lcp_echo_interval:
            self.ppp_echo.set_active(False)
        else:
            self.ppp_echo.set_active(True)

        self.refresh_table(require_mppe)
        #==================================

    def check_button_cb(self, widget, key):
        active = widget.get_active()
        if key.startswith("refuse"):
            if active:
                setattr(self.ppp_setting, key, False)
            else:
                setattr(self.ppp_setting, key, True)
        elif key.startswith("no"):
            if active:
                setattr(self.ppp_setting, key, False)
            else:
                setattr(self.ppp_setting, key, True)
        elif key is "echo":
            if active:
                setattr(self.ppp_setting, "lcp_echo_failure", 5)
                setattr(self.ppp_setting, "lcp_echo_interval", 30)
            else:
                setattr(self.ppp_setting, "lcp_echo_failure", 0)
                setattr(self.ppp_setting, "lcp_echo_interval", 0)
        else:
            if active:
                setattr(self.ppp_setting, key, True)
            else:
                setattr(self.ppp_setting, key, False)
        #check_settings(self.connection, self.set_button)
        ##################
        is_valid = self.connection.check_setting_finish()
        #self.settings_obj.ppp_is_valid = is_valid
        self.settings_obj.set_button("save", is_valid)

        if key is "require_mppe":
            if active:
                self.refresh_table(1)
            else:
                self.refresh_table(None)