All Files (95.65% covered at 23.83 hits/line)
96 files in total.
1816 relevant lines.
1737 lines covered and
79 lines missed
-
2
class ComponentQuery < GuiQuery
-
# Launch the query in the Event Dispatch Thread (EDT),
-
# which is the thread reserved for user interfaces.
-
#
-
2
def initialize(component)
-
# if a fixture, component is component's target. Otherwise, it is the component.
-
53
super()
-
53
@component = component.target if component.class.to_s =~ /Fixture$/
-
1054
@component = component if component.class.ancestors.any? {|c| c.to_s =~/Javax|JavaAwt/}
-
end
-
-
2
def self.execute_query(component)
-
52
GuiActionRunner.execute(self.new(component))
-
end
-
end
-
-
# creates a class for the query - name is derived from the method name, but we
-
# really don't care what it is, we only need to have a class defined so
-
# that we can use GuiActionRunner on it.
-
# the class is defined in the context of the toplevel binding, unless it
-
# already exists.
-
-
2
def define_edt_query_class(name)
-
-
36
class_name = "#{name.to_s.chomp('?')}_query".camelize
-
18
begin
-
18
class_name.constatize
-
rescue NameError
-
18
method_call_name = name.to_s.chomp("?")
-
18
method_call_name = "is_"+method_call_name if method_call_name.size < name.to_s.size
-
18
eval "
-
18
class #{class_name} < ComponentQuery
-
def executeInEDT
-
18
@component.#{method_call_name}
-
end
-
end", TOPLEVEL_BINDING
-
end
-
end
-
-
2
def define_edt_query(name)
-
18
define_edt_query_class name
-
36
define_method("edt_#{name}") do
-
138
return "#{name.to_s.chomp('?')}_query".camelize.constantize.execute_query(self)
-
end
-
end
-
-
2
module EDTQuery
-
-
2
define_edt_query :visible?
-
2
define_edt_query :enabled?
-
2
define_edt_query :title
-
2
define_edt_query :label_for
-
2
define_edt_query :owner
-
2
define_edt_query :selected_text
-
2
define_edt_query :viewport
-
2
define_edt_query :selected_component
-
2
define_edt_query :view
-
-
end
-
-
2
class ComponentFixture
-
2
include EDTQuery
-
end
-
-
2
class Component
-
2
include EDTQuery
-
end
-
-
-
-
1
class DrawingExtensions
-
1
include Drawing
-
1
attr_accessor :gc
-
1
attr_accessor :bi
-
1
def initialize
-
47
@bi = BufferedImage.new(500,500,BufferedImage::TYPE_4BYTE_ABGR)
-
47
@gc = @bi.create_graphics
-
end
-
end
-
2
java.lang.System.set_property("apple.laf.useScreenMenuBar", "false")
-
2
java.lang.System.set_property("com.drogar.testing.fest","true")
-
-
2
%w{GuiActionRunner GuiQuery GuiTask FailOnThreadViolationRepaintManager}.each do |c|
-
8
java_import "org.fest.swing.edt."+c
-
end
-
-
2
java_import org.fest.swing.core.BasicRobot
-
2
java_import org.fest.swing.finder.WindowFinder
-
-
2
%w{Component JMenuItem Frame JTextComponent JSpinner JLabel JButton JFileChooser}.each do |c|
-
16
java_import "org.fest.swing.fixture."+c+"Fixture"
-
end
-
-
2
%w{JButton JLabel Frame Dialog}.each do |c|
-
8
java_import "org.fest.swing.core.matcher."+c+"Matcher"
-
end
-
-
-
2
FailOnThreadViolationRepaintManager.install()
-
-
-
1
def get_sample_data_at_point(rstr,x,y)
-
82
s=[]
-
82
[0,1,2,3].each do |i|
-
328
s<< rstr.getSample(x,y,i)
-
end
-
82
s
-
end
-
-
1
def check_some_point_is_black(img,start_x,start_y,end_x,end_y)
-
2
rstr = img.data(Rectangle.new(start_x,start_y,end_x+1,end_y+1))
-
-
2
xs = Range.new(start_x,end_x)
-
2
ys = Range.new(start_y,end_y)
-
4
(xs.any? do |x|
-
1752
ys.any? {|y| get_sample_data_at_point(rstr,x,y)[3] == 255}
-
end).should == true
-
end
-
-
1
def check_raster_point_is_black(rstr,x,y)
-
9
s=get_sample_data_at_point(rstr,x,y)
-
-
9
s[3].should == 255
-
end
-
-
1
def check_raster_point_is_grey(rstr,x,y)
-
16
s=get_sample_data_at_point(rstr,x,y)
-
16
s[3].should > 50
-
end
-
-
1
def check_raster_point_is_white(rstr,x,y)
-
1
s=get_sample_data_at_point(rstr,x,y)
-
1
s[3].should == 0
-
end
-
-
1
def check_raster_point_is_green(rstr,x,y)
-
2
s=get_sample_data_at_point(rstr,x,y)
-
-
2
s[1].should_not == 0
-
2
s[0].should == 0
-
2
s[2].should == 0
-
2
s[3].should_not == 0
-
end
-
2
$:.unshift File.expand_path(File.dirname(__FILE__))
-
2
require 'swingtown_utils'
-
2
require 'swingtown/swingtown'
-
-
# EOF
-
2
module Swingtown
-
2
module MiG
-
2
module ClassMethods
-
2
HERE = File.expand_path(File.dirname __FILE__ )
-
-
2
def mig_jar glob_path = "#{HERE}/../../java/*.jar"
-
warn "mig_jar #{glob_path} "
-
Dir.glob(glob_path).select { |f|
-
f =~ /(miglayout-)(.+).jar$/}.first
-
end
-
-
2
def mig_layout
-
require mig_jar
-
end
-
-
end
-
-
2
def self.included(base)
-
base.extend(MiG::ClassMethods)
-
end
-
-
2
def mig_layout(layout_spec)
-
Java::net::miginfocom::swing::MigLayout.new layout_spec
-
end
-
-
end
-
-
2
module Core
-
2
module SwingConstants
-
%w{
-
2
BOTTOM
-
CENTER
-
EAST
-
HORIZONTAL
-
LEADING
-
LEFT
-
NEXT
-
NORTH
-
NORTH_EAST
-
NORTH_WEST
-
PREVIOUS
-
RIGHT
-
SOUTH
-
SOUTH_EAST
-
SOUTH_WEST
-
TOP
-
TRAILING
-
VERTICAL
-
WEST}.each do |konst|
-
114
class_eval "#{konst} = Java::javax::swing::SwingConstants::#{konst}"
-
end
-
end
-
-
2
class Dimension
-
2
def self.[](width, height)
-
java::awt::Dimension.new width, height
-
end
-
end
-
-
# class ImageIcon
-
# def self.load(image_path)
-
# javax.swing.ImageIcon.new load_resource image_path
-
# end
-
# end
-
-
-
# A button wrapper
-
# See http://xxxxxxxx to understand Swing buttons
-
2
class Button < Java::javax::swing::JButton
-
2
def initialize(*args)
-
102
super(*args)
-
102
yield self if block_given?
-
end
-
2
def self.make_button_in_container(container, *args)
-
204
self.new(*args) {|btn| container.add(btn)}
-
end
-
end
-
-
-
2
class MenuBar < Java::javax.swing.JMenuBar
-
2
def initialize
-
super
-
yield self if block_given?
-
end
-
-
end
-
-
2
class MenuItem < Java::javax.swing.JMenuItem
-
2
def initialize
-
super
-
yield self if block_given?
-
end
-
end
-
-
2
class Menu < Java::javax.swing.JMenu
-
2
def initialize
-
super
-
yield self if block_given?
-
end
-
end
-
-
2
class SFont < Java::java.awt.Font
-
end
-
-
# A label wrapper
-
# See http://xxxxxxxx to understand Swing labels
-
2
class Label < Java::javax::swing::JLabel
-
-
2
@@default_font = SFont.new("Lucida Grande", 0, 12)
-
-
2
def self.default_font=(default_font)
-
@@default_font = default_font
-
end
-
-
2
def self.default_font
-
101
@@default_font
-
end
-
-
2
def initialize(text=nil)
-
100
super
-
100
self.text = text.to_s if text
-
100
self.font = Label.default_font
-
100
yield self if block_given?
-
end
-
-
2
def minimum_dimensions(width, height)
-
self.minimum_size = java::awt::Dimension.new width, height
-
end
-
-
2
def prefered_dimensions(width, height)
-
self.prefered_size = java::awt::Dimension.new width, height
-
end
-
end
-
-
2
class Spinner < Java::javax.swing.JSpinner
-
2
JINT = Java::int
-
2
@@spinner_cons = SpinnerNumberModel.java_class.constructor(JINT,JINT,
-
JINT,JINT)
-
2
def self.make_new_spinner_number_model(args)
-
102
@@spinner_cons.new_instance(args[0],args[1],args[2],args[3])
-
end
-
2
def initialize
-
104
super
-
end
-
-
2
def self.make_spinner(*args)
-
102
return Spinner.new unless args and args.length == 4
-
102
spinner = Spinner.new
-
-
102
spinner.model=make_new_spinner_number_model(args)
-
102
spinner
-
end
-
2
def labelize_and_add_to_container(text_for_label, container)
-
102
spinlab = make_my_label(text_for_label)
-
102
container.add(spinlab) if container
-
102
container.add(self) if container
-
end
-
2
def self.spinner_with_label(text_for_label, container=nil)
-
spinner = make_spinner
-
spinner.labelize_and_add_to_container(text_for_label, container)
-
end
-
2
def self.spinner_with_label_and_model(text_for_label,val, min, max, step,container=nil)
-
102
spinner = make_spinner(val,min,max,step)
-
-
102
spinner.labelize_and_add_to_container(text_for_label, container)
-
end
-
2
def make_my_label(text_for_label)
-
103
spinlab = Label.new(text_for_label)
-
103
spinlab.label_for = self
-
103
spinlab
-
end
-
end
-
-
2
class TextField < Java::javax.swing.JTextField
-
-
2
@@default_font = SFont.new("Lucida Grande", 0, 12)
-
-
2
def self.default_font=(default_font)
-
@@default_font = default_font
-
end
-
-
2
def self.default_font
-
@@default_font
-
end
-
-
2
def initialize(text = nil)
-
super
-
self.text = text.to_s
-
self.font = Label.default_font
-
-
yield self if block_given?
-
end
-
-
2
def minimum_dimensions(width, height)
-
self.minimum_size = java::awt::Dimension.new(width,
-
height)
-
end
-
-
2
def prefered_dimensions(width, height)
-
self.preferred_size = java::awt::Dimension.new(width,
-
height)
-
end
-
-
end
-
-
# A LayeredPane wrapper
-
# See http://xxxx xxxx to understand Swing LayeredPanes
-
2
class LayeredPane < javax::swing.JLayeredPane
-
-
2
def initialize(*args)
-
super
-
yield self if block_given?
-
end
-
-
2
def background_color(red, blue, green)
-
self.background = java::awt::Color.new(red.to_i, blue.to_i,
-
green.to_i)
-
end
-
-
2
def size(width, height)
-
self.preferred_size = java::awt::Dimension.new(width,
-
height)
-
end
-
-
-
2
def add_ordered_components(*components)
-
components.each do |c|
-
self.add c
-
end
-
-
components.each do |c|
-
self.moveToFront c
-
end
-
-
-
end
-
end
-
-
2
class TabbedPane < javax::swing.JTabbedPane
-
2
def initialize(*args)
-
13
super(*args)
-
13
yield self if block_given?
-
end
-
end
-
-
2
class ScrollPane < javax::swing.JScrollPane
-
-
2
def initialize(*args)
-
78
super(*args)
-
78
yield self if block_given?
-
end
-
-
2
def background_color(red, blue, green)
-
self.background = java::awt::Color.new(red.to_i, blue.to_i,
-
green.to_i)
-
end
-
-
2
def size(width, height)
-
self.preferred_size = java::awt::Dimension.new(width,
-
height)
-
end
-
-
-
end
-
# A panel wrapper
-
# See http://xxxxxxxx to understand Swing panels
-
2
class Panel < javax::swing.JPanel
-
-
2
def initialize()
-
101
super()
-
101
yield self if block_given?
-
end
-
-
2
def background_color(red, blue, green)
-
self.background = java::awt::Color.new(red.to_i, blue.to_i,
-
green.to_i)
-
end
-
-
2
def size(width, height)
-
self.preferred_size = java::awt::Dimension.new(width,
-
height)
-
end
-
end
-
-
-
# A frame wrapper
-
# See http://xxxxxxxx to understand Swing frames
-
2
class STFrame < Java::javax::swing::JFrame
-
2
attr_accessor :minimum_height, :minimum_width
-
-
2
def initialize(title, options={})
-
78
super(title)
-
99
options.each {|k,v| self.send(k,v)}
-
78
yield self if block_given?
-
end
-
-
2
def define_minimum_size(width, height)
-
self.minimum_size = java::awt::Dimension.new(width, height)
-
end
-
-
2
def minimum_height=(height)
-
define_minimum_size(@minimum_width.to_i,
-
@minimum_height = height.to_i)
-
end
-
-
2
def minimum_width=(width)
-
define_minimum_size(@minimum_width = width.to_i,
-
@minimum_height.to_i)
-
end
-
end
-
-
2
class STDialog < Java::javax::swing::JDialog
-
-
2
def initialize(title=nil,do_not_yield = false)
-
41
super()
-
41
self.title = title if title
-
41
yield self if block_given? and not do_not_yield
-
end
-
end
-
-
2
class STDialogWithOK < STDialog
-
2
attr_accessor :button_pane
-
2
attr_accessor :ok_button
-
2
attr_accessor :data_pane
-
2
def initialize(title=nil)
-
36
super(title, false)
-
36
self.root_pane.content_pane = Panel.new do |cpane|
-
-
36
cpane.layout = BoxLayout.new(cpane,BoxLayout::Y_AXIS)
-
-
72
self.data_pane = Panel.new {|dp| cpane.add(dp)}
-
36
@button_pane = Panel.new do |bp|
-
36
@ok_button = Button.new("OK") do |b|
-
36
bp.add(b)
-
36
self.root_pane.default_button = b
-
end
-
36
cpane.add(bp)
-
end
-
end
-
36
yield self.data_pane if block_given?
-
end
-
end
-
end
-
end
-
-
-
2
module Swingtown
-
-
# :stopdoc:
-
2
VERSION = '0.3.0'
-
2
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
-
2
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
-
# :startdoc:
-
-
# Returns the version string for the library.
-
#
-
2
def self.version
-
VERSION
-
end
-
-
# Returns the library path for the module. If any arguments are given,
-
# they will be joined to the end of the libray path using
-
# <tt>File.join</tt>.
-
#
-
2
def self.libpath *args
-
args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
-
end
-
-
# Returns the lpath for the module. If any arguments are given,
-
# they will be joined to the end of the path using
-
# <tt>File.join</tt>.
-
#
-
2
def self.path *args
-
args.empty? ? PATH : ::File.join(PATH, args.flatten)
-
end
-
-
-
-
2
def self.find_mig_jar(here)
-
java_lib_dir = File.join(here,'java')
-
mig_jar = Dir.glob("#{java_lib_dir}/*.jar").select { |f| f =~ /(miglayout-)(.+).jar$/}.first
-
raise "Failed to find MiG layout jar to copy over from '#{java_lib_dir}'!" unless mig_jar
-
mig_jar
-
end
-
-
2
def self.file_check_and_warn(which,path)
-
if File.exist? path
-
warn "The #{which} file(s) already exists. Remove/rename it/them, and try again."
-
exit
-
end
-
end
-
2
def self.copy_over_mig(path = 'lib/java')
-
here = File.dirname(File.expand_path(__FILE__))
-
-
mig_jar = find_mig_jar(here)
-
-
file_check_and_warn("miglayout jar", "#{path}/#{mig_jar}")
-
-
-
FileUtils.mkdir_p path unless File.exists? path
-
warn "Have mig jar at #{mig_jar}"
-
FileUtils.cp_r mig_jar, path, :verbose => true
-
end
-
-
2
def self.copy_over
-
require 'fileutils'
-
copy_over_ruby
-
copy_over_mig
-
end
-
-
2
def self.copy_over_ruby(path = 'lib/ruby')
-
-
here = File.dirname(File.expand_path(__FILE__))
-
-
file_check_and_warn("swingset","#{path}/swingset")
-
-
FileUtils.mkdir_p path unless File.exists? path
-
FileUtils.cp_r "#{here}/swingset", path, :verbose => true
-
FileUtils.cp_r "#{here}/swingset.rb", path, :verbose => true
-
FileUtils.cp_r "#{here}/swingset_utils.rb", path, :verbose => true
-
end
-
-
end # module Swingtown
-
-
2
def check_java_lib_jar
-
java_lib_dir = File.join File.dirname( File.expand_path(__FILE__) ), 'java'
-
warn java_lib_dir
-
end
-
# EOF
-
-
2
if $0 == __FILE__
-
check_java_lib_jar
-
warn Neurogami::SwingSet.find_mig_jar "#{java_lib_dir}/*.jar"
-
-
end
-
-
2
class ApplicationController < Monkeybars::Controller
-
# Add content here that you want to be available to all the controllers
-
# in your application
-
-
2
attr_reader :lqpl_emulator_server_connection
-
-
-
2
java_signature "Object lqpl_emulator_server_connection()"
-
2
def lqpl_emulator_server_connection(connect=true)
-
68
@lqpl_emulator_server_connection = LqplEmulatorServerConnection.instance if connect && !@lqpl_emulator_server_connection
-
68
@lqpl_emulator_server_connection.connect if connect && !@lqpl_emulator_server_connection.connected?
-
68
@lqpl_emulator_server_connection
-
end
-
-
2
def my_frame
-
5
@__view.the_frame
-
end
-
-
2
def toggle_visibility
-
8
visible? ? hide : show
-
end
-
-
end
-
2
class ModelCreateError < RuntimeError ; end
-
-
2
class ApplicationModel
-
end
-
2
class ApplicationView < Monkeybars::View
-
# Add content here that you want to be available to all the views in your application
-
end
-
2
require 'communications/connection'
-
2
COMPILER_SERVER="lqpl-compiler-server"
-
2
class CompilerServerConnection < Connection
-
# include Singleton
-
-
2
attr_accessor :failed
-
2
attr_accessor :failure_message
-
-
2
def initialize(port=7683)
-
2
super(port)
-
2
@connect_to = COMPILER_SERVER
-
2
connect
-
end
-
-
2
def self.get_instance(port=7683)
-
47
super(port)
-
end
-
-
2
def compile(fname)
-
11
@fname = fname
-
11
@dir = File.dirname(@fname)
-
11
File.open(fname, "r") do |f|
-
11
qpl_file_data = f.read()
-
11
send_and_receive_command "<qplprogram>"
-
11
qpl_file_data.each_line(separator='\n') do |line|
-
11
send_and_receive_command line
-
end
-
11
@connection.puts "</qplprogram>"
-
11
@qpo_code = get_qpo_program
-
end
-
11
@qpo_code
-
end
-
-
2
def compile_and_write_qpo(fname)
-
5
write_qpo_file if compile(fname)
-
end
-
-
2
def get_qpo_program
-
11
accum=""
-
#lineno = 0
-
11
line=bypass_cs_messages
-
22
read_warning = (line =~ /w='YES'/)
-
11
reset_failure_status
-
11
while line and line != "</qpo>\n" and line !~ /<\/compilefail/ and !@failed do
-
198
line = process_input_line(line) {|checked_line| accum += checked_line if checked_line !~ command_start_regex}
-
end
-
11
read_failure_message if read_warning
-
11
return accum
-
end
-
-
2
def process_input_line(line)
-
101
@failed = line =~ /<compilefail/
-
101
read_failure_message if @failed
-
101
return nil if @failed
-
97
yield line
-
97
send_included_file(line) if line =~ /<getFirst>/
-
97
@connection.readline
-
end
-
-
2
def command_start_regex
-
97
/(CS_)|(<qpo)|(<compilefail)|(<getFirst)/
-
end
-
-
2
def bypass_cs_messages
-
11
line='CS_T'
-
11
line = @connection.readline while line =~ /CS_/ #until line !~ /CS_/
-
11
line
-
end
-
-
2
def reset_failure_status
-
11
@failed = false
-
11
@failure_message = ""
-
end
-
-
2
def read_failure_message
-
6
line = @connection.readline
-
#puts "read_failure_message: line='#{line}'"
-
6
@failure_message = ""
-
6
while line and line !~ /<\/compilefail/ and line !~ /<\/warning/ do
-
14
@failure_message << line if line !~ /^</
-
14
line = @connection.readline
-
#puts "read_failure_message: line='#{line}'"
-
end
-
end
-
-
2
def success_or_fail_message(file_name)
-
18
"Compile of #{file_name} was #{failed ? 'un' : ''}successful\n"+failure_message
-
end
-
-
2
def base_file_from_line(line_input)
-
3
basef = line_input[/(<getFirst>)(.*)(<\/getFirst>)/,2]
-
3
File.exists?(basef) ? basef : @dir + "/" + basef
-
end
-
-
2
def send_included_file(line)
-
3
f = base_file_from_line line
-
3
fdata=""
-
3
if File.exists?(f)
-
1
File.open(f) do |incfile|
-
1
fdata = incfile.read
-
end
-
1
write_specified_file f,fdata
-
else
-
2
@failed = true
-
6
@failure_message = "Unable to find or open file #{f}, Looking in #{Dir.pwd}"
-
end
-
end
-
-
2
def write_specified_file(filename, filedata)
-
2
@connection.puts "<file name='#{File.basename filename}'>"
-
1
@connection.puts filedata
-
1
@connection.puts "</file>"
-
end
-
-
2
def write_qpo_file
-
7
connect if !connected?
-
7
version_line = get_version_line
-
7
File.open(object_file_name,"w+") do |f|
-
7
f.puts version_line
-
7
f.puts @qpo_code
-
end
-
end
-
-
2
def object_file_name
-
7
File.dirname(@fname)+File::SEPARATOR+File.basename(@fname,".qpl")+".qpo"
-
end
-
-
2
def get_version_line
-
7
@connection.puts "<sendversion />"
-
7
version = @connection.readline
-
7
"Compiler: Version="+CompilerServerConnection::makeVersionNumber(version)
-
end
-
-
2
def self.makeVersionNumber(vstring)
-
8
nums = vstring[/(\d+,)+\d+/].gsub(/,/,'.')
-
8
return nums
-
end
-
-
2
def failed?
-
1
@failed
-
end
-
end
-
2
require 'singleton'
-
2
require 'socket'
-
-
2
java_import java.lang.ProcessBuilder
-
2
java_import com.drogar.lqpl.Main
-
2
java_import java.net.URLDecoder
-
-
2
class Connection
-
2
include Singleton
-
-
2
attr_accessor :port
-
2
attr_accessor :connect_to
-
2
attr_accessor :my_path
-
-
2
def initialize(port=nil)
-
5
@port = port
-
5
@connection = nil
-
5
@process = nil
-
5
_set_up_my_path
-
end
-
-
2
java_signature "boolean is_connected()"
-
2
def connected?
-
101
@connection != nil
-
end
-
-
2
def close_down
-
72
@connection.close if connected?
-
72
@process.destroy if @process
-
72
@connection = nil
-
72
@process = nil
-
end
-
-
2
def self.get_instance(port=nil)
-
56
c = self.instance
-
56
c.port = port
-
56
c
-
end
-
-
2
def connect
-
104
res = _make_connection
-
-
# puts " will try from #{jar_path}"
-
104
if !res
-
3
begin
-
# try executing from PATH first - probably not right for testing....
-
#TODO - add flag to pick order of these.
-
3
_start_up_the_executable_in_a_process(@connect_to)
-
rescue => e
-
3
begin
-
# Assume executables just below jar path
-
# Works for bundled executables.
-
9
_start_up_the_executable_in_a_process("#{@my_path}bin/#{@connect_to}")
-
rescue => e1
-
3
begin
-
# assume one further .. and then over to out/bin
-
# works for rspec and cucumber
-
9
_start_up_the_executable_in_a_process("#{@my_path}../out/bin/#{@connect_to}")
-
rescue => e2
-
9
raise ServerProcessNotFound, "There was no process found on port #{@port}. Please start '#{@connect_to}'."
-
end
-
end
-
end
-
end
-
end
-
-
2
def _set_up_my_path
-
5
@my_path= File.expand_path(__FILE__)[Regexp.new /.*?jar!/]
-
5
if @my_path
-
#:nocov:
-
skipped
@my_path=@my_path[5,@my_path.length - 18] #remove 'file:' from front, lqpl_gui.jar! from back
-
#:nocov:
-
else
-
5
@my_path = File.expand_path(File.dirname(__FILE__))+"/../../"
-
end
-
end
-
-
2
def _start_up_the_executable_in_a_process(executable)
-
9
@process=ProcessBuilder.new(executable, "").start
-
2
sleep 0.25
-
2
res2 = _make_connection
-
2
raise ServerProcessNotFound if !res2
-
end
-
-
2
def _make_connection
-
-
108
["127.0.0.1", "::1", "localhost"].each do |addr|
-
120
begin
-
120
@connection = TCPSocket.new addr, @port
-
102
return true
-
rescue Errno::ECONNREFUSED => e1
-
#puts "Connect refused For #{addr}, exception: #{e1}"
-
rescue SocketError => e
-
#puts "Socket error for #{addr}, exception: #{e} "
-
end
-
end
-
6
return false # made it through without returning
-
end
-
-
-
-
2
def send_and_receive_command(command)
-
104
connect if !connected?
-
104
@connection.puts command
-
104
@connection.readline
-
end
-
end
-
2
require 'communications/connection'
-
2
EMULATOR = "lqpl-emulator"
-
-
2
class LqplEmulatorServerConnection < Connection
-
#include Singleton
-
-
-
2
def initialize(port=9502)
-
2
super(port)
-
2
@connect_to = EMULATOR
-
2
connect
-
end
-
-
2
def self.get_instance(port=9502)
-
9
super(port)
-
end
-
-
-
2
def send_load_from_file(depth_multiplier, fname)
-
-
31
@fname = fname
-
31
@dir = File.dirname(@fname)
-
31
File.open(fname, "r") do |f|
-
31
qpl_file_data = f.read()
-
93
send_and_receive_command "load #{depth_multiplier} #{TranslateLineEnds.new qpl_file_data}"
-
end
-
end
-
-
2
def get_qstack(tree_depth=5, recursion_depth=1)
-
135
send_and_receive_command("get qstack #{recursion_depth} #{tree_depth}\n")
-
end
-
-
2
def get_stack_translation(tree_depth=5, recursion_depth=1)
-
132
send_and_receive_command("get memorymap #{recursion_depth} #{tree_depth}\n")
-
end
-
-
2
def get_classical_stack(tree_depth=5, recursion_depth=1)
-
132
send_and_receive_command("get classicalstack #{recursion_depth} #{tree_depth}\n")
-
end
-
-
2
def get_dump(tree_depth=5, recursion_depth=1)
-
135
send_and_receive_command("get dump #{recursion_depth} #{tree_depth}\n")
-
end
-
-
2
def do_step(step_size=1, recursion_depth=1)
-
60
send_and_receive_command "step #{step_size} #{recursion_depth}\n"
-
end
-
-
2
def do_run(recursion_depth=1)
-
10
send_and_receive_command "run #{recursion_depth}\n"
-
end
-
-
2
def do_trim
-
3
send_and_receive_command "trim\n"
-
end
-
-
2
def code_pointer(recursion_depth=1)
-
102
send_and_receive_command "get codepointer #{recursion_depth}"
-
end
-
-
-
2
def loaded_code(recursion_depth=1)
-
34
send_and_receive_command "get code #{recursion_depth}"
-
end
-
-
2
def get_simulate_results(recursion_depth=1)
-
4
send_and_receive_command "simulate #{recursion_depth}"
-
end
-
-
2
def send_set_depth_multiplier(multiplier=10)
-
44
send_and_receive_command "setdepthmultiple #{multiplier}"
-
end
-
-
end
-
#===============================================================================
-
# Platform specific operations, feel free to remove or override any of these
-
# that don't work for your platform/application
-
-
2
def on_mac
-
4
yield if RbConfig::CONFIG["host_os"] =~ /darwin/i
-
end
-
-
#:nocov:
-
skipped
def on_win
-
skipped
yield if RbConfig::CONFIG["host_os"] =~ /^win|mswin/i
-
skipped
end
-
skipped
-
skipped
def on_linux
-
skipped
yield if RbConfig::CONFIG["host_os"] =~ /^win|mswin/i
-
skipped
end
-
skipped
-
skipped
-
skipped
def not_on_mac
-
skipped
testing = java.lang.System.get_property("com.drogar.testing.fest")
-
skipped
yield if (!(RbConfig::CONFIG["host_os"] =~ /darwin/i)) || (testing && testing == "true")
-
skipped
end
-
skipped
-
skipped
on_mac do
-
skipped
testing = java.lang.System.get_property("com.drogar.testing.fest")
-
skipped
if !testing or testing != "true"
-
skipped
java.lang.System.set_property("apple.laf.useScreenMenuBar", "true")
-
skipped
end
-
skipped
end
-
#:nocov:
-
2
class AboutController < ApplicationController
-
2
set_model 'AboutModel'
-
2
set_view 'AboutView'
-
2
set_close_action :dispose
-
-
2
def handleAbout(about_event)
-
1
open
-
end
-
-
2
def ok_button_action_performed
-
1
dispose
-
end
-
end
-
2
require 'version'
-
2
class AboutModel
-
2
attr_accessor :about_text
-
-
2
def initialize
-
3
@about_text = ABOUT_STRING
-
end
-
end
-
-
2
class AboutView < ApplicationView
-
2
set_java_class AboutDialog
-
-
-
2
map :view => "about_data_label.text", :model => :about_text
-
-
2
def on_first_update(model,transfer)
-
1
super(model,transfer)
-
1
@main_view_component.pack
-
end
-
end
-
2
class SimulateResultsParser < AbstractListPatternParser
-
-
-
2
def random_value
-
6
@md[:random_value]
-
end
-
-
2
def simulate_results
-
7
@parsed_list
-
end
-
-
2
def parse_list
-
8
SimulateResultsParser::values_to_list @md[:triples], SimulateResultsParser::triple_pattern do |ret, rv|
-
11
ret << [rv[:stackaddress],rv[:type],rv[:value]]
-
end
-
end
-
-
2
def self.embeddable_top_level_regexp
-
12
Regexp.new "<Simulated><double>(?<random_value>.*)</double><results>(?<triples>(" +
-
SimulateResultsParser::triple_pattern.source +
-
")*)</results></Simulated>"
-
end
-
-
2
def self.triple_pattern
-
20
Regexp.new "<triple><string>(?<stackaddress>.*?)</string><string>(?<type>.*?)</string><string>(?<value>.*?)</string></triple>"
-
end
-
-
end
-
2
class SimulateResultsController < ApplicationController
-
2
set_model 'SimulateResultsModel'
-
2
set_view 'SimulateResultsView'
-
2
set_close_action :dispose
-
-
2
def set_simulate_data(xml_data,stack_translation)
-
3
model.stack_translation = stack_translation
-
3
model.simulate_results= xml_data
-
2
update_view
-
end
-
-
2
def get_simulate_data
-
1
model.simulate_results_text
-
end
-
-
2
def set_simulate_results(recursion_depth, stack_translation)
-
1
set_simulate_data(lqpl_emulator_server_connection.get_simulate_results(recursion_depth), stack_translation)
-
end
-
-
2
def ok_button_action_performed
-
1
dispose
-
end
-
end
-
-
2
class SimulateResultsModel
-
2
attr_accessor :simulate_results
-
2
attr_accessor :simulate_results_text
-
2
attr_accessor :random_value_text
-
2
attr_accessor :stack_translation
-
-
2
java_signature "void random_value_text(Object)"
-
2
def random_value_text=(whatever)
-
end
-
-
2
java_signature "void simulate_results_text(Object)"
-
2
def simulate_results_text=(whatever)
-
end
-
-
2
def simulate_results_text
-
50
inner = (@simulate_results || []).collect {|triple| "#{triple[0]}(#{triple[1]}) = #{triple[2]}"}.join("<br />")
-
7
"<html>"+inner+"</html>"
-
end
-
-
2
def random_value_text
-
5
@random_value_text || ""
-
end
-
-
2
java_signature "void simulate_results(Object)"
-
2
def simulate_results=(xml_data)
-
7
raise ModelCreateError, "Missing Stack Translation" if @stack_translation.nil?
-
7
sr = SimulateResultsParser.new xml_data
-
5
@random_value_text = "Random Value: "+sr.random_value
-
12
@simulate_results = sr.simulate_results.collect {|srs| [@stack_translation.reverse_lookup(srs[0]),srs[1],srs[2]]}
-
end
-
-
end
-
-
-
2
class SimulateResultsView < ApplicationView
-
2
set_java_class SimulateResultsDialog
-
-
2
map :view => "random_value_label.text", :model => :random_value_text
-
2
map :view => "simulate_results_label.text", :model => :simulate_results_text
-
2
def update(model,transfer)
-
3
super
-
3
@main_view_component.pack
-
end
-
end
-
2
class InvalidInput < RuntimeError
-
end
-
2
class ServerProcessNotFound < RuntimeError
-
end
-
2
require 'singleton'
-
2
require 'communications/connection'
-
2
require 'communications/compiler_server_connection'
-
2
require 'communications/lqpl_emulator_server_connection'
-
-
2
class ExitHandler
-
2
include Singleton
-
-
2
def handleQuitRequestWith(quit_event, quit_response)
-
3
close_servers
-
3
quit_response.performQuit
-
end
-
-
2
def close_servers
-
31
CompilerServerConnection.instance.close_down
-
31
LqplEmulatorServerConnection.instance.close_down
-
end
-
end
-
2
class ClassicalStackForm < ScrollableLabel
-
-
2
attr_accessor :classical_stack_text
-
-
2
def initialize()
-
2
super("Classical Stack",Rectangle.new(270, 330, 150, 400))
-
end
-
-
2
def classical_stack_text=(new_text)
-
45
self.the_scrolling_label.text = new_text
-
end
-
-
2
def classical_stack_text
-
self.the_scrolling_label.text
-
end
-
-
end
-
2
class QuantumStackPanel < ScrollPane
-
2
attr_accessor :quantum_stack_painter
-
2
attr_accessor :quantum_stack_image_label
-
-
2
def initialize()
-
5
super
-
# use actual JLabel so java understands it in setting the viewport
-
5
@quantum_stack_image_label = Java::javax::swing::JLabel.new()
-
5
self.viewport_view = @quantum_stack_image_label
-
5
self.background = Color.white
-
end
-
-
2
def preferred_size()
-
layout_size = super.preferred_size()
-
max = [layout_size.width,layoutSize.height].max
-
Dimension[max+800,max+600]
-
end
-
-
2
def quantum_stack_painter=(qsp)
-
45
@quantum_stack_painter = qsp
-
45
@quantum_stack_image_label.icon = qsp.image_of_model
-
45
repaint
-
end
-
end
-
-
2
class AboutDialog < STDialogWithOK
-
-
2
attr_accessor :about_data_label
-
-
2
def initialize()
-
9
super("About LQPL")
-
9
make_data_panel(self.data_pane)
-
-
end
-
-
2
def make_data_panel(dpanel)
-
9
Panel.new do |p|
-
9
@about_data_label = Label.new("")
-
9
p.add(@about_data_label)
-
9
dpanel.add(p)
-
end
-
end
-
-
end
-
2
class SimulateResultsDialog < STDialogWithOK
-
-
2
attr_accessor :random_value_label
-
2
attr_accessor :simulate_results_label
-
-
2
def initialize()
-
11
super("Simulate Results")
-
11
self.bounds = Rectangle.new(50, 110, 200, 100)
-
11
Panel.new do |datap|
-
11
datap.layout = BoxLayout.new(datap,BoxLayout::Y_AXIS)
-
11
@random_value_label = make_rv_label(datap)
-
11
make_scroll_panel(datap)
-
11
self.data_pane.add(datap)
-
end
-
end
-
2
def make_rv_label(cpanel)
-
22
Label.new("") { |rvt| cpanel.add(rvt) }
-
end
-
2
def make_scroll_panel(cpanel)
-
11
ScrollPane.new do |sp|
-
11
@simulate_results_label = Label.new("") do |lbl|
-
11
sp.viewport_view=lbl
-
end
-
11
cpanel.add(sp)
-
end
-
end
-
end
-
2
class DumpForm < ScrollableLabel
-
-
2
attr_accessor :dump_text
-
-
2
def initialize()
-
2
super("Dump",Rectangle.new(430, 670, 600, 215))
-
end
-
-
2
def dump_text=(new_text)
-
46
self.the_scrolling_label.text = new_text
-
end
-
-
2
def dump_text
-
self.the_scrolling_label.text
-
end
-
-
end
-
2
class ExecutableCodeForm < STFrame
-
-
2
attr_accessor :code_tabbed_pane
-
-
2
def initialize
-
13
super("Executing Code", set_bounds: Rectangle.new(10, 330, 250, 400))
-
13
@code_tabbed_pane = TabbedPane.new
-
13
self.content_pane = @code_tabbed_pane
-
end
-
-
-
end
-
2
class ScrollableLabel < STFrame
-
-
2
attr_accessor :the_scrolling_label
-
-
2
def initialize(title, bounds)
-
6
super(title, set_bounds: bounds)
-
6
@the_scrolling_label = Label.new("")
-
6
scrollpane = ScrollPane.new(@the_scrolling_label)
-
6
self.content_pane = scrollpane
-
end
-
-
-
end
-
2
class QuantumEmulatorMainForm < STFrame
-
2
attr_accessor :spinner_panel, :button_panel, :step_spinner,
-
:recursion_spinner, :recursion_multiplier_spinner,
-
:tree_depth_spinner, :messages_text_area, :step_button,
-
:go_button, :trim_button
-
-
2
def initialize()
-
72
super("Quantum Emulator")
-
72
self.name = "Quantum Emulator"
-
72
self.content_pane = make_content_panel
-
72
self.bounds=Rectangle.new(10,10,400,300)
-
end
-
2
def make_content_panel()
-
72
Panel.new do |cpane|
-
72
cpane.layout = BoxLayout.new(cpane,BoxLayout::Y_AXIS)
-
-
72
make_scroll_panel(cpane)
-
72
@spinner_panel = make_spinner_panel(cpane)
-
-
72
@button_panel = make_button_panel(cpane)
-
end
-
end
-
2
def make_scroll_panel(cpane)
-
72
ScrollPane.new do |spane|
-
72
@messages_text_area = JTextArea.new
-
72
@messages_text_area.name = "messagesTextArea"
-
72
@messages_text_area.editable = false
-
72
spane.viewport_view = messages_text_area
-
72
cpane.add(spane)
-
end
-
end
-
-
2
def make_spinner_panel(cpane)
-
72
Panel.new do |spinpane|
-
72
spinpane.layout = GridLayout.new(4,2)
-
72
@step_spinner =
-
Spinner.spinner_with_label_and_model("Step Size",1, 1,
-
100000, 1,spinpane)
-
72
@recursion_spinner =
-
Spinner.spinner_with_label_and_model("Recursion Depth",1, 1,
-
100000, 1,spinpane)
-
72
@tree_depth_spinner =
-
Spinner.spinner_with_label_and_model("Tree Depth",4, 1,
-
100, 1,spinpane)
-
72
@recursion_multiplier_spinner =
-
Spinner.spinner_with_label_and_model("Recursion Multiplier",
-
10, 1,
-
100000, 1,spinpane)
-
72
spinpane.visible = false
-
72
cpane.add(spinpane)
-
end
-
end
-
-
2
def make_button_panel(cpane)
-
72
Panel.new do |buttonpanel|
-
72
buttonpanel.layout = GridLayout.new(1,3)
-
72
@trim_button = Button.make_button_in_container(buttonpanel,"Trim")
-
72
@step_button = Button.make_button_in_container(buttonpanel,"Step")
-
72
@go_button = Button.make_button_in_container(buttonpanel,"Go")
-
72
buttonpanel.visible = false
-
72
cpane.add(buttonpanel)
-
end
-
end
-
-
-
end
-
2
class QuantumStackForm < STFrame
-
-
2
attr_accessor :quantum_stack_panel
-
-
2
def initialize
-
4
super("Quantum Stack", set_bounds: Rectangle.new(430,10,600,640))
-
4
@quantum_stack_panel = QuantumStackPanel.new
-
4
self.content_pane = @quantum_stack_panel
-
end
-
-
end
-
-
2
class StackTranslationForm < ScrollableLabel
-
-
2
attr_accessor :stack_translation_text
-
-
2
def initialize()
-
2
super("Stack Translation",Rectangle.new(10, 740, 400, 150))
-
end
-
-
2
def stack_translation_text=(new_text)
-
46
self.the_scrolling_label.text = new_text
-
end
-
-
2
def stack_translation_text
-
self.the_scrolling_label.text
-
end
-
-
end
-
-
2
java_import java.awt.event.WindowEvent
-
2
require 'dialogs/about/about_controller'
-
2
require 'exit_handler'
-
-
2
class LqplController < ApplicationController
-
2
set_model 'LqplModel'
-
2
set_view 'LqplView'
-
2
set_close_action :close
-
-
2
attr_accessor :cmp
-
2
attr_accessor :sub_controllers
-
2
attr_accessor :dialogs
-
2
attr_accessor :qpl_dialog
-
-
2
def self.set_file_menu_actions
-
2
{ "the_menu.file_compile" => "file_compile",
-
"the_menu.file_load" => "file_load",
-
"the_menu.file_simulate" => "file_simulate"}.each do |k,v|
-
6
add_listener :type => :action, :components => {k => v}
-
end
-
end
-
-
2
def self.set_view_menu_actions
-
2
[ "the_menu.view_classical_stack",
-
"the_menu.view_dump" ,
-
"the_menu.view_executing_code" ,
-
"the_menu.view_stack_translation"].each do |k|
-
8
add_listener :type => :action, :components => {k => "view_sub_panel"}
-
end
-
end
-
-
2
def self.set_up_exit_and_about
-
2
on_mac do
-
2
java_import com.apple.eawt.Application
-
2
Application.application.about_handler = AboutController.instance
-
2
Application.application.quit_handler = ExitHandler.instance
-
end
-
-
2
not_on_mac do
-
2
{ "the_menu.file_exit" => "file_exit",
-
"the_menu.help_about" => "help_about"}.each do |k,v|
-
4
add_listener :type => :action, :components => {k => v}
-
end
-
end
-
end
-
-
2
set_file_menu_actions
-
2
set_view_menu_actions
-
2
set_up_exit_and_about
-
-
-
2
def close
-
26
all_controllers_dispose
-
26
ExitHandler.instance.close_servers
-
26
super
-
end
-
-
2
def load(*args)
-
-
34
@cmp = CompilerServerConnection.get_instance
-
34
@cmp.connect
-
-
34
self.lqpl_emulator_server_connection.connect
-
34
@sub_controllers = [QuantumStackController, ClassicalStackController, DumpController, ExecutableCodeController,
-
170
StackTranslationController].inject([]) {|memo,controller| memo << controller.instance}
-
102
@dialogs = [AboutController, SimulateResultsController].inject([]) { |mem, var| mem << var.instance}
-
end
-
-
2
def file_exit_action_performed
-
1
close
-
end
-
-
2
def help_about_action_performed
-
1
AboutController.instance.handleAbout(nil)
-
end
-
-
2
def file_compile_action_performed
-
5
chooser = JFileChooser.lqpl_source_file_opener
-
5
if chooser.show_open_dialog(self.my_frame) == JFileChooser::APPROVE_OPTION
-
4
@cmp.compile_and_write_qpo chooser.get_selected_file.get_absolute_path
-
4
model.messages_text = @cmp.success_or_fail_message(chooser.get_selected_file.name)
-
else
-
1
model.messages_text = "Compile action cancelled."
-
end
-
5
update_view
-
end
-
-
2
def file_load_action_performed
-
17
@qpl_dialog = JFileChooser.lqpl_assembled_file_opener
-
17
if @qpl_dialog.show_open_dialog(nil) == JFileChooser::APPROVE_OPTION
-
16
load_file @qpl_dialog.selected_file.absolute_path
-
16
model.set_title_and_enable @qpl_dialog.selected_file.name
-
16
initialize_sub_controllers
-
else
-
1
model.messages_text = "QPO file load cancelled."
-
end
-
17
update_view
-
end
-
-
2
def load_file(file_path)
-
16
self.lqpl_emulator_server_connection.send_load_from_file(model.recursion_multiplier_spinner, file_path)
-
16
self.lqpl_emulator_server_connection.send_set_depth_multiplier(model.recursion_multiplier_spinner)
-
end
-
-
2
def all_controllers_dispose
-
81
@dialogs.each {|d| d.dispose} if @dialogs
-
153
@sub_controllers.each{|sc| sc.dispose} if @sub_controllers
-
end
-
-
2
def file_simulate_action_performed
-
1
SimulateResultsController.instance.set_simulate_results(model.recursion_spinner,StackTranslationController.instance.get_stack_translation)
-
1
SimulateResultsController.instance.open
-
end
-
-
2
def view_sub_panel_action_performed(e)
-
8
command_and_sub_panel = e.action_command.scan(/\w+/)
-
8
PanelController::controller_from_name(command_and_sub_panel).instance.toggle_visibility
-
8
model.toggle_view_menu(command_and_sub_panel)
-
8
update_view
-
end
-
-
2
def initialize_sub_controllers
-
16
ExecutableCodeController.instance.set_code_and_code_pointer model.recursion_spinner
-
-
16
update_sub_model_data
-
16
open_sub_panels
-
16
model.enable_view_menu_items
-
end
-
-
2
def open_sub_panels
-
99
@sub_controllers.each {|sc| sc.open}
-
end
-
-
2
def update_sub_model_data
-
261
@sub_controllers.each {|sc| sc.set_data_from_lqpl_model(model)}
-
end
-
-
2
def step_spinner_state_changed
-
2
model.step_spinner = java.lang.Integer.new(view_model.step_spinner)
-
end
-
-
2
def recursion_spinner_state_changed
-
4
model.recursion_spinner = java.lang.Integer.new(view_model.recursion_spinner)
-
8
model.messages_text = "Recursion Depth set to #{model.recursion_spinner}"
-
4
enable_and_update true
-
end
-
-
2
def recursion_multiplier_spinner_state_changed
-
10
model.recursion_multiplier_spinner = java.lang.Integer.new("#{view_model.recursion_multiplier_spinner}")
-
5
lqpl_emulator_server_connection.send_set_depth_multiplier(model.recursion_multiplier_spinner)
-
10
model.messages_text = "Recursion Multiplier set to #{model.recursion_multiplier_spinner}"
-
5
enable_and_update true
-
end
-
-
2
def enable_and_update(enabled)
-
20
model.go_enabled = enabled
-
20
model.step_enabled = enabled
-
20
update_view
-
20
update_sub_model_data
-
end
-
-
-
2
def tree_depth_spinner_state_changed
-
7
model.tree_depth_spinner = java.lang.Integer.new(view_model.tree_depth_spinner)
-
14
model.messages_text = "Tree Depth set to #{model.tree_depth_spinner}"
-
7
update_view
-
7
update_sub_model_data
-
end
-
-
2
def step_button_action_performed
-
9
res = self.lqpl_emulator_server_connection.do_step(model.step_spinner,model.recursion_spinner)
-
18
enable_and_update !(res =~ /executed/)
-
end
-
-
2
def go_button_action_performed
-
2
self.lqpl_emulator_server_connection.do_run model.recursion_spinner
-
2
enable_and_update false
-
end
-
-
2
def trim_button_action_performed
-
2
model.messages_text = self.lqpl_emulator_server_connection.do_trim
-
9
@sub_controllers.each {|sc| sc.set_data_from_lqpl_model(model) if sc.update_on_lqpl_model_trim}
-
2
update_view
-
end
-
end
-
2
%w{JMenuBar JMenu JMenuItem}.each do |nm|
-
6
java_import "javax.swing."+nm
-
end
-
-
2
class LqplMenu
-
2
attr_accessor :view_classical_stack
-
2
attr_accessor :view_dump
-
2
attr_accessor :view_executing_code
-
2
attr_accessor :view_stack_translation
-
-
2
attr_accessor :file_compile
-
2
attr_accessor :file_load
-
2
attr_accessor :file_simulate
-
-
#next are for win/linux only. Mac is handled in lqpl_controller
-
2
attr_accessor :file_exit
-
2
attr_accessor :help_about
-
-
2
def initialize(parent)
-
47
mbar = JMenuBar.new
-
47
init_file_menu mbar
-
47
init_view_menu mbar
-
47
init_help_menu mbar
-
-
47
parent.set_menu_bar(mbar);
-
47
mbar.visible = true;
-
end
-
-
2
def init_file_menu(mbar)
-
47
menu_file = JMenu.new("File")
-
47
@file_load = JMenuItem.new("Load");
-
47
@file_compile = JMenuItem.new("Compile");
-
47
@file_simulate = JMenuItem.new("Simulate");
-
-
47
menu_file.add(@file_load);
-
47
menu_file.add(@file_compile);
-
47
menu_file.add(@file_simulate);
-
#:nocov:
-
skipped
not_on_mac do
-
skipped
@file_exit = JMenuItem.new("Exit")
-
skipped
menu_file.add(@file_exit)
-
skipped
end
-
#:nocov:
-
47
mbar.add(menu_file)
-
end
-
-
2
def init_view_menu(mbar)
-
47
menu_view = JMenu.new("View");
-
47
@view_classical_stack = JMenuItem.new("Hide Classical Stack");
-
47
@view_dump = JMenuItem.new("Hide Dump");
-
47
@view_executing_code = JMenuItem.new("Hide Executing Code");
-
47
@view_stack_translation = JMenuItem.new("Hide Stack Translation");
-
-
47
@view_classical_stack.enabled = false;
-
47
@view_dump.enabled = false;
-
47
@view_executing_code.enabled = false;
-
47
@view_stack_translation.enabled = false;
-
-
47
menu_view.add(@view_classical_stack);
-
47
menu_view.add(@view_dump);
-
47
menu_view.add(@view_executing_code);
-
47
menu_view.add(@view_stack_translation);
-
47
mbar.add(menu_view)
-
end
-
-
#:nocov:
-
skipped
def init_help_menu mbar
-
skipped
not_on_mac do
-
skipped
menu_help = JMenu.new("Help")
-
skipped
@help_about = JMenuItem.new("About")
-
skipped
menu_help.add(@help_about)
-
skipped
mbar.add(menu_help)
-
skipped
end
-
skipped
end
-
#:nocov:
-
-
end
-
2
JInteger = java.lang.Integer
-
-
2
class LqplModel < ApplicationModel
-
2
attr_accessor :spinner_panel_visible, :button_panel_visible
-
2
attr_accessor :step_spinner, :recursion_spinner, :recursion_multiplier_spinner, :tree_depth_spinner
-
2
attr_accessor :go_enabled, :step_enabled
-
-
2
attr_accessor :messages_text
-
-
2
attr_accessor :view_menu_classical_stack_enabled,:view_menu_dump_enabled,:view_menu_executing_code_enabled,:view_menu_stack_translation_enabled
-
2
attr_accessor :view_menu_classical_stack_text,:view_menu_dump_text,:view_menu_executing_code_text,:view_menu_stack_translation_text
-
-
2
attr_accessor :frame_title
-
-
2
def initialize
-
56
init_panels
-
56
init_spinners
-
56
init_buttons
-
56
init_view_menu
-
56
@frame_title = "Quantum Emulator"
-
end
-
-
2
def init_panels
-
56
@spinner_panel_visible = false
-
56
@button_panel_visible = false
-
end
-
-
2
def init_spinners
-
56
@step_spinner = JInteger.new(1)
-
56
@recursion_spinner = JInteger.new(1)
-
56
@recursion_multiplier_spinner = JInteger.new(10)
-
56
@tree_depth_spinner = JInteger.new(4)
-
end
-
-
2
def init_buttons
-
56
@go_enabled = true
-
56
@step_enabled = true
-
end
-
-
2
def init_view_menu
-
56
@view_menu_stack_translation_enabled = false
-
56
@view_menu_dump_enabled = false
-
56
@view_menu_executing_code_enabled = false
-
56
@view_menu_classical_stack_enabled = false
-
-
56
@view_menu_stack_translation_text = "Hide Stack Translation"
-
56
@view_menu_executing_code_text = "Hide Executing Code"
-
56
@view_menu_dump_text = "Hide Dump"
-
56
@view_menu_classical_stack_text = "Hide Classical Stack"
-
end
-
-
2
def toggle_view_menu(current_command)
-
10
self.send(LqplModel::symbol_for_view_menu_item(current_command), LqplModel::new_view_command(current_command))
-
end
-
-
2
def enable_view_menu_items
-
20
self.view_menu_stack_translation_enabled = true
-
20
self.view_menu_dump_enabled = true
-
20
self.view_menu_executing_code_enabled = true
-
20
self.view_menu_classical_stack_enabled = true
-
end
-
-
2
def set_title_and_enable(base_file_name)
-
44
self.frame_title = "Quantum Emulator - #{base_file_name}"
-
22
self.go_enabled = true
-
22
self.step_enabled = true
-
22
self.spinner_panel_visible = true
-
22
self.button_panel_visible = true
-
44
self.messages_text = "#{base_file_name} was loaded."
-
end
-
-
2
def self.toggle_action(current)
-
15
return "Hide" if current == "Show"
-
8
"Show"
-
end
-
-
2
def self.new_view_command(current_command)
-
12
toggle_action(current_command[0])+" "+current_command[1,current_command.size-1].join(" ")
-
end
-
-
2
def self.symbol_for_view_menu_item(current_command)
-
12
which_menu=current_command.drop(1).collect(&:downcase).join("_")
-
24
"view_menu_#{which_menu}_text=".to_sym
-
end
-
end
-
2
require 'lqpl_menu'
-
-
2
class LqplView < ApplicationView
-
2
set_java_class QuantumEmulatorMainForm
-
-
2
attr_accessor :the_menu
-
2
map :view => "spinner_panel.visible", :model => :spinner_panel_visible
-
2
map :view => "button_panel.visible", :model => :button_panel_visible
-
-
2
map :view => "step_spinner.model.value", :model => :step_spinner
-
2
map :view => "recursion_spinner.model.value", :model => :recursion_spinner
-
2
map :view => "recursion_multiplier_spinner.model.value", :model => :recursion_multiplier_spinner
-
2
map :view => "tree_depth_spinner.model.value", :model => :tree_depth_spinner
-
-
2
map :view => "messages_text_area.text", :model => :messages_text
-
-
2
map :view => "step_button.enabled", :model => :step_enabled
-
2
map :view => "go_button.enabled", :model => :go_enabled
-
-
2
map :view => "the_menu.view_classical_stack.enabled", :model => :view_menu_classical_stack_enabled
-
2
map :view => "the_menu.view_dump.enabled", :model => :view_menu_dump_enabled
-
2
map :view => "the_menu.view_executing_code.enabled", :model => :view_menu_executing_code_enabled
-
2
map :view => "the_menu.view_stack_translation.enabled", :model => :view_menu_stack_translation_enabled
-
-
2
map :view => "the_menu.view_classical_stack.text", :model => :view_menu_classical_stack_text
-
2
map :view => "the_menu.view_dump.text", :model => :view_menu_dump_text
-
2
map :view => "the_menu.view_executing_code.text", :model => :view_menu_executing_code_text
-
2
map :view => "the_menu.view_stack_translation.text", :model => :view_menu_stack_translation_text
-
-
2
raw_mapping :set_title,nil
-
-
-
2
def load(*args)
-
27
@the_menu=LqplMenu.new(self)
-
end
-
-
2
def set_menu_bar(mbar)
-
27
@main_view_component.setJMenuBar(mbar)
-
end
-
-
2
def set_title(model,trans)
-
51
@main_view_component.title = model.frame_title
-
end
-
-
2
def the_frame
-
5
@main_view_component
-
end
-
end
-
2
require 'rbconfig'
-
2
require 'java'
-
2
require 'config/platform'
-
-
2
Dir.glob(File.expand_path(File.dirname(__FILE__) +
-
"/**/*").gsub('%20', ' ')).each do |directory|
-
# File.directory? is broken in current JRuby for dirs inside jars
-
# http://jira.codehaus.org/browse/JRUBY-2289
-
234
$LOAD_PATH << directory unless directory =~ /\.\w+$/
-
end
-
-
-
#puts "set loadpath #{$LOAD_PATH}"
-
# Some JRuby $LOAD_PATH path bugs to check if you're having trouble:
-
# http://jira.codehaus.org/browse/JRUBY-2518 -
-
# Dir.glob and Dir[] doesn't work
-
# for starting in a dir in a jar
-
# (such as Active-Record migrations)
-
# http://jira.codehaus.org/browse/JRUBY-3247 -
-
# Compiled Ruby classes produce
-
# word substitutes for characters
-
# like - and . (to minus and dot).
-
# This is problematic with gems
-
# like ActiveSupport and Prawn
-
-
#===================================================================
-
# Monkeybars requires, this pulls in the requisite libraries needed
-
# for Monkeybars to operate.
-
-
2
require 'resolver'
-
#:nocov:
-
skipped
def monkeybars_jar path
-
skipped
Dir.glob(path).select { |f| f =~ /(monkeybars-)(.+).jar$/}.first
-
skipped
end
-
skipped
-
skipped
case Monkeybars::Resolver.run_location
-
skipped
when Monkeybars::Resolver::IN_FILE_SYSTEM
-
skipped
-
skipped
here = File.expand_path File.dirname(__FILE__)
-
skipped
npath = here + '/../lib/java/*.jar'
-
skipped
# puts npath
-
skipped
mbj = monkeybars_jar( here + '/../lib/java/*.jar' )
-
skipped
# puts "resulting mbj=#{mbj}"
-
skipped
if !mbj || mbj == ''
-
skipped
mbj = monkeybars_jar( here + '/../../../lib/java/*.jar' )
-
skipped
# puts "or is #{mbj}"
-
skipped
end
-
skipped
add_to_classpath mbj
-
skipped
end
-
#:nocov:
-
-
-
-
2
require 'monkeybars'
-
-
2
require 'application_controller'
-
2
require 'application_view'
-
-
# End of Monkeybars requires
-
#==================================================================
-
#
-
# Add your own application-wide libraries below. To include jars,
-
# append to $CLASSPATH, or use add_to_classpath, for example:
-
#
-
# $CLASSPATH << File.expand_path(File.dirname(__FILE__) +
-
# "/../lib/java/swing-layout-1.0.3.jar")
-
#
-
# is equivalent to
-
#
-
# add_to_classpath "../lib/java/swing-layout-1.0.3.jar"
-
#
-
# There is also a helper for adding to your load path and avoiding
-
# issues with file: being appended to the load path (useful for
-
# JRuby libs that need your jar directory on the load path).
-
#
-
# add_to_load_path "../lib/java"
-
#
-
-
-
2
case Monkeybars::Resolver.run_location
-
2
when Monkeybars::Resolver::IN_FILE_SYSTEM
-
# Files to be added only when running from the file system go here
-
when Monkeybars::Resolver::IN_JAR_FILE
-
# Files to be added only when run from inside a jar file
-
end
-
-
2
%w{BorderLayout GridLayout}.each do |awtfile|
-
8
java_import "java.awt.#{awtfile}"
-
end
-
-
2
%w{JOptionPane JFileChooser filechooser.FileNameExtensionFilter
-
JTextArea JScrollPane BoxLayout SpinnerNumberModel}.each do |cfile|
-
14
java_import "javax.swing."+cfile
-
end
-
-
# for swinging
-
2
add_to_load_path "../lib/ruby/swingtown"
-
2
require 'swingtown'
-
2
include Swingtown::Core
-
-
-
# end for swinging
-
-
2
java_import java.lang.System
-
-
2
java_import java.awt.Point
-
-
2
%w{point jfile_chooser array}.each do |rfile|
-
6
require 'utility/monkey/'+rfile
-
end
-
-
-
2
%w{translate_line_ends drawing duck_matcher
-
swing_runner}.each do |f|
-
8
require "utility/"+f
-
end
-
-
2
%w{abstract_pattern zero_pattern value_pattern abstract_list_pattern
-
qubit_pattern data_pattern classical_pattern stack_translation
-
code_pointer executable_code dump_call dump_split dump
-
quantum_stack}.each do |rf|
-
28
require "panels/parsers/"+rf+"_parser"
-
end
-
-
2
require 'dialogs/parsers/simulate_results_parser'
-
2
require 'painting/canvas_size'
-
2
require 'application_model'
-
2
require 'panels/panel_controller'
-
-
2
%w{server_process_not_found invalid_input}.each do |f|
-
4
require "exceptions/"+f
-
end
-
-
-
2
%w{lqpl_emulator_server_connection
-
compiler_server_connection}.each do |f|
-
4
require "communications/"+f
-
end
-
-
2
%w{about simulate_results}.each do |dialog|
-
8
require "forms/dialogs/#{dialog}_dialog"
-
end
-
-
2
%w{quantum_stack_panel}.each do |component|
-
4
require "forms/components/#{component}"
-
end
-
-
2
%w{scrollable_label}.each do |generic_form|
-
4
require "forms/generic/#{generic_form}"
-
end
-
-
2
%w{classical_stack dump executable_code quantum_emulator_main
-
quantum_stack stack_translation}.each do |a_form|
-
24
require "forms/#{a_form}_form"
-
end
-
-
2
%w{abstract classical data qubit value zero}.each do |rf|
-
24
require "panels/quantum_stack/descriptor/#{rf}_descriptor_model"
-
24
require "panels/quantum_stack/descriptor/#{rf}_descriptor_painter"
-
end
-
-
2
require 'panels/quantum_stack/descriptor/descriptor_painter_factory'
-
2
require 'panels/quantum_stack/quantum_stack_painter'
-
-
-
-
2
SwingRunner::on_edt do
-
2
{ ""=>%w{lqpl},
-
"panels/" => %w{quantum_stack classical_stack dump executable_code
-
stack_translation},
-
"dialogs/" =>%w{simulate_results about}}.each do |k,v|
-
6
v.each do |f|
-
16
require k+f+"/"+f+"_view"
-
16
require k+f+"/"+f+"_model"
-
16
require k+f+"/"+f+"_controller"
-
end
-
end
-
end
-
-
2
require "exit_handler"
-
-
-
-
-
2
class CanvasSize
-
2
attr_accessor :left_width
-
2
attr_accessor :right_width
-
2
attr_accessor :height
-
-
2
VERTICAL_NODE_SEPARATION=50.0
-
2
HORIZONTAL_NODE_SEPARATION=55.0
-
2
def self.new_with_measures(left=0.0,right=0.0,height=0.0)
-
103
cs=self.new
-
103
cs.initialize_with_measures(left,right,height)
-
103
cs
-
end
-
-
2
def self.new_from_subtree(subtree_array)
-
67
left = CanvasSize::subtree_left_width(subtree_array)
-
67
right = CanvasSize::subtree_right_width(subtree_array)
-
85
h = subtree_array.collect{|cs| cs.height_with_spacing}.max
-
67
self.new_with_measures(left,right,h)
-
end
-
-
2
def self.subtree_left_width(subtree_array)
-
67
self.subtree_side_width(subtree_array, :left)
-
end
-
-
2
def self.subtree_right_width(subtree_array)
-
67
self.subtree_side_width(subtree_array, :right)
-
end
-
-
2
def self.subtree_side_width(subtree_array, side)
-
84
mid = subtree_array.get_middle_element
-
168
CanvasSize::total_widths(subtree_array.get_partition(side))+(mid ? mid.required_width(side) : 0)
-
end
-
2
def self.total_widths(sizes)
-
130
sizes.inject(0.0){|memo,s| memo+s.required_width}
-
end
-
-
2
def self.width_to_right_of_head(sizes)
-
15
return 0.0 if !sizes or sizes.length == 0
-
14
sizes[0].right_required_width + CanvasSize::total_widths(sizes.drop(1))
-
end
-
-
2
def self.width_to_left_of_tail(sizes)
-
15
return 0.0 if !sizes or sizes.length == 0
-
14
sizes.last.left_required_width + CanvasSize::total_widths(sizes.take(sizes.length-1))
-
end
-
-
# computes offsets for painting the substacks.
-
# sum up the sizes from point to midpoint to get offsets (-ve to left, +ve to right)
-
# special cases:
-
# No sizes -> nothing to return
-
# handle having a midpoint = equals size 0
-
2
def self.compute_offsets(sizes)
-
61
return [] if !sizes or sizes.length == 0
-
-
11
mid = sizes.get_middle_element
-
11
CanvasSize::left_offsets(sizes,mid) + CanvasSize::right_offsets(sizes,mid)
-
end
-
-
2
def self.left_offsets(sizes,mid)
-
24
lefts = sizes.get_left_partition.tails.collect {|la| -CanvasSize.width_to_right_of_head(la)}
-
16
lefts.collect! {|b| b-mid.left_required_width} if mid
-
13
lefts << 0 if mid
-
13
lefts
-
end
-
-
2
def self.right_offsets(sizes,mid)
-
24
rights = sizes.get_right_partition.heads.collect{|ra| CanvasSize.width_to_left_of_tail(ra)}
-
35
rights.collect{|r| r+(mid ? mid.right_required_width : 0)}
-
end
-
-
2
def initialize_with_measures(left,right,height)
-
106
self.left_width = left || 0.0
-
106
self.right_width=right || 0.0
-
106
self.height=height || 0.0
-
end
-
-
2
def total_width
-
82
@left_width+@right_width
-
end
-
-
2
def required_width(side=nil)
-
83
return [total_width, HORIZONTAL_NODE_SEPARATION].max unless side
-
8
return left_required_width if side == :left
-
4
right_required_width
-
end
-
-
2
def left_required_width
-
94
[@left_width, HORIZONTAL_NODE_SEPARATION*0.5].max
-
end
-
-
2
def right_required_width
-
94
[@right_width, HORIZONTAL_NODE_SEPARATION*0.5].max
-
end
-
-
2
def height_with_spacing
-
83
@height + VERTICAL_NODE_SEPARATION
-
end
-
-
2
def max_of_each_dimension!(other_canvas_size)
-
68
@left_width = [@left_width,other_canvas_size.left_width].max
-
68
@right_width = [@right_width,other_canvas_size.right_width].max
-
68
@height = [@height,other_canvas_size.height].max
-
end
-
-
2
def self.vertical_node_separation
-
13
node_separation(:vertical)
-
end
-
-
2
def self.node_separation(direction)
-
17
case direction
-
32
when :vertical then VERTICAL_NODE_SEPARATION
-
3
when :horizontal then HORIZONTAL_NODE_SEPARATION
-
1
else VERTICAL_NODE_SEPARATION
-
end
-
end
-
end
-
2
class ClassicalStackController < PanelController
-
2
set_model 'ClassicalStackModel'
-
2
set_view 'ClassicalStackView'
-
2
set_close_action :hide
-
-
2
def set_data_from_lqpl_model(lqpl_model)
-
43
set_classical_stack(lqpl_model.tree_depth_spinner, lqpl_model.recursion_spinner)
-
end
-
-
2
def set_classical_stack(tree_depth, recursion_level)
-
43
set_classical_stack_data(lqpl_emulator_server_connection.get_classical_stack(tree_depth,recursion_level))
-
end
-
-
2
def set_classical_stack_data(cs_data)
-
45
model.classical_stack= cs_data
-
44
update_view
-
end
-
-
2
def get_classical_stack_data
-
1
model.classical_stack_text
-
end
-
end
-
2
class ClassicalStackModel < ApplicationModel
-
2
attr_accessor :classical_stack_text
-
2
attr_accessor :classical_stack
-
-
2
def classical_stack_text=(whatever)
-
end
-
-
2
def classical_stack_text
-
48
cs = @classical_stack || []
-
48
return "" if cs == []
-
27
inside=cs.collect {|c| "#{c}"}.join("<br />")
-
3
"<html>"+inside+"</html>"
-
end
-
-
2
def to_a
-
14
@classical_stack
-
end
-
-
2
def classical_stack=(xml_input)
-
66
cpp = ClassicalPatternParser.new xml_input
-
64
@classical_stack = cpp.parsed_value
-
end
-
-
end
-
-
2
class ClassicalStackView < ApplicationView
-
2
set_java_class ClassicalStackForm
-
-
2
map :view => "classical_stack_text", :model => :classical_stack_text
-
end
-
2
class DumpCallModel < ApplicationModel
-
-
2
def initialize(inx)
-
19
self.dumpcall=inx
-
end
-
-
2
def dumpcall=(in_xml)
-
19
dcp = DumpCallParser.new in_xml
-
19
@ret_offset=dcp.parsed_value[0]
-
19
@ret_label=dcp.parsed_value[1]
-
19
@cstack = ClassicalStackModel.new
-
19
@cstack.classical_stack= dcp.parsed_value[2]
-
end
-
-
2
def text
-
52
"Return to #{@ret_label}(#{@ret_offset}). CS=#{@cstack.to_a}"
-
end
-
-
end
-
2
class DumpController < PanelController
-
2
set_model 'DumpModel'
-
2
set_view 'DumpView'
-
2
set_close_action :hide
-
-
2
def set_data_from_lqpl_model(lqpl_model)
-
44
set_dump(lqpl_model.tree_depth_spinner, lqpl_model.recursion_spinner)
-
end
-
-
2
def set_dump(tree_depth, recursion_level)
-
44
set_dump_data(lqpl_emulator_server_connection.get_dump(tree_depth,recursion_level))
-
end
-
-
2
def set_dump_data(dump_data)
-
45
model.dump= dump_data
-
45
update_view
-
end
-
-
2
def get_dump_data
-
1
model.text
-
end
-
-
2
def update_on_lqpl_model_trim
-
2
true
-
end
-
end
-
2
require "panels/dump/dump_call_model"
-
2
require "panels/dump/dump_split_model"
-
-
2
class DumpModel <ApplicationModel
-
-
2
attr_accessor :dump
-
-
2
def dump=(in_xml)
-
47
dp = DumpParser.new in_xml
-
47
@dump = dp.parsed_value
-
end
-
-
2
def text=(whatev)
-
end
-
-
2
def text
-
47
inside = @dump.inject("") do |inner, ditem|
-
10
inner += "<li>"+ditem.text+"</li>"
-
end
-
47
"<html><ol>"+inside+"</ol></html>"
-
end
-
-
-
end
-
2
class DumpSplitModel <ApplicationModel
-
-
2
def initialize(inx)
-
4
self.dumpsplit=inx
-
end
-
-
2
def dumpsplit=(in_xml)
-
4
dsp = DumpSplitParser.new in_xml
-
4
@ds_text= dsp.parsed_value
-
end
-
-
2
def text
-
1
@ds_text
-
end
-
end
-
-
2
class DumpView < ApplicationView
-
2
set_java_class DumpForm
-
2
map :view => "dump_text", :model => :text
-
end
-
2
class CodePointer < ApplicationModel
-
2
attr_accessor :qpo_method
-
2
attr_accessor :line_number
-
2
def initialize(xml_string)
-
77
begin
-
77
cp_match = CodePointerParser.new xml_string
-
58
@qpo_method = cp_match.parsed_value[0]
-
58
@line_number = cp_match.parsed_value[1]
-
rescue ParserError => e
-
19
raise e unless xml_string == ""
-
16
@qpo_method = ""
-
16
@line_number = 0
-
end
-
end
-
-
2
def normalize(max_plus_one)
-
63
if max_plus_one
-
62
@line_number = [[@line_number,max_plus_one -1].min, 0].max
-
else
-
1
@line_number = 0
-
end
-
end
-
-
2
def mangle_to_selection_key
-
315
"#{@qpo_method}--#{@line_number}"
-
end
-
end
-
2
class ExecutableCodeController < PanelController
-
2
set_model 'ExecutableCodeModel'
-
2
set_view 'ExecutableCodeView'
-
2
set_close_action :hide
-
-
-
2
def set_data_from_lqpl_model(lqpl_model)
-
43
set_code_pointer lqpl_model.recursion_spinner
-
end
-
-
2
def set_code_and_code_pointer(recursion_depth)
-
16
model.the_code = lqpl_emulator_server_connection.loaded_code recursion_depth
-
16
model.the_code_pointer = lqpl_emulator_server_connection.code_pointer recursion_depth
-
16
model.the_code_was_updated = true
-
16
update_view
-
end
-
-
2
def set_code_pointer(recursion_depth)
-
43
model.the_code_pointer = lqpl_emulator_server_connection.code_pointer recursion_depth
-
43
model.the_code_was_updated = false
-
43
update_view
-
end
-
-
-
end
-
2
require 'panels/executable_code/code_pointer'
-
-
2
class ExecutableCodeModel < ApplicationModel
-
2
attr_accessor :the_code
-
2
attr_accessor :the_code_pointer
-
2
attr_accessor :the_code_was_updated
-
-
2
def the_code=(xml_string)
-
24
ecp = ExecutableCodeParser.new xml_string
-
23
@the_code = ecp.parsed_value
-
23
raise ModelCreateError, "code xml was ill-formed" if !self.the_code
-
end
-
-
2
def the_code_pointer=(xml_string)
-
59
@the_code_pointer = CodePointer.new xml_string
-
58
if !the_code or !the_code.has_key?( @the_code_pointer.qpo_method)
-
2
@the_code_pointer = nil
-
else
-
56
@the_code_pointer.normalize(@the_code[@the_code_pointer.qpo_method].length)
-
end
-
end
-
-
2
def the_code_was_updated?
-
52
@the_code_was_updated
-
end
-
-
end
-
2
WIDTH_OF_TEXT_PANE = 60
-
-
2
class ExecutableCodeView < ApplicationView
-
2
set_java_class ExecutableCodeForm
-
-
2
raw_mapping :set_up_tabbed_views, nil
-
-
2
attr_accessor :qpo_method_to_tab_map
-
2
attr_accessor :qpo_method_and_line_to_selection_start_and_end_map
-
-
2
def set_up_tabbed_views(model,transfer)
-
53
if model.the_code_was_updated?
-
15
create_tabbed_views(model.the_code)
-
end
-
53
set_highlight_for_code_pointer(model.the_code_pointer)
-
end
-
-
2
def create_tabbed_views(code_map)
-
22
code_tab_pane = reset_tabbed_panes_and_maps
-
22
i = 0
-
22
cp = CodePointer.new ""
-
22
code_map.each do |qpo_method, qpo_ins|
-
44
code_tab_pane.add_tab(qpo_method.to_s, ExecutableCodeView::init_scroll_pane(qpo_ins))
-
44
@qpo_method_to_tab_map[qpo_method] = i
-
44
text_len=0
-
44
cp.qpo_method = qpo_method
-
44
qpo_ins.each_with_index do |ins_line, ind|
-
360
cp.line_number = ind
-
360
add_to_selection_start_and_end_map(cp, ins_line, text_len)
-
360
text_len += 1+ins_line.length
-
end
-
44
i += 1
-
end
-
end
-
-
2
def reset_tabbed_panes_and_maps
-
26
code_tabbed_pane.remove_all
-
26
@qpo_method_to_tab_map = {}
-
26
@qpo_method_and_line_to_selection_start_and_end_map = {}
-
26
code_tabbed_pane
-
end
-
-
2
def add_to_selection_start_and_end_map(cp,ins_line,text_len)
-
92
@qpo_method_and_line_to_selection_start_and_end_map[cp.mangle_to_selection_key] = [text_len, text_len+1+ins_line.length]
-
end
-
-
2
def self.init_scroll_pane(qpo_ins)
-
48
JScrollPane.new(ExecutableCodeView::init_instructions_text_area qpo_ins)
-
end
-
-
2
def self.init_instructions_text_area(qpo_ins)
-
51
instructions_text_area = JTextArea.new(qpo_ins.join("\n"), qpo_ins.length, WIDTH_OF_TEXT_PANE)
-
51
instructions_text_area.editable = false
-
51
instructions_text_area.selection_start = 0
-
51
instructions_text_area.selection_end = 0
-
51
instructions_text_area
-
end
-
-
#todo - revise this and code_pointer to know when just the line changes, rather than the whole thing.
-
2
def set_highlight_for_code_pointer(code_pointer)
-
54
return if !@qpo_method_to_tab_map[code_pointer.qpo_method]
-
54
code_tabbed_pane.selected_index = @qpo_method_to_tab_map[code_pointer.qpo_method]
-
54
selection_key = code_pointer.mangle_to_selection_key
-
54
set_selection_bounds_in_view(@qpo_method_and_line_to_selection_start_and_end_map[selection_key])
-
end
-
-
2
def set_selection_bounds_in_view(selection_bounds)
-
55
jt = code_tabbed_pane.selected_component.viewport.view
-
55
jt.request_focus(true) # deprecated method, but otherwise the highlight does not show when switching qpo_methods
-
55
jt.selection_start = 0 # reset to handle "use" case where we go back (loop) in the code
-
55
jt.selection_end = 0
-
55
jt.selection_end = selection_bounds[1] if selection_bounds
-
55
jt.selection_start = selection_bounds[0] if selection_bounds
-
end
-
-
end
-
2
class PanelController < ApplicationController
-
-
2
@@controllers={}
-
2
def self.controller_from_name(name_array)
-
52
name_array.collect(&:to_sym).inject(nil){|memo, n| memo || @@controllers[n]}
-
end
-
-
2
def update_on_lqpl_model_trim
-
7
false
-
end
-
-
end
-
-
-
2
class DumpController < PanelController
-
2
@@controllers[:Dump] = DumpController
-
end
-
-
2
class ClassicalStackController < PanelController
-
2
@@controllers[:Classical] = ClassicalStackController
-
end
-
-
2
class QuantumStackController < PanelController
-
2
@@controllers[:Quantum] = QuantumStackController
-
end
-
-
2
class ExecutableCodeController < PanelController
-
2
@@controllers[:Executing] = ExecutableCodeController
-
end
-
-
2
class StackTranslationController < PanelController
-
2
@@controllers[:Translation] = StackTranslationController
-
end
-
-
2
class AbstractListPatternParser < AbstractPatternParser
-
-
2
def initialize(instring)
-
100
super(instring)
-
93
@parsed_list=parse_list
-
end
-
-
2
def parsed_value
-
103
@parsed_list
-
end
-
-
2
def parse_list # abstract kind of method
-
1
[]
-
end
-
-
2
def self.values_to_list(input,pattern,return_value=[])
-
#return [] if !input or "" == input
-
104
match_vals = pattern.match input
-
104
return return_value if ! match_vals
-
52
matched_len = match_vals[0].length
-
52
yield return_value,match_vals
-
52
while match_vals
-
184
match_vals = pattern.match input[matched_len, input.length]
-
184
return return_value if ! match_vals
-
132
matched_len += match_vals[0].length
-
132
yield return_value,match_vals
-
end
-
end
-
end
-
2
class ParserError < RuntimeError
-
end
-
-
2
class AbstractPatternParser
-
2
attr_reader :md
-
-
2
def initialize(in_string)
-
102
@md = self.class.top_level_regexp.match in_string
-
126
raise ParserError, "No match -#{self.class.top_level_regexp}- to -#{in_string}-" unless @md
-
end
-
-
2
def parsed?
-
18
@md
-
end
-
-
2
def self.top_level_regexp
-
103
self.surround_with_start_end self.embeddable_top_level_regexp
-
end
-
-
-
2
def self.embeddable_top_level_regexp
-
6
Regexp.new /^$/
-
end
-
-
2
def self.surround_with_start_end(regexp)
-
105
Regexp.new "^"+regexp.source+"$"
-
end
-
end
-
2
class ClassicalPatternParser < AbstractListPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
102
Regexp.new "<Classical>(?<classical_values>((<cint>(-?\\d+)</cint>)|(<cbool>(True|False)</cbool>))*)</Classical>"
-
end
-
-
2
LIST_PATTERN = Regexp.new /^(<cint>(?<int_value>-?\d+)<\/cint>)|(<cbool>(?<bool_value>True|False)<\/cbool>)/
-
-
2
def parse_list
-
100
values = @md[:classical_values]
-
100
ClassicalPatternParser::values_to_list values, LIST_PATTERN do |ret, md|
-
96
ret << md[:int_value].to_i if md[:int_value]
-
121
ret << (md[:bool_value] == 'True') if md[:bool_value]
-
end
-
end
-
end
-
2
class CodePointerParser < AbstractPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
94
Regexp.new "<pair><string>(?<key>.*?)</string><int>(?<value>\\d*)</int></pair>"
-
end
-
-
2
def parsed_value
-
85
[@md[:key].to_sym,@md[:value].to_i]
-
end
-
end
-
2
class DataPatternParser < AbstractListPatternParser
-
-
2
CONS_PATTERN = Regexp.new /^(<string>(?<constructor_name>[\w\d_]*)<\/string><StackAddresses>(?<addresses>(<int>(\d*)<\/int>)*)<\/StackAddresses>)/
-
-
2
LIST_PATTERN = Regexp.new /^(<int>(?<address>\d*)<\/int>)/
-
-
-
2
def self.embeddable_top_level_regexp
-
25
Regexp.new "<AlgebraicData>(?<constructors>(<string>([\\w\\d_]*)<\/string><StackAddresses>"+
-
"((<int>(\\d*)</int>)*)</StackAddresses>)+)</AlgebraicData>"
-
end
-
-
2
def parse_list
-
17
constructors_string = @md[:constructors]
-
17
DataPatternParser::values_to_list constructors_string, CONS_PATTERN do |rval, mdata|
-
26
cons_name = mdata[:constructor_name]
-
27
raise InvalidInput, "Constructor '#{cons_name}' duplicated in algebraic data" if rval.assoc(cons_name)
-
25
rval << [cons_name,DataPatternParser::parse_address_list(mdata[:addresses])]
-
end
-
end
-
-
-
2
def self.parse_address_list(addresses_string)
-
29
DataPatternParser::values_to_list addresses_string, LIST_PATTERN do |rval, md|
-
16
elem = md[:address].to_i
-
17
raise InvalidInput, "StackAddress '#{elem}' duplicated for single constructor" if rval.include? elem
-
15
rval << elem
-
end
-
end
-
-
-
end
-
2
class DumpCallParser < AbstractPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
32
Regexp.new "<DumpCall><int>(?<return_offset>\\d*)</int><string>(?<return_label>[\\w\\d_]*)</string>(?<classical_stack>" +
-
ClassicalPatternParser.embeddable_top_level_regexp.to_s+")</DumpCall>"
-
end
-
-
2
def parsed_value
-
57
[@md[:return_offset],@md[:return_label], @md[:classical_stack]]
-
end
-
-
end
-
2
class DumpParser < AbstractListPatternParser
-
2
def self.embeddable_top_level_regexp
-
51
Regexp.new "<Dump>(?<dump_list>("+DUMP_LIST_PATTERN.source+")*)</Dump>"
-
end
-
-
2
def parse_list
-
51
DumpParser::values_to_list @md[:dump_list], DUMP_LIST_PATTERN do |ret, dv|
-
20
ret << DumpCallModel.new(dv[:dump_call]) if dv[:dump_call]
-
20
ret << DumpSplitModel.new(dv[:dump_split]) if dv[:dump_split]
-
end
-
end
-
-
2
DUMP_LIST_PATTERN = Regexp.new "(?<dump_call>"+DumpCallParser.embeddable_top_level_regexp.source+
-
")|(?<dump_split>"+DumpSplitParser.embeddable_top_level_regexp.source+")"
-
-
end
-
2
class DumpSplitParser < AbstractPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
10
Regexp.new "<DumpSplit>(?<dumpsplit>.*)</DumpSplit>"
-
end
-
-
2
def parsed_value
-
5
@md[:dumpsplit]
-
end
-
end
-
2
class ExecutableCodeParser < AbstractListPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
30
Regexp.new "<Code><map>(?<code_map>("+
-
KVPAIRS_PATTERN.source+")*?)</map></Code>"
-
end
-
-
2
def parse_list
-
26
ExecutableCodeParser::values_to_list @md[:code_map], KVPAIRS_PATTERN, {} do |retmap, kvpair|
-
46
retmap[kvpair[:code_key].to_sym] = ExecutableCodeParser::instructions_to_list kvpair[:instructions_list]
-
end
-
end
-
-
-
2
def self.instructions_to_list(instructions)
-
50
count = 0
-
50
self.values_to_list instructions, INSTRUCTIONS_PATTERN do |ret, ins|
-
384
ret << sprintf("%3d %s",count,ins[1])
-
384
count += 1
-
end
-
end
-
-
-
2
INSTRUCTIONS_PATTERN = Regexp.new "<i>(.*?)</i>"
-
-
2
KVPAIRS_PATTERN = Regexp.new "<kvpair><key><string>(?<code_key>.*?)</string></key><value>"+
-
"<instructions>(?<instructions_list>("+INSTRUCTIONS_PATTERN.source+
-
")*?)</instructions></value></kvpair>"
-
-
end
-
2
class QuantumStackParser < AbstractListPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
104
Regexp.new "<bottom/>|"+"<Qstack><int>(?<stackaddress>-?(\\d)*)<\/int>"+
-
"<bool>(?<on_diagonal>(True)|(False))</bool>"+
-
"<substacks>(?<substacks>.*)</substacks>"+
-
"(?<descriptor>(<Zero/>)|(<Value>.*</Value>)|(<Qubits>.*</Qubits>)|"+
-
"(<Classical>.*</Classical>)|(<AlgebraicData>.*</AlgebraicData>))"+
-
"</Qstack>"
-
end
-
-
2
def self.initial_qstack_regexp
-
1
Regexp.new "^"+QuantumStackParser::embeddable_top_level_regexp.source
-
end
-
-
2
def self.sub_qstack_matcher
-
64
DuckMatcher.new "<Qstack>", "</Qstack>", "<bottom/>"
-
end
-
-
2
def initialize(in_qst)
-
103
if in_qst.respond_to? :substacks_string
-
20
@md = in_qst.md
-
20
@parsed_list = in_qst.substacks
-
else
-
83
super
-
end
-
end
-
-
2
def stackaddress
-
109
@md[:stackaddress].to_i
-
end
-
-
2
def descriptor
-
126
@md[:descriptor]
-
end
-
-
2
def on_diagonal?
-
111
@md[:on_diagonal] == "True"
-
end
-
-
2
def substacks_string
-
105
@md[:substacks]
-
end
-
-
2
def bottom?
-
102
@md[0] == "<bottom/>"
-
end
-
-
2
def substacks
-
101
@parsed_list
-
end
-
-
2
def parse_list
-
103
return [] if !substacks_string || substacks_string == ""
-
25
QuantumStackParser::values_to_list substacks_string, QuantumStackParser::sub_qstack_matcher do |retval, qmd|
-
37
retval << QuantumStackParser.new(qmd[0])
-
end
-
end
-
-
end
-
2
class QubitPatternParser < AbstractListPatternParser
-
-
2
LIST_PATTERN = Regexp.new "<pair>(?<first_qubit>(<qz/>)|(<qo/>))(?<second_qubit>(<qz/>)|(<qo/>))</pair>"
-
# match 2 and 5
-
-
2
def self.embeddable_top_level_regexp
-
55
Regexp.new "<Qubits>(?<qubits>("+
-
LIST_PATTERN.source+"){1,4})<\/Qubits>"
-
end
-
-
-
2
def parse_list
-
54
qubit_string = @md[:qubits]
-
54
QubitPatternParser::values_to_list qubit_string, LIST_PATTERN do |rval,md|
-
294
elem = [md[:first_qubit], md[:second_qubit]].collect {|qb| QubitPatternParser::translate_qubit qb}
-
99
raise InvalidInput, "#{elem} duplicated in qubit" if rval.include? elem
-
97
rval << elem
-
end
-
end
-
-
2
def self.translate_qubit(single_qubit)
-
74
return 0 if single_qubit =~/^<qz\/>$/
-
24
return 1 if single_qubit =~/^<qo\/>$/
-
raise InvalidInput, "Got #{single_qubit}, expecting one of '<qz/>' or '<qo/>'"
-
end
-
end
-
2
class StackTranslationParser < AbstractListPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
60
Regexp.new "<MMap>(?<maps>("+LIST_PATTERN.source+")*)</MMap>"
-
end
-
-
2
def parse_list
-
58
values = @md[:maps]
-
58
StackTranslationParser.values_to_list values, LIST_PATTERN do |ret, mdata|
-
44
ret << StackTranslationParser::kv_pairs_to_map(mdata[:key_value_pairs])
-
end
-
end
-
-
-
2
def self.kv_pairs_to_map(kvps)
-
44
self.values_to_list kvps, KVPATTERN, {} do |ret, mdkv|
-
33
ret[mdkv[:key].to_sym] = mdkv[:value].to_i
-
end
-
end
-
-
2
KVPATTERN = Regexp.new "<kvpair><key><string>(?<key>.*?)</string></key><value><int>(?<value>\\d*)</int></value></kvpair>"
-
-
2
LIST_PATTERN = Regexp.new "<map>(?<key_value_pairs>("+KVPATTERN.source+")*)</map>"
-
-
end
-
2
class ValuePatternParser < AbstractPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
106
Regexp.new "<Value>(<number>)?(1|1\\.|1\\.0|0?\\.\\d*|\\d\\.\\d*e-\\d\\d?)(</number>)?</Value>"
-
end
-
-
2
def parsed_value
-
101
@md[2].to_f
-
end
-
end
-
2
class ZeroPatternParser < AbstractPatternParser
-
-
2
def self.embeddable_top_level_regexp
-
21
Regexp.new "<Zero/>"
-
end
-
-
2
def parsed_value
-
12
"0" if @md
-
end
-
end
-
2
class AbstractDescriptorModel <ApplicationModel
-
2
attr_accessor :value
-
2
attr_accessor :name
-
-
2
def self.make_instance(in_string)
-
104
case in_string
-
107
when /^<Zero/ then ZeroDescriptorModel.new in_string
-
158
when /^<Valu/ then ValueDescriptorModel.new in_string
-
54
when /^<Clas/ then ClassicalDescriptorModel.new in_string
-
52
when /^<Qubi/ then QubitDescriptorModel.new in_string
-
28
when /^<Alge/ then DataDescriptorModel.new in_string
-
4
else raise ModelCreateError, in_string
-
end
-
end
-
-
2
def initialize
-
1
raise ModelCreateError
-
end
-
-
2
def substack_labels
-
3
nil
-
end
-
end
-
2
class AbstractDescriptorPainter
-
-
2
include Drawing
-
-
2
def initialize(model)
-
109
@model_element = model
-
end
-
-
2
def model_element=(model)
-
4
@model_element = model
-
end
-
-
2
def model_element
-
1
@model_element
-
end
-
-
2
def node_size
-
105
10.0
-
end
-
-
2
def half_node_size
-
95
node_size * 0.5
-
end
-
-
2
def my_shape(point)
-
58
Ellipse2D::Double.new(point.x-half_node_size,
-
point.y-half_node_size,
-
node_size,
-
node_size)
-
end
-
-
2
def my_colour
-
#Not to be used
-
2
raise RuntimeError, "do not call paint on abstract
-
StackDescriptor, use on subclass:
-
2
I am a #{self.class}"
-
end
-
-
-
2
def image_of_model()
-
1
nil
-
end
-
-
-
2
def paint_model(g)
-
#Not to be used
-
1
raise RuntimeError, "do not call paint_model on descriptors,
-
use paint_model_at_point"
-
end
-
-
-
2
def paint_model_at_point(g,center)
-
57
draw_colour_filled_shape(g,my_shape(center), my_colour)
-
56
paint_name(g,center) if @model_element.name
-
56
paint_value(g,center) if @model_element.length == 0
-
end
-
-
2
def paint_name(g,center)
-
114
draw_text_to_left_of_point(g,"#{@model_element.name}",
-
Point.new(center.x-node_size,
-
center.y
-
)
-
)
-
end
-
-
2
def paint_value(g,center)
-
114
draw_text_centered_at_point(g,"#{@model_element.value}",
-
Point.new(center.x,
-
center.y+2*node_size
-
)
-
)
-
end
-
-
-
2
def model_paint_size(g)
-
-
76
height = node_size
-
76
valsize = get_value_canvas_size g
-
76
height += valsize.height_with_spacing if @model_element.length == 0
-
-
76
right_width = valsize.right_required_width
-
76
left_width = [half_node_size + name_width(g),
-
valsize.left_required_width].max
-
-
76
CanvasSize.new_with_measures(left_width, right_width, height)
-
end
-
-
2
def get_value_canvas_size(g)
-
152
valsize = get_string_size(g," #{@model_element.value} ")
-
76
CanvasSize.new_with_measures(valsize.width*0.5,
-
valsize.width*0.5,
-
valsize.height
-
)
-
end
-
-
2
def name_width g
-
144
return get_string_size(g,"#{@model_element.name}").width +
-
node_size if @model_element.name
-
8
0
-
end
-
-
-
end
-
2
class ClassicalDescriptorModel< AbstractDescriptorModel
-
-
2
def self.validate_substacks_count(substacks)
-
56
raise ModelCreateError, "Classical element on stack should have substacks" if !substacks || substacks.size == 0
-
end
-
-
2
def initialize(in_string)
-
67
cpp = ClassicalPatternParser.new in_string
-
66
@value = cpp.parsed_value
-
end
-
-
2
def length
-
3
@value.length
-
end
-
-
2
def substack_labels
-
44
@value.collect {|v| "#{v}"}
-
end
-
-
end
-
2
class ClassicalDescriptorPainter < AbstractDescriptorPainter
-
-
-
2
def my_colour
-
4
Color.green
-
end
-
end
-
2
class DataDescriptorModel < AbstractDescriptorModel
-
-
2
def self.validate_substacks_count(substacks)
-
6
raise ModelCreateError, "Data element on stack should have substacks" if !substacks || substacks.size == 0
-
end
-
-
-
2
def initialize(in_string)
-
15
dpp = DataPatternParser.new(in_string)
-
-
14
@value = dpp.parsed_value
-
end
-
-
-
2
def length
-
6
@value.length
-
end
-
-
2
def substack_labels
-
57
@value.collect {|v| "#{v[0]}#{v[1] if [] != v[1]}"}
-
end
-
end
-
2
class DataDescriptorPainter < AbstractDescriptorPainter
-
-
2
def my_colour
-
3
Color.magenta
-
end
-
-
-
2
def my_shape(point)
-
3
Rectangle2D::Double.new(point.x-half_node_size, point.y-half_node_size, node_size, node_size)
-
end
-
end
-
-
2
class DescriptorPainterFactory
-
2
def self.make_painter(model)
-
119
case model
-
134
when ClassicalDescriptorModel then ClassicalDescriptorPainter.new(model)
-
107
when DataDescriptorModel then DataDescriptorPainter.new(model)
-
116
when QubitDescriptorModel then QubitDescriptorPainter.new(model)
-
161
when ValueDescriptorModel then ValueDescriptorPainter.new(model)
-
14
when ZeroDescriptorModel then ZeroDescriptorPainter.new(model)
-
end
-
end
-
end
-
2
class QubitDescriptorModel < AbstractDescriptorModel
-
-
2
def self.validate_substacks_count(substacks)
-
87
raise ModelCreateError, "Qubit on stack should have 1 - 4 substacks, not #{!substacks ? "be nil" : substacks.size}" if !substacks || substacks.size == 0 or substacks.size > 4
-
end
-
-
2
def initialize(in_string)
-
56
qpp = QubitPatternParser.new in_string
-
55
@value = qpp.parsed_value
-
end
-
-
2
def length
-
13
@value.length
-
end
-
-
2
def substack_labels
-
88
@value.collect {|v| "#{v[0]}#{v[1]}"}
-
end
-
end
-
2
class QubitDescriptorPainter < AbstractDescriptorPainter
-
-
2
def my_colour
-
5
Color.red
-
end
-
-
end
-
-
-
2
class ValueDescriptorModel < AbstractDescriptorModel
-
-
2
def self.validate_substacks_count(substacks)
-
108
return unless substacks
-
107
raise ModelCreateError, "Value element should not have substacks" if substacks.size > 0
-
end
-
-
2
def initialize(in_string)
-
200
@value = @value = (ValuePatternParser.new in_string).parsed_value
-
98
@name = nil
-
end
-
-
2
def length
-
73
0
-
end
-
-
end
-
2
class ValueDescriptorPainter < AbstractDescriptorPainter
-
-
2
def my_colour
-
54
Color.blue
-
end
-
-
end
-
2
class ZeroDescriptorModel <AbstractDescriptorModel
-
-
2
def self.validate_substacks_count(substacks)
-
4
return unless substacks
-
3
raise ModelCreateError, "Zero stack should not have substacks" if substacks.size > 0
-
end
-
-
2
def initialize(in_string="<Zero/>")
-
28
@value = (ZeroPatternParser.new in_string).parsed_value
-
end
-
-
2
def length
-
4
0
-
end
-
-
end
-
2
class ZeroDescriptorPainter < AbstractDescriptorPainter
-
-
-
2
def my_colour
-
1
Color.black
-
end
-
-
end
-
2
class QuantumStackController < PanelController
-
2
set_model 'QuantumStackModel'
-
2
set_view 'QuantumStackView'
-
-
2
def set_data_from_lqpl_model(lqpl_model)
-
44
set_quantum_stack(lqpl_model.tree_depth_spinner,
-
lqpl_model.recursion_spinner,
-
StackTranslationController.instance.get_stack_translation)
-
end
-
-
2
def set_quantum_stack(tree_depth,recursion_depth,stack_trans)
-
44
model.stack_translation = stack_trans
-
44
model.quantum_stack =
-
lqpl_emulator_server_connection.get_qstack(tree_depth,
-
recursion_depth)
-
44
update_view
-
end
-
-
2
def update_on_lqpl_model_trim
-
2
true
-
end
-
end
-
2
class QuantumStackModel < ApplicationModel
-
-
2
attr_accessor :substacks
-
2
attr_accessor :descriptor
-
2
attr_accessor :stack_translation
-
2
attr_accessor :stackaddress
-
-
2
def quantum_stack
-
end
-
-
2
def quantum_stack=(in_qstack)
-
100
raise ModelCreateError, "QuantumStack: Missing Stack Translation" if @stack_translation.nil?
-
99
return if !in_qstack
-
99
@preferred_size = nil
-
99
decode_stack_data_from_xml in_qstack
-
end
-
-
2
def decode_stack_data_from_xml(in_qstack)
-
119
qpp = QuantumStackParser.new in_qstack
-
118
@bottom = qpp.bottom?
-
118
@substacks = []
-
118
return if bottom?
-
-
103
@stackaddress = qpp.stackaddress
-
103
@on_diagonal = qpp.on_diagonal?
-
103
@substacks = qpp.substacks.collect do |ss|
-
48
q = QuantumStackModel.new
-
48
q.stack_translation = @stack_translation
-
48
q.quantum_stack = ss
-
48
q
-
end if qpp.substacks
-
103
set_descriptor qpp.descriptor
-
end
-
-
2
def set_descriptor(xml_descriptor)
-
109
@descriptor = AbstractDescriptorModel.make_instance xml_descriptor
-
109
@descriptor.class.validate_substacks_count(@substacks)
-
104
@descriptor.name = make_name(:use_stack_address)
-
end
-
-
2
def make_name(formatting)
-
222
nm = (@stack_translation.reverse_lookup(@stackaddress)).to_s
-
234
nm += "(#{@stackaddress})" if nm != "#{@stackaddress}" && formatting == :use_stack_address
-
111
nm = "" if nm == "-1"
-
111
nm
-
end
-
-
2
def bottom?
-
100
@bottom
-
end
-
-
-
end
-
2
LINE_LABEL_FONT_SIZE = 8.0
-
2
PLACEMENTS={-1 => :left, 0 => :right, 1 => :right}
-
-
2
class QuantumStackPainter
-
2
include Drawing
-
-
2
attr :model_element
-
-
2
def initialize(model_element)
-
110
self.model_element=model_element
-
end
-
-
2
def model_element=(model)
-
110
@model_element = model
-
-
110
@descriptor_painter =
-
DescriptorPainterFactory.make_painter(model.descriptor)
-
110
@sstack_painters = @model_element.substacks.collect do |s|
-
48
QuantumStackPainter.new(s)
-
end
-
-
end
-
-
-
2
def image_of_model()
-
46
bistart = BufferedImage.new(10,10,
-
BufferedImage::TYPE_4BYTE_ABGR)
-
46
gstart = bistart.create_graphics
-
46
image_size = model_paint_size(gstart)
-
46
bifull = BufferedImage.new(image_size.required_width+40,
-
image_size.height+40,
-
BufferedImage::TYPE_4BYTE_ABGR)
-
46
g = bifull.create_graphics
-
46
paint_model(g)
-
46
ImageIcon.new(bifull)
-
end
-
-
-
2
def paint_model(g)
-
47
g.set_rendering_hint(RenderingHints::KEY_ANTIALIASING,
-
RenderingHints::VALUE_ANTIALIAS_ON)
-
-
47
d = model_paint_size(g);
-
47
paint_model_at_point(g,Point.new(d.left_required_width+20.0,
-
20.0))
-
end
-
-
2
def paint_model_at_point(g,center)
-
55
if model_element.bottom?
-
2
draw_text_centered_at_point(g,"...", center)
-
else
-
53
paint_substacks(center,g)
-
53
@descriptor_painter.paint_model_at_point(g,center)
-
-
end
-
end
-
-
2
def bottom_element_size(g)
-
5
dim= get_string_size(g,"...")
-
5
@preferred_size = CanvasSize.new_with_measures(dim.width * 0.5,
-
dim.width * 0.5,
-
dim.height)
-
5
return @preferred_size
-
end
-
-
2
def model_paint_size(g)
-
71
return @preferred_size if @preferred_size
-
43
return bottom_element_size g if model_element.bottom?
-
-
-
41
@preferred_size =
-
CanvasSize.new_from_subtree(
-
@sstack_painters.collect do |painter|
-
6
painter.model_paint_size(g)
-
end)
-
-
41
@preferred_size.max_of_each_dimension!(
-
@descriptor_painter.model_paint_size(g)) if @descriptor_painter
-
-
41
@preferred_size
-
end
-
-
2
def substack_label(index)
-
17
d = @model_element.descriptor.substack_labels if @model_element.descriptor
-
17
return d[index].to_s if d
-
1
"Nil for model descriptor"
-
#"#{@model_element.descriptor.substack_labels[index]}"
-
end
-
-
2
def substack_label_placement(index)
-
42
PLACEMENTS[index <=> (@model_element.substacks.length - 1) * 0.5]
-
end
-
-
2
def paint_substacks(top_point,g)
-
54
offsets = CanvasSize::compute_offsets(sub_stack_sizes(g))
-
54
Range.new(0,@sstack_painters.size-1).each do |i|
-
10
paint_at_point = top_point.copy_with_x_and_y_offset(
-
offsets[i],
-
CanvasSize::vertical_node_separation)
-
10
paint_substack(g,i,top_point,paint_at_point)
-
end
-
end
-
-
2
def paint_substack(g,index,top_point,paint_point)
-
13
draw_black_line(g,top_point, paint_point)
-
13
draw_sized_text(g,LINE_LABEL_FONT_SIZE,substack_label(index),
-
top_point, paint_point,
-
substack_label_placement(index))
-
13
@sstack_painters[index].paint_model_at_point(g,paint_point)
-
-
end
-
-
2
def sub_stack_sizes(g)
-
56
@sstack_painters.collect do |sstack_painter|
-
14
sstack_painter.model_paint_size(g)
-
end
-
end
-
-
-
-
end
-
-
2
class QuantumStackView < ApplicationView
-
2
set_java_class QuantumStackForm
-
2
raw_mapping :make_quantum_stack_painter,nil
-
-
2
def make_quantum_stack_painter(model,transfer)
-
45
quantum_stack_panel.quantum_stack_painter =
-
QuantumStackPainter.new(model)
-
end
-
end
-
2
class StackTranslationController < PanelController
-
2
set_model 'StackTranslationModel'
-
2
set_view 'StackTranslationView'
-
2
set_close_action :hide
-
-
2
def set_data_from_lqpl_model(lqpl_model)
-
43
set_stack_translation(lqpl_model.tree_depth_spinner, lqpl_model.recursion_spinner)
-
end
-
-
2
def set_stack_translation(tree_depth, recursion_level)
-
43
set_stack_translation_data(lqpl_emulator_server_connection.get_stack_translation(tree_depth,recursion_level))
-
end
-
-
2
def set_stack_translation_data(stack_translation_data)
-
45
model.stack_translation= stack_translation_data
-
45
update_view
-
end
-
-
2
def get_stack_translation_text
-
1
model.text
-
end
-
-
2
def get_stack_translation
-
46
model
-
end
-
end
-
2
class StackTranslationModel < ApplicationModel
-
2
attr_accessor :stack_translation
-
2
attr_accessor :text
-
-
2
def stack_translation=(in_mmap)
-
54
stp = StackTranslationParser.new in_mmap
-
53
@stack_translation = stp.parsed_value
-
53
@reverse_translation = @stack_translation.reverse.inject({}) do |rev_map,st_map|
-
36
rev_map.merge! st_map.invert
-
end
-
end
-
-
2
def text=(whatever)
-
end
-
-
2
def text
-
50
inside = @stack_translation.inject("") do |inner, tr_map|
-
92
line = (tr_map.collect {|kv| "#{kv[0]}=>#{kv[1]}"}).join(", ")
-
25
inner += "<li>"+line+"</li>"
-
end
-
50
"<html><ol>"+inside+"</ol></html>"
-
end
-
-
2
def reverse_lookup(val)
-
59
rmap = @reverse_translation || {}
-
59
rmap.default=val.to_s.to_sym
-
59
rmap[val.to_i].id2name
-
end
-
-
-
end
-
-
2
class StackTranslationView < ApplicationView
-
2
set_java_class StackTranslationForm #com.drogar.lqpl.screens.StackTranslation
-
2
map :view => "stack_translation_text", :model => :text
-
end
-
-
2
module Monkeybars
-
2
class Resolver
-
2
IN_FILE_SYSTEM = :in_file_system
-
2
IN_JAR_FILE = :in_jar_file
-
-
# Returns a const value indicating if the currently executing code is being run from the file system or from within a jar file.
-
2
def self.run_location
-
4
if File.expand_path(__FILE__) =~ /\.jar\!/
-
#:nocov:#
-
skipped
IN_JAR_FILE
-
#:nocov:#
-
else
-
4
IN_FILE_SYSTEM
-
end
-
end
-
end
-
end
-
-
2
class Object
-
2
def add_to_classpath(path)
-
2
$CLASSPATH << get_expanded_path(path)
-
end
-
#:nocov:#
-
skipped
def add_to_load_path(path)
-
skipped
$LOAD_PATH << get_expanded_path(path)
-
skipped
end
-
#:nocov:#
-
2
private
-
2
def get_expanded_path(path)
-
4
resolved_path = File.expand_path(File.dirname(__FILE__) + "/" + path.gsub("\\", "/"))
-
4
resolved_path.gsub!("file:", "") unless resolved_path.index(".jar!")
-
4
resolved_path.gsub!("%20", ' ')
-
4
resolved_path
-
end
-
end
-
2
["AlphaComposite","BasicStroke","Color","Dimension","Point","Rectangle","RenderingHints"].each do |name|
-
28
java_import "java.awt.#{name}"
-
end
-
-
2
java_import java.awt.font.TextAttribute
-
-
2
["Dimension2D","Line2D","Ellipse2D","Rectangle2D"].each do |name|
-
16
java_import "java.awt.geom.#{name}"
-
end
-
-
2
java_import java.awt.image.BufferedImage
-
-
2
["AttributedString","AttributedCharacterIterator"].each do |name|
-
8
java_import "java.text.#{name}"
-
end
-
-
2
java_import javax.swing.ImageIcon
-
-
-
-
2
module Drawing
-
2
def draw_text_centered_at_point(g,text, point)
-
63
text_bounds = get_string_size(g,text)
-
126
g.draw_string(text, point.x-(text_bounds.width*0.5), point.y)
-
end
-
-
2
def draw_text_centered_between(g,text, point1, point2)
-
1
draw_text_centered_at_point(g,text,mid_point(point1, point2))
-
end
-
-
2
def mid_point(point1, point2)
-
54
Point.new((point1.x + point2.x) / 2, (point1.y + point2.y) / 2)
-
end
-
-
2
def draw_sized_text(g,size,text, point1, point2,reference)
-
16
point = mid_point(point1, point2)
-
16
atext = AttributedString.new(text)
-
16
atext.add_attribute(TextAttribute::SIZE, size, 0, text.length)
-
16
case reference
-
21
when :left then draw_text_to_left_of_point(g,atext.iterator,Point.new(point.x,point.y))
-
20
when :right then draw_text_to_right_of_point(g,atext.iterator,point)
-
2
else draw_text_centered_at_point(g,atext.iterator,point)
-
end
-
end
-
-
2
def draw_text_to_left_of_point(g,text, point)
-
59
text_bounds = get_string_size(g,text)
-
59
g.draw_string(text, point.x-text_bounds.width, point.y)
-
end
-
-
2
def draw_text_to_right_of_point(g,text, point)
-
10
g.draw_string(text, point.x, point.y)
-
end
-
-
2
def get_string_size(g,text)
-
114
case text
-
114
when AttributedCharacterIterator then
-
4
this_font = g.font.java_send :deriveFont, [Java::float], 8.0
-
4
this_font.get_string_bounds(text,0, text.end_index, g.font_render_context)
-
110
else g.font.get_string_bounds(text,g.font_render_context)
-
end
-
end
-
-
2
def draw_black_line(g,from,to)
-
14
ln = Line2D::Double.new(from,to)
-
14
g.set_color(Color.black)
-
14
g.draw(ln)
-
end
-
-
2
def draw_colour_filled_shape(g,shape,fill_colour)
-
58
g.color = fill_colour
-
58
g.fill shape
-
58
g.color = Color.black
-
58
g.draw shape
-
end
-
-
end
-
2
class DuckMatcher
-
2
attr_reader :matchss
-
2
attr_accessor :recurss
-
2
def initialize(start,stop, entire_string)
-
62
@matchss = Regexp.new "(?<strt>"+start+")|(?<stop>"+stop+")|(?<all_of_it>"+entire_string+")"
-
end
-
-
2
def match(input)
-
69
@recurss = 0
-
69
current_position = 0
-
69
md = @matchss.match input
-
69
return nil if !md
-
41
return [md[0]] if md[:all_of_it]
-
26
while md do
-
66
return [input[0,current_position+md.end(0)]] if _matched_paired_start_stop?(md)
-
40
current_position += md.end(0)
-
40
md = @matchss.match input[Range.new(current_position, -1)]
-
end
-
return nil
-
end
-
-
2
def _matched_paired_start_stop? md
-
85
@recurss +=1 if md[:strt]
-
85
@recurss -=1 if md[:stop]
-
85
@recurss == 0
-
end
-
end
-
2
class Array
-
2
def partion_into_left_mid_right
-
6
[get_left_partition , _get_middle_element_as_array, get_right_partition]
-
end
-
-
2
def get_partition(side)
-
84
return get_left_partition if side == :left
-
42
return get_right_partition if side == :right
-
_get_middle_element_as_array
-
end
-
-
2
def get_left_partition
-
88
self[0,self.size/2]
-
end
-
-
2
def get_right_partition
-
264
self[(-(self.size/2)).ceil,self.size/2]
-
end
-
-
2
def get_middle_element
-
98
_get_middle_element_as_array[0]
-
end
-
-
2
def tails
-
34
Range.new(0,(self.size-1)).collect do |i|
-
17
self[i,self.size-i]
-
end
-
end
-
-
2
def heads
-
34
Range.new(0,(self.size-1)).collect do |i|
-
17
self[0,i+1]
-
end
-
end
-
-
2
private
-
2
def _get_middle_element_as_array
-
104
half_size = self.size/2
-
416
self[half_size,-((-self.size/2).ceil+(half_size.floor))]
-
end
-
-
end
-
2
class JFileChooser
-
2
def self.lqpl_assembled_file_opener
-
20
JFileChooser::opener("Load LQPO (Assembly) File","LQPL assembled file", "qpo")
-
end
-
-
2
def self.lqpl_source_file_opener
-
8
JFileChooser::opener("Open LQPL File for Compiling","LQPL source file", "qpl")
-
end
-
-
2
def self.opener(title, file_description, file_extension)
-
-
32
chooser = JFileChooser.new()
-
32
chooser.set_dialog_title title
-
32
chooser_files = FileNameExtensionFilter.new(file_description, [file_extension].to_java(:string))
-
32
chooser.set_file_filter(chooser_files)
-
32
chooser.set_current_directory(java.io.File.new(Dir.getwd))
-
32
chooser
-
end
-
end
-
2
class Point
-
2
def copy_with_x_and_y_offset(xoffset,yoffset)
-
48
Point.new(self.x+(xoffset||0.0), self.y+(yoffset||0))
-
end
-
end
-
2
class SwingRunner
-
2
def initialize(explicit_block=nil, &block)
-
61
@block = explicit_block || block
-
end
-
-
2
def run
-
61
@block.call
-
end
-
-
-
# :nocov:
-
skipped
def self.on_edt(&task)
-
skipped
if javax.swing.SwingUtilities.event_dispatch_thread?
-
skipped
javax.swing.SwingUtilities.invoke_later SwingRunner.new(task)
-
skipped
else
-
skipped
javax.swing.SwingUtilities.invoke_and_wait SwingRunner.new(task)
-
skipped
end
-
skipped
end
-
# :nocov:
-
-
end
-
2
class TranslateLineEnds
-
2
def initialize(in_string)
-
35
@data = in_string.gsub("\n", '<\\n>')
-
end
-
-
2
def to_s
-
35
@data
-
end
-
end
-
2
LQPL_GUI_VERSION="0.9.1"
-
-
4
ABOUT_STRING="<html> <center><strong>LQPL Emulator</strong> - Version #{LQPL_GUI_VERSION} (Experimental)</center> <br />
-
<table>
-
<tr><td>Contributers:</td><td> Robin Cockett (robin@ucalgary.ca)</td></tr>
-
<tr><td> </td><td> Brett Giles (brett.giles@ucalgary.ca)</td></tr>
-
<tr><td> </td><td>Rajika Kumarasiri</td></tr>
-
</table>
-
<br />
-
Website: http://pll.cpsc.ucalgary.ca/lqpl<br />
-
</html>"
-
-
2
LICENSE_STRING="
-
<html>
-
Copyright © 2006-2012, Brett G. Giles, Robin Cockett, University of Calgary<br />
-
All rights reserved.<br />
-
<br />
-
Redistribution and use in source and binary forms, with or without modification, are permitted<br />
-
provided that the following conditions are met:<br />
-
<ul>
-
<li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
-
<li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
-
<li>Neither the name of the University of Calgary nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.</li>
-
</ul>
-
<br />
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,<br />
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE<br />
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br />
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;<br />
-
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,<br />
-
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,<br />
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br />
-
-
lqpl includes software redistributed under:</br>
-
<ul>
-
<li>The Ruby license - monkeybars.jar - available at https://github.com/monkeybars/monkeybars-core</li>
-
<li>The Common Public License version 1.0 - jruby-complete.jar - available at www.jruby.org</li>
-
</ul>
-
</html>
-
"