Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/view/frame/ClipboardBox.py
blob: 9eae973e782519a9301e70c2eb54c928e694df81 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import logging
import dbus
import hippo

from sugar.graphics import style
from view.ClipboardIcon import ClipboardIcon

class ClipboardBox(hippo.CanvasBox):

	_CLIPBOARD_SERVICE = "org.laptop.Clipboard"
	_CLIPBOARD_OBJECT_PATH = "/org/laptop/Clipboard"
	
	def __init__(self, shell, menu_shell):
		hippo.CanvasBox.__init__(self)
		self._shell = shell
		self._menu_shell = menu_shell
		self._icons = {}

		bus = dbus.SessionBus()
		bus.add_signal_receiver(self.name_owner_changed_cb,
									signal_name="NameOwnerChanged",
									dbus_interface="org.freedesktop.DBus")
		# Try to register to ClipboardService, if we fail, we'll try later.
		try:
			self._connect_clipboard_signals()
		except dbus.DBusException, exception:
			pass
		
	def _connect_clipboard_signals(self):
		bus = dbus.SessionBus()
		proxy_obj = bus.get_object(self._CLIPBOARD_SERVICE, self._CLIPBOARD_OBJECT_PATH)
		iface = dbus.Interface(proxy_obj, self._CLIPBOARD_SERVICE)
		iface.connect_to_signal('object_added', self.object_added_callback)	
		iface.connect_to_signal('object_deleted', self.object_deleted_callback)
		iface.connect_to_signal('object_state_updated', self.object_state_updated_callback)	

	def name_owner_changed_cb(self, name, old, new):
		if name != self._CLIPBOARD_SERVICE:
			return
		if (not old and not len(old)) and (new and len(new)):
			# ClipboardService started up
			self._connect_clipboard_signals()

	def object_added_callback(self, mimeType, fileName):
		icon = ClipboardIcon(self._menu_shell, fileName)
		style.apply_stylesheet(icon, 'frame.BuddyIcon')
		self.append(icon)
		self._icons[fileName] = icon
		
		logging.debug('ClipboardBox: ' + fileName + ' was added.')

	def object_deleted_callback(self, fileName):
		icon = self._icons[fileName]
		self.remove(icon)
		self._icons.remove(icon)		
		logging.debug('ClipboardBox: ' + fileName + ' was deleted.')

	def object_state_updated_callback(self, fileName, percent):
		icon = self._icons[fileName]
		icon.set_percent(percent)
		logging.debug('ClipboardBox: ' + fileName + ' state was updated.')