OSDN Git Service

ThreadView is redrawn after HTTP GET due to prevent white drawingarea.
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / thread_window.py
index 3cc3f32..2a81afa 100644 (file)
@@ -50,6 +50,7 @@ import winwrapbase
 import bookmark_list
 import bookmark_window
 import thread_view
+import thread_popup
 
 GLADE_FILENAME = "thread_window.glade"
 
@@ -111,7 +112,10 @@ class HTMLParserToThreadView:
 
     def to_thread_view(self):
         if self.layout is not None:
-            gobject.idle_add(self.threadview.add_layout, self.layout)
+            # gobject.idle_add(self.threadview.add_layout, self.layout)
+            gtk.gdk.threads_enter()
+            self.threadview.add_layout(self.layout)
+            gtk.gdk.threads_leave()
             self.initialize()
 
 
@@ -143,10 +147,20 @@ class WinWrap(winwrapbase.WinWrapBase):
         self.vbox = self.widget_tree.get_widget("vbox")
 
         self.threadview = thread_view.ThreadView()
+        self.threadpopup = thread_popup.ThreadPopup(self.bbs_type)
+        self.threadpopup.push_thread_view(self.threadview)
         self.vbox.pack_start(self.threadview)
         self.vbox.reorder_child(self.threadview, 2)
+        self.window.set_focus(self.threadview.drawingarea)
 
-        self.threadview.on_uri_clicked = self.on_threadview_uri_clicked
+        self.threadview.connect("uri-clicked-event", self.on_threadview_uri_clicked)
+        self.threadpopup.connect(
+            "uri-clicked-event",
+            lambda widget, threadview, uri: self.on_threadview_uri_clicked(threadview, uri))
+
+        self.statusbar_context_id = self.statusbar.get_context_id(
+            "Thread Window Status")
+        self.statusbar.push(self.statusbar_context_id, "OK.")
 
         self.threadview.popupmenu = self.widget_tree.get_widget(
             "popup_threadview_menu")
@@ -198,13 +212,6 @@ class WinWrap(winwrapbase.WinWrapBase):
         self.created()
 
     def initialize_buffer(self):
-        self.textbuffer = gtk.TextBuffer()
-
-        self.enditer = self.textbuffer.get_end_iter()
-        self.boldtag = self.textbuffer.create_tag(weight=pango.WEIGHT_BOLD)
-        self.leftmargintag = self.textbuffer.create_tag()
-        self.leftmargintag.set_property("left-margin", 20)
-
         self.threadview.initialize_buffer()
 
     def destroy(self):
@@ -270,7 +277,7 @@ class WinWrap(winwrapbase.WinWrapBase):
         except OSError:
             traceback.print_exc()
 
-    def on_threadview_uri_clicked(self, uri):
+    def on_threadview_uri_clicked(self, widget, uri):
 
         if not uri.startswith("http://"):
             # maybe a relative uri.
@@ -290,10 +297,17 @@ class WinWrap(winwrapbase.WinWrapBase):
         clip.set_text(widget.uri, len(widget.uri))
 
     def on_popup_threadview_menu_copyselection_activate(self, widget):
-        pass
+        text = self.threadview.get_selected_text()
+        if text and len(text) > 0:
+            clip = gtk.Clipboard()
+            text = text.encode("utf8")
+            clip.set_text(text, len(text))
 
     def on_popup_threadview_menu_openasuri_activate(self, widget):
-        pass
+        text = self.threadview.get_selected_text()
+        if not text.startswith("http://"):
+            text = "http://" + text
+        self.on_threadview_uri_clicked(text)
 
     def on_popup_threadview_menu_refresh_activate(self, widget):
         self.update(widget)
@@ -314,19 +328,38 @@ class WinWrap(winwrapbase.WinWrapBase):
         if etag:
             req.add_header("If-None-Match", etag)
 
+        def push():
+            self.statusbar.pop(self.statusbar_context_id)
+            self.statusbar.push(self.statusbar_context_id, "GET...")
+        gobject.idle_add(push)
+
         req = self.bbs_type.set_extra_dat_request(req, self)
 
         opener = urllib2.build_opener(HTTPRedirectHandler302, HTTPDebugHandler)
         try:
             res = opener.open(req)
         except urllib2.HTTPError, e:
-            pass
-#             gobject.idle_add(
-#                 lambda x: self.statusbar.push(0, x), "%d %s" % (e.code, e.msg))
+            def push(code, msg):
+                message = "%d %s" % (code, msg)
+                self.statusbar.pop(self.statusbar_context_id)
+                self.statusbar.push(self.statusbar_context_id, message)
+            gobject.idle_add(push, e.code, e.msg)
         else:
             headers = res.info()
-#             gobject.idle_add(
-#                 lambda x: self.statusbar.push(0, x), "%d %s" % (res.code, res.msg))
+
+            if "Last-Modified" in headers:
+                la = headers["Last-Modified"]
+                def push(code, msg, lastm):
+                    message = "%d %s [%s]" % (code, msg, lastm)
+                    self.statusbar.pop(self.statusbar_context_id)
+                    self.statusbar.push(self.statusbar_context_id, message)
+                gobject.idle_add(push, res.code, res.msg, la)
+            else:
+                def push(code, msg):
+                    message = "%d %s" % (code, msg)
+                    self.statusbar.pop(self.statusbar_context_id)
+                    self.statusbar.push(self.statusbar_context_id, message)
+                gobject.idle_add(push, res.code, res.msg)
 
             maybe_incomplete = False
             for line in res:
@@ -361,11 +394,6 @@ class WinWrap(winwrapbase.WinWrapBase):
         self.jump_request_num = 0
 
         def load():
-            if self.num == 0:
-                def create_mark():
-                    self.textbuffer.create_mark("1", self.enditer, True)
-                gobject.idle_add(create_mark)
-
             line_count = datfile.get_dat_line_count(self.bbs_type)
             if line_count < self.num:
                 self.num = 0
@@ -398,6 +426,9 @@ class WinWrap(winwrapbase.WinWrapBase):
                 self.append_rawres_to_buffer(line)
 
             self.http_get_dat(save_line_and_append_to_buffer)
+            gtk.gdk.threads_enter()
+            self.threadview.redraw()
+            gtk.gdk.threads_leave()
             dat_file.close()
 
             def do_jump():
@@ -522,11 +553,6 @@ class WinWrap(winwrapbase.WinWrapBase):
 
         pipe.to_thread_view()
 
-    def href_tag(self, href):
-        tag = self.textbuffer.create_tag(underline=pango.UNDERLINE_SINGLE)
-        tag.set_data("href", href)
-        return tag
-
     def jump(self, value):
         gobject.idle_add(self.threadview.jump, value)