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.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2010-05-11  |  13KB  |  351 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (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 not isinstance(print_data.page_breaks, list):
  171.         raise AssertionError
  172.     if page_nr == 0:
  173.         start = 0
  174.     else:
  175.         start = print_data.page_breaks[page_nr - 1]
  176.     
  177.     try:
  178.         end = print_data.page_breaks[page_nr]
  179.     except IndexError:
  180.         end = print_data.layout.get_line_count()
  181.  
  182.     cr = context.get_cairo_context()
  183.     cr.set_source_rgb(0, 0, 0)
  184.     i = 0
  185.     start_pos = 0
  186.     iter = print_data.layout.get_iter()
  187.     while i >= start:
  188.         line = iter.get_line()
  189.         (_, logical_rect) = iter.get_line_extents()
  190.         (lx, ly, lwidth, lheight) = logical_rect
  191.         baseline = iter.get_baseline()
  192.         if i == start:
  193.             start_pos = ly / 1024
  194.         
  195.         cr.move_to(lx / 1024, baseline / 1024 - start_pos)
  196.         cr.show_layout_line(line)
  197.     i += 1
  198.     if not i < end and iter.next_line():
  199.         break
  200.         continue
  201.     continue
  202.  
  203.  
  204. def do_page_setup(action):
  205.     global settings, page_setup
  206.     if settings is None:
  207.         settings = gtk.PrintSettings()
  208.     
  209.     page_setup = gtk.print_run_page_setup_dialog(main_window, page_setup, settings)
  210.  
  211.  
  212. def status_changed_cb(op):
  213.     if op.is_finished():
  214.         active_prints.remove(op)
  215.     
  216.     update_statusbar()
  217.  
  218.  
  219. def do_print(action):
  220.     global settings
  221.     print_data = PrintData()
  222.     print_data.text = get_text()
  223.     print_ = gtk.PrintOperation()
  224.     if settings is not None:
  225.         print_.set_print_settings(settings)
  226.     
  227.     if page_setup is not None:
  228.         print_.set_default_page_setup(page_setup)
  229.     
  230.     print_.connect('begin_print', begin_print, print_data)
  231.     print_.connect('draw_page', draw_page, print_data)
  232.     
  233.     try:
  234.         res = print_.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, main_window)
  235.     except gobject.GError:
  236.         ex = None
  237.         error_dialog = gtk.MessageDialog(main_window, gtk.DIALOG_DESTROY_WITH_PARENT, gtk._MESSAGE_ERROR, gtk.BUTTONS_CLOSE, 'Error printing file:\n%s' % str(ex))
  238.         error_dialog.connect('response', gtk.Widget.destroy)
  239.         error_dialog.show()
  240.  
  241.     if res == gtk.PRINT_OPERATION_RESULT_APPLY:
  242.         settings = print_.get_print_settings()
  243.     
  244.     if not print_.is_finished():
  245.         active_prints.remove(print_)
  246.         update_statusbar()
  247.         print_.connect('status_changed', status_changed_cb)
  248.     
  249.  
  250.  
  251. def do_about(action):
  252.     authors = [
  253.         'Alexander Larsson (C version)',
  254.         'Gustavo Carneiro (Python translation)']
  255.     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)
  256.     about.set_transient_for(main_window)
  257.     about.show()
  258.  
  259.  
  260. def do_quit(action):
  261.     if __name__ == '__main__':
  262.         gtk.main_quit()
  263.     
  264.  
  265. entries = [
  266.     ('FileMenu', None, '_File'),
  267.     ('HelpMenu', None, '_Help'),
  268.     ('New', gtk.STOCK_NEW, '_New', '<control>N', 'Create a new file', do_new),
  269.     ('Open', gtk.STOCK_OPEN, '_Open', '<control>O', 'Open a file', do_open),
  270.     ('Save', gtk.STOCK_SAVE, '_Save', '<control>S', 'Save current file', do_save),
  271.     ('SaveAs', gtk.STOCK_SAVE, 'Save _As...', None, 'Save to a file', do_save_as),
  272.     ('Quit', gtk.STOCK_QUIT, '_Quit', '<control>Q', 'Quit', do_quit),
  273.     ('About', None, '_About', '<control>A', 'About', do_about),
  274.     ('PageSetup', None, 'Page _Setup', None, 'Set up the page', do_page_setup),
  275.     ('Print', gtk.STOCK_PRINT, None, None, 'Print the document', do_print)]
  276. 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"
  277.  
  278. def buffer_changed_callback(buffer):
  279.     global file_changed
  280.     file_changed = True
  281.     update_statusbar()
  282.  
  283.  
  284. def mark_set_callback(buffer, new_location, mark):
  285.     update_statusbar()
  286.  
  287.  
  288. def update_resize_grip(widget, event, statusbar):
  289.     if event.changed_mask & (gtk.gdk.WINDOW_STATE_MAXIMIZED | gtk.gdk.WINDOW_STATE_FULLSCREEN):
  290.         maximized = event.new_window_state & (gtk.gdk.WINDOW_STATE_MAXIMIZED | gtk.gdk.WINDOW_STATE_FULLSCREEN)
  291.         statusbar.set_has_resize_grip(not maximized)
  292.     
  293.  
  294.  
  295. def create_window():
  296.     global main_window, statusbar, buffer
  297.     main_window = gtk.Window()
  298.     main_window.set_default_size(400, 600)
  299.     if __name__ == '__main__':
  300.         main_window.connect('delete-event', gtk.main_quit)
  301.     
  302.     actions = gtk.ActionGroup('Actions')
  303.     actions.add_actions(entries)
  304.     ui = gtk.UIManager()
  305.     ui.insert_action_group(actions, 0)
  306.     main_window.add_accel_group(ui.get_accel_group())
  307.     main_window.set_border_width(0)
  308.     ui.add_ui_from_string(ui_info)
  309.     table = gtk.Table(1, 3, False)
  310.     main_window.add(table)
  311.     bar = ui.get_widget('/MenuBar')
  312.     bar.show()
  313.     table.attach(bar, 0, 1, 0, 1, gtk.EXPAND | gtk.FILL, 0, 0, 0)
  314.     sw = gtk.ScrolledWindow()
  315.     sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  316.     sw.set_shadow_type(gtk.SHADOW_IN)
  317.     table.attach(sw, 0, 1, 1, 2, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL, 0, 0)
  318.     contents = gtk.TextView()
  319.     contents.grab_focus()
  320.     sw.add(contents)
  321.     statusbar = gtk.Statusbar()
  322.     table.attach(statusbar, 0, 1, 2, 3, gtk.EXPAND | gtk.FILL, 0, 0, 0)
  323.     buffer = contents.get_buffer()
  324.     buffer.connect_object('changed', buffer_changed_callback, None)
  325.     buffer.connect_object('mark_set', mark_set_callback, None)
  326.     main_window.connect_object('window_state_event', update_resize_grip, statusbar, 0)
  327.     update_ui()
  328.     main_window.show_all()
  329.  
  330.  
  331. def main(argv):
  332.     create_window()
  333.     
  334.     try:
  335.         fname = argv[1]
  336.     except IndexError:
  337.         pass
  338.  
  339.     load_file(fname)
  340.     gtk.main()
  341.  
  342.  
  343. def PrintEditorDemo(win):
  344.     create_window()
  345.     main_window.set_transient_for(win)
  346.     return main_window
  347.  
  348. if __name__ == '__main__':
  349.     sys.exit(main(sys.argv))
  350.  
  351.