Python plugin: Add examples
[claws.git] / src / plugins / python / examples / auto / startup
1 # -*- coding: utf-8 -*-
2
3 import pygtk
4 pygtk.require('2.0')
5 import gtk
6
7 # lists to store information for cleanup in the shutdown script
8 mainwindow_merge_ids = []
9 mainwindow_actions = []
10
11
12 # function definitions
13
14 def add_python_documentation_menu_item():
15     # Adds a Help -> Python API documentation menu item
16     def pydoc_cb(action):
17         # callback for "Python API documentation" action
18         import os, tempfile, subprocess, pydoc
19         working_directory = os.getcwd()  # store current working directory
20         os.chdir(tempfile.gettempdir())  # switch to a temporary directory
21         pydoc.writedoc(clawsmail)        # write out API documentation to $TEMP/clawsmail.html
22         subprocess.Popen(["xdg-open", "clawsmail.html"]) # start html viewer in the background
23         os.chdir(working_directory)      # switch back to original working directory
24
25     global mainwindow_merge_ids
26     global mainwindow_actions
27     
28     # create "Python API documentation" menu item
29     group = clawsmail.get_mainwindow_action_group()
30     ui_manager = clawsmail.get_mainwindow_ui_manager()
31     action = gtk.Action("pydoc", "Python API documentation", None, None)
32     action.connect("activate", pydoc_cb)
33     group.add_action(action)
34     merge_id = ui_manager.new_merge_id()
35     ui_manager.add_ui(merge_id, "/Menu/Help", "pydoc", "pydoc", gtk.UI_MANAGER_MENUITEM, True)
36     mainwindow_merge_ids.append(merge_id)
37     mainwindow_actions.append(action)
38
39 def add_mark_thread_read_menu_item():
40     # Adds an Edit -> Mark thread as read menu item
41     def thread_read_cb(action):
42         # callback for "Mark thread as read" action
43         selected_messages = clawsmail.get_summaryview_selected_message_list()
44         group = clawsmail.get_mainwindow_action_group()
45         group.get_action("Edit/SelectThread").activate()
46         group.get_action("Message/Mark/MarkRead").activate()
47         clawsmail.summaryview_select_messages(selected_messages)        
48
49     global mainwindow_merge_ids
50     global mainwindow_actions
51     
52     # create "Mark thread read" menu item
53     group = clawsmail.get_mainwindow_action_group()
54     ui_manager = clawsmail.get_mainwindow_ui_manager()
55     action = gtk.Action("ThreadRead", "Mark thread as read", None, None)
56     action.connect("activate", thread_read_cb)
57     group.add_action_with_accel(action, None)
58     merge_id = ui_manager.new_merge_id()
59     ui_manager.add_ui(merge_id, "/Menu/Edit", "ThreadRead", "ThreadRead", gtk.UI_MANAGER_MENUITEM, False)
60     mainwindow_merge_ids.append(merge_id)
61     mainwindow_actions.append(action)
62
63 def add_dbus_interface():
64     # exports an interface to Claws Mail on the session D-Bus
65     #
66     # Example invokation to trigger an update of the summary view from the command line:
67     # dbus-send --session --type=method_call --dest=org.ClawsMail.PythonPlugin /org/ClawsMail/PythonPlugin org.ClawsMail.PythonPlugin.MainWindow.TriggerGtkAction string:'View/UpdateSummary'
68     try:
69         import dbus
70         import dbus.service
71         from dbus.mainloop.glib import DBusGMainLoop    
72     except ImportError:
73         print 'Cannot setup D-Bus interface: D-Bus Python bindings not available.'
74         return None
75         
76     class ClawsMailService(dbus.service.Object):
77         @dbus.service.method("org.ClawsMail.PythonPlugin.MainWindow", in_signature='s', out_signature='')
78         def TriggerGtkAction(self, action_path):
79             action = clawsmail.get_mainwindow_action_group().get_action(action_path)
80             if action:
81                 action.activate()
82             else:
83                 print 'No such action:', action_path
84                 
85     loop = DBusGMainLoop(set_as_default=True)
86     session_bus = dbus.SessionBus()
87     name = dbus.service.BusName("org.ClawsMail.PythonPlugin", session_bus)
88     object = ClawsMailService(session_bus, '/org/ClawsMail/PythonPlugin')
89     return name
90
91 # call the functions that have been defined above, or comment the functions that you want to omit
92 add_python_documentation_menu_item()
93 add_mark_thread_read_menu_item()
94 dbus_interface = add_dbus_interface()