home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / AppInstall / BrowserView.py < prev    next >
Encoding:
Python Source  |  2006-08-02  |  4.1 KB  |  137 lines

  1. # (c) 2005 Canonical, GPL
  2.  
  3.  
  4. import gtk
  5. import gtkhtml2
  6. import urllib
  7. import urlparse
  8. import gobject
  9. import time
  10. import subprocess
  11. from gettext import gettext as _
  12.  
  13. class BrowserView(object):
  14.     """ abstract browser interface for AppInstall, the requirements are
  15.         very light, it must only support loading a html page for now
  16.      """
  17.     def loadUri(self, uri):
  18.         pass
  19.  
  20. class DumpBrowserView(gtk.ScrolledWindow):
  21.     def __init__(self):
  22.         gtk.ScrolledWindow.__init__(self)
  23.         self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  24.         self.set_shadow_type(gtk.SHADOW_IN)
  25.         self.view = gtk.TextView()
  26.         self.add(self.view)
  27.         self.view.show_all()
  28.     def loadUri(self,uri):
  29.         parts = urlparse.urlparse(uri)
  30.         if parts[0] != "file":
  31.             return False
  32.         f = open(parts[2])
  33.         buf = self.view.get_buffer()
  34.         buf.set_text(f.read())
  35.         return True
  36.  
  37. # import gtkmozembed
  38. # class MozEmbedBrowserView(gtkmozembed.MozEmbed):
  39. #     def __init__(self):
  40. #         gtkmozembed.MozEmbed.__init__(self)
  41. #     def loadUri(self, uri):
  42. #         self.load_url(uri)
  43.         
  44.  
  45. class GtkHtml2BrowserView(gtk.ScrolledWindow):
  46.     __gsignals__ = {
  47.         'submit': (gobject.SIGNAL_RUN_LAST,
  48.                      gobject.TYPE_NONE,
  49.                      (gobject.TYPE_STRING,
  50.                       gobject.TYPE_STRING,
  51.                       gobject.TYPE_STRING))
  52.         }
  53.  
  54.     # FIXME: this stuff is not threaded
  55.     # the problem is that for threading and/or async read support
  56.     # we need a URLOpener() that returns a object that can do
  57.     # async read()
  58.     # To do this, we need a e.g. GnomeVfsWorker that reacts on
  59.     # read(), keeps the gtk_stuff runing and can be canceled
  60.  
  61.     def __init__(self):
  62.         gtk.ScrolledWindow.__init__(self)
  63.         self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  64.         self.set_shadow_type(gtk.SHADOW_IN)
  65.         self.view = gtkhtml2.View()
  66.         self.view.show()
  67.         self.currentUri = None
  68.         self._opener = urllib.FancyURLopener()
  69.         self.document = gtkhtml2.Document()
  70.         self.document.connect('request_url', self._request_url)
  71.         self.view.set_document(self.document)
  72.         self.add(self.view)
  73.         self.document.connect('link_clicked', self.linkClicked)
  74.         self.document.connect('submit', self.submit)
  75.  
  76.     def linkClicked(self, document, link):
  77.         subprocess.Popen(["/usr/bin/gnome-open",link])
  78.  
  79.     def submit(self, document, action, method, value):
  80.         """A html form in the app description is used to add required
  81.            repositories. So send the corresponding signal"""
  82.         self.emit("submit", action, method, value)
  83.  
  84.     def loadUri(self, uri):
  85.         #print "loadUri(%s)" % uri
  86.         self.content = None
  87.         if uri == "about:blank":
  88.             self.document.clear()
  89.             return
  90.  
  91.         # load it
  92.         try:
  93.             f = self._open_uri(uri)
  94.         except (OSError, IOError):
  95.             print "failed to open", uri
  96.             self.content = _("Failed to open '%s'") % uri
  97.             lock.release()
  98.             return
  99.         self.currentUri = self._resolve_uri(uri)
  100.         self.headers = f.info()
  101.         self.content = f.read()
  102.         self.document.open_stream('text/html')
  103.         self.document.write_stream(self.content)
  104.         self.document.close_stream()
  105.         
  106.     def _open_uri(self, uri):
  107.         #print "_resolv_uri: %s " % uri
  108.         uri = self._resolve_uri(uri)
  109.         return self._opener.open(uri)
  110.     def _resolve_uri(self, uri):
  111.         if self._is_relative_to_server(uri):
  112.             return urlparse.urljoin(self.currentUri, uri)
  113.         return uri
  114.     def _request_url(self, document, url, stream):
  115.         f = self._open_uri(url)
  116.         stream.write(f.read())
  117.     def _is_relative_to_server(self, url):
  118.         parts = urlparse.urlparse(url)
  119.         if parts[0] or parts[1]:
  120.             return False
  121.         return True
  122.  
  123. gobject.type_register(GtkHtml2BrowserView)
  124.  
  125.  
  126. if __name__ == "__main__":
  127.     win = gtk.Window()
  128.  
  129.     view = GtkHtml2BrowserView()
  130.     view.set_size_request(600,400)
  131.     win.add(view)
  132.     win.show_all()
  133.     view.loadUri("http://www.skype.com/company/legal/eula/")
  134.  
  135.  
  136.     gtk.main()
  137.