"""To create a panel applet for ROX-Filer, you should add a file called
AppletRun to your application. This is run when your applet it dragged onto
a panel. It works like the usual AppRun, except that it is passed the XID of
the GtkSocket widget that ROX-Filer creates for you on the panel.

A sample AppletRun might look like this:

#!/usr/bin/env python
import findrox; findrox.version(1, 9, 12)
import rox
import sys
from rox import applet, g

plug = applet.Applet(sys.argv[1])

label = g.Label('Hello\\nWorld!')
plug.add(label)
plug.show_all()

rox.mainloop()
"""

import rox
from rox import g

_root_window = g.gdk.get_default_root_window()

class Applet(g.Plug):
	"""When your AppletRun file is used, create an Applet widget with
	the argument passed to AppletRun. Show the widget to make it appear
	in the panel. toplevel_* functions are called automatically."""
	def __init__(self, xid):
		"""xid is the sys.argv[1] passed to AppletRun."""
		xid = long(xid)
		g.Plug.__init__(self, xid)
		self.socket = g.gdk.window_foreign_new(xid)
		rox.toplevel_ref()
		self.connect('destroy', rox.toplevel_unref)

	def is_vertical_panel(self):
		"""Returns True if the panel this applet is on is a left
		or right panel."""
		pos = self.socket.property_get('_ROX_PANEL_MENU_POS',
						'STRING', False)
		if pos: pos = pos[2]
		if pos:
			side, margin = pos.split(',')
			margin = int(margin)
		else:
			side, margin = None, 2

		if side == 'Left' or side == 'Right':
			return True
		elif side == 'Top' or side == 'Bottom':
			return False

		# Couldn't work out the side, return None which will
		# probably be interpreted as False.
		return None
	
	def position_menu(self, menu):
		"""Use this as the third argument to Menu.popup()."""
		x, y, mods = _root_window.get_pointer()
		pos = self.socket.property_get('_ROX_PANEL_MENU_POS',
						'STRING', False)
		if pos: pos = pos[2]
		if pos:
			side, margin = pos.split(',')
			margin = int(margin)
		else:
			side, margin = None, 2

		width, height = g.gdk.screen_width(), g.gdk.screen_height()
		
		req = menu.size_request()

		if side == 'Top':
			y = margin
			x -= 8 + req[0] / 4
		elif side == 'Bottom':
			y = height - margin - req[1]
			x -= 8 + req[0] / 4
		elif side == 'Left':
			x = margin
			y -= 16
		elif side == 'Right':
			x = width - margin - req[0]
			y -= 16
		else:
			x -= req[0] / 2
			y -= 32

		def limit(v, min, max):
			if v < min: return min
			if v > max: return max
			return v

		x = limit(x, 4, width - 4 - req[0])
		y = limit(y, 4, height - 4 - req[1])
		
		return (x, y, True)
