home *** CD-ROM | disk | FTP | other *** search
/ tusportal.tus.k12.pa.us / tusportal.tus.k12.pa.us.tar / tusportal.tus.k12.pa.us / Wyse / latest-image.raw / 0.img / usr / lib / pygtk / 2.0 / demos / print_editor.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2010-05-11  |  13KB  |  349 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. '''Print Editor
  5.  
  6. A small demo editor with printing support'''
  7. import sys
  8. import gobject
  9. import pango
  10. import gtk
  11. main_window = None
  12. filename = None
  13. page_setup = None
  14. settings = None
  15. file_changed = False
  16. buffer = None
  17. statusbar = None
  18. active_prints = []
  19.  
  20. def update_title():
  21.     if filename is None:
  22.         basename = 'Untitled'
  23.     else:
  24.         basename = os.path.basename(filename)
  25.     main_window.set_title('Simple Editor with printing - %s' % basename)
  26.  
  27.  
  28. def update_statusbar():
  29.     statusbar.pop(0)
  30.     iter = buffer.get_iter_at_mark(buffer.get_insert())
  31.     row = iter.get_line()
  32.     col = iter.get_line_offset()
  33.     print_str = ''
  34.     if active_prints:
  35.         op = active_prints[0]
  36.         print_str = op.get_status_string()
  37.     
  38.     if not file_changed or ' - Modified':
  39.         pass
  40.     msg = '%d, %d%s %s' % (row, col, '', print_str)
  41.     statusbar.push(0, msg)
  42.  
  43.  
  44. def update_ui():
  45.     update_title()
  46.     update_statusbar()
  47.  
  48.  
  49. def get_text():
  50.     (start, end) = buffer.get_bounds()
  51.     return buffer.get_text(start, end, False)
  52.  
  53.  
  54. def set_text(text):
  55.     global file_changed
  56.     buffer.set_text(text)
  57.     file_changed = False
  58.     update_ui()
  59.  
  60.  
  61. def do_new(action):
  62.     global filename
  63.     filename = None
  64.     set_text('')
  65.  
  66.  
  67. def load_file(open_filename):
  68.     error_dialog = None
  69.     
  70.     try:
  71.         contents = file(open_filename).read()
  72.     except IOError:
  73.         ex = None
  74.         error_dialog = gtk.MessageDialog(main_window, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Error loading file %s:\n%s' % (open_filename, str(ex)))
  75.  
  76.     
  77.     try:
  78.         contents = contents.decode('utf-8')
  79.     except UnicodeDecodeError:
  80.         error_dialog = gtk.MessageDialog(main_window, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Error loading file %s:\n%s' % (open_filename, 'Not valid utf8'))
  81.  
  82.     set_text(contents)
  83.     if error_dialog is not None:
  84.         error_dialog.connect('response', gtk.Widget.destroy)
  85.         error_dialog.show()
  86.     
  87.  
  88.  
  89. def do_open(action):
  90.     dialog = gtk.FileChooserDialog('Select file', main_window, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  91.     dialog.set_default_response(gtk.RESPONSE_OK)
  92.     response = dialog.run()
  93.     if response == gtk.RESPONSE_OK:
  94.         open_filename = dialog.get_filename()
  95.         load_file(open_filename)
  96.     
  97.     dialog.destroy()
  98.  
  99.  
  100. def save_file(save_filename):
  101.     global filename
  102.     text = get_text()
  103.     error_dialog = None
  104.     
  105.     try:
  106.         file(save_filename, 'w').write(text)
  107.     except IOError:
  108.         ex = None
  109.         error_dialog = gtk.MessageDialog(main_window, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Error saving to file %s:\n%s' % (open_filename, str(ex)))
  110.         error_dialog.connect('response', gtk.Widget.destroy)
  111.         error_dialog.show()
  112.  
  113.     if save_filename != filename:
  114.         filename = save_filename
  115.     
  116.     file_changed = False
  117.     update_ui()
  118.  
  119.  
  120. def do_save_as(action):
  121.     dialog = gtk.FileChooserDialog('Select file', main_window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
  122.     dialog.set_default_response(gtk.RESPONSE_OK)
  123.     response = dialog.run()
  124.     if response == gtk.RESPONSE_OK:
  125.         save_filename = dialog.get_filename()
  126.         save_file(save_filename)
  127.     
  128.     dialog.destroy()
  129.  
  130.  
  131. def do_save(action):
  132.     if filename is None:
  133.         do_save_as(action)
  134.     else:
  135.         save_file(filename)
  136.  
  137.  
  138. class PrintData:
  139.     text = None
  140.     layout = None
  141.     page_breaks = None
  142.  
  143.  
  144. def begin_print(operation, context, print_data):
  145.     width = context.get_width()
  146.     height = context.get_height()
  147.     print_data.layout = context.create_pango_layout()
  148.     print_data.layout.set_font_description(pango.FontDescription('Sans 12'))
  149.     print_data.layout.set_width(int(width * pango.SCALE))
  150.     print_data.layout.set_text(print_data.text)
  151.     num_lines = print_data.layout.get_line_count()
  152.     page_breaks = []
  153.     page_height = 0
  154.     for line in xrange(num_lines):
  155.         layout_line = print_data.layout.get_line(line)
  156.         (ink_rect, logical_rect) = layout_line.get_extents()
  157.         (lx, ly, lwidth, lheight) = logical_rect
  158.         line_height = lheight / 1024
  159.         if page_height + line_height > height:
  160.             page_breaks.append(line)
  161.             page_height = 0
  162.         
  163.         page_height += line_height
  164.     
  165.     operation.set_n_pages(len(page_breaks) + 1)
  166.     print_data.page_breaks = page_breaks
  167.  
  168.  
  169. def draw_page(operation, context, page_nr, print_data):
  170.     if page_nr == 0:
  171.         start = 0
  172.     else:
  173.         start = print_data.page_breaks[page_nr - 1]
  174.     
  175.     try:
  176.         end = print_data.page_breaks[page_nr]
  177.     except IndexError:
  178.         end = print_data.layout.get_line_count()
  179.  
  180.     cr = context.get_cairo_context()
  181.     cr.set_source_rgb(0, 0, 0)
  182.     i = 0
  183.     start_pos = 0
  184.     iter = print_data.layout.get_iter()
  185.     while i >= start:
  186.         line = iter.get_line()
  187.         (_, logical_rect) = iter.get_line_extents()
  188.         (lx, ly, lwidth, lheight) = logical_rect
  189.         baseline = iter.get_baseline()
  190.         if i == start:
  191.             start_pos = ly / 1024
  192.         
  193.         cr.move_to(lx / 1024, baseline / 1024 - start_pos)
  194.         cr.show_layout_line(line)
  195.     i += 1
  196.     if not i < end and iter.next_line():
  197.         break
  198.         continue
  199.     continue
  200.  
  201.  
  202. def do_page_setup(action):
  203.     global settings, page_setup
  204.     if settings is None:
  205.         settings = gtk.PrintSettings()
  206.     
  207.     page_setup = gtk.print_run_page_setup_dialog(main_window, page_setup, settings)
  208.  
  209.  
  210. def status_changed_cb(op):
  211.     if op.is_finished():
  212.         active_prints.remove(op)
  213.     
  214.     update_statusbar()
  215.  
  216.  
  217. def do_print(action):
  218.     global settings
  219.     print_data = PrintData()
  220.     print_data.text = get_text()
  221.     print_ = gtk.PrintOperation()
  222.     if settings is not None:
  223.         print_.set_print_settings(settings)
  224.     
  225.     if page_setup is not None:
  226.         print_.set_default_page_setup(page_setup)
  227.     
  228.     print_.connect('begin_print', begin_print, print_data)
  229.     print_.connect('draw_page', draw_page, print_data)
  230.     
  231.     try:
  232.         res = print_.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, main_window)
  233.     except gobject.GError:
  234.         ex = None
  235.         error_dialog = gtk.MessageDialog(main_window, gtk.DIALOG_DESTROY_WITH_PARENT, gtk._MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Error printing file:\n%s' % str(ex))
  236.         error_dialog.connect('response', gtk.Widget.destroy)
  237.         error_dialog.show()
  238.  
  239.     if res == gtk.PRINT_OPERATION_RESULT_APPLY:
  240.         settings = print_.get_print_settings()
  241.     
  242.     if not print_.is_finished():
  243.         active_prints.remove(print_)
  244.         update_statusbar()
  245.         print_.connect('status_changed', status_changed_cb)
  246.     
  247.  
  248.  
  249. def do_about(action):
  250.     authors = [
  251.         'Alexander Larsson (C version)',
  252.         'Gustavo Carneiro (Python translation)']
  253.     about = gobject.new(gtk.AboutDialog, name = 'print test editor', version = '0.1', copyright = '(C) Red Hat, Inc', comments = 'Program to demonstrate GTK+ printing.', authors = authors)
  254.     about.set_transient_for(main_window)
  255.     about.show()
  256.  
  257.  
  258. def do_quit(action):
  259.     if __name__ == '__main__':
  260.         gtk.main_quit()
  261.     
  262.  
  263. entries = [
  264.     ('FileMenu', None, '_File'),
  265.     ('HelpMenu', None, '_Help'),
  266.     ('New', gtk.STOCK_NEW, '_New', '<control>N', 'Create a new file', do_new),
  267.     ('Open', gtk.STOCK_OPEN, '_Open', '<control>O', 'Open a file', do_open),
  268.     ('Save', gtk.STOCK_SAVE, '_Save', '<control>S', 'Save current file', do_save),
  269.     ('SaveAs', gtk.STOCK_SAVE, 'Save _As...', None, 'Save to a file', do_save_as),
  270.     ('Quit', gtk.STOCK_QUIT, '_Quit', '<control>Q', 'Quit', do_quit),
  271.     ('About', None, '_About', '<control>A', 'About', do_about),
  272.     ('PageSetup', None, 'Page _Setup', None, 'Set up the page', do_page_setup),
  273.     ('Print', gtk.STOCK_PRINT, None, None, 'Print the document', do_print)]
  274. ui_info = "\n<ui>\n  <menubar name='MenuBar'>\n    <menu action='FileMenu'>\n      <menuitem action='New'/>\n      <menuitem action='Open'/>\n      <menuitem action='Save'/>\n      <menuitem action='SaveAs'/>\n      <menuitem action='PageSetup'/>\n      <menuitem action='Print'/>\n      <separator/>\n      <menuitem action='Quit'/>\n    </menu>\n    <menu action='HelpMenu'>\n      <menuitem action='About'/>\n    </menu>\n  </menubar>\n</ui>\n"
  275.  
  276. def buffer_changed_callback(buffer):
  277.     global file_changed
  278.     file_changed = True
  279.     update_statusbar()
  280.  
  281.  
  282. def mark_set_callback(buffer, new_location, mark):
  283.     update_statusbar()
  284.  
  285.  
  286. def update_resize_grip(widget, event, statusbar):
  287.     if event.changed_mask & (gtk.gdk.WINDOW_STATE_MAXIMIZED | gtk.gdk.WINDOW_STATE_FULLSCREEN):
  288.         maximized = event.new_window_state & (gtk.gdk.WINDOW_STATE_MAXIMIZED | gtk.gdk.WINDOW_STATE_FULLSCREEN)
  289.         statusbar.set_has_resize_grip(not maximized)
  290.     
  291.  
  292.  
  293. def create_window():
  294.     global main_window, statusbar, buffer
  295.     main_window = gtk.Window()
  296.     main_window.set_default_size(400, 600)
  297.     if __name__ == '__main__':
  298.         main_window.connect('delete-event', gtk.main_quit)
  299.     
  300.     actions = gtk.ActionGroup('Actions')
  301.     actions.add_actions(entries)
  302.     ui = gtk.UIManager()
  303.     ui.insert_action_group(actions, 0)
  304.     main_window.add_accel_group(ui.get_accel_group())
  305.     main_window.set_border_width(0)
  306.     ui.add_ui_from_string(ui_info)
  307.     table = gtk.Table(1, 3, False)
  308.     main_window.add(table)
  309.     bar = ui.get_widget('/MenuBar')
  310.     bar.show()
  311.     table.attach(bar, 0, 1, 0, 1, gtk.EXPAND | gtk.FILL, 0, 0, 0)
  312.     sw = gtk.ScrolledWindow()
  313.     sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  314.     sw.set_shadow_type(gtk.SHADOW_IN)
  315.     table.attach(sw, 0, 1, 1, 2, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
  316.     contents = gtk.TextView()
  317.     contents.grab_focus()
  318.     sw.add(contents)
  319.     statusbar = gtk.Statusbar()
  320.     table.attach(statusbar, 0, 1, 2, 3, gtk.EXPAND | gtk.FILL, 0, 0, 0)
  321.     buffer = contents.get_buffer()
  322.     buffer.connect_object('changed', buffer_changed_callback, None)
  323.     buffer.connect_object('mark_set', mark_set_callback, None)
  324.     main_window.connect_object('window_state_event', update_resize_grip, statusbar, 0)
  325.     update_ui()
  326.     main_window.show_all()
  327.  
  328.  
  329. def main(argv):
  330.     create_window()
  331.     
  332.     try:
  333.         fname = argv[1]
  334.     except IndexError:
  335.         pass
  336.  
  337.     load_file(fname)
  338.     gtk.main()
  339.  
  340.  
  341. def PrintEditorDemo(win):
  342.     create_window()
  343.     main_window.set_transient_for(win)
  344.     return main_window
  345.  
  346. if __name__ == '__main__':
  347.     sys.exit(main(sys.argv))
  348.  
  349.