/[straw]/straw/src/lib/SubscribeDialog.py
ViewVC logotype

Diff of /straw/src/lib/SubscribeDialog.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.17 by juri, Mon Sep 8 16:20:57 2003 UTC revision 1.18 by jmalonzo, Tue Sep 23 23:56:12 2003 UTC
# Line 2  cvs_id = "$Id$" Line 2  cvs_id = "$Id$"
2    
3  import gobject  import gobject
4  import gtk  import gtk
 from types import FunctionType  
5  import traceback  import traceback
6    
7  import straw  import straw
8  from error import log  from error import log
9    
10  class SubscribeDialog:  busy_cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
11      buttons_visible = {  ready_cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)
         'subscribe_dialog_start':    [0, 1, 1, 1, 1, 1],  
         'subscribe_dialog_previous': [0, lambda s: len(s._pagestack) > 1,  
                                       0, 0, 0, 0],  
         'subscribe_dialog_next':     [0, 0, 1, 0, 1, 0],  
         'subscribe_dialog_finish':   [0, 1, 0, 0, 0, 0]}  
12    
13    class SubscribeDialog:
14      COLUMN_URL = 0      COLUMN_URL = 0
15      COLUMN_TITLE = 1      COLUMN_TITLE = 1
16      COLUMN_DESCRIPTION = 2      COLUMN_DESCRIPTION = 2
17      COLUMN_FEED = 3      COLUMN_FEED = 3
18      COLUMN_PARSEDSUMMARY = 4      COLUMN_PARSEDSUMMARY = 4
19    
     PAGE_START = 0  
     PAGE_FINISH = 1  
     PAGE_PROBLEM = 2  
     PAGE_NOTFOUND = 3  
     PAGE_SELECT = 4  
     PAGE_WAIT = 5  
       
20      def __init__(self, xml):      def __init__(self, xml):
21          self._window = xml.get_widget("subscribe_dialog")          self._window = xml.get_widget("subscribe_dialog")
22          self._window.set_transient_for(straw.main_window.get_window())          self._window.set_transient_for(straw.main_window.get_window())
23          self._page = -1          self._feed_count = 0
24          self._pagestack = []          self._feed_is_parsed = bool(0)
25    
26            self._find_assistant = xml.get_widget("find_assistant")
27    
28            self._start_page = xml.get_widget("start_page")
29            self._location_page = xml.get_widget("location_page")
30            self._last_page = xml.get_widget("last_page")
31            self._subscribe_site_entry = xml.get_widget("subscribe_site_entry")
32            self._multiple_feed_page = xml.get_widget("multiple_feed_page")
33            self._subscribe_multiple_match_view = xml.get_widget("subscribe_multiple_match_view")
34    
35          nameFuncMap = {}          nameFuncMap = {}
36          for key in dir(self.__class__):          for key in dir(self.__class__):
37              if key[:3] == 'on_':              if key[:3] == 'on_':
38                  nameFuncMap[key] = getattr(self, key)                  nameFuncMap[key] = getattr(self, key)
39          xml.signal_autoconnect(nameFuncMap)          xml.signal_autoconnect(nameFuncMap)
40          for widget in ['subscribe_site_entry',  
                        'new_feed_name_entry', 'subscribe_notebook',  
                        'feed_error_display', 'subscribe_dialog_start',  
                        'subscribe_dialog_finish', 'subscribe_dialog_next',  
                        'subscribe_dialog_previous',  
                        'subscribe_feed_found_url',  
                        'subscribe_feed_found_description',  
                        'subscribe_multiple_match_view']:  
             self.__dict__['_%s' % widget] = xml.get_widget(widget)  
41          model = gtk.ListStore(          model = gtk.ListStore(
42              gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING,              gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING,
43              gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)              gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)
44          self._subscribe_multiple_match_view.set_model(model)          self._subscribe_multiple_match_view.set_model(model)
45          self.create_columns(self._subscribe_multiple_match_view)          self.create_columns(self._subscribe_multiple_match_view)
46    
47        def on_start_page_next(self, widget, data):
48            self._find_assistant.set_page(self._location_page)
49    
50            ltext = self._subscribe_site_entry.get_text()
51    
52            if ltext == "" or ltext is None:
53                self._find_assistant.set_buttons_sensitive(gtk.TRUE, gtk.FALSE, gtk.TRUE, gtk.FALSE)
54    
55            return gtk.TRUE
56    
57        def on_start_page_cancel(self, widget, data):
58            self.hide()
59    
60        def on_location_page_next(self, widget, data):
61            url = self._subscribe_site_entry.get_text()
62            if not self._feed_is_parsed:
63                rw = gtk.gdk.get_default_root_window()
64                rw.set_cursor(busy_cursor)
65                self.find_site(url)
66                rw.set_cursor(ready_cursor)
67    
68            if self._feed_count > 1:
69                self._find_assistant.set_page(self._multiple_feed_page)
70            else:
71                self._find_assistant.set_page(self._last_page)
72    
73            return gtk.TRUE
74    
75        def on_location_page_cancel(self, *args):
76            self.hide()
77    
78        def on_multiple_feed_page_cancel(self, *args):
79            self.hide()
80    
81        def on_multiple_feed_page_next(self, *args):
82            selection = self._subscribe_multiple_match_view.get_selection()
83            model, iter = selection.get_selected()
84            index = model.get_path(iter)[0]
85            f = model[index][self.COLUMN_FEED]
86            ps = model[index][self.COLUMN_PARSEDSUMMARY]
87            self.display_selected_feed(f, ps)
88    
89        def on_last_page_back(self, widget, data):
90            if self._feed_count > 1:
91                self._find_assistant.set_page(self._multiple_feed_page)
92            else:
93                self._find_assistant.set_page(self._location_page)
94    
95            return gtk.TRUE
96    
97        def on_last_page_finish(self, *args):
98            feed = self._new_feed[0]
99            ps = self._new_feed[1]
100            straw.config.feeds.append(feed)
101            feed.router.route_all(None, ps)
102            feed.poll_done()
103            self.hide()
104    
105        def on_last_page_cancel(self, *args):
106            self.hide()
107    
108        def on_subscribe_site_entry_delete_text(self, widget, start, end):
109            gtk.timeout_add(1, self.entry_delete)
110            return
111    
112        def entry_delete(self):
113            print "entry delete"
114            text = self._subscribe_site_entry.get_text()
115            if text == "" or text is None:
116                # FIXME: gtk.Entry.set_text("") emits a delete_text signal :(
117                #self._find_assistant.set_buttons_sensitive(gtk.TRUE, gtk.FALSE, gtk.TRUE, gtk.FALSE)
118                return
119    
120        def on_subscribe_site_entry_key_press_event(self, widget, event):
121            self._find_assistant.set_buttons_sensitive(gtk.TRUE, gtk.TRUE, gtk.TRUE, gtk.FALSE)
122            if event.keyval == gtk.keysyms.Return:
123                rw = gtk.gdk.get_default_root_window()
124                rw.set_cursor(busy_cursor)
125                self.find_site(self._subscribe_site_entry.get_text())
126                rw.set_cursor(ready_cursor)
127    
128        def on_subscribe_feed_url_entry_key_press_event(self, widget, event):
129            if event.keyval == gtk.keysyms.Return:
130                self.find_rss()
131    
132        def on_subscribe_dialog_delete_event(self, *args):
133            self.hide()
134            return gtk.TRUE
135    
136      def show(self, url):      def show(self, url):
137          self.show_buttons_for_page(self.PAGE_START)          self._start_page.show()
138            self._last_page.show()
139          self._window.show()          self._window.show()
         self._window.present()  
140          if url:          if url:
141              self.find_site(url)              self.find_site(url)
142    
143      def hide(self):      def hide(self):
144          self._new_feed = None          self._new_feed = None
145          self.set_page(self.PAGE_START, reset = 1)          self._find_assistant.set_page(self._start_page)
146          self._subscribe_site_entry.set_text("")          self._subscribe_site_entry.set_text("")
147            self._feed_count = 0
148            self._feed_is_parsed = bool(0)
149    
150          self._window.hide()          self._window.hide()
151            self._start_page.hide()
152            self._last_page.hide()
153    
154      def create_columns(self, treeview):      def create_columns(self, treeview):
155          for cname, cnum in [('URL', self.COLUMN_URL),          for cname, cnum in [('URL', self.COLUMN_URL),
# Line 75  class SubscribeDialog: Line 159  class SubscribeDialog:
159              column = gtk.TreeViewColumn(cname, renderer, text = cnum)              column = gtk.TreeViewColumn(cname, renderer, text = cnum)
160              treeview.append_column(column)              treeview.append_column(column)
161    
162      def show_buttons_for_page(self, page):      def display_selected_feed(self, feed=None, ps=None):
163          for name, visible in self.buttons_visible.items():          #self._subscribe_feed_found_url.set_text(feed.access_info[0])
164              widget = self.__dict__['_%s' % name]          if feed is not None and ps is not None:
165              if type(visible[page]) == FunctionType:              self._find_assistant.set_page(self._last_page)
166                  val = visible[page](self)              text = "Press 'Finish' if you want to subscribe to the feed below.\n\n"
167              else:              if len(feed.title):
168                  val = visible[page]                  text += "Title: %s \n" % feed.title
169              if val:              if len(feed.channel_description):
170                  widget.show()                  text += "Description: %s \n" % feed.channel_description
             else:  
                 widget.hide()  
         return  
   
     def set_page(self, page, reset = 0, nostack = 0):  
         self._subscribe_notebook.set_current_page(page)  
         self.show_buttons_for_page(page)  
         if not reset:  
             self._pagestack.append(self._page)  
         else:  
             self._pagestack = []  
         self._page = page  
171    
172      def display_selected_feed(self, feed, ps):              self._last_page.set_title("Feed Found")
173          self._new_feed_name_entry.set_text(feed.title)              self._last_page.set_text(text)
         self._subscribe_feed_found_url.set_text(feed.access_info[0])  
         self._subscribe_feed_found_description.set_text(  
             feed.channel_description)  
         self.set_page(self.PAGE_FINISH)  
         self._new_feed = (feed, ps)  
         return  
174    
175                self._new_feed = (feed, ps)
176      def parse_feed(self, data, feed):      def parse_feed(self, data, feed):
177          try:          try:
178              parsed = straw.SummaryParser().parse(data, feed)              parsed = straw.SummaryParser().parse(data, feed)
# Line 116  class SubscribeDialog: Line 183  class SubscribeDialog:
183              log("parse_feed: caught exception ", e)              log("parse_feed: caught exception ", e)
184              traceback.print_exc()              traceback.print_exc()
185              return None              return None
186            self._feed_is_parsed = bool(1)
187          return parsed          return parsed
188    
189      def display_feed_choices(self, feeds):      def display_feed_choices(self, feeds):
# Line 127  class SubscribeDialog: Line 195  class SubscribeDialog:
195                        self.COLUMN_TITLE, feed.title,                        self.COLUMN_TITLE, feed.title,
196                        self.COLUMN_DESCRIPTION, feed.channel_description,                        self.COLUMN_DESCRIPTION, feed.channel_description,
197                        self.COLUMN_FEED, feed, self.COLUMN_PARSEDSUMMARY, ps)                        self.COLUMN_FEED, feed, self.COLUMN_PARSEDSUMMARY, ps)
198          self.set_page(self.PAGE_SELECT)          print "setting to multiple page"
199            self._find_assistant.set_page(self._multiple_feed_page)
200    
201        def display_error(self, title, body):
202            self._find_assistant.set_page(self._last_page)
203            self._last_page.set_title(title)
204            self._last_page.set_text("%s" % body)
205            self._find_assistant.set_buttons_sensitive(gtk.TRUE, gtk.FALSE, gtk.TRUE, gtk.FALSE)
206            return
207    
208    
209      def find_site(self, site):      def find_site(self, site):
         self.set_page(self.PAGE_WAIT, nostack = 1)  
210          while gtk.events_pending():          while gtk.events_pending():
211              gtk.mainiteration(gtk.FALSE)              gtk.mainiteration()
212          try:          try:
213              feeds = straw.rssfinder.getFeeds(site)              feeds = straw.rssfinder.getFeeds(site)
214            except IOError, e:
215                self.display_error("Cannot Find Host", ("Straw cannot find %s. Please check your connection then try again" % site))
216                return
217          except Exception, e:          except Exception, e:
218              log("caught an exception: ", e)              log("caught an exception: ", e)
219              traceback.print_exc()              traceback.print_exc()
220              self.set_page(self.PAGE_NOTFOUND)              self.display_error("Fatal Error", "A fatal error occurred while processing this feed. Please report it to the maintainer")
221              return              return
222          if len(feeds) == 0:  
223              self.set_page(self.PAGE_NOTFOUND)          len_feeds = len(feeds)
224            self._feed_count = int(len_feeds)
225    
226            if len_feeds < 1:
227                self.display_error("Feed Not Found",("No feed was found in %s. Please make sure you typed the correct location." % site))
228              return              return
229          if len(feeds) == 1:          if len_feeds == 1:
230              feed = straw.Feed("temporary feed", feeds[0][0])              feed = straw.Feed("temporary feed", feeds[0][0])
231              ps = self.parse_feed(feeds[0][1], feed)              ps = self.parse_feed(feeds[0][1], feed)
232              feed.title = ps.title              feed.title = ps.title
# Line 158  class SubscribeDialog: Line 241  class SubscribeDialog:
241                  feed.channel_description = ps.description                  feed.channel_description = ps.description
242                  dfeeds.append((feed, ps))                  dfeeds.append((feed, ps))
243              self.display_feed_choices(dfeeds)              self.display_feed_choices(dfeeds)
   
     def on_subscribe_find_site_clicked(self, button, *args):  
         if straw.config.offline:  
                 straw.main.show_offline_dialog()  
                 return  
         self.find_site(self._subscribe_site_entry.get_text())  
           
     def on_subscribe_dialog_start_clicked(self, button, *args):  
         self.set_page(self.PAGE_START)  
   
     def on_subscribe_dialog_next_clicked(self, button, *args):  
         if self._page == self.PAGE_SELECT:  
             selection = self._subscribe_multiple_match_view.get_selection()  
             model, iter = selection.get_selected()  
             index = model.get_path(iter)[0]  
             f = model[index][self.COLUMN_FEED]  
             ps = model[index][self.COLUMN_PARSEDSUMMARY]  
             self.display_selected_feed(f, ps)  
         if self._page == self.PAGE_PROBLEM:  
             self.display_selected_feed(  
                 self._new_feed[0], self._new_feed[1], None)  
   
     def on_subscribe_dialog_finish_clicked(self, button, *args):  
         feed = self._new_feed[0]  
         ps = self._new_feed[1]  
         feed.title = self._new_feed_name_entry.get_text()  
         straw.config.feeds.append(feed)  
         feed.router.route_all(None, ps)  
         feed.poll_done()  
         self.hide()  
   
     def on_subscribe_dialog_previous_clicked(self, button, *args):  
         page = self._pagestack.pop()  
         self._subscribe_notebook.set_current_page(page)  
         self.show_buttons_for_page(page)  
         self._page = page  
   
     def on_subscribe_dialog_cancel_clicked(self, button, *args):  
         self.hide()  
   
     def on_subscribe_site_entry_key_press_event(self, widget, event):  
         if event.keyval == gtk.keysyms.Return:  
             self.find_site(self._subscribe_site_entry.get_text())  
   
     def on_subscribe_feed_url_entry_key_press_event(self, widget, event):  
         if event.keyval == gtk.keysyms.Return:  
             self.find_rss()  
   
     def on_subscribe_dialog_delete_event(self, *args):  
         self.hide()  
         return 1  

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.18

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26