changeset 6:fc3ea7da521a

printing
author Radomir Dopieralski <moindev@sheep.art.pl>
date Thu, 05 Jun 2008 22:03:05 +0200
parents a4ced379fb2e
children
files editor_view.py main_window.glade main_window.py
diffstat 3 files changed, 202 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/editor_view.py	Tue May 06 02:01:35 2008 +0200
+++ b/editor_view.py	Thu Jun 05 22:03:05 2008 +0200
@@ -22,6 +22,9 @@
     show_right_margin = property(
         lambda s: s.get_show_right_margin(),
         lambda s, v: s.set_show_right_margin(v))
+    show_line_numbers = property(
+        lambda s: s.get_show_line_numbers(),
+        lambda s, v: s.set_show_line_numbers(v))
     font_name = property(
         lambda s: s._font_name,
         lambda s, v: s.set_font_name(v))
@@ -75,6 +78,11 @@
         f.close()
         self.buffer.set_modified(False)
 
+    def jump(self, line):
+        position = self.buffer.get_iter_at_line(line-1)
+        self.scroll_to_iter(position, False)
+        self.buffer.place_cursor(position)
+
     def close(self):
         """Save and clean up everything."""
         pass
@@ -97,3 +105,27 @@
         self._color_style = style_id
 
 
+    def draw_page(self, operation, context, page_nr):
+        from math import floor, ceil
+        paper_height = context.get_height()
+        height = self.layout.get_size()[1]/pango.SCALE
+        line_height = height/self.layout.get_line_count()
+        max_lines = int(floor(paper_height/line_height))
+        start_line = page_nr * max_lines
+        end_line = min(start_line + max_lines, self.buffer.get_line_count())
+        start_iter = self.buffer.get_iter_at_line(start_line)
+        end_iter = self.buffer.get_iter_at_line(end_line)
+        self.layout.set_text(self.buffer.get_text(start_iter, end_iter))
+        context.get_cairo_context().show_layout(self.layout)
+
+    def begin_print(self, operation, context):
+        from math import floor, ceil
+        self.layout = context.create_pango_layout()
+        desc = pango.FontDescription("monospace 10")
+        self.layout.set_font_description(desc)
+        start, end = self.buffer.get_bounds()
+        self.layout.set_text(self.buffer.get_text(start, end))
+        height = self.layout.get_size()[1]/pango.SCALE
+        paper_height = context.get_height()
+        n_pages = int(ceil(height/paper_height))
+        operation.set_n_pages(n_pages)
--- a/main_window.glade	Tue May 06 02:01:35 2008 +0200
+++ b/main_window.glade	Thu Jun 05 22:03:05 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 Tue May  6 01:50:37 2008 -->
+<!--Generated with glade3 3.4.2 on Fri May  9 10:42:40 2008 -->
 <glade-interface>
   <widget class="GtkWindow" id="window">
     <property name="title" translatable="yes">Text Editor</property>
@@ -22,12 +22,22 @@
                   <widget class="GtkMenu" id="menu1">
                     <property name="visible">True</property>
                     <child>
-                      <widget class="GtkImageMenuItem" id="menu_properties">
+                      <widget class="GtkImageMenuItem" id="menuitem_print">
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">gtk-properties</property>
+                        <property name="label" translatable="yes">gtk-print</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
-                        <signal name="activate" handler="on_menu_properties_activate"/>
+                        <signal name="activate" handler="on_menuitem_print_activate"/>
+                        <accelerator key="P" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="menuitem_preview">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">gtk-print-preview</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">True</property>
+                        <signal name="activate" handler="on_menuitem_preview_activate"/>
                       </widget>
                     </child>
                     <child>
@@ -64,6 +74,7 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <signal name="activate" handler="on_menu_undo_activate"/>
+                        <accelerator key="Z" modifiers="GDK_CONTROL_MASK" signal="activate"/>
                       </widget>
                     </child>
                     <child>
@@ -73,6 +84,7 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <signal name="activate" handler="on_menu_redo_activate"/>
+                        <accelerator key="Y" modifiers="GDK_CONTROL_MASK" signal="activate"/>
                       </widget>
                     </child>
                     <child>
@@ -114,6 +126,46 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <signal name="activate" handler="on_menu_select_all_activate"/>
+                        <accelerator key="A" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem8">
+                        <property name="visible">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkCheckMenuItem" id="menuitem_tabs_spaces">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Indent with spaces</property>
+                        <property name="use_underline">True</property>
+                        <signal name="toggled" handler="on_menuitem_tabs_spaces_toggled"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkCheckMenuItem" id="menuitem_indent">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Autoindent</property>
+                        <property name="use_underline">True</property>
+                        <signal name="toggled" handler="on_menuitem_indent_toggled"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem10">
+                        <property name="visible">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="menu_save_defaults">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Save defaults</property>
+                        <property name="use_underline">True</property>
+                        <child internal-child="image">
+                          <widget class="GtkImage" id="menu-item-image3">
+                            <property name="visible">True</property>
+                            <property name="stock">gtk-preferences</property>
+                          </widget>
+                        </child>
                       </widget>
                     </child>
                   </widget>
@@ -129,29 +181,33 @@
                   <widget class="GtkMenu" id="menu4">
                     <property name="visible">True</property>
                     <child>
-                      <widget class="GtkCheckMenuItem" id="menu_line_numbers">
+                      <widget class="GtkCheckMenuItem" id="menuitem_margin">
                         <property name="visible">True</property>
-                        <property name="tooltip" translatable="yes">Toggle displaying line numbers</property>
-                        <property name="label" translatable="yes">_Line numbers</property>
+                        <property name="label" translatable="yes">Show right _margin</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="on_menu_line_numbers_toggled"/>
+                        <signal name="toggled" handler="on_menuitem_margin_toggled"/>
                       </widget>
                     </child>
                     <child>
-                      <widget class="GtkCheckMenuItem" id="menu_wrap">
+                      <widget class="GtkCheckMenuItem" id="menuitem_wrap">
                         <property name="visible">True</property>
                         <property name="tooltip" translatable="yes">Wrap long lines of text</property>
-                        <property name="label" translatable="yes">_Wrap lines</property>
+                        <property name="label" translatable="yes">_Wrap long lines</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="on_menu_wrap_toggled"/>
+                        <signal name="toggled" handler="on_menuitem_wrap_toggled"/>
                       </widget>
                     </child>
                     <child>
-                      <widget class="GtkCheckMenuItem" id="menu_match">
+                      <widget class="GtkCheckMenuItem" id="menuitem_words">
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">_Match brackets</property>
+                        <property name="label" translatable="yes">Don't _break words</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="on_menu_match_toggled"/>
+                        <signal name="toggled" handler="on_menuitem_words_toggled"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem9">
+                        <property name="visible">True</property>
                       </widget>
                     </child>
                     <child>
@@ -192,15 +248,33 @@
                       </widget>
                     </child>
                     <child>
-                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem5">
                         <property name="visible">True</property>
                       </widget>
                     </child>
                     <child>
-                      <widget class="GtkMenuItem" id="menu_save_defaults">
+                      <widget class="GtkCheckMenuItem" id="menuitem_numbers">
+                        <property name="visible">True</property>
+                        <property name="tooltip" translatable="yes">Toggle displaying line numbers</property>
+                        <property name="label" translatable="yes">Show _line numbers</property>
+                        <property name="use_underline">True</property>
+                        <signal name="toggled" handler="on_menuitem_numbers_toggled"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkCheckMenuItem" id="menu_match">
                         <property name="visible">True</property>
-                        <property name="label" translatable="yes">_Save defaults</property>
+                        <property name="label" translatable="yes">Match _brackets</property>
                         <property name="use_underline">True</property>
+                        <signal name="toggled" handler="on_menu_match_toggled"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkCheckMenuItem" id="menuitem_line">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Highlight current line</property>
+                        <property name="use_underline">True</property>
+                        <signal name="toggled" handler="on_menuitem_line_toggled"/>
                       </widget>
                     </child>
                   </widget>
@@ -222,6 +296,7 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <signal name="activate" handler="on_menu_jump_activate"/>
+                        <accelerator key="J" modifiers="GDK_CONTROL_MASK" signal="activate"/>
                       </widget>
                     </child>
                     <child>
@@ -254,6 +329,40 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <signal name="activate" handler="on_menuitem_clear_activate"/>
+                        <accelerator key="H" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem7">
+                        <property name="visible">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="menuitem_directory">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Containing _directory</property>
+                        <property name="use_underline">True</property>
+                        <accelerator key="D" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                        <child internal-child="image">
+                          <widget class="GtkImage" id="menu-item-image1">
+                            <property name="visible">True</property>
+                            <property name="stock">gtk-directory</property>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkImageMenuItem" id="menuitem_term">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">_Terminal</property>
+                        <property name="use_underline">True</property>
+                        <accelerator key="T" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+                        <child internal-child="image">
+                          <widget class="GtkImage" id="menu-item-image2">
+                            <property name="visible">True</property>
+                            <property name="icon_name">terminal</property>
+                          </widget>
+                        </child>
                       </widget>
                     </child>
                   </widget>
@@ -319,6 +428,7 @@
                 <property name="can_focus">True</property>
                 <property name="truncate_multiline">True</property>
                 <signal name="focus_out_event" handler="on_entry_jump_focus_out_event"/>
+                <signal name="key_press_event" handler="on_entry_jump_key_press_event"/>
                 <signal name="activate" handler="on_entry_jump_activate"/>
               </widget>
               <packing>
@@ -328,6 +438,7 @@
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="padding">2</property>
             <property name="position">2</property>
           </packing>
         </child>
@@ -358,6 +469,7 @@
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="padding">2</property>
             <property name="position">3</property>
           </packing>
         </child>
@@ -388,6 +500,7 @@
           </widget>
           <packing>
             <property name="expand">False</property>
+            <property name="padding">2</property>
             <property name="position">4</property>
           </packing>
         </child>
--- a/main_window.py	Tue May 06 02:01:35 2008 +0200
+++ b/main_window.py	Thu Jun 05 22:03:05 2008 +0200
@@ -13,7 +13,7 @@
 import editor_view
 
 class MainWindow:
-    def __init__(self, filename="main_window.py"):
+    def __init__(self, filename):
         self.xml = gtk.glade.XML("main_window.glade")
         self.xml.signal_autoconnect(self)
         scrolled_window = self.xml.get_widget("scrolledwindow")
@@ -79,6 +79,19 @@
         self.menuitem_undo.set_sensitive(self.editor.buffer.can_undo())
         self.menuitem_redo.set_sensitive(self.editor.buffer.can_redo())
 
+    def on_menuitem_margin_toggled(self, menuitem):
+        self.editor.show_right_margin = menuitem.get_active()
+
+    def on_menuitem_numbers_toggled(self, menuitem):
+        self.editor.show_line_numbers = menuitem.get_active()
+
+    def on_menuitem_wrap_toggled(self, menuitem):
+        print "wrap"
+        if menuitem.get_active():
+            self.editor.set_wrap_mode(gtk.WRAP_WORD)
+        else:
+            self.editor.set_wrap_mode(gtk.WRAP_NONE)
+
     def on_menu_about_activate(self, menuitem):
         dialog = gtk.AboutDialog()
         dialog.set_name("Text Editor")
@@ -110,6 +123,12 @@
     def on_entry_jump_focus_out_event(self, x, y):
         self.hbox_jump.hide()
 
+    def on_entry_jump_key_press_event(self, entry, event):
+       if event.keyval == 65307: # The ESC key
+            self.hbox_jump.hide()
+            self.editor.grab_focus()
+            return False
+
     def on_entry_jump_activate(self, entry):
         text = entry.get_text()
         try:
@@ -117,10 +136,9 @@
         except ValueError:
             return
         if  self.editor.buffer.get_line_count() >= line >= 1:
+            self.editor.jump(line)
             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)
+            self.editor.grab_focus()
 
     def on_menu_find_activate(self, menuitem):
         self.hbox_find.show()
@@ -131,6 +149,7 @@
 
     def on_entry_find_activate(self, entry):
         self.hbox_find.hide()
+        self.editor.grab_focus()
 
     def on_menu_replace_activate(self, menuitem):
         self.hbox_replace.show()
@@ -138,9 +157,25 @@
 
     def on_entry_replace_focus_out_event(self, x, y):
         self.hbox_replace.hide()
+        self.editor.grab_focus()
 
     def on_entry_replace_activate(self, entry):
         self.hbox_replace.hide()
+        self.editor.grab_focus()
+
+    def on_menuitem_preview_activate(self, menuitem):
+        dialog = gtk.PrintOperation()
+        dialog.set_job_name(self.editor.buffer.filename)
+        dialog.connect("draw-page", self.editor.draw_page)
+        dialog.connect("begin-print", self.editor.begin_print)
+        result = dialog.run(gtk.PRINT_OPERATION_ACTION_PREVIEW, self.window)
+
+    def on_menuitem_print_activate(self, menuitem):
+        dialog = gtk.PrintOperation()
+        dialog.set_job_name(self.editor.buffer.filename)
+        dialog.connect("draw-page", self.editor.draw_page)
+        dialog.connect("begin-print", self.editor.begin_print)
+        result = dialog.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, self.window)
 
     def close(self):
         self.editor.close()
@@ -148,5 +183,5 @@
         sys.exit()
 
 if __name__ == "__main__":
-    window = MainWindow()
+    window = MainWindow(__file__)
     gtk.main()