def testGetValueWhenTimeIsHiddenShouldReturnDateWithoutTime(self):
     self.time_picker.IsShown.return_value = False
     self.time_picker.get_time.return_value = wx.DateTimeFromHMS(14, 30)
     self.date_picker.get_date.return_value = wx.DateTimeFromDMY(
         31, 7, 2010, 0, 0)
     self.assertEquals(wx.DateTimeFromDMY(31, 7, 2010, 0, 0),
                       self.controller.get_value())
Esempio n. 2
0
    def _getCtrlWXDateTime(self):
        """
        Получить данные с контролов.
        @return: Данные возвращаются в виде wx.DateTime.
        """
        date_valid = self.isDateValid()
        time_valid = self.isTimeValid()

        if date_valid and time_valid:
            # И дата и время введены корректно
            lst_time = self._getCtrlTimeTuple()
            wx_datetime = self.dateEdit.GetValue()
            wx_datetime.SetHour(lst_time[0])
            wx_datetime.SetMinute(lst_time[1])
            wx_datetime.SetSecond(lst_time[2])
            return wx_datetime
        elif not date_valid and time_valid:
            # Дата не корректна а время корректно
            lst_time = self._getCtrlTimeTuple()
            return wx.DateTimeFromHMS(lst_time[0], lst_time[1], lst_time[2])
        elif date_valid and not time_valid:
            # Дата корректна а время не корректно
            return self.dateEdit.GetValue()
        else:
            # Ничего не корректно
            return None
 def AdjustFontForHeight(self, font, height):
     pointSize = 18
     while True:
         font.SetPointSize(pointSize)
         _, th = self.context.GetTextExtent(
             ' ' + wxTimeFormat.FormatTime(wx.DateTimeFromHMS(23, 59, 59)))
         if th <= height:
             return
         pointSize -= 1
         if pointSize == 1:
             return  # Hum
 def AdjustFontForWidth(self, font, width):
     pointSize = 18
     while True:
         font.SetPointSize(pointSize)
         self.context.SetFont(font)
         tw, _ = self.context.GetTextExtent(
             ' ' + wxTimeFormat.FormatTime(wx.DateTimeFromHMS(23, 59, 59)))
         if tw <= width:
             return
         pointSize -= 1
         if pointSize == 1:
             return  # Hum
Esempio n. 5
0
    def setDates(self):
        idx = self.recordService.get_series_points().index
        dateAfter = idx[0]
        dateBefore = idx[-1]

        formattedDateAfter = _pydate2wxdate(dateAfter)
        formattedDateBefore = _pydate2wxdate(dateBefore)

        self.dpAfter.SetRange(formattedDateAfter, formattedDateBefore)
        self.dpBefore.SetRange(formattedDateAfter, formattedDateBefore)
        self.dpAfter.SetValue(formattedDateAfter)
        self.tpBefore.SetValue(
            wx.DateTimeFromHMS(hour=23, minute=59, second=59))
        self.dpBefore.SetValue(formattedDateBefore)
Esempio n. 6
0
 def _TimeCtrl__validateValue(self, value):
     if not value:
         raise ValueError('%s not a valid time value' % repr(value))
     try:
         #value = self.GetWxDateTime(value) - THIS CAUSES THE PROBLEM !!!!!!!
         args = [int(slice) for slice in value.split(":")]
         value = wx.DateTimeFromHMS(*args)
     except:
         raise
     if self.IsLimited() and not self.IsInBounds(value):
         raise ValueError(
             'value %s is not within the bounds of the control' %
             str(value))
     return value
    def DrawHours(self, x, y, w, h, direction, includeText=True):
        if direction == wxSCHEDULER_VERTICAL:
            brush = self.context.CreateLinearGradientBrush(
                x, y, x + w, y + h, SCHEDULER_BACKGROUND_BRUSH(),
                DAY_BACKGROUND_BRUSH())
            self.context.SetBrush(brush)
            self.context.DrawRectangle(x, y, LEFT_COLUMN_SIZE, h)

        font = wx.NORMAL_FONT
        fsize = font.GetPointSize()
        fweight = font.GetWeight()

        try:
            font.SetWeight(wx.FONTWEIGHT_NORMAL)
            self.context.SetFont(font, wx.BLACK)

            self.context.SetPen(FOREGROUND_PEN)

            if direction == wxSCHEDULER_VERTICAL:
                hourH = 1.0 * h / len(self.displayedHours)
                self.AdjustFontForHeight(font, hourH)
                hourW, _ = self.context.GetTextExtent(
                    ' ' +
                    wxTimeFormat.FormatTime(wx.DateTimeFromHMS(23, 59, 59)))
            else:
                hourW = 1.0 * w / len(self.displayedHours)
                self.AdjustFontForWidth(font, int(hourW * 2 * 0.9))
                _, hourH = self.context.GetTextExtent(
                    ' ' +
                    wxTimeFormat.FormatTime(wx.DateTimeFromHMS(23, 59, 59)))

            if not includeText:
                hourH = 0

            for i, hour in enumerate(self.displayedHours):
                if hour.GetMinute() == 0:
                    if direction == wxSCHEDULER_VERTICAL:
                        self.context.DrawLines([
                            (x + LEFT_COLUMN_SIZE - hourW / 2, y + i * hourH),
                            (x + w, y + i * hourH)
                        ])
                        if includeText:
                            self.context.DrawText(
                                ' ' + wxTimeFormat.FormatTime(hour),
                                x + LEFT_COLUMN_SIZE - hourW - 10,
                                y + i * hourH)
                    else:
                        self.context.DrawLines([(x + i * hourW,
                                                 y + hourH * 1.25),
                                                (x + i * hourW, y + h + 10)])
                        if includeText:
                            self.context.DrawText(
                                wxTimeFormat.FormatTime(hour),
                                x + i * hourW + 5, y + hourH * .25)
                else:
                    if direction == wxSCHEDULER_VERTICAL:
                        self.context.DrawLines([(x + LEFT_COLUMN_SIZE,
                                                 y + i * hourH),
                                                (x + w, y + i * hourH)])
                    else:
                        self.context.DrawLines([(x + i * hourW,
                                                 y + hourH * 1.4),
                                                (x + i * hourW, y + h)])

            if direction == wxSCHEDULER_VERTICAL:
                self.context.DrawLines([(x + LEFT_COLUMN_SIZE - 1, y),
                                        (x + LEFT_COLUMN_SIZE - 1, y + h)])
                return LEFT_COLUMN_SIZE, max(h, DAY_SIZE_MIN.height)
            else:
                self.context.DrawLines([(x, y + hourH * 1.5 - 1),
                                        (x + w, y + hourH * 1.5 - 1)])
                return max(w, DAY_SIZE_MIN.width), hourH * 1.5
        finally:
            font.SetPointSize(fsize)
            font.SetWeight(fweight)
    def DrawHours(self, x, y, w, h, direction, includeText=True):
        if direction == wxSCHEDULER_VERTICAL:
            self.context.SetBrush(wx.Brush(SCHEDULER_BACKGROUND_BRUSH()))
            self.context.DrawRectangle(x, y, LEFT_COLUMN_SIZE, h)

        font = self.context.GetFont()
        fWeight = font.GetWeight()
        fSize = font.GetPointSize()
        try:
            font.SetWeight(wx.FONTWEIGHT_NORMAL)
            self.context.SetFont(font)
            self.context.SetTextForeground(wx.BLACK)

            if direction == wxSCHEDULER_VERTICAL:
                hourH = 1.0 * h / len(self.displayedHours)
                self.AdjustFontForHeight(font, hourH)
                hourW, _ = self.context.GetTextExtent(
                    ' ' +
                    wxTimeFormat.FormatTime(wx.DateTimeFromHMS(23, 59, 59)))
            else:
                hourW = 1.0 * w / len(self.displayedHours)
                self.AdjustFontForWidth(font, int(hourW * 2 * 0.9))
                _, hourH = self.context.GetTextExtent(
                    ' ' +
                    wxTimeFormat.FormatTime(wx.DateTimeFromHMS(23, 59, 59)))

            if not includeText:
                hourH = 0

            for i, hour in enumerate(self.displayedHours):
                if hour.GetMinute() == 0:
                    if direction == wxSCHEDULER_VERTICAL:
                        self.context.DrawLine(x + LEFT_COLUMN_SIZE - hourW / 2,
                                              y + i * hourH, x + w,
                                              y + i * hourH)
                        if includeText:
                            self.context.DrawText(
                                wxTimeFormat.FormatTime(hour),
                                x + LEFT_COLUMN_SIZE - hourW - 5,
                                y + i * hourH)
                    else:
                        self.context.DrawLine(x + i * hourW, y + hourH * 1.25,
                                              x + i * hourW, y + h)
                        if includeText:
                            self.context.DrawText(
                                wxTimeFormat.FormatTime(hour),
                                x + i * hourW + 5, y + hourH * .25)
                else:
                    if direction == wxSCHEDULER_VERTICAL:
                        self.context.DrawLine(x + LEFT_COLUMN_SIZE,
                                              y + i * hourH, x + w,
                                              y + i * hourH)
                    else:
                        self.context.DrawLine(x + i * hourW, y + hourH * 1.4,
                                              x + i * hourW, y + h)

            if direction == wxSCHEDULER_VERTICAL:
                self.context.DrawLine(x + LEFT_COLUMN_SIZE - 1, y,
                                      x + LEFT_COLUMN_SIZE - 1, y + h)
                return LEFT_COLUMN_SIZE, max(h, DAY_SIZE_MIN.height)
            else:
                self.context.DrawLine(x, y + hourH * 1.5 - 1, x + w,
                                      y + hourH * 1.5 - 1)
                return max(w, DAY_SIZE_MIN.width), hourH * 1.5
        finally:
            font.SetWeight(fWeight)
            font.SetPointSize(fSize)
Esempio n. 9
0
    def __init__(self, parent, config):
        wx.Dialog.__init__(self,
                           parent,
                           -1,
                           _('Settings'),
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)

        # notebook
        self.notebook = wx.Notebook(self, -1)
        self.notebook_gammu = wx.Panel(self.notebook, -1)
        self.notebook_connection = wx.Panel(self.notebook, -1)
        self.notebook_messages = wx.Panel(self.notebook, -1)
        self.notebook_view = wx.Panel(self.notebook, -1)
        self.notebook_other = wx.Panel(self.notebook, -1)
        self.notebook_hacks = wx.Panel(self.notebook, -1)

        # main layout
        self.sizer = wx.lib.rcsizer.RowColSizer()

        self.sizer.AddGrowableCol(2)
        self.sizer.AddGrowableRow(1)

        self.sizer.AddSpacer(1, 1, pos=(0, 0))
        self.sizer.AddSpacer(1, 1, pos=(0, 4))

        self.sizer.Add(self.notebook, pos=(1, 1), colspan=3, flag=wx.EXPAND)

        self.sizer.Add(wx.StaticLine(self, -1),
                       pos=(2, 1),
                       colspan=3,
                       flag=wx.EXPAND)

        self.button_sizer = wx.StdDialogButtonSizer()
        self.button_sizer.AddButton(wx.Button(self, wx.ID_OK))
        self.button_sizer.AddButton(wx.Button(self, wx.ID_CANCEL))
        self.button_sizer.Realize()

        self.sizer.Add(self.button_sizer,
                       pos=(3, 1),
                       colspan=3,
                       flag=wx.ALIGN_RIGHT)

        self.sizer.AddSpacer(1, 1, pos=(4, 0), colspan=5)

        self.config = config
        self.gammu_config = config.gammu

        # gammu tab
        self.sizer_gammu = wx.lib.rcsizer.RowColSizer()

        self.sizer_gammu.AddGrowableCol(1)

        self.sizer_gammu.AddSpacer(1, 1, pos=(0, 0))
        r = 1

        self.editcfgpath = FileBrowseButton(
            self.notebook_gammu,
            size=(250, -1),
            labelText='',
            initialValue=config.Read('/Gammu/Gammurc', False),
            toolTip=
            _('Please enter here path to gammu configuration file you want to use.'
              ),
            changeCallback=self.OnConfigChange,
            fileMode=wx.OPEN)
        self.sizer_gammu.Add(wx.StaticText(self.notebook_gammu, -1,
                                           _('Gammurc path')),
                             pos=(r, 1),
                             flag=wx.ALIGN_CENTER_VERTICAL)
        self.sizer_gammu.Add(self.editcfgpath, pos=(r, 2), flag=wx.EXPAND)
        r += 1

        self.sizer_gammu.Add(wx.StaticText(
            self.notebook_gammu, -1,
            _('You can configure connection parameters on Connection tab.')),
                             pos=(r, 1),
                             colspan=2)
        r += 1

        self.sizer_gammu.AddSpacer(1, 1, pos=(r, 3))
        r += 1

        self.editauto = wx.CheckBox(
            self.notebook_gammu, -1,
            _('Automatically connect to phone on startup'))
        self.editauto.SetToolTipString(
            _('Whether you want application automatically connect to phone when it is started.'
              ))
        self.editauto.SetValue(config.Read('/Wammu/AutoConnect') == 'yes')
        self.sizer_gammu.Add(self.editauto, pos=(r, 1), colspan=2)
        r += 1

        self.editdebug = wx.CheckBox(self.notebook_gammu, -1,
                                     _('Show debug log'))
        self.editdebug.SetToolTipString(
            _('Show debug information on error output.'))
        self.editdebug.SetValue(config.Read('/Debug/Show') == 'yes')
        self.sizer_gammu.Add(self.editdebug, pos=(r, 1), colspan=2)
        r += 1

        self.editsync = wx.CheckBox(self.notebook_gammu, -1,
                                    _('Synchronize time'))
        self.editsync.SetToolTipString(
            _('Synchronise time in phone with computer time while connecting.')
        )
        self.editsync.SetValue(config.ReadBool('/Gammu/SyncTime'))
        self.sizer_gammu.Add(self.editsync, pos=(r, 1), colspan=2)
        r += 1

        self.editinfo = wx.CheckBox(self.notebook_gammu, -1,
                                    _('Startup information'))
        self.editinfo.SetToolTipString(
            _('Display startup on phone (not supported by all models).'))
        self.editinfo.SetValue(config.ReadBool('/Gammu/StartInfo'))
        self.sizer_gammu.Add(self.editinfo, pos=(r, 1), colspan=2)
        r += 1

        if sys.platform != 'win32':
            # locking not available on windoze
            self.editlock = wx.CheckBox(self.notebook_gammu, -1,
                                        _('Lock device'))
            self.editlock.SetToolTipString(
                _('Whether to lock device in /var/lock. On some systems you might lack privileges to do so.'
                  ))
            self.editlock.SetValue(config.ReadBool('/Gammu/LockDevice'))
            self.sizer_gammu.Add(self.editlock, pos=(r, 1), colspan=2)
            r += 1

        self.sizer_gammu.AddSpacer(1, 1, pos=(r, 3))

        # size gammu tab
        self.notebook_gammu.SetAutoLayout(True)
        self.notebook_gammu.SetSizer(self.sizer_gammu)
        self.sizer_gammu.Fit(self.notebook_gammu)
        self.sizer_gammu.SetSizeHints(self.notebook_gammu)

        # connection tab
        self.sizer_connection = wx.lib.rcsizer.RowColSizer()

        self.sizer_connection.AddGrowableCol(1)

        self.sizer_connection.AddSpacer(1, 1, pos=(0, 0))
        r = 1

        lst, choices = config.gammu.GetConfigList()
        self.editsection = wx.Choice(self.notebook_connection,
                                     choices=choices,
                                     size=(250, -1))
        section = config.ReadInt('/Gammu/Section')
        for i in range(len(lst)):
            if lst[i]['Id'] == section:
                self.editsection.SetSelection(i)
                break
        self.sizer_connection.Add(wx.StaticText(self.notebook_connection, -1,
                                                _('Phone connection')),
                                  pos=(r, 1),
                                  rowspan=2,
                                  flag=wx.ALIGN_CENTER_VERTICAL)
        self.sizer_connection.Add(self.editsection, pos=(r, 2))
        self.Bind(wx.EVT_CHOICE, self.OnConnectionChange, self.editsection)
        r += 1

        self.addsection = wx.Button(self.notebook_connection, wx.ID_ADD)
        self.sizer_connection.Add(self.addsection, pos=(r, 2), flag=wx.EXPAND)
        r += 1

        self.sizer_connection.AddSpacer(1, 1, pos=(r, 3))
        r += 1

        self.editname = wx.TextCtrl(self.notebook_connection,
                                    -1,
                                    '',
                                    size=(250, -1))
        self.editname.SetToolTipString(_('Name for this configuration.'))
        self.sizer_connection.Add(wx.StaticText(self.notebook_connection, -1,
                                                _('Name')),
                                  pos=(r, 1),
                                  flag=wx.ALIGN_CENTER_VERTICAL)
        self.sizer_connection.Add(self.editname, pos=(r, 2))
        r += 1

        self.editdev = wx.ComboBox(self.notebook_connection,
                                   -1,
                                   '',
                                   choices=Wammu.Data.Devices,
                                   size=(150, -1))
        self.editdev.SetToolTipString(
            _('Device, where your phone is connected.'))
        self.sizer_connection.Add(wx.StaticText(self.notebook_connection, -1,
                                                _('Device')),
                                  pos=(r, 1),
                                  flag=wx.ALIGN_CENTER_VERTICAL)
        self.sizer_connection.Add(self.editdev,
                                  pos=(r, 2),
                                  flag=wx.ALIGN_RIGHT | wx.EXPAND)
        r += 1

        self.editconn = wx.ComboBox(self.notebook_connection,
                                    -1,
                                    '',
                                    choices=Wammu.Data.Connections,
                                    size=(150, -1))
        self.editconn.SetToolTipString(
            _('Connection which your phone understands, check Gammu documentation for connection details.'
              ))
        self.sizer_connection.Add(wx.StaticText(self.notebook_connection, -1,
                                                _('Connection')),
                                  pos=(r, 1),
                                  flag=wx.ALIGN_CENTER_VERTICAL)
        self.sizer_connection.Add(self.editconn,
                                  pos=(r, 2),
                                  flag=wx.ALIGN_RIGHT | wx.EXPAND)
        r += 1

        self.editmodel = wx.ComboBox(self.notebook_connection,
                                     -1,
                                     '',
                                     choices=Wammu.Data.Models,
                                     size=(150, -1))
        self.editmodel.SetToolTipString(
            _('Phone model, you can usually keep here auto unless you have any problems.'
              ))
        if self.editmodel.GetValue() == '':
            self.editmodel.SetValue('auto')
        self.sizer_connection.Add(wx.StaticText(self.notebook_connection, -1,
                                                _('Model')),
                                  pos=(r, 1),
                                  flag=wx.ALIGN_CENTER_VERTICAL)
        self.sizer_connection.Add(self.editmodel,
                                  pos=(r, 2),
                                  flag=wx.ALIGN_RIGHT | wx.EXPAND)
        r += 1

        # Initialise above fields
        self.OnConnectionChange()

        self.sizer_connection.AddSpacer(1, 1, pos=(r, 3))

        # size connection tab
        self.notebook_connection.SetAutoLayout(True)
        self.notebook_connection.SetSizer(self.sizer_connection)
        self.sizer_connection.Fit(self.notebook_connection)
        self.sizer_connection.SetSizeHints(self.notebook_connection)

        # messages tab
        self.sizer_messages = wx.lib.rcsizer.RowColSizer()

        self.sizer_messages.AddGrowableCol(1)

        self.sizer_messages.AddSpacer(1, 1, pos=(0, 0))
        r = 1

        v = config.ReadInt('/Message/ScaleImage')
        self.editscale = wx.SpinCtrl(self.notebook_messages,
                                     -1,
                                     str(v),
                                     style=wx.SP_WRAP | wx.SP_ARROW_KEYS,
                                     min=1,
                                     max=20,
                                     initial=v,
                                     size=(150, -1))
        self.editscale.SetToolTipString(
            _('Whether images in messages should be scaled when displayed. This is usually good idea as they are pretty small.'
              ))
        self.sizer_messages.Add(wx.StaticText(self.notebook_messages, -1,
                                              _('Scale images')),
                                pos=(r, 1))
        self.sizer_messages.Add(self.editscale, pos=(r, 2))
        r += 1

        self.editformat = wx.CheckBox(self.notebook_messages, -1,
                                      _('Attempt to reformat text'))
        self.editformat.SetToolTipString(
            _('If you get sometimes "compressed" messages likeTHIStext, you should be interested in this choice.'
              ))
        self.editformat.SetValue(config.Read('/Message/Format') == 'yes')
        self.sizer_messages.Add(self.editformat, pos=(r, 1), colspan=2)
        r += 1

        # options for new message
        self.new_message_panel = wx.Panel(self.notebook_messages, -1)
        self.sizer_messages.Add(self.new_message_panel,
                                pos=(r, 1),
                                colspan=2,
                                flag=wx.EXPAND)
        r += 1

        self.sizer_message_new = wx.StaticBoxSizer(
            wx.StaticBox(self.new_message_panel, -1,
                         _('Default options for new message')), wx.HORIZONTAL)
        self.new_message_panel_2 = wx.Panel(self.new_message_panel, -1)
        self.sizer_message_new.Add(self.new_message_panel_2, 1, wx.EXPAND, 0)

        self.sizer_message_new_2 = wx.lib.rcsizer.RowColSizer()

        self.sizer_message_new_2.AddGrowableCol(1)

        r2 = 0

        self.editconcat = wx.CheckBox(self.new_message_panel_2, -1,
                                      _('Concatenated'))
        self.editconcat.SetToolTipString(
            _('Create concatenated message, what allows to send longer messages.'
              ))
        self.editconcat.SetValue(config.Read('/Message/Concatenated') == 'yes')
        self.sizer_message_new_2.Add(self.editconcat, pos=(r2, 0), colspan=2)
        r2 += 1

        self.editunicode = wx.CheckBox(self.new_message_panel_2, -1,
                                       _('Create unicode message'))
        self.editunicode.SetToolTipString(
            _('Unicode messages can contain national and other special characters, check this if you use non latin-1 characters. Your messages will require more space, so you can write less characters into single message.'
              ))
        self.editunicode.SetValue(config.Read('/Message/Unicode') == 'yes')
        self.sizer_message_new_2.Add(self.editunicode, pos=(r2, 0), colspan=2)
        r2 += 1

        self.editreport = wx.CheckBox(self.new_message_panel_2, -1,
                                      _('Request delivery report by default'))
        self.editreport.SetToolTipString(
            _('Check to request delivery report for message.'))
        self.editreport.SetValue(
            config.Read('/Message/DeliveryReport') == 'yes')
        self.sizer_message_new_2.Add(self.editreport, pos=(r2, 0), colspan=2)
        r2 += 1

        self.edit16bit = wx.CheckBox(self.new_message_panel_2, -1,
                                     _('Use 16bit Id'))
        self.edit16bit.SetToolTipString(
            _('Use 16 bit Id inside message. This is safe for most cases.'))
        self.edit16bit.SetValue(config.Read('/Message/16bitId') == 'yes')
        self.sizer_message_new_2.Add(self.edit16bit, pos=(r2, 0), colspan=2)
        r2 += 1

        self.new_message_panel_2.SetAutoLayout(True)
        self.new_message_panel_2.SetSizer(self.sizer_message_new_2)
        self.sizer_message_new_2.Fit(self.new_message_panel_2)
        self.sizer_message_new_2.SetSizeHints(self.new_message_panel_2)

        self.new_message_panel.SetAutoLayout(True)
        self.new_message_panel.SetSizer(self.sizer_message_new)
        self.sizer_message_new.Fit(self.new_message_panel)
        self.sizer_message_new.SetSizeHints(self.new_message_panel)

        self.sizer_messages.AddSpacer(1, 1, pos=(r, 3))

        # size messages tab
        self.notebook_messages.SetAutoLayout(True)
        self.notebook_messages.SetSizer(self.sizer_messages)
        self.sizer_messages.Fit(self.notebook_messages)
        self.sizer_messages.SetSizeHints(self.notebook_messages)

        # view tab
        self.sizer_view = wx.lib.rcsizer.RowColSizer()

        self.sizer_view.AddGrowableCol(1)

        self.sizer_view.AddSpacer(1, 1, pos=(0, 0))
        r = 1

        v = config.Read('/Wammu/NameFormat')
        self.editnameformat = wx.Choice(
            self.notebook_view,
            choices=[
                _('Automatic'),
                _('Automatic starting with first name'),
                _('Automatic starting with last name'),
                _('Custom, use format string below')
            ],
            size=(250, -1))
        if v == 'auto':
            self.editnameformat.SetSelection(0)
        elif v == 'auto-first-last':
            self.editnameformat.SetSelection(1)
        elif v == 'auto-last-first':
            self.editnameformat.SetSelection(2)
        elif v == 'custom':
            self.editnameformat.SetSelection(3)
        self.sizer_view.Add(wx.StaticText(self.notebook_view, -1,
                                          _('Name display format')),
                            pos=(r, 1))
        self.sizer_view.Add(self.editnameformat, pos=(r, 2), flag=wx.EXPAND)
        self.Bind(wx.EVT_CHOICE, self.OnNameFormatChange, self.editnameformat)
        r += 1

        v = config.Read('/Wammu/NameFormatString')
        self.editnamestring = wx.ComboBox(
            self.notebook_view,
            -1,
            v,
            choices=[
                v,
                '%(FirstName)s %(LastName)s (%(Company)s)',
                '%(LastName)s, %(FirstName)s (%(Company)s)',
                '%(LastName)s, %(FirstName)s (%(NickName)s)',
            ])
        # l10n: The %s will be replaced by list of currently supported tags, %%(value)s should be kept intact (you can translate word value).
        self.editnamestring.SetToolTipString(
            _('Format string for name displaying. You can use %%(value)s format marks. Currently available values are: %s.'
              ) % 'Name, FirstName, LastName, NickName, FormalName, Company')
        self.sizer_view.Add(wx.StaticText(self.notebook_view, -1,
                                          _('Name format string')),
                            pos=(r, 1),
                            flag=wx.ALIGN_CENTER_VERTICAL)
        self.sizer_view.Add(self.editnamestring,
                            pos=(r, 2),
                            flag=wx.ALIGN_RIGHT | wx.EXPAND)
        r += 1

        self.sizer_view.AddSpacer(1, 1, pos=(r, 3))

        # size view tab
        self.notebook_view.SetAutoLayout(True)
        self.notebook_view.SetSizer(self.sizer_view)
        self.sizer_view.Fit(self.notebook_view)
        self.sizer_view.SetSizeHints(self.notebook_view)

        # other tab
        self.sizer_other = wx.lib.rcsizer.RowColSizer()

        self.sizer_other.AddGrowableCol(1)

        self.sizer_other.AddSpacer(1, 1, pos=(0, 0))
        r = 1

        v = config.ReadInt('/Wammu/RefreshState')
        self.editrefresh = wx.SpinCtrl(self.notebook_other,
                                       -1,
                                       str(v),
                                       style=wx.SP_WRAP | wx.SP_ARROW_KEYS,
                                       min=0,
                                       max=10000000,
                                       initial=v,
                                       size=(150, -1))
        self.editrefresh.SetToolTipString(
            _('How often refresh phone state in application status bar. Enter value in miliseconds, 0 to disable.'
              ))
        self.sizer_other.Add(wx.StaticText(self.notebook_other, -1,
                                           _('Refresh phone state')),
                             pos=(r, 1))
        self.sizer_other.Add(self.editrefresh, pos=(r, 2))
        r += 1

        self.editconfirm = wx.CheckBox(self.notebook_other, -1,
                                       _('Confirm deleting'))
        self.editconfirm.SetToolTipString(
            _('Whether to ask for confirmation when deleting entries.'))
        self.editconfirm.SetValue(config.Read('/Wammu/ConfirmDelete') == 'yes')
        self.sizer_other.Add(self.editconfirm, pos=(r, 1), colspan=2)
        r += 1

        self.taskbaricon = wx.CheckBox(self.notebook_other, -1,
                                       _('Task bar icon'))
        self.taskbaricon.SetToolTipString(_('Show icon in task bar.'))
        self.taskbaricon.SetValue(config.Read('/Wammu/TaskBarIcon') == 'yes')
        self.sizer_other.Add(self.taskbaricon, pos=(r, 1), colspan=2)
        r += 1

        dtime = config.Read('/Wammu/DefaultTime')
        try:
            times = dtime.split(':')
            th = int(times[0])
            tm = int(times[1])
            ts = int(times[2])
        except:
            th = 9
            tm = 0
            ts = 0
        self.edittime = TimeCtrl(self.notebook_other, -1, fmt24hr=True)
        Wammu.Utils.FixupMaskedEdit(self.edittime)
        self.edittime.SetValue(wx.DateTimeFromHMS(th, tm, ts))
        self.edittime.SetToolTipString(
            _('Default time to be used for newly created time fields.'))
        self.sizer_other.Add(wx.StaticText(self.notebook_other, -1,
                                           _('Default time')),
                             pos=(r, 1))
        self.sizer_other.Add(self.edittime, pos=(r, 2))
        r += 1

        v = config.ReadInt('/Wammu/DefaultDateOffset')
        self.editdate = wx.SpinCtrl(self.notebook_other,
                                    -1,
                                    str(v),
                                    style=wx.SP_WRAP | wx.SP_ARROW_KEYS,
                                    min=-10000000,
                                    max=10000000,
                                    initial=v,
                                    size=(150, -1))
        self.editdate.SetToolTipString(
            _('Default date to be used for newly created time fields. Enter amount of days from today (1=tomorrow).'
              ))
        self.sizer_other.Add(wx.StaticText(self.notebook_other, -1,
                                           _('Default date=now + x days')),
                             pos=(r, 1))
        self.sizer_other.Add(self.editdate, pos=(r, 2))
        r += 1

        v = config.ReadInt('/Wammu/DefaultEntries')
        self.editentries = wx.SpinCtrl(self.notebook_other,
                                       -1,
                                       str(v),
                                       style=wx.SP_WRAP | wx.SP_ARROW_KEYS,
                                       min=0,
                                       max=20,
                                       initial=v,
                                       size=(150, -1))
        self.editentries.SetToolTipString(
            _('How many entries will be shown in newly created item.'))
        self.sizer_other.Add(wx.StaticText(self.notebook_other, -1,
                                           _('Entries for new item')),
                             pos=(r, 1))
        self.sizer_other.Add(self.editentries, pos=(r, 2))
        r += 1

        lst = ['Auto']
        lst += Wammu.Data.InternationalPrefixes
        self.editprefix = wx.ComboBox(self.notebook_other,
                                      -1,
                                      config.Read('/Wammu/PhonePrefix'),
                                      choices=lst,
                                      size=(150, -1))
        self.editprefix.SetToolTipString(
            _('Prefix for non international phone numbers.'))
        self.sizer_other.Add(wx.StaticText(self.notebook_other, -1,
                                           _('Number prefix')),
                             pos=(r, 1))
        self.sizer_other.Add(self.editprefix, pos=(r, 2))
        r += 1

        self.sizer_other.AddSpacer(1, 1, pos=(r, 3))

        # size other tab
        self.notebook_other.SetAutoLayout(True)
        self.notebook_other.SetSizer(self.sizer_other)
        self.sizer_other.Fit(self.notebook_other)
        self.sizer_other.SetSizeHints(self.notebook_other)

        # hacks tab
        self.sizer_hacks = wx.lib.rcsizer.RowColSizer()

        self.sizer_hacks.AddGrowableCol(1)

        self.sizer_hacks.AddSpacer(1, 1, pos=(0, 0))
        r = 1

        v = config.ReadInt('/Hacks/MaxEmptyGuess')
        self.editmaxemptyguess = wx.SpinCtrl(self.notebook_hacks,
                                             -1,
                                             str(v),
                                             style=wx.SP_WRAP
                                             | wx.SP_ARROW_KEYS,
                                             min=0,
                                             max=10000000,
                                             initial=v,
                                             size=(150, -1))
        self.editmaxemptyguess.SetToolTipString(
            _('Applies only when Wammu can not find proper count of entries to read. This number limits how many empty entries will be read before reading will be stopped.'
              ))
        self.sizer_hacks.Add(wx.StaticText(
            self.notebook_hacks, -1,
            _('Maximal empty entries if total is guessed')),
                             pos=(r, 1))
        self.sizer_hacks.Add(self.editmaxemptyguess, pos=(r, 2))
        r += 1

        v = config.ReadInt('/Hacks/MaxEmptyKnown')
        self.editmaxemptyknown = wx.SpinCtrl(self.notebook_hacks,
                                             -1,
                                             str(v),
                                             style=wx.SP_WRAP
                                             | wx.SP_ARROW_KEYS,
                                             min=0,
                                             max=10000000,
                                             initial=v,
                                             size=(150, -1))
        self.editmaxemptyknown.SetToolTipString(
            _('In case phone reports wrongly number of entries, Wammu would try to read infinitely or till error. This number limits how many empty entries will be read before reading will be stopped.'
              ))
        self.sizer_hacks.Add(wx.StaticText(
            self.notebook_hacks, -1,
            _('Maximal empty entries if total is known')),
                             pos=(r, 1))
        self.sizer_hacks.Add(self.editmaxemptyknown, pos=(r, 2))
        r += 1

        self.sizer_hacks.AddSpacer(1, 1, pos=(r, 3))

        # size hacks tab
        self.notebook_hacks.SetAutoLayout(True)
        self.notebook_hacks.SetSizer(self.sizer_hacks)
        self.sizer_hacks.Fit(self.notebook_hacks)
        self.sizer_hacks.SetSizeHints(self.notebook_hacks)

        # add pages to notebook
        self.notebook.AddPage(self.notebook_gammu, _('Gammu'))
        self.notebook.AddPage(self.notebook_connection, _('Connection'))
        self.notebook.AddPage(self.notebook_messages, _('Messages'))
        self.notebook.AddPage(self.notebook_view, _('View'))
        self.notebook.AddPage(self.notebook_other, _('Other'))
        self.notebook.AddPage(self.notebook_hacks, _('Hacks'))

        # size main layout
        self.SetAutoLayout(True)
        self.SetSizer(self.sizer)
        self.sizer.Fit(self)
        self.sizer.SetSizeHints(self)

        # workaround, when sizers don't set correct size
        sz = self.GetSize()
        if sz.y < 150:
            self.SetSize((400, 400))

        # Intialise fields
        self.OnNameFormatChange()

        # event handlers
        self.Bind(wx.EVT_BUTTON, self.Okay, id=wx.ID_OK)
        self.Bind(wx.EVT_BUTTON, self.AddPhone, id=wx.ID_ADD)
 def testPopulatesTimeFromWxTime(self):
     py_time = wx.DateTimeFromHMS(6, 9)
     self.controller.set_time(py_time)
     self.py_time_picker.set_time_string.assert_called_with("06:09")