Ejemplo n.º 1
0
    def popup(self):
        if hasattr(self, '_menu') and self._menu: self._menu.Destroy()
        from gui.uberwidgets.umenu import UMenu
        menu = UMenu(self)
        if not self.data.type == 'fb':
            menu.AddItem(_('&Edit'), callback=lambda: self.on_edit())
        menu.AddItem(_('&Delete'), callback=lambda: self.on_delete())
        menu.AddSep()
        common.actions.menu(self, self.data, menu)

        self._menu = menu
        return menu
Ejemplo n.º 2
0
    def popup(self):
        if hasattr(self, '_menu') and self._menu: self._menu.Destroy()
        menu = UMenu(self)

        menu.AddItem(_('&Edit'),   callback = lambda: self.on_edit())
        menu.AddItem(_('&Remove'), callback = lambda: self.on_delete())

        menu.AddSep()
        actions.menu(self, self.data, menu)

        self._menu = menu
        return menu
Ejemplo n.º 3
0
def default_umenu(tc):
    from gui.uberwidgets.umenu import UMenu
    m = UMenu(tc)

    # spelling suggestions and options
    if isinstance(tc, SpellCheckTextCtrlMixin):
        tc.AddSuggestionsToMenu(m)

    m.AddItem(_('Copy'),  id = wx.ID_COPY,  callback = tc.Copy)
    m.AddItem(_('Paste'), id = wx.ID_PASTE, callback = tc.Paste)
    m.AddSep()

    from gui.toolbox import add_rtl_checkbox
    add_rtl_checkbox(tc, m)

    return m
Ejemplo n.º 4
0
    def on_fbar_context_menu(self, e):
        # TODO: why isn't the IM window's formatting bar its own subclass!?

        from gui.uberwidgets.umenu import UMenu
        m = UMenu(self)
        m.AddItem(_('Hide Formatting Bar'), callback = lambda: wx.CallAfter(setpref, 'messaging.show_formatting_bar', False))
        m.PopupMenu()
Ejemplo n.º 5
0
def metacontact_buddy_menu(menu, mc):
    lenmc = len(mc)

    for contact in mc:
        # add a service specific menu for each contact in the metacontact
        contact_menu = Menu(menu.Window)

        # search_bases = False means we'll get the actions specific to the buddy's service
        actions.menu(menu.Window, contact, contact_menu, search_bases=False)

        if contact_menu[0].IsSeparator():
            contact_menu.RemoveItem(contact_menu[0])

        if lenmc > 2:
            contact_menu.AddSep()
            contact_menu.AddItem(_('&Remove from Merged Contact'),
                                 callback=lambda contact=contact: mc.manager.
                                 remove(mc, contact))

        # use the contact's service icon for the submenu (greyed out if offline)
        icon = contact.serviceicon
        if not contact.online:
            icon = icon.Greyed

        menu.AddSubMenu(contact_menu, contact.name, bitmap=icon)
Ejemplo n.º 6
0
    def CreatePopupMenu(self):
        buddy_frame = wx.FindWindowByName('Buddy List')

        # TODO: fix skinned menus so that they don't need to be told they are in the system tray!
        umenu = UMenu(buddy_frame, onshow=None, windowless=True)

        add_hidden_convo_menu_items(umenu)

        statuscombo.add_global_to_menu(umenu, _('Set &Global Status...'))
        statmenu = UMenu(
            buddy_frame,
            onshow=None)  #statuscombo.create_status_menu(add_custom = True)
        statuscombo.status_menu(statmenu, add_custom=True, add_promote=True)
        umenu.AddSubMenu(statmenu, _('Set IM &Status'))

        umenu.AddSep()

        show_hide = umenu.AddItem(_('Show &Buddy List'),
                                  id=actionIDs.ShowBuddyList)
        if buddy_frame:
            docker = getattr(buddy_frame, 'docker', None)

            if docker:
                disable_hide = docker.Enabled and docker.docked and docker.AutoHide
                show_hide.label = _(
                    'Hide &Buddy List') if buddy_frame.Shown else _(
                        'Show &Buddy List')
                show_hide.Enable(not disable_hide)

        # The menubar is the "app" menubar on Mac and thus cannot be hidden.
        if platformName != 'mac':
            umenu.AddPrefCheck('buddylist.show_menubar', _('Show Menu Bar'))

        umenu.AddItem(_('&Preferences...'), id=wx.ID_PREFERENCES)

        # Mac gets this menu item standard on the Dock, don't duplicate it.
        if platformName != 'mac':
            umenu.AddSep()
            umenu.AddItem(_('E&xit Digsby'), id=wx.ID_EXIT)

        # since status items are created dynamically, we must bind to them on the fly.
        self.SetupStatusHandlers()

        return umenu
Ejemplo n.º 7
0
    def GenMenu(self):
        m = UMenu(self)

        # spelling suggestions and options
        if isinstance(self, SpellCheckTextCtrlMixin):
            if self.AddSuggestionsToMenu(m):
                m.AddSep()

        m.AddItem(_('Cut'),   id = wx.ID_CUT,   callback = self.Cut)
        m.AddItem(_('Copy'),  id = wx.ID_COPY,  callback = self.Copy)
        m.AddItem(_('Paste'), id = wx.ID_PASTE, callback = self.Paste)
        m.AddSep()
        m.AddItem(_('Select All'), id = wx.ID_SELECTALL, callback = lambda: self.SetSelection(0, self.GetLastPosition()))
        m.AddSep()

        from gui.toolbox import add_rtl_checkbox
        add_rtl_checkbox(self, m)

        return m
Ejemplo n.º 8
0
def GetTextCtrlMenu(self):
    from gui.uberwidgets.umenu import UMenu

    m, tc = UMenu(self), self.input_area.tc

    # spelling suggestions and options
    from gui.spellchecktextctrlmixin import add_spelling_suggestions
    if add_spelling_suggestions(tc, m):
        m.AddSep()

    m.AddItem(
        _('Copy'), id=wx.ID_COPY,
        callback=tc.Copy)  # todo: disable if "not tc.CanCopy()" when shown.
    m.AddItem(_('Paste'), id=wx.ID_PASTE, callback=tc.Paste)
    m.AddSep()

    m.AddPrefCheck('messaging.show_actions_bar', _('Show &Actions Bar'))
    m.AddPrefCheck('messaging.show_formatting_bar', _('Show &Formatting Bar'))
    m.AddPrefCheck('messaging.show_send_button', _('Show Send Button'))
    m.AddSep()
    gui.toolbox.add_rtl_checkbox(tc, m)

    return m
Ejemplo n.º 9
0
    def build_actionsbar_menu(self):
        m = UMenu(self, onshow=self.update_actionsbar_menu)

        c = self._actionsbar_checks = {}
        for name, label in [('icons', _('Icons Only')),
                            ('text', _('Text Only')),
                            ('next', _('Icons Next to Text')),
                            ('above', _('Icons Above Text'))]:

            def cb(name=name):
                with self.Frozen():
                    setpref(action_icons_key, name)

            c[name] = m.AddCheckItem(label, callback=cb)

        m.AddSep()
        m.AddItem(
            _('Hide Actions Bar'),
            callback=lambda: setpref('messaging.show_actions_bar', False))

        return m
Ejemplo n.º 10
0
def GetMenu(self):
    try:
        self._menu.Destroy()
    except AttributeError:
        pass

    from gui.uberwidgets.umenu import UMenu
    m = UMenu(self, onshow=self._onpopupshown)

    self._menu = m
    self._topid = id(self.Top)

    self.keep_on_top = m.AddCheckItem(_('&Keep on Top'),
                                      callback=self.Top.ToggleOnTop)
    self.view_past_chats_item = m.AddItem(_('&View Past Chats'),
                                          callback=self._on_view_past_chats)

    m.AddSep()

    add, addcheck, setmode = m.AddItem, m.AddCheckItem, self.set_mode

    c = self.capsbuttons = {}
    buddy = self.Buddy
    for bname, caption in buttons:
        if bname == 'files':
            c[bname] = add(caption, callback=lambda: self.Buddy.send_file())
        else:
            if buddy is None or (bname == 'sms' and 'SMS' not in buddy.caps):
                continue

            c[bname] = addcheck(
                caption,
                callback=lambda b=bname: setmode(b, toggle_tofrom=b == 'im'))

    m.AddSep()

    self.edit_items = {}
    self.edit_items['Copy'] = add(_('Copy\tCtrl+C'), id=wx.ID_COPY)

    # add a "Copy Link" item if the mouse is hovering over a link
    message_area = getattr(self, 'message_area', None)
    if message_area is not None:  # may not be created yet.
        ctrl = wx.FindWindowAtPointer()
        if ctrl is message_area:
            info = ctrl.HitTest(ctrl.ScreenToClient(wx.GetMousePosition()))
            if info.Link:
                add(_('Copy &Link'),
                    callback=lambda: clipboard.copy(info.Link))

    self.paste_item = self.edit_items['Paste'] = add(_('Paste\tCtrl+V'),
                                                     id=wx.ID_PASTE)
    self.paste_index = len(self._menu) - 1

    if pref('debug.message_area.show_edit_source', False):
        add(_('Edit Source'), callback=lambda: self.message_area.EditSource())
    if pref('debug.message_area.show_jsconsole', False):
        from gui.browser import jsconsole
        add(_('&Javascript Console'),
            callback=lambda: jsconsole.show_console())

    # text size menu
    if message_area is not None and message_area.IsShownOnScreen():
        textsize_menu = UMenu(self)
        self.textbigger = textsize_menu.AddItem(
            _('&Increase Text Size\tCtrl+='),
            callback=message_area.IncreaseTextSize)
        self.textsmaller = textsize_menu.AddItem(
            _('&Decrease Text Size\tCtrl+-'),
            callback=message_area.DecreaseTextSize)
        textsize_menu.AddSep()
        textsize_menu.AddItem(_('&Reset Text Size\tCtrl+0'),
                              callback=message_area.ResetTextSize)

        m.AddSubMenu(textsize_menu, _('&Text Size'))

    m.AddSep()

    # these checkboxes affect a global preference that immediately takes effect in
    # all open ImWins
    self.roomlist_item = m.AddCheckItem(_('Show &Room List'),
                                        callback=self.toggle_roomlist)
    self.actions_item = m.AddPrefCheck('messaging.show_actions_bar',
                                       _('Show &Actions Bar'))
    self.formatting_item = m.AddPrefCheck('messaging.show_formatting_bar',
                                          _('Show &Formatting Bar'))

    return self._menu
Ejemplo n.º 11
0
 def OnContextMenu(self, event):
     from gui.uberwidgets.umenu import UMenu
     m = UMenu(self)
     m.AddItem(_('Hide Formatting Bar'), callback = lambda: wx.CallAfter(setpref, 'messaging.show_formatting_bar', False))
     m.PopupMenu()
Ejemplo n.º 12
0
def create_main_menu(parent):
    'Returns the main menu object.'

    menu = MenuBar(parent, skinkey='menubar')
    digsby = Menu(parent)
    view = Menu(parent)
    tools = Menu(parent)
    help = Menu(parent)

    def makeadd(m):
        return (lambda title, callback=None, id=-1: m.AddItem(
            title, callback=callback, id=id))

    #
    # My Status
    #
    mystatus = Menu(parent, onshow=update_statuses)
    add = makeadd(mystatus)
    add(_('&New Status Message...'), new_status_message)
    add(_('&Edit Status Messages...'), lambda: prefsdialog_show('status'))
    mystatus.AddSep()

    from gui.protocols import add_group

    def add_chat():
        import gui.chatgui
        gui.chatgui.join_chat()

    #
    # Digsby
    #
    digsby.AddSubMenu(mystatus, _('My Status'))
    add = makeadd(digsby)
    add(_('My &Accounts...'), lambda: prefsdialog_show('accounts'))
    digsby.AddSep()
    sendimitem = add(_('&New IM...\tCtrl+N'), ShowNewIMDialog)
    if pref('messaging.groupchat.enabled', False):
        groupchatitem = add(_('New Group C&hat...\tCtrl+Shift+N'), add_chat)
    else:
        groupchatitem = None
    digsby.AddSep()
    addcontactitem = add(_('Add &Contact...\tCtrl+A'),
                         lambda: AddContactDialog.MakeOrShow())
    addgroupitem = add(_('Add &Group...\tCtrl+Shift+A'), lambda: add_group())
    renameitem = add(_('&Rename Selection'),
                     lambda: parent.blist.rename_selected())
    deleteitem = add(
        _('&Delete Selection...'),
        lambda: parent.blist.delete_blist_item(parent.blist.SelectedItem))
    digsby.AddSep()
    add(_('Sign &Off Digsby (%s)') % profile.name, lambda: profile.signoff())
    # wx.App handles this for proper shutdown.
    add(_('E&xit Digsby'), id=wx.ID_EXIT)

    def on_digsby_show(_m):
        b = parent.blist.SelectedItem

        allow_add = any(x.allow_contact_add
                        for x in profile.account_manager.connected_accounts)

        for item in (sendimitem, groupchatitem, addcontactitem, addgroupitem):
            if item is not None:
                item.Enable(allow_add)

        if not allow_rename(b):
            renameitem.SetItemLabel(_('&Rename Selection'))
            deleteitem.SetItemLabel(_('&Delete Selection'))
            renameitem.Enable(False)
            deleteitem.Enable(False)
        else:
            renameitem.SetItemLabel(
                _('&Rename {name}').format(name=getattr(b, 'alias', b.name)))
            deleteitem.SetItemLabel(
                _('&Delete {name}').format(name=getattr(b, 'alias', b.name)))
            renameitem.Enable(True)
            deleteitem.Enable(True)

    #
    # View
    #

    add = makeadd(view)
    view.AddPrefCheck('buddylist.always_on_top', _('&Always On Top'))
    add(_('Skins...\tCtrl+S'), lambda: prefsdialog_show('appearance'))
    view.AddSep()
    view.AddPrefCheck('buddylist.show_menubar', _('&Menu Bar'))

    def on_menubar(val):
        if not val:
            wx.MessageBox(
                _('You can bring back the menubar by right clicking '
                  'on the digsby icon in the task tray.'), _('Hide Menu Bar'))

    profile.prefs.link('buddylist.show_menubar',
                       lambda val: wx.CallAfter(on_menubar, val), False, menu)

    view.AddPrefCheck('buddylist.show_status', _('Status Panel'))
    add(_('Arrange &Panels...'),
        callback=lambda *_a: edit_buddylist_order(parent))
    view.AddSep()
    view.AddPrefCheck('buddylist.show_mobile',
                      _('Show &Mobile Contacts\tCtrl+M'))
    view.AddPrefCheck('buddylist.show_offline',
                      _('Show &Offline Contacts\tCtrl+O'))
    groupoffline = view.AddPrefCheck('buddylist.group_offline',
                                     _('&Group Offline Contacts\tCtrl+G'))

    hideoffline = view.AddPrefCheck('buddylist.hide_offline_groups',
                                    _('&Hide Offline Groups'))

    groupby = Menu(parent)
    add = makeadd(groupby)
    groupby.sorttypes = []

    # sort by
    sortby = Menu(parent)
    add = makeadd(sortby)
    sortby.sorttypes = []

    sort_models = profile.blist.sort_models
    group_by = sort_models[0]
    sort_by = sort_models[1]
    then_by = sort_models[2]

    def addsort(model, view, sortstr, title):
        def set(model=model, view=view, sortstr=sortstr):
            model.selection = [v[0] for v in model.values].index(sortstr)
            view[model.selection].Check(True)

        mi = view.AddCheckItem(title, set)
        view.sorttypes.append(sortstr)
        return mi

    sort_names = dict(
        (('none', _('&None')), ('status', _('&Status')), ('name', _('N&ame')),
         ('log', _('&Log Size')), ('service', _('Ser&vice'))))

    def addsorts(model, view, names):
        for name in names:
            addsort(model=model,
                    view=view,
                    sortstr=name,
                    title=sort_names[name])

    addsorts(model=group_by,
             view=groupby,
             names=[k for k, _v in GROUP_BY_CHOICES])
    groupby.AddSep()
    groupby.AddItem(_('Advan&ced...'),
                    callback=lambda: prefsdialog_show('contact_list'))

    addsorts(model=sort_by,
             view=sortby,
             names=[k for k, _v in SORT_BY_CHOICES])
    sortby.AddSep()

    def sortby_adv_click():
        sortby[-1].Check(then_by.selection > 0)
        prefsdialog_show('contact_list')

    sortby.AddCheckItem(_('Advan&ced...'), callback=sortby_adv_click)
    sortby_adv = sortby[-1]

    groupby.reset_watcher = reset_checks_SortOptionWatcher(
        model=group_by, view=groupby, names=GROUP_BY_CHOICES)
    sortby.reset_watcher = reset_checks_SortOptionWatcher(
        model=sort_by, view=sortby, names=SORT_BY_CHOICES)
    sortby.adv_watcher = reset_check_AdvWatcher(model=then_by, view=sortby_adv)

    view.AddSep()
    view.AddSubMenu(groupby, _('&Group By'))
    view.AddSubMenu(sortby, _('&Sort By'))

    #
    # Tools
    #

    add = makeadd(tools)
    add(_('&Preferences...\tCtrl+P'),
        id=wx.ID_PREFERENCES,
        callback=lambda: prefsdialog_show('accounts'))
    add(_('Buddy List &Search\tCtrl+F'), parent.start_search)
    add(_('&File Transfer History\tCtrl+J'), FileTransferDialog.Display)

    def pb_show():
        from gui.pastbrowser import PastBrowser
        PastBrowser.MakeOrShow()

    add(_('&Chat History\tCtrl+H'), pb_show)

    #
    # Help
    #
    add = makeadd(help)
    add(_('&Documentation'),
        lambda: wx.LaunchDefaultBrowser('http://wiki.digsby.com'))
    add(_('Support &Forums'),
        lambda: wx.LaunchDefaultBrowser('http://forum.digsby.com'))
    help.AddSep()
    add(_('&Submit Bug Report'), do_diagnostic)
    add(_('Su&ggest a Feature'), send_features_email)
    help.AddSep()

    if getattr(sys, 'DEV', False) or pref('debug.console', False):
        add(_('Show Debug Console'), wx.GetApp().toggle_crust)
        help.AddSep()

    add(_('Su&pport Digsby'), lambda: support.SupportFrame.MakeOrShow(parent))

    for hook in Hook("digsby.help.actions"):
        help_menu_items = hook()
        for item in help_menu_items:
            add(*item)

    def on_view_show(_m):
        sortstatus = pref('buddylist.sortby').startswith('*status')

        showoffline = pref('buddylist.show_offline')
        hidegroups = pref('buddylist.hide_offline_groups')
        groupoff = pref('buddylist.group_offline')

        groupoffline.Enable(not sortstatus and showoffline)
        groupoffline.Check(groupoff and (not sortstatus and showoffline))

        hideoffline.Enable(not sortstatus)
        hideoffline.Check((sortstatus and not showoffline)
                          or (not sortstatus and hidegroups))

    digsbyMenuName = _('&Digsby')
    if config.platformName == "mac":
        digsbyMenuName = _("&File")

    menu.Append(digsby, digsbyMenuName, onshow=on_digsby_show)
    menu.Append(view, _('&View'), onshow=on_view_show)
    menu.Append(tools,
                _('&Tools'),
                onshow=lambda m: on_accounts_entries(parent, m))
    menu.Append(help, _('&Help'))
    return menu
Ejemplo n.º 13
0
    f.Bind(wx.EVT_CLOSE, lambda e: app.ExitMainLoop())
    p = wx.Panel(f)
    f.CenterOnScreen()

    p.Sizer = wx.BoxSizer(wx.VERTICAL)

    bar = UMenuBar(p, p.Sizer)
    bmps = [
        wx.Bitmap('..\\..\\..\\res\\%s.png' % aa)
        for aa in ('online', 'away', 'offline')
    ]

    m = UMenu(f)
    m.AddItem('&Preferences\tCtrl+P',
              callback=lambda: msg('prefs'),
              bitmap=skin.get('serviceicons.aim'))
    accounts_item = m.AddItem('&Accounts\tCtrl+A',
                              callback=lambda: msg('show accounts!'))

    m.AddSep()

    sub = UMenu(f)
    g = sub.AddItem('one', callback=lambda: msg('one!'))
    sub.AddItem('two\tCtrl+T', bitmap=bmps[1])
    three = sub.AddItem('three', bitmap=bmps[2])

    sub4 = UMenu(f)
    sub4.AddItem('foo1')
    sub4.AddItem('&foo')
    sub4.AddItem('&foo2')
Ejemplo n.º 14
0
    def __init__(self,parent):
        SimplePanel.__init__(self, parent, wx.FULL_REPAINT_ON_RESIZE)

        self.BackgroundColour = wx.WHITE

        self.Sizer = wx.BoxSizer(HORIZONTAL)
        sz = wx.BoxSizer(HORIZONTAL)

        self.Sizer.Add(sz,1,EXPAND|ALL,3)

        leftcol = wx.BoxSizer(VERTICAL)

        acctcombo = self.acctcombo = UberCombo(self, value='',skinkey='AppDefaults.PrefCombo')
        acctcont = PrefPanel(self,acctcombo,_('Account'))


        leftcol.Add(acctcont,0,EXPAND|ALL,3)

        buddylist = self.buddylist = ListOBuddies(self)
        self.buddies_panel = buddycont = PrefPanel(self, buddylist, _('Buddy'))
        leftcol.Add(buddycont, 1, EXPAND | TOPLESS, 3)

        style = wx.NO_BORDER | CAL_SUNDAY_FIRST | CAL_SEQUENTIAL_MONTH_SELECTION | CAL_SHOW_HOLIDAYS
        cal = self.cal = CalendarCtrl(self, -1, wx.DateTime.Now(), wx.DefaultPosition, wx.DefaultSize, style)

        cal.SetForegroundColour(wx.Color(160, 160, 160))
        cal.SetHolidayColours(wx.BLACK, wx.WHITE)
        cal.SetHeaderColours(Color(160, 160, 160), Color(239, 239, 239))

        calcont = PrefPanel(self,cal,_('Date'))
        leftcol.Add(calcont, 0, EXPAND | TOPLESS, 3)

        sz.Add(leftcol, 0, EXPAND)

        viewpanel = wx.Panel(self)

        viewer = self.viewer = PastBrowserWebkitWindow(viewpanel)
#        viewer.SetMouseWheelZooms(True)
        finder = self.finder = FindBar(viewpanel,viewer)

        menu = UMenu(viewer)
        menu.AddItem(_('Copy'),  id = wx.ID_COPY,  callback = lambda *a: viewer.Copy())

        viewer.BindWheel(self)
        viewer.BindScrollWin(self)
        viewer.Bind(wx.EVT_CONTEXT_MENU,
                    lambda e: (menu.GetItemById(wx.ID_COPY).Enable(viewer.CanCopy()),
                               menu.PopupMenu(event = e)))

        viewer.Bind(wx.EVT_KEY_DOWN,self.OnKeyDown)
        finder.TextControl.Bind(wx.EVT_KEY_DOWN,self.OnKeyDown)

        nav  = BoxSizer(wx.HORIZONTAL)

        prev = self.prev = UberButton(viewpanel, label = '<-', skin = BUTTON_SKIN)
        next = self.next = UberButton(viewpanel, label = '->', skin = BUTTON_SKIN)

        datelabel = wx.StaticText(viewpanel, -1, style = wx.ALIGN_CENTER| wx.ST_NO_AUTORESIZE)
        datelabel.SetMinSize((140, -1))


        prev.Bind(wx.EVT_BUTTON, lambda e: self.Flip(-1))
        next.Bind(wx.EVT_BUTTON, lambda e: self.Flip( 1))

        nav.AddStretchSpacer(1)
        nav.AddMany([(prev, 0, wx.EXPAND | wx.ALIGN_CENTER),
                     (datelabel, 0, wx.EXPAND | wx.ALIGN_CENTER),
                     (next, 0, wx.EXPAND | wx.ALIGN_CENTER)])
        nav.AddStretchSpacer(1)


        viewpanel.Sizer = wx.BoxSizer(wx.VERTICAL)
        viewpanel.Sizer.AddMany([ (nav,    0, EXPAND),
                                  (viewer, 1, EXPAND),
                                  (finder, 0, EXPAND) ])

        sz.Add(PrefPanel(self, viewpanel, _('Conversation Log')), 1, EXPAND | ALL, 3)

        Bind = self.Bind
        Bind(wx.EVT_PAINT, self.OnPaint)

        def OnAcct(*a):
            '''
            Handle selection of a new account from the Account drop down
            '''
            if self.GroupChatsSelected():
                from collections import defaultdict
                self.groupchats = defaultdict(list)
                for g in GetGroupChats():
                    d = g['time']
                    key = DateTimeFromDMY(d.day, d.month-1, d.year)
                    self.groupchats[key].append(g)

                #dates = sorted((g['date'], g) for g in
                self.dates = sorted(self.groupchats.keys())
                UpdateCal()
                self.buddies_panel.SetTitle(_('Chats'))
            else:
                buddylist.SetList(GetBuddies(acctcombo.Value.id), BuddyRenderer())
                OnBuddy()
                self.buddies_panel.SetTitle(_('Buddy'))

        def OnBuddy(*a):
            '''
            Handels selection of a buddy from the buddy pannel
            '''

            if not self.GroupChatsSelected():
                self.dates = GetDates(buddylist.SelectedBuddy.dir)
                UpdateCal()
            else:
                ViewLogForFile(buddylist.SelectedItem['file'], do_aliases=False)

        def UpdateCal():
            '''
            Switches the date to the last date conversed with the selected budy
            '''
            self.next.Enable(True)
            self.prev.Enable(True)
            if self.dates:
                self.cal.Date = self.dates[-1]

            self.cal.Enable(True)
            OnCalChange()

        def OnCalChange(*a):
            '''
            Update the Calendar UI to a new date
            '''
            caldate = cal.Date

            currentyear   = caldate.GetYear()
            currentmonth  = caldate.GetMonth()
            relevantdates = frozenset(date.GetDay() for date in self.dates
                                      if date.GetYear() == currentyear and
                                      date.GetMonth() == currentmonth and date.GetDay())
            SetHoliday, SetAttr = cal.SetHoliday, cal.SetAttr

            for i in xrange(1, 32):
                if i in relevantdates:
                    SetHoliday(i)
                else:
                    SetAttr(i, CalendarDateAttr(Color(160,160,160)))


            OnDayChange()

        self.OnCalChange = OnCalChange

        def ViewLogForDay(date):
            '''
            Load the log file for the specified date for the currently selected buddy
            '''
            logpath = logpath_for_date(buddylist.SelectedBuddy, date)
            ViewLogForFile(logpath)

        def ViewLogForFile(logpath, do_aliases=True):
            '''
            Update the log viewer with the file specified
            '''
            with viewer.Frozen():
                viewer.SetPageSource(logpath.text('utf-8', 'replace'), logpath.url())
                viewer.RunScript('window.scroll(0, 0);')

                if do_aliases:
                    substitue_aliases()

                import hooks
                hooks.notify('digsby.statistics.logviewer.log_viewed')

        def substitue_aliases():
            '''
            Swap out buddy names with their allies
            '''
            import gui
            with open(gui.skin.resourcedir() / 'html' / 'jquery-1.3.2.js', 'rb') as f:
                viewer.RunScript(f.read())
            buddy = buddylist.SelectedBuddy
            aliases = IAliasProvider(profile())
            import simplejson as json
            names = set(json.loads(viewer.RunScript("var foo = []; $('.buddy').each(function(){foo.push($(this).html())}); JSON.stringify(foo);")))
            for name in names:
                alias = aliases.get_alias(name, buddy.service, buddy.protocol) or name
                viewer.RunScript(SUBHTML % (json.dumps(name), json.dumps(alias)))

        def OnDayChange(*a):
            '''
            Show the log for the day selected in the clander
            '''
            date = cal.Date
            self.date = date

            datelabel.SetLabel(date.FormatDate())

            if cal.GetAttr(date.GetDay()).IsHoliday():
                if self.GroupChatsSelected():
                    chats = sorted(self.groupchats[date], key=lambda g: g['time'], reverse=True)
                    buddylist.SetList(chats, GroupChatRenderer())
                    if chats:
                        ViewLogForFile(chats[0]['file'], do_aliases=False)
                else:
                    ViewLogForDay(date)
            else:
                year  = str(date.GetYear())
                month = date.GetMonth()
                month = wx.DateTime.GetMonthName(int(month))
                day   = str(date.GetDay())

                specific_day_string = _('{month}, {day}, {year}').format(month=month, day=day, year=year)

                if self.GroupChatsSelected():
                    msg = _("There are no chat logs for {specific_day_string}.").format(specific_day_string=specific_day_string)
                else:
                    msg = _("There are no chat logs for {specific_day_string} with {name}.").format(specific_day_string=specific_day_string, name=buddylist.SelectedBuddy.name)

                viewer.SetPageSource(msg, 'file:///C:/')

            viewer.SetFocus()


            wx.CallAfter(cal.Refresh)
        self.OnDayChange = OnDayChange

        acctcombo.SetCallbacks(value = OnAcct)
        buddylist.Bind(wx.EVT_LISTBOX, OnBuddy)

        cBind = cal.Bind
        cBind(EVT_CALENDAR_YEAR, OnCalChange)
        cBind(EVT_CALENDAR_MONTH, OnCalChange)
        cBind(EVT_CALENDAR_SEL_CHANGED, OnDayChange)

        acctcombo.SetItems(MakeAccountItems(), 0)