raubarede/Ruiby

View on GitHub
lib/ruiby_gtk/dsl/editors.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# Creative Commons BY-SA :  Regis d'Aubarede <regis.aubarede@gmail.com>
# LGPL

module Ruiby_dsl

  ##################### source editor

  # a source_editor widget : text as showed in fixed font, colorized (default: ruby syntaxe)
  # from: green shoes plugin
  # options= :width  :height :on_change :lang :font
  # @edit=source_editor().editor
  # @edit.buffer.text=File.read(@filename)
  def source_editor(args={},&blk) 
    #return(nil) # loading gtksourceview3 scratch application...
    begin
      require 'gtksourceview3'
    rescue Exception => e
      log('gtksourceview3 not installed!, please use text_area')
      puts '******** gtksourceview3 not installed!, please use text_area ************' 
      return
    end
    _accept?(:widget)    
    args[:width]  = 400 unless args[:width]
    args[:height] = 300 unless args[:height]
    change_proc = proc { }
    sv = GtkSource::View.new
    sv.show_line_numbers = true
    sv.insert_spaces_instead_of_tabs = false
    sv.smart_home_end = :always
    sv.tab_width = 4
    sv.buffer.text = (args[:text]||"").to_s
    sv.buffer.language = GtkSource::LanguageManager.new.get_language(args[:lang]||'ruby')
    sv.buffer.highlight_syntax = true
    sv.override_font(  Pango::FontDescription.new(args[:font] || "Courier new 10")) 
    cb = ScrolledWindow.new
    cb.define_singleton_method(:editor) { sv }
    cb.define_singleton_method(:text=) { |t| sv.buffer.text=t }
    cb.define_singleton_method(:text) {  sv.buffer.text }
    
    if block_given?
      sv.signal_connect('key_press_event') { |w,evt|
          blk.call(w,w.buffer.text) rescue error($!)
          false
      }
    end
    
    cb.set_size_request(args[:width], args[:height])
    cb.set_policy(:automatic, :automatic)
    cb.set_shadow_type(:in)
    cb.add(sv)
    cb.show_all
    attribs(cb,{})  
  end

end