changeset 5:a4ced379fb2e

fixed undo/redo, jump to line, some display of find/replace
author Radomir Dopieralski <moindev@sheep.art.pl>
date Tue, 06 May 2008 02:01:35 +0200
parents c9d8b5166581
children fc3ea7da521a
files editor_view.py main_window.glade main_window.py
diffstat 3 files changed, 141 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/editor_view.py	Mon May 05 22:48:13 2008 +0200
+++ b/editor_view.py	Tue May 06 02:01:35 2008 +0200
@@ -44,6 +44,8 @@
             self.buffer = gtksourceview.Buffer()
         gtksourceview.View.__init__(self, self.buffer)
 
+        self.scheme_manager = gtksourceview.style_scheme_manager_get_default()
+
         self.font_name = ""
         self.color_style = None
         self.highlight_brackets = True
@@ -51,9 +53,9 @@
         self.show_right_margin = True
 
     def load(self, filename, encoding=None):
-        mime, detected_encoding = mimetypes.guess_type(filename)
+        self.mime, detected_encoding = mimetypes.guess_type(filename)
         self.encoding = encoding or detected_encoding or "utf-8"
-        self.buffer.set_language(find_mime_lang(mime))
+        self.buffer.set_language(find_mime_lang(self.mime))
         self.buffer.filename = filename
         f = open(filename, "r")
         text = unicode(f.read(), self.encoding)
@@ -94,3 +96,4 @@
             self.highlight_syntax = False
         self._color_style = style_id
 
+
--- a/main_window.glade	Mon May 05 22:48:13 2008 +0200
+++ b/main_window.glade	Tue May 06 02:01:35 2008 +0200
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.4.2 on Mon May  5 22:10:53 2008 -->
+<!--Generated with glade3 3.4.2 on Tue May  6 01:50:37 2008 -->
 <glade-interface>
   <widget class="GtkWindow" id="window">
     <property name="title" translatable="yes">Text Editor</property>
@@ -177,6 +177,7 @@
                                 <property name="visible">True</property>
                                 <property name="label" translatable="yes">No colors</property>
                                 <property name="use_underline">True</property>
+                                <property name="active">True</property>
                                 <property name="draw_as_radio">True</property>
                                 <signal name="toggled" handler="on_menuitem_style_toggled"/>
                               </widget>
@@ -300,10 +301,12 @@
           </packing>
         </child>
         <child>
-          <widget class="GtkHBox" id="hbox_search">
+          <widget class="GtkHBox" id="hbox_jump">
             <child>
-              <widget class="GtkLabel" id="label_search">
-                <property name="label" translatable="yes">Find:</property>
+              <widget class="GtkLabel" id="label_jump">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Jump to line:</property>
+                <property name="justify">GTK_JUSTIFY_RIGHT</property>
                 <property name="single_line_mode">True</property>
               </widget>
               <packing>
@@ -311,35 +314,15 @@
               </packing>
             </child>
             <child>
-              <widget class="GtkLabel" id="label_line">
-                <property name="label" translatable="yes">Jump to line:</property>
-                <property name="justify">GTK_JUSTIFY_RIGHT</property>
-                <property name="single_line_mode">True</property>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="label_replace">
-                <property name="label" translatable="yes">Replace with:</property>
-                <property name="single_line_mode">True</property>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkEntry" id="entry">
+              <widget class="GtkEntry" id="entry_jump">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="truncate_multiline">True</property>
-                <signal name="activate" handler="on_entry_activate"/>
+                <signal name="focus_out_event" handler="on_entry_jump_focus_out_event"/>
+                <signal name="activate" handler="on_entry_jump_activate"/>
               </widget>
               <packing>
-                <property name="position">3</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </widget>
@@ -348,6 +331,66 @@
             <property name="position">2</property>
           </packing>
         </child>
+        <child>
+          <widget class="GtkHBox" id="hbox_find">
+            <child>
+              <widget class="GtkLabel" id="label_find">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Find text:</property>
+                <property name="single_line_mode">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkEntry" id="entry_find">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="truncate_multiline">True</property>
+                <signal name="focus_out_event" handler="on_entry_find_focus_out_event"/>
+                <signal name="activate" handler="on_entry_find_activate"/>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkHBox" id="hbox_replace">
+            <child>
+              <widget class="GtkLabel" id="label_replace">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Replace with:</property>
+                <property name="single_line_mode">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkEntry" id="entry_replace">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="truncate_multiline">True</property>
+                <signal name="focus_out_event" handler="on_entry_replace_focus_out_event"/>
+                <signal name="activate" handler="on_entry_replace_activate"/>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
       </widget>
     </child>
   </widget>
--- a/main_window.py	Mon May 05 22:48:13 2008 +0200
+++ b/main_window.py	Tue May 06 02:01:35 2008 +0200
@@ -2,6 +2,7 @@
 # -*- coding: utf-8 -*-
 
 import sys
+import os
 
 import pygtk
 pygtk.require("2.0")
@@ -12,19 +13,21 @@
 import editor_view
 
 class MainWindow:
-    def __init__(self):
+    def __init__(self, filename="main_window.py"):
         self.xml = gtk.glade.XML("main_window.glade")
         self.xml.signal_autoconnect(self)
         scrolled_window = self.xml.get_widget("scrolledwindow")
         self.window = self.xml.get_widget("window")
-        self.search_bar = self.xml.get_widget("hbox_search")
-        self.label_search = self.xml.get_widget("label_search")
-        self.label_line = self.xml.get_widget("label_line")
-        self.label_replace = self.xml.get_widget("label_replace")
         self.menuitem_color = self.xml.get_widget("menuitem_color")
         self.menuitem_no_style = self.xml.get_widget("menuitem_no_style")
         self.menuitem_undo = self.xml.get_widget("menu_undo")
         self.menuitem_redo = self.xml.get_widget("menu_redo")
+        self.hbox_jump = self.xml.get_widget("hbox_jump")
+        self.entry_jump = self.xml.get_widget("entry_jump")
+        self.hbox_find = self.xml.get_widget("hbox_find")
+        self.entry_find = self.xml.get_widget("entry_find")
+        self.hbox_replace = self.xml.get_widget("hbox_replace")
+        self.entry_replace = self.xml.get_widget("entry_replace")
 
         # Add the gtksourceview widget
         self.editor = editor_view.EditorView()
@@ -34,7 +37,6 @@
         #self.editor.buffer.connect("can-undo", self.on_buffer_can_undo)
         #self.editor.buffer.connect("can-redo", self.on_buffer_can_redo)
         self.editor.buffer.connect("changed", self.on_buffer_can_undo)
-        self.editor.buffer.connect("changed", self.on_buffer_can_redo)
 
         # Populate the style list
         menu = self.menuitem_color.get_submenu()
@@ -46,11 +48,17 @@
             self.style_menu[scheme_id] = item
         menu.show_all()
 
+        basename = os.path.normcase(os.path.basename(filename))
+        filepath = os.path.normcase(os.path.abspath(os.path.dirname(filename)))
+        home = os.path.expanduser("~")
+        if filepath.startswith(home):
+            filepath = "~" + filepath[len(home):]
+        title = "%s (%s) - Text Editor" % (basename, filepath)
+        self.window.set_title(title)
+        self.editor.load(filename)
         self.window.set_default_size(640, 480)
         self.window.show()
 
-        self.editor.load("main_window.py")
-
     def on_window_destroy(self, window):
         self.close()
 
@@ -59,22 +67,31 @@
 
     def on_buffer_can_undo(self, buffer):
         self.menuitem_undo.set_sensitive(buffer.can_undo())
-
-    def on_buffer_can_redo(self, buffer):
         self.menuitem_redo.set_sensitive(buffer.can_redo())
 
     def on_menu_undo_activate(self, menuitem):
         self.editor.buffer.undo()
+        self.menuitem_undo.set_sensitive(self.editor.buffer.can_undo())
+        self.menuitem_redo.set_sensitive(self.editor.buffer.can_redo())
 
     def on_menu_redo_activate(self, menuitem):
         self.editor.buffer.redo()
+        self.menuitem_undo.set_sensitive(self.editor.buffer.can_undo())
+        self.menuitem_redo.set_sensitive(self.editor.buffer.can_redo())
 
     def on_menu_about_activate(self, menuitem):
-        pass
+        dialog = gtk.AboutDialog()
+        dialog.set_name("Text Editor")
+        dialog.set_version("0.1")
+        dialog.set_copyright("(c) Copyright 2008 by Radomir Dopieralski")
+        dialog.set_comments("Mu License")
+        dialog.set_license("If you are asking what license this software is released under, you are asking the wrong question.")
+        dialog.set_logo_icon_name("edit")
+        dialog.run()
+        dialog.destroy()
 
     def on_menuitem_font_activate(self, menuitem):
         """Allow user to change the font."""
-
         dialog = gtk.FontSelectionDialog("Select font")
         if self.editor.font_name:
             dialog.set_font_name(self.editor.font_name)
@@ -87,8 +104,43 @@
             self.editor.color_style = style_id
 
     def on_menu_jump_activate(self, menuitem):
-        self.search_bar.show()
+        self.hbox_jump.show()
+        self.entry_jump.grab_focus()
+
+    def on_entry_jump_focus_out_event(self, x, y):
+        self.hbox_jump.hide()
+
+    def on_entry_jump_activate(self, entry):
+        text = entry.get_text()
+        try:
+            line = int(text)
+        except ValueError:
+            return
+        if  self.editor.buffer.get_line_count() >= line >= 1:
+            self.hbox_jump.hide()
+            i = self.editor.buffer.get_iter_at_line(line-1)
+            self.editor.scroll_to_iter(i, False)
+            self.editor.buffer.place_cursor(i)
 
+    def on_menu_find_activate(self, menuitem):
+        self.hbox_find.show()
+        self.entry_find.grab_focus()
+
+    def on_entry_find_focus_out_event(self, x, y):
+        self.hbox_find.hide()
+
+    def on_entry_find_activate(self, entry):
+        self.hbox_find.hide()
+
+    def on_menu_replace_activate(self, menuitem):
+        self.hbox_replace.show()
+        self.entry_replace.grab_focus()
+
+    def on_entry_replace_focus_out_event(self, x, y):
+        self.hbox_replace.hide()
+
+    def on_entry_replace_activate(self, entry):
+        self.hbox_replace.hide()
 
     def close(self):
         self.editor.close()