class BlueToothView(gtk.VBox):
    '''
    class docs
    '''

    def __init__(self, module_frame):
        '''
        init docs
        '''
        gtk.VBox.__init__(self)

        self.module_frame = module_frame

        self.my_bluetooth = MyBluetooth(self.__on_adapter_removed,
                                        self.__on_default_adapter_changed,
                                        self.__device_found)
        self.periodic_timer = None
        self.is_discoverable = False
        self.is_searching = False
        '''
        enable open
        '''
        if self.my_bluetooth.adapter:
            self.my_bluetooth.adapter.connect("property-changed", self.__on_property_changed)
            if self.my_bluetooth.adapter.get_powered():
                self.title_align, self.title_label = self.__setup_title_align(
                    app_theme.get_pixbuf("bluetooth/enable_open.png"), _("Bluetooth"))
                self.title_label.set_sensitive(True)
            else:
                self.title_align, self.title_label = self.__setup_title_align(
                    app_theme.get_pixbuf("bluetooth/enable_open_disable.png"), _("Bluetooth"))
        else:
            self.title_align, self.title_label = self.__setup_title_align(
                app_theme.get_pixbuf("bluetooth/enable_open_disable.png"), _("Bluetooth"))
            self.title_label.set_sensitive(False)
        self.enable_align = self.__setup_align()
        self.enable_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.enable_open_label = self.__setup_label(_("Enable bluetooth"))
        if self.my_bluetooth.adapter:
            self.my_bluetooth.adapter.set_powered(permanent_settings.get_powered())
            self.enable_open_label.set_sensitive(self.my_bluetooth.adapter.get_powered())
        else:
            self.enable_open_label.set_sensitive(False)
        self.enable_open_toggle_align = self.__setup_align(padding_top = 4, padding_left = 158)
        self.enable_open_toggle = self.__setup_toggle()
        if self.my_bluetooth.adapter:
            self.enable_open_toggle.set_active(self.my_bluetooth.adapter.get_powered())
        self.enable_open_toggle.connect("toggled", self.__toggled, "enable_open")
        self.enable_open_toggle_align.add(self.enable_open_toggle)
        self.__widget_pack_start(self.enable_box,
                                 [self.enable_open_label,
                                  self.enable_open_toggle_align])
        self.enable_align.add(self.enable_box)
        '''
        display
        '''
        self.display_align = self.__setup_align()
        self.display_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.display_device_label = self.__setup_label(_("Device name"))
        if self.my_bluetooth.adapter:
            self.display_device_label.set_sensitive(self.my_bluetooth.adapter.get_powered())
        else:
            self.display_device_label.set_sensitive(False)
        self.display_device_entry = InputEntry()
        if self.my_bluetooth.adapter:
            self.display_device_entry.set_text(self.my_bluetooth.adapter.get_name())
            self.display_device_entry.set_sensitive(self.my_bluetooth.adapter.get_powered())
        else:
            self.display_device_entry.set_sensitive(False)
        self.display_device_entry.set_size(HSCALEBAR_WIDTH, WIDGET_HEIGHT)
        self.display_device_entry.entry.connect("changed", self.__display_device_changed)
        self.__widget_pack_start(self.display_box,
                                 [self.display_device_label, self.display_device_entry])
        self.display_align.add(self.display_box)
        '''
        enable searchable
        '''
        self.search_align = self.__setup_align()
        self.search_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.search_label = self.__setup_label(_("Discoverable"))
        if self.my_bluetooth.adapter:
            self.search_label.set_sensitive(self.my_bluetooth.adapter.get_powered())
        else:
            self.search_label.set_sensitive(False)
        self.search_timeout_align = self.__setup_align(padding_top = 0, padding_left = 0)
        self.search_timeout_label = self.__setup_label("", width = 110, align = ALIGN_START)
        self.search_timeout_align.add(self.search_timeout_label)
        self.search_toggle_align = self.__setup_align(padding_top = 4, padding_left = 18)
        self.search_toggle = self.__setup_toggle()
        if self.my_bluetooth.adapter:
            self.search_toggle.set_active(self.my_bluetooth.adapter.get_discoverable())
        self.search_toggle.connect("toggled", self.__toggled, "search")
        self.search_toggle_align.add(self.search_toggle)
        self.__widget_pack_start(self.search_box,
                                 [self.search_label,
                                  self.search_timeout_align,
                                  self.search_toggle_align
                                 ])
        self.search_align.add(self.search_box)
        '''
        device iconview
        '''
        self.device_align = self.__setup_align()
        self.device_iconview = DeviceIconView()
        self.device_iconview.set_size_request(690, 228)
        self.device_align.add(self.device_iconview)
        '''
        operation
        '''
        self.oper_align = self.__setup_align()
        self.oper_box = gtk.HBox(spacing = WIDGET_SPACING)
        self.notice_label = Label("", text_x_align = ALIGN_START, label_width = 610)
        self.search_button = Button(_("Search"))
        if self.my_bluetooth.adapter:
            self.search_button.set_sensitive(self.my_bluetooth.adapter.get_powered())
        else:
            self.search_button.set_sensitive(False)
        self.search_button.connect("clicked", self.__on_search)
        self.__widget_pack_start(self.oper_box,
                [self.notice_label,
                 self.search_button,
                ])
        self.oper_align.add(self.oper_box)
        '''
        this->gtk.VBox pack_start
        '''
        self.__widget_pack_start(self,
                                 [self.title_align,
                                  self.enable_align,
                                  self.display_align,
                                  self.search_align,
                                  self.device_align,
                                  self.oper_align])

        if self.my_bluetooth.adapter == None:
            self.set_sensitive(False)

        self.connect("expose-event", self.__expose)

        if self.my_bluetooth.adapter and self.my_bluetooth.adapter.get_powered():
            self.__get_devices()

    def __on_property_changed(self, adapter, key, value):
        if key == "Powered":
            if value == 1:
                self.enable_open_toggle.set_active(True)
                # removed by hualet, this will cause devices are added twice.
                # self.__set_enable_open(True)
            else:
                self.enable_open_toggle.set_active(False)
                # self.__set_enable_open(False)
        if key == "Devices":    # fixbug: iconview didn't update accordingly 
                                # while adapter paired other devices in system tray. 
            self.device_iconview.clear()
            self.__get_devices()

    def sendfile(self, device_name):
        event_manager.emit("send-file", device_name)

    def cancel(self):
        event_manager.emit("cancel", None)

    def __on_adapter_removed(self):
        self.set_sensitive(False)

    def __on_default_adapter_changed(self):
        self.set_sensitive(True)
        self.display_device_entry.set_text(self.my_bluetooth.adapter.get_name())

    def __display_device_changed(self, widget, event):
        self.my_bluetooth.adapter.set_name(widget.get_text())

    def __setup_separator(self):
        hseparator = HSeparator(app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0)
        hseparator.set_size_request(500, HSEPARATOR_HEIGHT)
        return hseparator

    def __setup_title_label(self,
                            text="",
                            text_color=app_theme.get_color("globalTitleForeground"),
                            text_size=TITLE_FONT_SIZE,
                            text_x_align=ALIGN_START,
                            label_width=180):
        return Label(text = text,
                     text_color = text_color,
                     text_size = text_size,
                     text_x_align = text_x_align,
                     label_width = label_width,
                     enable_select = False,
                     enable_double_click = False)

    def __setup_title_align(self,
                            pixbuf,
                            text,
                            padding_top=TEXT_WINDOW_TOP_PADDING,
                            padding_left=TEXT_WINDOW_LEFT_PADDING):
        align = self.__setup_align(padding_top = padding_top, padding_left = padding_left)
        align_box = gtk.VBox(spacing = WIDGET_SPACING)
        title_box = gtk.HBox(spacing = WIDGET_SPACING)
        image = ImageBox(pixbuf)
        label = self.__setup_title_label(text)
        separator = self.__setup_separator()
        self.__widget_pack_start(title_box, [image, label])
        self.__widget_pack_start(align_box, [title_box, separator])
        align.add(align_box)
        return align, label

    def __get_devices(self):
        devices = self.my_bluetooth.get_devices()
        items = []
        i = 0

        while i < len(devices):
            items.append(DeviceItem(devices[i].get_name(),
                         app_theme.get_pixbuf("bluetooth/%s.png" % bluetooth_class_to_type(devices[i].get_class())).get_pixbuf(),
                         devices[i],
                         self.my_bluetooth.adapter,
                         devices[i].get_paired(),
                         self.module_frame))
            i += 1

        self.device_iconview.add_items(items)

    def __refresh_notice_label(self):
        searching_str = _("Discovering device")

        if self.notice_label.get_text().count(".") == 3:
            self.notice_label.set_text(searching_str + ".")
        else:
            self.notice_label.set_text(self.notice_label.get_text() + ".")

        return True

    def __on_search(self, widget):
        if not self.is_searching:
            self.my_bluetooth.adapter.start_discovery()
            self.notice_label.set_text(_("Discovering device"))
            self.refresh_lable_timeout = gobject.timeout_add_seconds(1, self.__refresh_notice_label)
            self.my_bluetooth.adapter.connect("property-changed", self.on_adapter_property_changed)
            self.is_searching = True
            
    def on_adapter_property_changed(self, obj, key, value):
        if key == "Discovering" and value == False:
            gobject.source_remove(self.refresh_lable_timeout)
            if self.is_searching:
                self.my_bluetooth.adapter.stop_discovery()
            self.is_searching = False
            self.notice_label.set_text("")

    def __device_found(self, adapter, address, values):
        print "address", address
        if address not in adapter.get_address_records():
            device_path = adapter.create_device(address)
            if device_path == "None":
                return 
            
            device = Device(device_path)
            items = []
        
            if not values.has_key("Name"):
                return
        
            print bluetooth_class_to_type(device.get_class())
            items.append(DeviceItem(values['Name'],
                                    app_theme.get_pixbuf("bluetooth/%s.png" 
                                                         % bluetooth_class_to_type(device.get_class())).get_pixbuf(), 
                                    device, 
                                    adapter))
            self.device_iconview.add_items(items)
                
    def __set_enable_open(self, is_open=True):
        self.enable_open_label.set_sensitive(is_open)
        self.display_device_label.set_sensitive(is_open)
        self.search_label.set_sensitive(is_open)
        self.display_align.set_sensitive(is_open)
        self.display_device_entry.set_sensitive(is_open)
        # self.device_iconview.set_sensitive(is_open)
        self.search_align.set_sensitive(is_open)
        self.search_timeout_label.set_child_visible(False)
        self.search_button.set_sensitive(is_open)
        # changed by hualet, to fix the bug that device icons stay while disabling the iconview widget
        if is_open:
            self.__get_devices()
        else:
            self.device_iconview.clear()

    def __toggled(self, widget, object):
        if self.my_bluetooth.adapter == None:
            return

        if object == "enable_open":
            self.__set_enable_open(widget.get_active())
            permanent_settings.set_powered(widget.get_active())
            self.my_bluetooth.adapter.set_powered(widget.get_active())
            return

        if object == "search":
            self.is_discoverable = widget.get_active()
            self.my_bluetooth.adapter.set_discoverable(self.is_discoverable)
            self.search_timeout_label.set_child_visible(self.is_discoverable)
            if self.is_discoverable:
                self.periodic_timer = PerodicTimer(self, 1)
            else:
                self.periodic_timer.stop()
            return

    def __expose(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation

        cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR))
        cr.rectangle(rect.x, rect.y, rect.width, rect.height)
        cr.fill()

    def __setup_label(self, text="", width=180, align=ALIGN_END):
        return Label(text, None, TITLE_FONT_SIZE, align, width, False, False, False)

    def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH):
        combo = ComboBox(items, None, 0, width, width)
        combo.set_size_request(width, WIDGET_HEIGHT)
        return combo

    def __setup_toggle(self):
        return ToggleButton(
                app_theme.get_pixbuf("toggle_button/inactive_normal.png"),
                app_theme.get_pixbuf("toggle_button/active_normal.png"),
                inactive_disable_dpixbuf = app_theme.get_pixbuf("toggle_button/inactive_normal.png"),
                active_disable_dpixbuf = app_theme.get_pixbuf("toggle_button/inactive_normal.png"))

    def __setup_align(self, xalign=0, yalign=0, xscale=0, yscale=0,
                      padding_top=BETWEEN_SPACING,
                      padding_bottom=0,
                      padding_left=TEXT_WINDOW_LEFT_PADDING,
                      padding_right=20):
        align = gtk.Alignment()
        align.set(xalign, yalign, xscale, yscale)
        align.set_padding(padding_top, padding_bottom, padding_left, padding_right)
        return align

    def __widget_pack_start(self, parent_widget, widgets=[], expand=False, fill=False):
        if parent_widget == None:
            return
        for item in widgets:
            parent_widget.pack_start(item, expand, fill)
class BlueToothView(gtk.VBox):
    '''
    class docs
    '''
    def __init__(self, module_frame):
        '''
        init docs
        '''
        gtk.VBox.__init__(self)

        self.module_frame = module_frame

        self.my_bluetooth = MyBluetooth(self.__on_adapter_removed,
                                        self.__on_default_adapter_changed,
                                        self.__device_found)
        self.periodic_timer = None
        self.is_discoverable = False
        self.is_searching = False
        '''
        enable open
        '''
        if self.my_bluetooth.adapter:
            self.my_bluetooth.adapter.connect("property-changed",
                                              self.__on_property_changed)
            if self.my_bluetooth.adapter.get_powered():
                self.title_align, self.title_label = self.__setup_title_align(
                    app_theme.get_pixbuf("bluetooth/enable_open.png"),
                    _("Bluetooth"))
                self.title_label.set_sensitive(True)
            else:
                self.title_align, self.title_label = self.__setup_title_align(
                    app_theme.get_pixbuf("bluetooth/enable_open_disable.png"),
                    _("Bluetooth"))
        else:
            self.title_align, self.title_label = self.__setup_title_align(
                app_theme.get_pixbuf("bluetooth/enable_open_disable.png"),
                _("Bluetooth"))
            self.title_label.set_sensitive(False)
        self.enable_align = self.__setup_align()
        self.enable_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.enable_open_label = self.__setup_label(_("Enable bluetooth"))
        if self.my_bluetooth.adapter:
            self.my_bluetooth.adapter.set_powered(
                permanent_settings.get_powered())
            self.enable_open_label.set_sensitive(
                self.my_bluetooth.adapter.get_powered())
        else:
            self.enable_open_label.set_sensitive(False)
        self.enable_open_toggle_align = self.__setup_align(padding_top=4,
                                                           padding_left=158)
        self.enable_open_toggle = self.__setup_toggle()
        if self.my_bluetooth.adapter:
            self.enable_open_toggle.set_active(
                self.my_bluetooth.adapter.get_powered())
        self.enable_open_toggle.connect("toggled", self.__toggled,
                                        "enable_open")
        self.enable_open_toggle_align.add(self.enable_open_toggle)
        self.__widget_pack_start(
            self.enable_box,
            [self.enable_open_label, self.enable_open_toggle_align])
        self.enable_align.add(self.enable_box)
        '''
        display
        '''
        self.display_align = self.__setup_align()
        self.display_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.display_device_label = self.__setup_label(_("Device name"))
        if self.my_bluetooth.adapter:
            self.display_device_label.set_sensitive(
                self.my_bluetooth.adapter.get_powered())
        else:
            self.display_device_label.set_sensitive(False)
        self.display_device_entry = InputEntry()
        if self.my_bluetooth.adapter:
            self.display_device_entry.set_text(
                self.my_bluetooth.adapter.get_name())
            self.display_device_entry.set_sensitive(
                self.my_bluetooth.adapter.get_powered())
        else:
            self.display_device_entry.set_sensitive(False)
        self.display_device_entry.set_size(HSCALEBAR_WIDTH, WIDGET_HEIGHT)
        self.display_device_entry.entry.connect("changed",
                                                self.__display_device_changed)
        self.__widget_pack_start(
            self.display_box,
            [self.display_device_label, self.display_device_entry])
        self.display_align.add(self.display_box)
        '''
        enable searchable
        '''
        self.search_align = self.__setup_align()
        self.search_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.search_label = self.__setup_label(_("Discoverable"))
        if self.my_bluetooth.adapter:
            self.search_label.set_sensitive(
                self.my_bluetooth.adapter.get_powered())
        else:
            self.search_label.set_sensitive(False)
        self.search_timeout_align = self.__setup_align(padding_top=0,
                                                       padding_left=0)
        self.search_timeout_label = self.__setup_label("",
                                                       width=110,
                                                       align=ALIGN_START)
        self.search_timeout_align.add(self.search_timeout_label)
        self.search_toggle_align = self.__setup_align(padding_top=4,
                                                      padding_left=18)
        self.search_toggle = self.__setup_toggle()
        if self.my_bluetooth.adapter:
            self.search_toggle.set_active(
                self.my_bluetooth.adapter.get_discoverable())
        self.search_toggle.connect("toggled", self.__toggled, "search")
        self.search_toggle_align.add(self.search_toggle)
        self.__widget_pack_start(self.search_box, [
            self.search_label, self.search_timeout_align,
            self.search_toggle_align
        ])
        self.search_align.add(self.search_box)
        '''
        device iconview
        '''
        self.device_align = self.__setup_align()
        self.device_iconview = DeviceIconView()
        self.device_iconview.set_size_request(690, 228)
        self.device_align.add(self.device_iconview)
        '''
        operation
        '''
        self.oper_align = self.__setup_align()
        self.oper_box = gtk.HBox(spacing=WIDGET_SPACING)
        self.notice_label = Label("",
                                  text_x_align=ALIGN_START,
                                  label_width=610)
        self.search_button = Button(_("Search"))
        if self.my_bluetooth.adapter:
            self.search_button.set_sensitive(
                self.my_bluetooth.adapter.get_powered())
        else:
            self.search_button.set_sensitive(False)
        self.search_button.connect("clicked", self.__on_search)
        self.__widget_pack_start(self.oper_box, [
            self.notice_label,
            self.search_button,
        ])
        self.oper_align.add(self.oper_box)
        '''
        this->gtk.VBox pack_start
        '''
        self.__widget_pack_start(self, [
            self.title_align, self.enable_align, self.display_align,
            self.search_align, self.device_align, self.oper_align
        ])

        if self.my_bluetooth.adapter == None:
            self.set_sensitive(False)

        self.connect("expose-event", self.__expose)

        if self.my_bluetooth.adapter and self.my_bluetooth.adapter.get_powered(
        ):
            self.__get_devices()

    def __on_property_changed(self, adapter, key, value):
        if key == "Powered":
            if value == 1:
                self.enable_open_toggle.set_active(True)
                # removed by hualet, this will cause devices are added twice.
                # self.__set_enable_open(True)
            else:
                self.enable_open_toggle.set_active(False)
                # self.__set_enable_open(False)
        if key == "Devices":  # fixbug: iconview didn't update accordingly
            # while adapter paired other devices in system tray.
            self.device_iconview.clear()
            self.__get_devices()

    def sendfile(self, device_name):
        event_manager.emit("send-file", device_name)

    def cancel(self):
        event_manager.emit("cancel", None)

    def __on_adapter_removed(self):
        self.set_sensitive(False)

    def __on_default_adapter_changed(self):
        self.set_sensitive(True)
        self.display_device_entry.set_text(
            self.my_bluetooth.adapter.get_name())

    def __display_device_changed(self, widget, event):
        self.my_bluetooth.adapter.set_name(widget.get_text())

    def __setup_separator(self):
        hseparator = HSeparator(
            app_theme.get_shadow_color("hSeparator").get_color_info(), 0, 0)
        hseparator.set_size_request(500, HSEPARATOR_HEIGHT)
        return hseparator

    def __setup_title_label(
            self,
            text="",
            text_color=app_theme.get_color("globalTitleForeground"),
            text_size=TITLE_FONT_SIZE,
            text_x_align=ALIGN_START,
            label_width=180):
        return Label(text=text,
                     text_color=text_color,
                     text_size=text_size,
                     text_x_align=text_x_align,
                     label_width=label_width,
                     enable_select=False,
                     enable_double_click=False)

    def __setup_title_align(self,
                            pixbuf,
                            text,
                            padding_top=TEXT_WINDOW_TOP_PADDING,
                            padding_left=TEXT_WINDOW_LEFT_PADDING):
        align = self.__setup_align(padding_top=padding_top,
                                   padding_left=padding_left)
        align_box = gtk.VBox(spacing=WIDGET_SPACING)
        title_box = gtk.HBox(spacing=WIDGET_SPACING)
        image = ImageBox(pixbuf)
        label = self.__setup_title_label(text)
        separator = self.__setup_separator()
        self.__widget_pack_start(title_box, [image, label])
        self.__widget_pack_start(align_box, [title_box, separator])
        align.add(align_box)
        return align, label

    def __get_devices(self):
        devices = self.my_bluetooth.get_devices()
        items = []
        i = 0

        while i < len(devices):
            items.append(
                DeviceItem(
                    devices[i].get_name(),
                    app_theme.get_pixbuf(
                        "bluetooth/%s.png" % bluetooth_class_to_type(
                            devices[i].get_class())).get_pixbuf(), devices[i],
                    self.my_bluetooth.adapter, devices[i].get_paired(),
                    self.module_frame))
            i += 1

        self.device_iconview.add_items(items)

    def __refresh_notice_label(self):
        searching_str = _("Discovering device")

        if self.notice_label.get_text().count(".") == 3:
            self.notice_label.set_text(searching_str + ".")
        else:
            self.notice_label.set_text(self.notice_label.get_text() + ".")

        return True

    def __on_search(self, widget):
        if not self.is_searching:
            self.my_bluetooth.adapter.start_discovery()
            self.notice_label.set_text(_("Discovering device"))
            self.refresh_lable_timeout = gobject.timeout_add_seconds(
                1, self.__refresh_notice_label)
            self.my_bluetooth.adapter.connect("property-changed",
                                              self.on_adapter_property_changed)
            self.is_searching = True

    def on_adapter_property_changed(self, obj, key, value):
        if key == "Discovering" and value == False:
            gobject.source_remove(self.refresh_lable_timeout)
            if self.is_searching:
                self.my_bluetooth.adapter.stop_discovery()
            self.is_searching = False
            self.notice_label.set_text("")

    def __device_found(self, adapter, address, values):
        print "address", address
        if address not in adapter.get_address_records():
            device_path = adapter.create_device(address)
            if device_path == "None":
                return

            device = Device(device_path)
            items = []

            if not values.has_key("Name"):
                return

            print bluetooth_class_to_type(device.get_class())
            items.append(
                DeviceItem(
                    values['Name'],
                    app_theme.get_pixbuf(
                        "bluetooth/%s.png" % bluetooth_class_to_type(
                            device.get_class())).get_pixbuf(), device,
                    adapter))
            self.device_iconview.add_items(items)

    def __set_enable_open(self, is_open=True):
        self.enable_open_label.set_sensitive(is_open)
        self.display_device_label.set_sensitive(is_open)
        self.search_label.set_sensitive(is_open)
        self.display_align.set_sensitive(is_open)
        self.display_device_entry.set_sensitive(is_open)
        # self.device_iconview.set_sensitive(is_open)
        self.search_align.set_sensitive(is_open)
        self.search_timeout_label.set_child_visible(False)
        self.search_button.set_sensitive(is_open)
        # changed by hualet, to fix the bug that device icons stay while disabling the iconview widget
        if is_open:
            self.__get_devices()
        else:
            self.device_iconview.clear()

    def __toggled(self, widget, object):
        if self.my_bluetooth.adapter == None:
            return

        if object == "enable_open":
            self.__set_enable_open(widget.get_active())
            permanent_settings.set_powered(widget.get_active())
            self.my_bluetooth.adapter.set_powered(widget.get_active())
            return

        if object == "search":
            self.is_discoverable = widget.get_active()
            self.my_bluetooth.adapter.set_discoverable(self.is_discoverable)
            self.search_timeout_label.set_child_visible(self.is_discoverable)
            if self.is_discoverable:
                self.periodic_timer = PerodicTimer(self, 1)
            else:
                self.periodic_timer.stop()
            return

    def __expose(self, widget, event):
        cr = widget.window.cairo_create()
        rect = widget.allocation

        cr.set_source_rgb(*color_hex_to_cairo(MODULE_BG_COLOR))
        cr.rectangle(rect.x, rect.y, rect.width, rect.height)
        cr.fill()

    def __setup_label(self, text="", width=180, align=ALIGN_END):
        return Label(text, None, TITLE_FONT_SIZE, align, width, False, False,
                     False)

    def __setup_combo(self, items=[], width=HSCALEBAR_WIDTH):
        combo = ComboBox(items, None, 0, width, width)
        combo.set_size_request(width, WIDGET_HEIGHT)
        return combo

    def __setup_toggle(self):
        return ToggleButton(
            app_theme.get_pixbuf("toggle_button/inactive_normal.png"),
            app_theme.get_pixbuf("toggle_button/active_normal.png"),
            inactive_disable_dpixbuf=app_theme.get_pixbuf(
                "toggle_button/inactive_normal.png"),
            active_disable_dpixbuf=app_theme.get_pixbuf(
                "toggle_button/inactive_normal.png"))

    def __setup_align(self,
                      xalign=0,
                      yalign=0,
                      xscale=0,
                      yscale=0,
                      padding_top=BETWEEN_SPACING,
                      padding_bottom=0,
                      padding_left=TEXT_WINDOW_LEFT_PADDING,
                      padding_right=20):
        align = gtk.Alignment()
        align.set(xalign, yalign, xscale, yscale)
        align.set_padding(padding_top, padding_bottom, padding_left,
                          padding_right)
        return align

    def __widget_pack_start(self,
                            parent_widget,
                            widgets=[],
                            expand=False,
                            fill=False):
        if parent_widget == None:
            return
        for item in widgets:
            parent_widget.pack_start(item, expand, fill)
Esempio n. 3
0
class Form(DialogBox):
    def __init__(self):
        DialogBox.__init__(
            self,
            _("Convert"),
            FORM_WIDTH,
            FORM_HEIGHT,
            mask_type=DIALOG_MASK_SINGLE_PAGE,
            close_callback=self.hide_all,
            modal=True,
            window_hint=gtk.gdk.WINDOW_TYPE_HINT_DIALOG,
            window_pos=gtk.WIN_POS_CENTER,
            # skip_taskbar_hint=False,
            resizable=False,
        )
        # Init value.
        self.init_value()
        # Init all widgets.
        self.InitializeComponent()

    def init_value(self):
        read_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                 "xml")
        self.read_xml = ReadXml(read_path)
        self.model_dict = {}

        # init brand EN list.
        self.brand_dict = {
            "intel": _("intel"),
            "zte": _("zte"),
            "hasee": _("hasee"),
            "apple": _("apple"),
            "nokia": _("nokia"),
            "alcatel": _("alcatel"),
            "google": _("google"),
            "asus": _("asus"),
            "hp": _("hp"),
            "sony": _("sony"),
            "hedy": _("hedy"),
            "archos": _("archos"),
            "boway": _("boway"),
            "bird": _("bird"),
            "vivo": _("vivo"),
            "great wall": _("great wall"),
            "changhong": _("changhong"),
            "skyworth": _("skyworth"),
            "dell": _("dell"),
            "philips": _("philips"),
            "toshiba": _("toshiba"),
            "amazon": _("amazon"),
            "sdo": _("sdo"),
            "disney": _("disney"),
            "haier": _("haier"),
            "fujitsu": _("fujitsu"),
            "acer": _("acer"),
            "lenovo": _("lenovo"),
            "gigabyte": _("gigabyte"),
            "xiaomi": _("xiaomi"),
            "huawei": _("huawei"),
            "blackberry": _("blackberry"),
            "motorola": _("motorola"),
            "sangsung": _("sangsung"),
            "meizu ": _("meizu "),
            "benq": _("benq"),
            "panasonic": _("panasonic"),
            "sony ericsson": _("sony ericsson"),
            "pioneer": _("pioneer"),
            "hyundai": _("hyundai"),
            "newman": _("newman"),
            "coolpad": _("coolpad"),
            "malata": _("malata"),
            "malata": _("malata"),
            "sharp": _("sharp"),
            "gionee": _("gionee"),
            "k-touch": _("k-touch"),
            "Pantech": _("Pantech"),
            "hisense": _("hisense"),
            "teclast": _("teclast"),
            "cube": _("cube"),
            "amoi": _("amoi"),
            "doov": _("doov"),
            "minte": _("minte"),
            "dopod": _("dopod"),
            "eton": _("eton"),
            "cherr": _("cherr"),
            "gaoxinqi": _("gaoxinqi"),
            "konka": _("konka"),
            "viewsonic": _("viewsonic"),
            "xibo": _("xibo"),
            "hosin": _("hosin"),
            "apanda": _("apanda"),
            "iocean": _("iocean"),
            "mastone": _("mastone")
        }

    def InitializeComponent(self):
        # Init form event.
        # self.connect("destroy", lambda w : self.destroy())
        self.connect("destroy", lambda w: self.hide_all())
        # Init widgets.
        self.brand_label = Label("%s: " % _("Phone brand"))
        self.format_label = Label("%s: " % _("Output format"))
        self.bit_rate_label = Label("%s: " % _("Audio encoder"))
        self.frame_rate_label = Label("%s: " % _("Video encoder"))
        self.path_label = Label("%s: " % _("Output directory"))
        self.model_label = Label("%s: " % _("Phone model"))
        self.ratio_label = Label('    %s: ' % _("Resolution"))

        self.path_entry = InputEntry()
        self.save_path_entry = InputEntry()
        fixed_width = 108
        self.brand_combo = NewComboBox(fixed_width)
        self.format_combo = NewComboBox(fixed_width)
        self.bit_rate_combo = NewComboBox(fixed_width)
        self.frame_rate_combo = NewComboBox(fixed_width)
        self.model_combo = NewComboBox(fixed_width)
        self.ratio_combo = NewComboBox(fixed_width)

        self.modify_chooser_btn = FileChooserButton(
            "选择")  # connect self.FileChooser
        self.save_chooser_btn = Button(_("Change"))
        self.start_btn = Button(_("Start"))
        self.close_btn = Button(_("Close"))
        self.higt_set_bool = False
        self.higt_set_btn = LabelButton()  #Button(_("Advanced"))

        self.show_and_hide_task_btn = Button(_("Task Manager"))

        self.higt_hbox = gtk.HBox()
        self.higt_hbox.pack_start(self.higt_set_btn)

        self.higt_align = gtk.Alignment()
        self.higt_align.add(self.higt_hbox)
        self.higt_align.set_padding(0, 0, 7, 0)
        self.higt_align.set(1, 0, 1, 0)

        self.left_button_box.set_buttons([self.higt_align])
        self.right_button_box.set_buttons([self.start_btn, self.close_btn])

        # ratio_combo.
        self.__ratio_list = [
            "176 x 220",
            "240 x 320",
            "320 x 240",
            "320 x 480",
            "400 x 240",
            "480 x 800",
            "540 x 960",
            "600 x 1024",
            "640 x 480",
            "720 x 1280",
            "800 x 480",
            "800 x 600",
            "1024 x 600",
            "1024 x 768",
            "1152 x 864",
        ]
        self.ratio_items = []
        for ratio in self.__ratio_list:
            self.ratio_combo.append_text(ratio)
            self.ratio_items.append((ratio, ratio))
        self.ratio_combo.set_active(5)
        # brand_combo.
        brand_items = []
        for brand in self.read_xml.brand_dict.keys():
            brand_po = brand
            if self.brand_dict.has_key(brand):
                brand_po = self.brand_dict[brand]
            brand_items.append((brand_po, brand))

        self.brand_combo.set_items(brand_items, 0)
        #self.brand_combo.add_items(brand_items, 0)

        self.brand_combo.prepend_text(_("No Presets"))
        self.brand_combo.connect("changed", self.brand_combo_item_selected)
        # model_combo.
        self.model_label.set_sensitive(False)
        self.model_combo.set_sensitive(False)
        self.model_combo.prepend_text(_("No Model"))
        self.model_combo.connect("changed", self.model_combo_item_selected)
        #
        self.save_chooser_btn.set_size_request(75, 21)
        self.save_chooser_btn.connect("clicked", self.save_chooser_btn_clicked)

        # path_entry.
        PATH_ENTRY_WIDTH = 240
        PATH_ENTRY_HEIGHT = 22
        self.save_path_entry.set_sensitive(False)
        self.save_path_entry.set_text(self.get_home_path())
        self.save_path_entry.set_size(PATH_ENTRY_WIDTH, PATH_ENTRY_HEIGHT)
        self.close_btn.connect("clicked", lambda w: self.hide_all())
        # higt_set_btn.
        self.higt_set_btn.connect("clicked", self.higt_set_btn_clicked)

        # form body box add main fixed.
        self.body_table_ali = gtk.Alignment()
        self.body_table_ali.set_padding(6, 0, 0, 0)
        self.body_table = gtk.Table(rows=6, columns=4, homogeneous=False)
        self.body_table_ali.add(self.body_table)

        self.brand_model_hbox = gtk.HBox()
        top, bottom = 5, 5
        brand_position = eval(_("('brand_position', 20)"))
        model_position = eval(_("('model_position', 20)"))
        self.brand_hbox_ali, self.brand_hbox = self.create_hbox(
            bottom, top, 15 + int(brand_position[1]), 0, self.brand_label,
            self.brand_combo)
        self.model_hbox_ali, self.model_hbox = self.create_hbox(
            bottom, top, 50 - int(model_position[1]), 0, self.model_label,
            self.model_combo)

        self.brand_model_hbox.pack_start(self.brand_hbox_ali, False, False)
        self.brand_model_hbox.pack_start(self.model_hbox_ali, False, False)
        format_position = eval(_("('format_position', 12)"))
        ratio_position = eval(_("('ratio_position', 18)"))
        self.format_hbox_ali, self.format_hbox = self.create_hbox(
            bottom, top, 15 + int(format_position[1]), 0, self.format_label,
            self.format_combo)
        self.ratio_hbox_ali, ratio_hbox = self.create_hbox(
            bottom, top, 50 - int(ratio_position[1]), 0, self.ratio_label,
            self.ratio_combo)

        self.format_ratio_hbox = gtk.HBox()
        self.format_ratio_hbox.pack_start(self.format_hbox_ali, False, False)
        self.format_ratio_hbox.pack_start(self.ratio_hbox_ali, False, False)

        frame_rate_position = eval(_("('frame_position', 13)"))
        bit_rate_position = eval(_("('bit_rate_position', 28)"))
        self.frame_rate_hbox_ali, self.frame_rate_hbox = self.create_hbox(
            bottom, top, 15 + int(frame_rate_position[1]), 0,
            self.frame_rate_label, self.frame_rate_combo)
        self.bit_rate_hbox_ali, self.bit_rate_hbox = self.create_hbox(
            bottom, top, 50 - int(bit_rate_position[1]), 0,
            self.bit_rate_label, self.bit_rate_combo)

        self.bit_frame_hbox = gtk.HBox()
        self.bit_frame_hbox.pack_start(self.frame_rate_hbox_ali, False, False)
        self.bit_frame_hbox.pack_start(self.bit_rate_hbox_ali, False, False)

        # self.path_label, self.save_path_entry, self.save_chooser_btn
        self.save_path_hbox_ali = gtk.Alignment()
        self.save_path_hbox = gtk.HBox()
        self.save_path_hbox_ali.set_padding(5, 5, 16, 0)
        self.save_path_hbox_ali.add(self.save_path_hbox)

        self.save_path_entry_ali = gtk.Alignment()
        self.save_path_entry_ali.set_padding(1, 0, 0, 0)
        self.save_path_entry_ali.add(self.save_path_entry)

        self.save_chooser_btn_ali = gtk.Alignment()
        self.save_chooser_btn_ali.set_padding(0, 0, 10, 0)
        self.save_chooser_btn_ali.add(self.save_chooser_btn)

        self.save_path_hbox.pack_start(self.path_label, False, False)
        self.save_path_hbox.pack_start(self.save_path_entry_ali, False, False)
        self.save_path_hbox.pack_start(self.save_chooser_btn_ali, False, False)

        # left right top, bottom.
        '''brand_model_hbox.'''
        # self.body_table.attach(self.brand_model_hbox, 0, 1, 0, 1, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.brand_model_hbox, 0, 1, 0, 1, gtk.FILL,
                               gtk.FILL)
        # self.body_table.attach(self.model_hbox, 1, 2, 0, 1, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.model_hbox, 2, 3, 0, 1, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.model_hbox, 3, 4, 0, 1, gtk.EXPAND, gtk.EXPAND)
        '''format_ratio_hbox.'''
        # self.body_table.attach(self.format_ratio_hbox, 0, 1, 1, 2, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.format_ratio_hbox, 0, 1, 1, 2, gtk.FILL,
                               gtk.FILL)
        # self.body_table.attach(self.format_combo, 1, 2, 1, 2, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.ratio_hbox, 2, 3, 1, 2, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.ratio_combo, 3, 4, 1, 2, gtk.EXPAND, gtk.EXPAND)
        '''bit_frame_hbox.'''
        # self.body_table.attach(self.bit_frame_hbox, 0, 1, 2, 3, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.bit_frame_hbox, 0, 1, 2, 3, gtk.FILL,
                               gtk.FILL)
        '''save_path_hbox.'''
        # self.body_table.attach(self.save_path_hbox_ali, 0, 1, 3, 4, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.save_path_hbox_ali, 0, 1, 3, 4, gtk.FILL,
                               gtk.FILL)

        self.body_box.pack_start(self.body_table_ali, True, True)
        self.hide_setting()

    def create_hbox(self, top, bottom, left, right, child1, child2):
        hbox_ali = gtk.Alignment()
        hbox_ali.set_padding(top, bottom, left, right)
        hbox = gtk.HBox()
        hbox_ali.add(hbox)
        hbox.pack_start(child1, False, False)
        hbox.pack_start(child2, False, False)
        return hbox_ali, hbox

    def get_home_path(self):
        return os.path.expanduser("~")

    def save_chooser_btn_clicked(self, widget):
        '''保存目录... ...'''
        self.show_open_dir_dialog_window()

    def show_open_dir_dialog_window(self):
        open_dialog = gtk.FileChooserDialog(
            _("Choose a directory"), None,
            gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,
             gtk.RESPONSE_OK))
        # current floader set.
        open_dialog.set_current_folder(self.get_home_path())
        # run dir dialog window.
        res = open_dialog.run()

        if res == gtk.RESPONSE_OK:
            path_string = open_dialog.get_filename()
            if path_string:
                self.save_path_entry.set_text(path_string)
        # destroy dialog window.
        open_dialog.destroy()

    def brand_combo_item_selected(self, combo, item_content):
        self.model_combo.clear_items()
        self.ratio_combo.clear_items()
        #
        try:
            self.model_dict = self.read_xml.load(
                self.read_xml.brand_dict[item_content])
        except Exception, e:
            print "brand_combo_item_selected[error]:", e
            self.model_dict = {}
        #
        if item_content != _("No Presets") and self.model_dict != {}:
            model_items = []
            for model in self.model_dict:
                model_items.append((model, model))
            self.model_combo.set_items(model_items, 0)

            # self.model_combo.droplist.set_size_request(-1, self.model_combo.droplist_height)
            self.model_combo.set_active(0)
            self.model_combo.set_sensitive(True)
            self.model_label.set_sensitive(True)
        else:
            # clear model and ratio all text.
            self.model_combo.append_text(_("No Model"))
            self.model_combo.set_sensitive(False)
            self.model_label.set_sensitive(False)
            # add ratios.
            for ratio in self.ratio_items:
                self.ratio_combo.append_text(ratio[0])
            self.ratio_combo.set_active(5)
Esempio n. 4
0
class Form(DialogBox):
    def __init__(self):
        DialogBox.__init__(
            self,
            _("Convert"),
            FORM_WIDTH,
            FORM_HEIGHT,
            mask_type=DIALOG_MASK_SINGLE_PAGE,
            close_callback=self.hide_all,
            modal=True,
            window_hint=gtk.gdk.WINDOW_TYPE_HINT_DIALOG,
            window_pos=gtk.WIN_POS_CENTER,
            # skip_taskbar_hint=False,
            resizable=False,
        )
        # Init value.
        self.init_value()
        # Init all widgets.
        self.InitializeComponent()

    def init_value(self):
        read_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "xml")
        self.read_xml = ReadXml(read_path)
        self.model_dict = {}

        # init brand EN list.
        self.brand_dict = {
            "intel": _("intel"),
            "zte": _("zte"),
            "hasee": _("hasee"),
            "apple": _("apple"),
            "nokia": _("nokia"),
            "alcatel": _("alcatel"),
            "google": _("google"),
            "asus": _("asus"),
            "hp": _("hp"),
            "sony": _("sony"),
            "hedy": _("hedy"),
            "archos": _("archos"),
            "boway": _("boway"),
            "bird": _("bird"),
            "vivo": _("vivo"),
            "great wall": _("great wall"),
            "changhong": _("changhong"),
            "skyworth": _("skyworth"),
            "dell": _("dell"),
            "philips": _("philips"),
            "toshiba": _("toshiba"),
            "amazon": _("amazon"),
            "sdo": _("sdo"),
            "disney": _("disney"),
            "haier": _("haier"),
            "fujitsu": _("fujitsu"),
            "acer": _("acer"),
            "lenovo": _("lenovo"),
            "gigabyte": _("gigabyte"),
            "xiaomi": _("xiaomi"),
            "huawei": _("huawei"),
            "blackberry": _("blackberry"),
            "motorola": _("motorola"),
            "sangsung": _("sangsung"),
            "meizu ": _("meizu "),
            "benq": _("benq"),
            "panasonic": _("panasonic"),
            "sony ericsson": _("sony ericsson"),
            "pioneer": _("pioneer"),
            "hyundai": _("hyundai"),
            "newman": _("newman"),
            "coolpad": _("coolpad"),
            "malata": _("malata"),
            "malata": _("malata"),
            "sharp": _("sharp"),
            "gionee": _("gionee"),
            "k-touch": _("k-touch"),
            "Pantech": _("Pantech"),
            "hisense": _("hisense"),
            "teclast": _("teclast"),
            "cube": _("cube"),
            "amoi": _("amoi"),
            "doov": _("doov"),
            "minte": _("minte"),
            "dopod": _("dopod"),
            "eton": _("eton"),
            "cherr": _("cherr"),
            "gaoxinqi": _("gaoxinqi"),
            "konka": _("konka"),
            "viewsonic": _("viewsonic"),
            "xibo": _("xibo"),
            "hosin": _("hosin"),
            "apanda": _("apanda"),
            "iocean": _("iocean"),
            "mastone": _("mastone"),
        }

    def InitializeComponent(self):
        # Init form event.
        # self.connect("destroy", lambda w : self.destroy())
        self.connect("destroy", lambda w: self.hide_all())
        # Init widgets.
        self.brand_label = Label("%s: " % _("Phone brand"))
        self.format_label = Label("%s: " % _("Output format"))
        self.bit_rate_label = Label("%s: " % _("Audio encoder"))
        self.frame_rate_label = Label("%s: " % _("Video encoder"))
        self.path_label = Label("%s: " % _("Output directory"))
        self.model_label = Label("%s: " % _("Phone model"))
        self.ratio_label = Label("    %s: " % _("Resolution"))

        self.path_entry = InputEntry()
        self.save_path_entry = InputEntry()
        fixed_width = 108
        self.brand_combo = NewComboBox(fixed_width)
        self.format_combo = NewComboBox(fixed_width)
        self.bit_rate_combo = NewComboBox(fixed_width)
        self.frame_rate_combo = NewComboBox(fixed_width)
        self.model_combo = NewComboBox(fixed_width)
        self.ratio_combo = NewComboBox(fixed_width)

        self.modify_chooser_btn = FileChooserButton("选择")  # connect self.FileChooser
        self.save_chooser_btn = Button(_("Change"))
        self.start_btn = Button(_("Start"))
        self.close_btn = Button(_("Close"))
        self.higt_set_bool = False
        self.higt_set_btn = LabelButton()  # Button(_("Advanced"))

        self.show_and_hide_task_btn = Button(_("Task Manager"))

        self.higt_hbox = gtk.HBox()
        self.higt_hbox.pack_start(self.higt_set_btn)

        self.higt_align = gtk.Alignment()
        self.higt_align.add(self.higt_hbox)
        self.higt_align.set_padding(0, 0, 7, 0)
        self.higt_align.set(1, 0, 1, 0)

        self.left_button_box.set_buttons([self.higt_align])
        self.right_button_box.set_buttons([self.start_btn, self.close_btn])

        # ratio_combo.
        self.__ratio_list = [
            "176 x 220",
            "240 x 320",
            "320 x 240",
            "320 x 480",
            "400 x 240",
            "480 x 800",
            "540 x 960",
            "600 x 1024",
            "640 x 480",
            "720 x 1280",
            "800 x 480",
            "800 x 600",
            "1024 x 600",
            "1024 x 768",
            "1152 x 864",
        ]
        self.ratio_items = []
        for ratio in self.__ratio_list:
            self.ratio_combo.append_text(ratio)
            self.ratio_items.append((ratio, ratio))
        self.ratio_combo.set_active(5)
        # brand_combo.
        brand_items = []
        for brand in self.read_xml.brand_dict.keys():
            brand_po = brand
            if self.brand_dict.has_key(brand):
                brand_po = self.brand_dict[brand]
            brand_items.append((brand_po, brand))

        self.brand_combo.set_items(brand_items, 0)
        # self.brand_combo.add_items(brand_items, 0)

        self.brand_combo.prepend_text(_("No Presets"))
        self.brand_combo.connect("changed", self.brand_combo_item_selected)
        # model_combo.
        self.model_label.set_sensitive(False)
        self.model_combo.set_sensitive(False)
        self.model_combo.prepend_text(_("No Model"))
        self.model_combo.connect("changed", self.model_combo_item_selected)
        #
        self.save_chooser_btn.set_size_request(75, 21)
        self.save_chooser_btn.connect("clicked", self.save_chooser_btn_clicked)

        # path_entry.
        PATH_ENTRY_WIDTH = 240
        PATH_ENTRY_HEIGHT = 22
        self.save_path_entry.set_sensitive(False)
        self.save_path_entry.set_text(self.get_home_path())
        self.save_path_entry.set_size(PATH_ENTRY_WIDTH, PATH_ENTRY_HEIGHT)
        self.close_btn.connect("clicked", lambda w: self.hide_all())
        # higt_set_btn.
        self.higt_set_btn.connect("clicked", self.higt_set_btn_clicked)

        # form body box add main fixed.
        self.body_table_ali = gtk.Alignment()
        self.body_table_ali.set_padding(6, 0, 0, 0)
        self.body_table = gtk.Table(rows=6, columns=4, homogeneous=False)
        self.body_table_ali.add(self.body_table)

        self.brand_model_hbox = gtk.HBox()
        top, bottom = 5, 5
        brand_position = eval(_("('brand_position', 20)"))
        model_position = eval(_("('model_position', 20)"))
        self.brand_hbox_ali, self.brand_hbox = self.create_hbox(
            bottom, top, 15 + int(brand_position[1]), 0, self.brand_label, self.brand_combo
        )
        self.model_hbox_ali, self.model_hbox = self.create_hbox(
            bottom, top, 50 - int(model_position[1]), 0, self.model_label, self.model_combo
        )

        self.brand_model_hbox.pack_start(self.brand_hbox_ali, False, False)
        self.brand_model_hbox.pack_start(self.model_hbox_ali, False, False)
        format_position = eval(_("('format_position', 12)"))
        ratio_position = eval(_("('ratio_position', 18)"))
        self.format_hbox_ali, self.format_hbox = self.create_hbox(
            bottom, top, 15 + int(format_position[1]), 0, self.format_label, self.format_combo
        )
        self.ratio_hbox_ali, ratio_hbox = self.create_hbox(
            bottom, top, 50 - int(ratio_position[1]), 0, self.ratio_label, self.ratio_combo
        )

        self.format_ratio_hbox = gtk.HBox()
        self.format_ratio_hbox.pack_start(self.format_hbox_ali, False, False)
        self.format_ratio_hbox.pack_start(self.ratio_hbox_ali, False, False)

        frame_rate_position = eval(_("('frame_position', 13)"))
        bit_rate_position = eval(_("('bit_rate_position', 28)"))
        self.frame_rate_hbox_ali, self.frame_rate_hbox = self.create_hbox(
            bottom, top, 15 + int(frame_rate_position[1]), 0, self.frame_rate_label, self.frame_rate_combo
        )
        self.bit_rate_hbox_ali, self.bit_rate_hbox = self.create_hbox(
            bottom, top, 50 - int(bit_rate_position[1]), 0, self.bit_rate_label, self.bit_rate_combo
        )

        self.bit_frame_hbox = gtk.HBox()
        self.bit_frame_hbox.pack_start(self.frame_rate_hbox_ali, False, False)
        self.bit_frame_hbox.pack_start(self.bit_rate_hbox_ali, False, False)

        # self.path_label, self.save_path_entry, self.save_chooser_btn
        self.save_path_hbox_ali = gtk.Alignment()
        self.save_path_hbox = gtk.HBox()
        self.save_path_hbox_ali.set_padding(5, 5, 16, 0)
        self.save_path_hbox_ali.add(self.save_path_hbox)

        self.save_path_entry_ali = gtk.Alignment()
        self.save_path_entry_ali.set_padding(1, 0, 0, 0)
        self.save_path_entry_ali.add(self.save_path_entry)

        self.save_chooser_btn_ali = gtk.Alignment()
        self.save_chooser_btn_ali.set_padding(0, 0, 10, 0)
        self.save_chooser_btn_ali.add(self.save_chooser_btn)

        self.save_path_hbox.pack_start(self.path_label, False, False)
        self.save_path_hbox.pack_start(self.save_path_entry_ali, False, False)
        self.save_path_hbox.pack_start(self.save_chooser_btn_ali, False, False)

        # left right top, bottom.
        """brand_model_hbox."""
        # self.body_table.attach(self.brand_model_hbox, 0, 1, 0, 1, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.brand_model_hbox, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
        # self.body_table.attach(self.model_hbox, 1, 2, 0, 1, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.model_hbox, 2, 3, 0, 1, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.model_hbox, 3, 4, 0, 1, gtk.EXPAND, gtk.EXPAND)
        """format_ratio_hbox."""
        # self.body_table.attach(self.format_ratio_hbox, 0, 1, 1, 2, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.format_ratio_hbox, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
        # self.body_table.attach(self.format_combo, 1, 2, 1, 2, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.ratio_hbox, 2, 3, 1, 2, gtk.EXPAND, gtk.EXPAND)
        # self.body_table.attach(self.ratio_combo, 3, 4, 1, 2, gtk.EXPAND, gtk.EXPAND)
        """bit_frame_hbox."""
        # self.body_table.attach(self.bit_frame_hbox, 0, 1, 2, 3, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.bit_frame_hbox, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
        """save_path_hbox."""
        # self.body_table.attach(self.save_path_hbox_ali, 0, 1, 3, 4, gtk.EXPAND, gtk.EXPAND)
        self.body_table.attach(self.save_path_hbox_ali, 0, 1, 3, 4, gtk.FILL, gtk.FILL)

        self.body_box.pack_start(self.body_table_ali, True, True)
        self.hide_setting()

    def create_hbox(self, top, bottom, left, right, child1, child2):
        hbox_ali = gtk.Alignment()
        hbox_ali.set_padding(top, bottom, left, right)
        hbox = gtk.HBox()
        hbox_ali.add(hbox)
        hbox.pack_start(child1, False, False)
        hbox.pack_start(child2, False, False)
        return hbox_ali, hbox

    def get_home_path(self):
        return os.path.expanduser("~")

    def save_chooser_btn_clicked(self, widget):
        """保存目录... ..."""
        self.show_open_dir_dialog_window()

    def show_open_dir_dialog_window(self):
        open_dialog = gtk.FileChooserDialog(
            _("Choose a directory"),
            None,
            gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK),
        )
        # current floader set.
        open_dialog.set_current_folder(self.get_home_path())
        # run dir dialog window.
        res = open_dialog.run()

        if res == gtk.RESPONSE_OK:
            path_string = open_dialog.get_filename()
            if path_string:
                self.save_path_entry.set_text(path_string)
        # destroy dialog window.
        open_dialog.destroy()

    def brand_combo_item_selected(self, combo, item_content):
        self.model_combo.clear_items()
        self.ratio_combo.clear_items()
        #
        try:
            self.model_dict = self.read_xml.load(self.read_xml.brand_dict[item_content])
        except Exception, e:
            print "brand_combo_item_selected[error]:", e
            self.model_dict = {}
        #
        if item_content != _("No Presets") and self.model_dict != {}:
            model_items = []
            for model in self.model_dict:
                model_items.append((model, model))
            self.model_combo.set_items(model_items, 0)

            # self.model_combo.droplist.set_size_request(-1, self.model_combo.droplist_height)
            self.model_combo.set_active(0)
            self.model_combo.set_sensitive(True)
            self.model_label.set_sensitive(True)
        else:
            # clear model and ratio all text.
            self.model_combo.append_text(_("No Model"))
            self.model_combo.set_sensitive(False)
            self.model_label.set_sensitive(False)
            # add ratios.
            for ratio in self.ratio_items:
                self.ratio_combo.append_text(ratio[0])
            self.ratio_combo.set_active(5)
class PPPConf(gtk.VBox):
    ENTRY = 0
    OFFBUTTON = 1

    TABLE_WIDTH = 150

    def __init__(self, settings_obj=None):
        gtk.VBox.__init__(self)

        #self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        #Dispatcher.set_button = set_button_callback
        #self.module_frame = module_frame

        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj

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

        self.refuse_eap_label = Label(_("EAP"),
                                      text_size=CONTENT_FONT_SIZE,
                                      enable_select=False,
                                      enable_double_click=False)
        self.refuse_pap_label = Label(_("PAP"),
                                      text_size=CONTENT_FONT_SIZE,
                                      enable_select=False,
                                      enable_double_click=False)
        self.refuse_chap_label = Label(_("CHAP"),
                                       text_size=CONTENT_FONT_SIZE,
                                       enable_select=False,
                                       enable_double_click=False)
        self.refuse_mschap_label = Label(_("MSCHAP"),
                                         text_size=CONTENT_FONT_SIZE,
                                         enable_select=False,
                                         enable_double_click=False)
        self.refuse_mschapv2_label = Label(_("MSCHAP v2"),
                                           text_size=CONTENT_FONT_SIZE,
                                           enable_select=False,
                                           enable_double_click=False)
        self.refuse_eap = SwitchButton()
        self.refuse_pap = SwitchButton()
        self.refuse_chap = SwitchButton()
        self.refuse_mschap = SwitchButton()
        self.refuse_mschapv2 = SwitchButton()

        self.method_table = gtk.Table(23, 3, False)

        # 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)

        #compressio))n = Label(_("Compression"), text_size=TITLE_FONT_SIZE)
        self.require_mppe_label = Label(
            _("Use point-to-point encryption(mppe)"),
            text_size=CONTENT_FONT_SIZE,
            enable_select=False,
            enable_double_click=False)
        self.require_mppe_128_label = Label(_("Require 128-bit encryption"),
                                            text_size=CONTENT_FONT_SIZE,
                                            enable_select=False,
                                            enable_double_click=False)
        self.mppe_stateful_label = Label(_("Use stateful MPPE"),
                                         text_size=CONTENT_FONT_SIZE,
                                         enable_select=False,
                                         enable_double_click=False)
        self.nobsdcomp_label = Label(_("Allow BSD data Compression"),
                                     text_size=CONTENT_FONT_SIZE,
                                     enable_select=False,
                                     enable_double_click=False)
        self.nodeflate_label = Label(_("Allow Deflate data compression"),
                                     text_size=CONTENT_FONT_SIZE,
                                     enable_select=False,
                                     enable_double_click=False)
        self.no_vj_comp_label = Label(_("Use TCP header compression"),
                                      text_size=CONTENT_FONT_SIZE,
                                      enable_select=False,
                                      enable_double_click=False)
        #echo = Label("Echo", text_size=TITLE_FONT_SIZE)
        self.ppp_echo_label = Label(_("Send PPP echo packets"),
                                    text_size=CONTENT_FONT_SIZE,
                                    enable_select=False,
                                    enable_double_click=False)
        self.nopcomp_label = Label(
            _("Use protocal field compression negotiation"),
            text_size=CONTENT_FONT_SIZE,
            enable_select=False,
            enable_double_click=False)
        self.noaccomp_label = Label(_("Use Address/Control compression"),
                                    text_size=CONTENT_FONT_SIZE,
                                    enable_select=False,
                                    enable_double_click=False)

        self.require_mppe = SwitchButton()
        self.require_mppe_128 = SwitchButton()
        self.mppe_stateful = SwitchButton()

        self.nobsdcomp = SwitchButton()
        self.nodeflate = SwitchButton()
        self.no_vj_comp = SwitchButton()
        self.nopcomp = SwitchButton()
        self.noaccomp = SwitchButton()
        self.ppp_echo = SwitchButton()
        self.ip_sec_enable = SwitchButton()

        ## Settings for IPSec
        self.ipsec_title = TitleBar(None,
                                    _("IPSec Setting"),
                                    width=self.TABLE_WIDTH,
                                    has_separator=False)

        self.ip_sec_enable_label = Label(_("Enable IPSec tunnel to l2tp host"),
                                         text_size=CONTENT_FONT_SIZE,
                                         enable_select=False,
                                         enable_double_click=False)
        self.group_name_label = Label(_("Group Name:"),
                                      text_size=CONTENT_FONT_SIZE,
                                      enable_select=False,
                                      enable_double_click=False)
        self.gateway_id_label = Label(_("Gateway ID:"),
                                      text_size=CONTENT_FONT_SIZE,
                                      enable_select=False,
                                      enable_double_click=False)
        self.pre_shared_key_label = Label(_("Pre_Shared_key"),
                                          text_size=CONTENT_FONT_SIZE,
                                          enable_select=False,
                                          enable_double_click=False)
        self.group_name = InputEntry()
        self.group_name.set_size(self.TABLE_WIDTH, 22)
        self.gateway_id = InputEntry()
        self.gateway_id.set_size(self.TABLE_WIDTH, 22)
        self.pre_shared_key = PasswordEntry()
        self.pre_shared_key.set_text = self.pre_shared_key.entry.set_text
        self.pre_shared_key.set_size(self.TABLE_WIDTH, 22)

        methods_list = [
            "refuse_eap", "refuse_eap_label", "refuse_pap", "refuse_pap_label",
            "refuse_chap", "refuse_chap_label", "refuse_mschap",
            "refuse_mschap_label", "refuse_mschapv2", "refuse_mschapv2_label"
        ]
        compression_list = [
            "require_mppe_label", "require_mppe", "require_mppe_128_label",
            "require_mppe_128", "mppe_stateful_label", "mppe_stateful",
            "nobsdcomp_label", "nobsdcomp", "nodeflate_label", "nodeflate",
            "no_vj_comp_label", "no_vj_comp", "nopcomp_label", "nopcomp",
            "noaccomp_label", "noaccomp"
        ]

        echo_list = ["ppp_echo_label", "ppp_echo"]

        ip_sec_list = [
            "ip_sec_enable_label", "ip_sec_enable", "group_name_label",
            "group_name", "gateway_id_label", "gateway_id",
            "pre_shared_key_label", "pre_shared_key"
        ]

        for name in (compression_list + echo_list + methods_list +
                     ip_sec_list):
            widget = getattr(self, name)
            if not name.endswith("label"):
                align = style.wrap_with_align(widget, align="left")
            else:
                align = style.wrap_with_align(widget, width=210)

            setattr(self, name + "_align", align)

        #vbox = gtk.VBox()
        table_align = gtk.Alignment(0, 0, 0, 0)
        table_align.add(self.method_table)
        style.set_table(self.method_table)

        self.pack_start(table_align, False, False)
        self.method_table.set_row_spacing(5, 20)
        self.method_table.set_row_spacing(15, 20)
        self.method_table.set_row_spacing(18, 20)

        Dispatcher.connect("vpn-type-change", lambda w, c: self.refresh(c))
        #align = style.set_box_with_align(vbox, "text")
        #self.add_with_viewport(align)
        #style.draw_background_color(align)

        #confirm_button = Button("Confirm")
        #confirm_button.connect("clicked", self.confirm_button_cb)
        #button_aligns = gtk.Alignment(0.5 , 1, 0, 0)
        #button_aligns.add(confirm_button)
        #self.add(button_aligns)

        #self.require_mppe_128.set_sensitive(False)
        #self.mppe_stateful.set_sensitive(False)
        ##self.refresh()

    def init_signal(self):
        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.click_mppe_callback,
                                  "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")
        self.nopcomp.connect("toggled", self.check_button_cb, "nopcomp")
        self.noaccomp.connect("toggled", self.check_button_cb, "noaccomp")

        self.ip_sec_enable.connect("toggled", self.enable_ipsec_cb)
        #self.group_name.entry.connect("focus-out-event", self.entry_focus_out_cb, "ipsec-group-name")
        #self.gateway_id.entry.connect("focus-out-event", self.entry_focus_out_cb, "ipsec-gataway-id")
        #self.pre_shared_key.entry.connect("focus-out-event", self.entry_focus_out_cb, "ipsec-psk")
        self.group_name.entry.connect("changed", self.entry_changed_cb,
                                      "ipsec-group-name")
        self.gateway_id.entry.connect("changed", self.entry_changed_cb,
                                      "ipsec-gateway-id")
        self.pre_shared_key.entry.connect("changed", self.entry_changed_cb,
                                          "ipsec-psk")

    def init_ui(self):

        self.service_type = self.vpn_setting.service_type.split(".")[-1]

        def table_attach(widget_name, row, padding=0):
            label = getattr(self, widget_name + "_label_align")
            widget = getattr(self, widget_name + "_align")
            self.method_table.attach(label, 0, 2, row, row + 1)
            self.method_table.attach(widget,
                                     2,
                                     3,
                                     row,
                                     row + 1,
                                     xpadding=padding)

        #print self.service_type
        container_remove_all(self.method_table)
        self.method_table.attach(self.method_title, 0, 3, 0, 1)
        table_attach("refuse_eap", 1)
        table_attach("refuse_pap", 2)
        table_attach("refuse_chap", 3)
        table_attach("refuse_mschap", 4)
        table_attach("refuse_mschapv2", 5)
        self.method_table.attach(self.compression_title, 0, 3, 6, 7)
        table_attach("require_mppe", 8)
        if self.require_mppe.get_active():
            table_attach("require_mppe_128", 9)
            table_attach("mppe_stateful", 10)
        table_attach("nobsdcomp", 11)
        table_attach("nodeflate", 12)
        table_attach("no_vj_comp", 13)
        self.method_table.attach(self.echo_title, 0, 3, 16, 17)
        table_attach("ppp_echo", 18)

        if self.service_type == "l2tp":
            #print "this is l2tp"
            table_attach("nopcomp", 14)
            table_attach("noaccomp", 15)

            self.method_table.attach(self.ipsec_title, 0, 3, 19, 20)
            table_attach("ip_sec_enable", 20)
            if self.ip_sec_enable.get_active():
                table_attach("group_name", 21)
                table_attach("gateway_id", 22)
                table_attach("pre_shared_key", 23)

        self.method_table.show_all()

    def refresh(self, connection):
        self.connection = connection
        self.vpn_setting = self.connection.get_setting("vpn")
        #=========================
        # retreieve settings
        self.service_type = self.vpn_setting.service_type.split(".")[-1]
        #print ">>",self.vpn_setting.data
        refuse_eap = self.vpn_setting.get_data_item("refuse-eap")
        refuse_pap = self.vpn_setting.get_data_item("refuse-pap")
        refuse_chap = self.vpn_setting.get_data_item("refuse-chap")
        refuse_mschap = self.vpn_setting.get_data_item("refuse-mschap")
        refuse_mschapv2 = self.vpn_setting.get_data_item("refuse-mschapv2")

        require_mppe = self.vpn_setting.get_data_item("require-mppe")
        require_mppe_128 = self.vpn_setting.get_data_item("require-mppe-128")
        mppe_stateful = self.vpn_setting.get_data_item("mppe-stateful")

        nobsdcomp = self.vpn_setting.get_data_item("nobsdcomp")
        nodeflate = self.vpn_setting.get_data_item("nodeflate")
        no_vj_comp = self.vpn_setting.get_data_item("no-vj-comp")

        lcp_echo_failure = self.vpn_setting.get_data_item("lcp-echo-failure")
        lcp_echo_interval = self.vpn_setting.get_data_item("lcp-echo-interval")

        self.refuse_mschap.set_active(refuse_mschap == None)
        self.refuse_mschapv2.set_active(refuse_mschapv2 == None)
        self.require_mppe.set_active(require_mppe != None)

        self.refuse_eap.set_active(refuse_eap == None)
        self.refuse_pap.set_active(refuse_pap == None)
        self.refuse_chap.set_active(refuse_chap == None)

        self.require_mppe_128.set_active(require_mppe_128 != None)
        if self.require_mppe_128.get_active() or self.mppe_stateful.get_active(
        ):
            self.require_mppe.set_active(True)
        self.mppe_stateful.set_active(mppe_stateful != None)
        self.nobsdcomp.set_active(nobsdcomp == None)
        self.nodeflate.set_active(nodeflate == None)
        self.no_vj_comp.set_active(no_vj_comp == None)

        if self.service_type == "l2tp":
            nopcomp = self.vpn_setting.get_data_item("nopcomp")
            noaccomp = self.vpn_setting.get_data_item("noaccomp")
            ipsec_enabled = self.vpn_setting.get_data_item("ipsec-enabled")

            self.nopcomp.set_active(nopcomp == None)
            self.noaccomp.set_active(noaccomp == None)

            if ipsec_enabled:
                self.ip_sec_enable.set_active(True)

                ipsec_group_name = self.vpn_setting.get_data_item(
                    "ipsec-group-name")
                ipsec_gateway_id = self.vpn_setting.get_data_item(
                    "ipsec-gateway-id")
                ipsec_psk = self.vpn_setting.get_data_item("ipsec-psk")
                self.group_name.set_text(ipsec_group_name)
                self.gateway_id.set_text(ipsec_gateway_id)
                self.pre_shared_key.set_text(ipsec_psk)

            else:
                self.ip_sec_enable.set_active(False)

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

        self.init_signal()
        self.init_lock = False
        self.require_mppe.emit("toggled")
        self.init_lock = True
        self.init_ui()
        #==================================
        # Connect signal
    def enable_ipsec_cb(self, widget):
        active = widget.get_active()
        if active:
            self.vpn_setting.set_data_item("ipsec-enabled", "yes")
            self.group_name.set_sensitive(True)
            self.gateway_id.set_sensitive(True)
            self.pre_shared_key.set_sensitive(True)

            ipsec_group_name = self.vpn_setting.get_data_item(
                "ipsec-group-name")
            ipsec_gateway_id = self.vpn_setting.get_data_item(
                "ipsec-gateway-id")
            ipsec_psk = self.vpn_setting.get_data_item("ipsec-psk")

            #print ipsec_group_name
            self.group_name.set_text(ipsec_group_name)
            self.gateway_id.set_text(ipsec_gateway_id)
            self.pre_shared_key.set_text(ipsec_psk)
            self.init_ui()
        else:
            self.vpn_setting.delete_data_item("ipsec-enabled")
            self.group_name.set_text("")
            self.gateway_id.set_text("")
            self.pre_shared_key.set_text("")

            self.group_name.set_sensitive(False)
            self.gateway_id.set_sensitive(False)
            self.pre_shared_key.set_sensitive(False)
            self.init_ui()

    def entry_focus_out_cb(self, widget, event, key):
        text = widget.get_text()
        if text and key != "name":
            self.vpn_setting.set_data_item(key, text)
        else:
            self.vpn_setting.delete_data_item(key)

    def entry_changed_cb(self, widget, string, key):
        if string == "":
            #print key,"entry is empty"
            self.vpn_setting.delete_data_item(key)
        elif key != "name":
            self.vpn_setting.set_data_item(key, string)

        if self.connection.check_setting_finish():
            Dispatcher.set_button("save", True)
        else:
            Dispatcher.set_button("save", False)

    def check_button_cb(self, widget, key):
        auth_lock = self.auth_lock()
        active = widget.get_active()
        if key.startswith("refuse"):
            if active:
                self.vpn_setting.delete_data_item(key)
            else:
                self.vpn_setting.set_data_item(key, "yes")

            if auth_lock:
                self.require_mppe_label.set_sensitive(False)
                self.require_mppe.set_sensitive(False)

                self.set_group_sensitive(True)
            else:
                self.require_mppe_label.set_sensitive(True)
                self.require_mppe.set_sensitive(True)

        elif key.startswith("no"):
            if active:
                self.vpn_setting.delete_data_item(key)
            else:
                self.vpn_setting.set_data_item(key, "yes")

        elif key == "echo":
            if active:
                self.vpn_setting.set_data_item("lcp-echo-failure", "5")
                self.vpn_setting.set_data_item("lcp-echo-interval", "30")
            else:
                self.vpn_setting.delete_data_item("lcp-echo-failure")
                self.vpn_setting.delete_data_item("lcp-echo-interval")
        elif key.startswith("ipsec"):
            if active:
                self.vpn_setting.set_data_item(key, "yes")
            else:
                self.vpn_setting.delete_data_item(key)
        elif key.startswith("require") or key.startswith("mppe"):
            if active:
                self.vpn_setting.set_data_item(key, "yes")
            else:
                self.vpn_setting.delete_data_item(key)

        if self.connection.check_setting_finish():
            Dispatcher.set_button("save", True)
        else:
            Dispatcher.set_button("save", False)

    def click_mppe_callback(self, widget, key):
        active = widget.get_active()
        if active and key != "name":
            self.vpn_setting.set_data_item(key, "yes")
            #self.set_group_active(False)
            self.set_group_sensitive(False)

            self.mppe_group_set_sensitive(True)
            self.init_ui()
        else:
            #self.set_group_active(True)
            self.set_group_sensitive(True)
            self.vpn_setting.delete_data_item(key)
            self.mppe_group_set_active(False)
            self.mppe_group_set_sensitive(False)
            self.init_ui()

        if self.init_lock:
            if self.connection.check_setting_finish():
                Dispatcher.set_button("save", True)
            else:
                Dispatcher.set_button("save", False)

        if self.auth_lock():
            self.require_mppe_label.set_sensitive(False)
            self.require_mppe.set_sensitive(False)
            return

    def mppe_group_set_sensitive(self, boolean):
        self.require_mppe_128_label.set_sensitive(boolean)
        self.mppe_stateful_label.set_sensitive(boolean)
        self.require_mppe_128.set_sensitive(boolean)
        self.mppe_stateful.set_sensitive(boolean)

    def mppe_group_set_active(self, boolean):
        log.debug()
        self.require_mppe_128.set_active(boolean)
        self.mppe_stateful.set_active(boolean)

    def confirm_button_cb(self, widget):
        self.module_frame.send_message("change_crumb", 2)
        nm_module.slider._slide_to_page("vpn", "none")

    def auth_lock(self):
        if self.refuse_mschap.get_active() or self.refuse_mschapv2.get_active(
        ):
            return False
        else:
            return True

    def set_group_active(self, boolean):
        self.refuse_eap.set_active(boolean)
        self.refuse_pap.set_active(boolean)
        self.refuse_chap.set_active(boolean)

    def set_group_sensitive(self, boolean):
        self.refuse_eap.set_sensitive(boolean)
        self.refuse_pap.set_sensitive(boolean)
        self.refuse_chap.set_sensitive(boolean)
        self.refuse_eap_label.set_sensitive(boolean)
        self.refuse_pap_label.set_sensitive(boolean)
        self.refuse_chap_label.set_sensitive(boolean)
class PPPConf(gtk.VBox):
    ENTRY = 0
    OFFBUTTON = 1

    TABLE_WIDTH = 150
    def __init__(self, settings_obj=None):
        gtk.VBox.__init__(self)
        
        #self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        #Dispatcher.set_button = set_button_callback
        #self.module_frame = module_frame

        # 新增settings_obj变量,用于访问shared_methods.Settings对象
        self.settings_obj = settings_obj
        
        self.method_title = TitleBar(None,
                                     _("Configure Method"),
                                     width=self.TABLE_WIDTH,
                                     has_separator=False)

        self.refuse_eap_label = Label(_("EAP"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.refuse_pap_label = Label(_("PAP"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.refuse_chap_label = Label(_("CHAP"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.refuse_mschap_label = Label(_("MSCHAP"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.refuse_mschapv2_label = Label(_("MSCHAP v2"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.refuse_eap = SwitchButton()
        self.refuse_pap = SwitchButton()
        self.refuse_chap = SwitchButton()
        self.refuse_mschap = SwitchButton()
        self.refuse_mschapv2 = SwitchButton()
        
        self.method_table = gtk.Table(23, 3, False)

        # 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)


        #compressio))n = Label(_("Compression"), text_size=TITLE_FONT_SIZE)
        self.require_mppe_label = Label(_("Use point-to-point encryption(mppe)"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.require_mppe_128_label = Label(_("Require 128-bit encryption"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.mppe_stateful_label = Label(_("Use stateful MPPE"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.nobsdcomp_label = Label(_("Allow BSD data Compression"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.nodeflate_label = Label(_("Allow Deflate data compression"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.no_vj_comp_label = Label(_("Use TCP header compression"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        #echo = Label("Echo", text_size=TITLE_FONT_SIZE)
        self.ppp_echo_label = Label(_("Send PPP echo packets"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.nopcomp_label = Label(_("Use protocal field compression negotiation"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.noaccomp_label = Label(_("Use Address/Control compression"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)

        self.require_mppe = SwitchButton()
        self.require_mppe_128 = SwitchButton()
        self.mppe_stateful = SwitchButton()
        
        self.nobsdcomp = SwitchButton()
        self.nodeflate = SwitchButton()
        self.no_vj_comp = SwitchButton()
        self.nopcomp = SwitchButton()
        self.noaccomp = SwitchButton() 
        self.ppp_echo = SwitchButton()
        self.ip_sec_enable = SwitchButton()

        ## Settings for IPSec
        self.ipsec_title = TitleBar(None,
                                    _("IPSec Setting"),
                                    width=self.TABLE_WIDTH,
                                    has_separator=False)

        self.ip_sec_enable_label = Label(_("Enable IPSec tunnel to l2tp host"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.group_name_label = Label(_("Group Name:"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.gateway_id_label = Label(_("Gateway ID:"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.pre_shared_key_label = Label(_("Pre_Shared_key"), text_size=CONTENT_FONT_SIZE,
                               enable_select=False,
                               enable_double_click=False)
        self.group_name = InputEntry()
        self.group_name.set_size(self.TABLE_WIDTH, 22)
        self.gateway_id = InputEntry()
        self.gateway_id.set_size(self.TABLE_WIDTH, 22)
        self.pre_shared_key = PasswordEntry()
        self.pre_shared_key.set_text = self.pre_shared_key.entry.set_text
        self.pre_shared_key.set_size(self.TABLE_WIDTH, 22)
        
        methods_list = ["refuse_eap", "refuse_eap_label",
                        "refuse_pap", "refuse_pap_label",
                        "refuse_chap", "refuse_chap_label",
                        "refuse_mschap", "refuse_mschap_label",
                        "refuse_mschapv2", "refuse_mschapv2_label"]
        compression_list = ["require_mppe_label", "require_mppe",
                            "require_mppe_128_label", "require_mppe_128",
                            "mppe_stateful_label", "mppe_stateful",
                            "nobsdcomp_label", "nobsdcomp",
                            "nodeflate_label", "nodeflate",
                            "no_vj_comp_label", "no_vj_comp",
                            "nopcomp_label", "nopcomp",
                            "noaccomp_label", "noaccomp"]

        echo_list = ["ppp_echo_label","ppp_echo"]

        ip_sec_list = ["ip_sec_enable_label", "ip_sec_enable",
                       "group_name_label", "group_name",
                       "gateway_id_label", "gateway_id",
                       "pre_shared_key_label", "pre_shared_key"]

        for name in (compression_list+echo_list+methods_list + ip_sec_list):
            widget = getattr(self, name)
            if not name.endswith("label"):
                align = style.wrap_with_align(widget, align="left")
            else:
                align = style.wrap_with_align(widget, width=210)

            setattr(self, name + "_align", align)

        #vbox = gtk.VBox()
        table_align = gtk.Alignment(0, 0, 0, 0)
        table_align.add(self.method_table)
        style.set_table(self.method_table)

        self.pack_start(table_align, False, False)
        self.method_table.set_row_spacing(5, 20)
        self.method_table.set_row_spacing(15, 20)
        self.method_table.set_row_spacing(18, 20)

        Dispatcher.connect("vpn-type-change", lambda w,c:self.refresh(c))
        #align = style.set_box_with_align(vbox, "text")
        #self.add_with_viewport(align)
        #style.draw_background_color(align)


        #confirm_button = Button("Confirm")
        #confirm_button.connect("clicked", self.confirm_button_cb)
        #button_aligns = gtk.Alignment(0.5 , 1, 0, 0)
        #button_aligns.add(confirm_button)
        #self.add(button_aligns)

        #self.require_mppe_128.set_sensitive(False)
        #self.mppe_stateful.set_sensitive(False)
        ##self.refresh()
    
    def init_signal(self):
        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.click_mppe_callback, "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")
        self.nopcomp.connect("toggled", self.check_button_cb, "nopcomp")
        self.noaccomp.connect("toggled", self.check_button_cb, "noaccomp")

        self.ip_sec_enable.connect("toggled", self.enable_ipsec_cb)
        #self.group_name.entry.connect("focus-out-event", self.entry_focus_out_cb, "ipsec-group-name")
        #self.gateway_id.entry.connect("focus-out-event", self.entry_focus_out_cb, "ipsec-gataway-id")
        #self.pre_shared_key.entry.connect("focus-out-event", self.entry_focus_out_cb, "ipsec-psk")
        self.group_name.entry.connect("changed", self.entry_changed_cb, "ipsec-group-name")
        self.gateway_id.entry.connect("changed", self.entry_changed_cb, "ipsec-gateway-id")
        self.pre_shared_key.entry.connect("changed", self.entry_changed_cb, "ipsec-psk")

    def init_ui(self):

        self.service_type = self.vpn_setting.service_type.split(".")[-1]
        def table_attach(widget_name, row, padding=0):
            label = getattr(self, widget_name + "_label_align")
            widget = getattr(self, widget_name + "_align")
            self.method_table.attach(label, 0, 2, row, row + 1)
            self.method_table.attach(widget, 2, 3, row, row + 1, xpadding=padding)
        #print self.service_type
        container_remove_all(self.method_table)
        self.method_table.attach(self.method_title, 0, 3, 0, 1)
        table_attach( "refuse_eap", 1)
        table_attach( "refuse_pap", 2 )
        table_attach( "refuse_chap", 3)
        table_attach( "refuse_mschap", 4 )
        table_attach( "refuse_mschapv2", 5)
        self.method_table.attach( self.compression_title, 0, 3, 6 ,7)
        table_attach("require_mppe", 8)
        if self.require_mppe.get_active():
            table_attach("require_mppe_128", 9)
            table_attach("mppe_stateful", 10)
        table_attach("nobsdcomp", 11)
        table_attach("nodeflate", 12)
        table_attach("no_vj_comp", 13)
        self.method_table.attach(self.echo_title, 0, 3, 16, 17)
        table_attach("ppp_echo", 18)

        if self.service_type == "l2tp":
            #print "this is l2tp"
            table_attach("nopcomp", 14)
            table_attach("noaccomp", 15)
            
            self.method_table.attach(self.ipsec_title, 0, 3, 19, 20)
            table_attach("ip_sec_enable", 20)
            if self.ip_sec_enable.get_active():
                table_attach("group_name", 21)
                table_attach("gateway_id", 22)
                table_attach("pre_shared_key", 23)

        self.method_table.show_all()



    def refresh(self, connection):
        self.connection = connection
        self.vpn_setting = self.connection.get_setting("vpn")
        #=========================
        # retreieve settings
        self.service_type = self.vpn_setting.service_type.split(".")[-1]
        #print ">>",self.vpn_setting.data
        refuse_eap = self.vpn_setting.get_data_item("refuse-eap")
        refuse_pap = self.vpn_setting.get_data_item("refuse-pap")
        refuse_chap = self.vpn_setting.get_data_item("refuse-chap")
        refuse_mschap = self.vpn_setting.get_data_item("refuse-mschap")
        refuse_mschapv2 = self.vpn_setting.get_data_item("refuse-mschapv2")

        require_mppe = self.vpn_setting.get_data_item("require-mppe")
        require_mppe_128 = self.vpn_setting.get_data_item("require-mppe-128")
        mppe_stateful = self.vpn_setting.get_data_item("mppe-stateful")

        nobsdcomp = self.vpn_setting.get_data_item("nobsdcomp")
        nodeflate = self.vpn_setting.get_data_item("nodeflate")
        no_vj_comp = self.vpn_setting.get_data_item("no-vj-comp")


        lcp_echo_failure = self.vpn_setting.get_data_item("lcp-echo-failure")
        lcp_echo_interval = self.vpn_setting.get_data_item("lcp-echo-interval")
        
        self.refuse_mschap.set_active(refuse_mschap == None)
        self.refuse_mschapv2.set_active(refuse_mschapv2 == None)
        self.require_mppe.set_active(require_mppe != None)
        
        self.refuse_eap.set_active(refuse_eap == None)
        self.refuse_pap.set_active(refuse_pap == None)
        self.refuse_chap.set_active(refuse_chap == None)

        self.require_mppe_128.set_active(require_mppe_128 != None)
        if self.require_mppe_128.get_active() or self.mppe_stateful.get_active():
            self.require_mppe.set_active(True)
        self.mppe_stateful.set_active(mppe_stateful != None)
        self.nobsdcomp.set_active(nobsdcomp == None)
        self.nodeflate.set_active(nodeflate == None)
        self.no_vj_comp.set_active(no_vj_comp == None)

        if self.service_type == "l2tp":
            nopcomp = self.vpn_setting.get_data_item("nopcomp")
            noaccomp = self.vpn_setting.get_data_item("noaccomp")
            ipsec_enabled = self.vpn_setting.get_data_item("ipsec-enabled")

            self.nopcomp.set_active(nopcomp == None)
            self.noaccomp.set_active(noaccomp == None)
            
            if ipsec_enabled:
                self.ip_sec_enable.set_active(True)

                ipsec_group_name = self.vpn_setting.get_data_item("ipsec-group-name")
                ipsec_gateway_id = self.vpn_setting.get_data_item("ipsec-gateway-id")
                ipsec_psk = self.vpn_setting.get_data_item("ipsec-psk")
                self.group_name.set_text(ipsec_group_name)
                self.gateway_id.set_text(ipsec_gateway_id)
                self.pre_shared_key.set_text(ipsec_psk)

            else:
                self.ip_sec_enable.set_active(False)

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

        self.init_signal()
        self.init_lock = False
        self.require_mppe.emit("toggled")
        self.init_lock = True
        self.init_ui()
        #==================================
        # Connect signal
    def enable_ipsec_cb(self, widget):
        active = widget.get_active()
        if active:
            self.vpn_setting.set_data_item("ipsec-enabled", "yes")
            self.group_name.set_sensitive(True)
            self.gateway_id.set_sensitive(True)
            self.pre_shared_key.set_sensitive(True)

            ipsec_group_name = self.vpn_setting.get_data_item("ipsec-group-name")
            ipsec_gateway_id = self.vpn_setting.get_data_item("ipsec-gateway-id")
            ipsec_psk = self.vpn_setting.get_data_item("ipsec-psk")
            
            #print ipsec_group_name
            self.group_name.set_text(ipsec_group_name)
            self.gateway_id.set_text(ipsec_gateway_id)
            self.pre_shared_key.set_text(ipsec_psk)
            self.init_ui()
        else:
            self.vpn_setting.delete_data_item("ipsec-enabled")
            self.group_name.set_text("")
            self.gateway_id.set_text("")
            self.pre_shared_key.set_text("")

            self.group_name.set_sensitive(False)
            self.gateway_id.set_sensitive(False)
            self.pre_shared_key.set_sensitive(False)
            self.init_ui()

    def entry_focus_out_cb(self, widget, event, key):
        text = widget.get_text()
        if text and key != "name":
            self.vpn_setting.set_data_item(key, text)
        else:
            self.vpn_setting.delete_data_item(key)
    def entry_changed_cb(self, widget, string, key):
        if string == "":
            #print key,"entry is empty"
            self.vpn_setting.delete_data_item(key)
        elif key != "name":
            self.vpn_setting.set_data_item(key, string)

        if self.connection.check_setting_finish():
            Dispatcher.set_button("save", True)
        else:
            Dispatcher.set_button("save", False)


    def check_button_cb(self, widget, key):
        auth_lock = self.auth_lock()
        active = widget.get_active()
        if key.startswith("refuse"):
            if active:
                self.vpn_setting.delete_data_item(key)
            else:
                self.vpn_setting.set_data_item(key, "yes")

            if auth_lock:
                self.require_mppe_label.set_sensitive(False)
                self.require_mppe.set_sensitive(False)

                self.set_group_sensitive(True)
            else:
                self.require_mppe_label.set_sensitive(True)
                self.require_mppe.set_sensitive(True)

        elif key.startswith("no"):
            if active:
                self.vpn_setting.delete_data_item(key)
            else:
                self.vpn_setting.set_data_item(key, "yes")

        elif key == "echo":
            if active:
                self.vpn_setting.set_data_item("lcp-echo-failure", "5")
                self.vpn_setting.set_data_item("lcp-echo-interval", "30")
            else:
                self.vpn_setting.delete_data_item("lcp-echo-failure")
                self.vpn_setting.delete_data_item("lcp-echo-interval")
        elif key.startswith("ipsec"):
            if active:
                self.vpn_setting.set_data_item(key, "yes")
            else:
                self.vpn_setting.delete_data_item(key)
        elif key.startswith("require") or key.startswith("mppe"):
            if active:
                self.vpn_setting.set_data_item(key, "yes")
            else:
                self.vpn_setting.delete_data_item(key)
            

        if self.connection.check_setting_finish():
            Dispatcher.set_button("save", True)
        else:
            Dispatcher.set_button("save", False)
    
    def click_mppe_callback(self, widget, key):
        active = widget.get_active()
        if active and key != "name":
            self.vpn_setting.set_data_item(key, "yes")
            #self.set_group_active(False)
            self.set_group_sensitive(False)

            self.mppe_group_set_sensitive(True)
            self.init_ui()
        else:
            #self.set_group_active(True)
            self.set_group_sensitive(True)
            self.vpn_setting.delete_data_item(key)
            self.mppe_group_set_active(False)
            self.mppe_group_set_sensitive(False)
            self.init_ui()
        
        if self.init_lock:
            if self.connection.check_setting_finish():
                Dispatcher.set_button("save", True)
            else:
                Dispatcher.set_button("save", False)

        if self.auth_lock():
            self.require_mppe_label.set_sensitive(False)
            self.require_mppe.set_sensitive(False)
            return


    def mppe_group_set_sensitive(self, boolean):
        self.require_mppe_128_label.set_sensitive(boolean)
        self.mppe_stateful_label.set_sensitive(boolean)
        self.require_mppe_128.set_sensitive(boolean)
        self.mppe_stateful.set_sensitive(boolean)

    def mppe_group_set_active(self, boolean):
        log.debug()
        self.require_mppe_128.set_active(boolean)
        self.mppe_stateful.set_active(boolean)

    def confirm_button_cb(self, widget):
        self.module_frame.send_message("change_crumb", 2)
        nm_module.slider._slide_to_page("vpn", "none")
        
    def auth_lock(self):
        if self.refuse_mschap.get_active() or self.refuse_mschapv2.get_active():
            return False
        else:
            return True

    def set_group_active(self, boolean):
        self.refuse_eap.set_active(boolean)
        self.refuse_pap.set_active(boolean)
        self.refuse_chap.set_active(boolean)

    def set_group_sensitive(self, boolean):
        self.refuse_eap.set_sensitive(boolean)
        self.refuse_pap.set_sensitive(boolean)
        self.refuse_chap.set_sensitive(boolean)
        self.refuse_eap_label.set_sensitive(boolean)
        self.refuse_pap_label.set_sensitive(boolean)
        self.refuse_chap_label.set_sensitive(boolean)