cosmos 3.4.2 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +69 -11
  3. data/autohotkey/config/targets/INST/cmd_tlm/inst_tlm.txt +23 -0
  4. data/autohotkey/tools/TestRunnerAHK5 +17 -0
  5. data/autohotkey/tools/TestRunnerAHK6 +17 -0
  6. data/autohotkey/tools/cmd_extractor.ahk +6 -0
  7. data/autohotkey/tools/data_viewer.ahk +6 -0
  8. data/autohotkey/tools/limits_monitor.ahk +67 -14
  9. data/autohotkey/tools/replay.ahk +6 -0
  10. data/autohotkey/tools/test_runner5.ahk +8 -0
  11. data/autohotkey/tools/test_runner6.ahk +5 -0
  12. data/autohotkey/tools/tlm_extractor.ahk +25 -1
  13. data/autohotkey/tools/tlm_grapher.ahk +6 -0
  14. data/cosmos.gemspec +19 -19
  15. data/data/crc.txt +46 -46
  16. data/data/critical.wav +0 -0
  17. data/data/information.wav +0 -0
  18. data/data/input.wav +0 -0
  19. data/data/message.wav +0 -0
  20. data/data/question.wav +0 -0
  21. data/data/warning.wav +0 -0
  22. data/demo/Gemfile +5 -1
  23. data/demo/Launcher +5 -4
  24. data/demo/Launcher.bat +6 -56
  25. data/demo/config/data/crc.txt +73 -55
  26. data/demo/config/system/system.txt +1 -0
  27. data/demo/config/targets/EXAMPLE/cmd_tlm/example_tlm.txt +2 -0
  28. data/demo/procedures/example_test.rb +17 -16
  29. data/demo/tools/CmdExtractor +6 -5
  30. data/demo/tools/CmdExtractor.bat +6 -56
  31. data/demo/tools/CmdSender +6 -5
  32. data/demo/tools/CmdSender.bat +6 -56
  33. data/demo/tools/CmdTlmServer +6 -5
  34. data/demo/tools/CmdTlmServer.bat +6 -56
  35. data/demo/tools/DataViewer +6 -5
  36. data/demo/tools/DataViewer.bat +6 -56
  37. data/demo/tools/ExampleTarget +6 -5
  38. data/demo/tools/ExampleTarget.bat +6 -56
  39. data/demo/tools/HandbookCreator +6 -5
  40. data/demo/tools/HandbookCreator.bat +6 -58
  41. data/demo/tools/Launcher +6 -5
  42. data/demo/tools/Launcher.bat +6 -56
  43. data/demo/tools/LimitsMonitor +6 -5
  44. data/demo/tools/LimitsMonitor.bat +6 -56
  45. data/demo/tools/OpenGLBuilder +6 -5
  46. data/demo/tools/OpenGLBuilder.bat +6 -56
  47. data/demo/tools/PacketViewer +6 -5
  48. data/demo/tools/PacketViewer.bat +6 -56
  49. data/demo/tools/Replay +6 -5
  50. data/demo/tools/Replay.bat +6 -56
  51. data/demo/tools/ScpiTarget +6 -5
  52. data/demo/tools/ScpiTarget.bat +6 -56
  53. data/demo/tools/ScriptRunner +6 -5
  54. data/demo/tools/ScriptRunner.bat +6 -56
  55. data/demo/tools/TableManager +6 -5
  56. data/demo/tools/TableManager.bat +6 -56
  57. data/demo/tools/TestRunner +6 -5
  58. data/demo/tools/TestRunner.bat +6 -56
  59. data/demo/tools/TlmExtractor +6 -5
  60. data/demo/tools/TlmExtractor.bat +6 -56
  61. data/demo/tools/TlmGrapher +6 -5
  62. data/demo/tools/TlmGrapher.bat +6 -56
  63. data/demo/tools/TlmViewer +6 -5
  64. data/demo/tools/TlmViewer.bat +6 -56
  65. data/demo/tools/ToolLaunch.bat +63 -0
  66. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  67. data/demo/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  68. data/demo/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  69. data/demo/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  70. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  71. data/demo/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  72. data/demo/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  73. data/demo/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  74. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  75. data/demo/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  76. data/demo/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  77. data/demo/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  78. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  79. data/demo/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  80. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  81. data/demo/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  82. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  83. data/demo/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  84. data/demo/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  85. data/demo/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  86. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  87. data/demo/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  88. data/demo/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  89. data/demo/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  90. data/demo/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  91. data/demo/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  92. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  93. data/demo/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  94. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  95. data/demo/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  96. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  97. data/demo/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  98. data/demo/tools/tool_launch.rb +38 -0
  99. data/install/Gemfile +5 -1
  100. data/install/Launcher +5 -3
  101. data/install/Launcher.bat +6 -56
  102. data/install/config/data/crc.txt +67 -49
  103. data/install/config/tools/launcher/launcher.txt +1 -0
  104. data/install/tools/CmdExtractor +6 -5
  105. data/install/tools/CmdExtractor.bat +6 -56
  106. data/install/tools/CmdSender +6 -5
  107. data/install/tools/CmdSender.bat +6 -56
  108. data/install/tools/CmdTlmServer +6 -5
  109. data/install/tools/CmdTlmServer.bat +6 -56
  110. data/install/tools/DataViewer +6 -5
  111. data/install/tools/DataViewer.bat +6 -56
  112. data/install/tools/HandbookCreator +6 -5
  113. data/install/tools/HandbookCreator.bat +6 -58
  114. data/install/tools/Launcher +6 -5
  115. data/install/tools/Launcher.bat +6 -56
  116. data/install/tools/LimitsMonitor +6 -5
  117. data/install/tools/LimitsMonitor.bat +6 -56
  118. data/install/tools/OpenGLBuilder +6 -5
  119. data/install/tools/OpenGLBuilder.bat +6 -56
  120. data/install/tools/PacketViewer +6 -5
  121. data/install/tools/PacketViewer.bat +6 -56
  122. data/install/tools/Replay +6 -5
  123. data/install/tools/Replay.bat +6 -56
  124. data/install/tools/ScriptRunner +6 -5
  125. data/install/tools/ScriptRunner.bat +6 -56
  126. data/install/tools/TableManager +6 -5
  127. data/install/tools/TableManager.bat +6 -56
  128. data/install/tools/TestRunner +6 -5
  129. data/install/tools/TestRunner.bat +6 -56
  130. data/install/tools/TlmExtractor +6 -5
  131. data/install/tools/TlmExtractor.bat +6 -56
  132. data/install/tools/TlmGrapher +6 -5
  133. data/install/tools/TlmGrapher.bat +6 -56
  134. data/install/tools/TlmViewer +6 -5
  135. data/install/tools/TlmViewer.bat +6 -56
  136. data/install/tools/ToolLaunch.bat +63 -0
  137. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/CmdExtractor.rb +6 -5
  138. data/install/tools/mac/CmdExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  139. data/install/tools/mac/CmdSender.app/Contents/MacOS/CmdSender.rb +6 -5
  140. data/install/tools/mac/CmdSender.app/Contents/MacOS/tool_launch.rb +38 -0
  141. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/CmdTlmServer.rb +6 -5
  142. data/install/tools/mac/CmdTlmServer.app/Contents/MacOS/tool_launch.rb +38 -0
  143. data/install/tools/mac/DataViewer.app/Contents/MacOS/DataViewer.rb +6 -5
  144. data/install/tools/mac/DataViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  145. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/HandbookCreator.rb +6 -5
  146. data/install/tools/mac/HandbookCreator.app/Contents/MacOS/tool_launch.rb +38 -0
  147. data/install/tools/mac/Launcher.app/Contents/MacOS/Launcher.rb +6 -5
  148. data/install/tools/mac/Launcher.app/Contents/MacOS/tool_launch.rb +38 -0
  149. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/LimitsMonitor.rb +6 -5
  150. data/install/tools/mac/LimitsMonitor.app/Contents/MacOS/tool_launch.rb +38 -0
  151. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/OpenGLBuilder.rb +6 -5
  152. data/install/tools/mac/OpenGLBuilder.app/Contents/MacOS/tool_launch.rb +38 -0
  153. data/install/tools/mac/PacketViewer.app/Contents/MacOS/PacketViewer.rb +6 -5
  154. data/install/tools/mac/PacketViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  155. data/install/tools/mac/Replay.app/Contents/MacOS/Replay.rb +6 -5
  156. data/install/tools/mac/Replay.app/Contents/MacOS/tool_launch.rb +38 -0
  157. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/ScriptRunner.rb +6 -5
  158. data/install/tools/mac/ScriptRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  159. data/install/tools/mac/TableManager.app/Contents/MacOS/TableManager.rb +6 -5
  160. data/install/tools/mac/TableManager.app/Contents/MacOS/tool_launch.rb +38 -0
  161. data/install/tools/mac/TestRunner.app/Contents/MacOS/TestRunner.rb +6 -5
  162. data/install/tools/mac/TestRunner.app/Contents/MacOS/tool_launch.rb +38 -0
  163. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/TlmExtractor.rb +6 -5
  164. data/install/tools/mac/TlmExtractor.app/Contents/MacOS/tool_launch.rb +38 -0
  165. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/TlmGrapher.rb +6 -5
  166. data/install/tools/mac/TlmGrapher.app/Contents/MacOS/tool_launch.rb +38 -0
  167. data/install/tools/mac/TlmViewer.app/Contents/MacOS/TlmViewer.rb +6 -5
  168. data/install/tools/mac/TlmViewer.app/Contents/MacOS/tool_launch.rb +38 -0
  169. data/install/tools/tool_launch.rb +38 -0
  170. data/lib/cosmos/core_ext/string.rb +3 -2
  171. data/lib/cosmos/gui/dialogs/about_dialog.rb +3 -7
  172. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +200 -136
  173. data/lib/cosmos/gui/opengl/gl_viewer.rb +8 -8
  174. data/lib/cosmos/gui/qt.rb +56 -27
  175. data/lib/cosmos/gui/qt_tool.rb +3 -1
  176. data/lib/cosmos/gui/text/ruby_editor.rb +130 -110
  177. data/lib/cosmos/gui/utilities/script_module_gui.rb +150 -4
  178. data/lib/cosmos/io/json_drb.rb +1 -1
  179. data/lib/cosmos/io/win32_serial_driver.rb +2 -4
  180. data/lib/cosmos/packet_logs/ccsds_log_reader.rb +1 -0
  181. data/lib/cosmos/packet_logs/packet_log_reader.rb +13 -4
  182. data/lib/cosmos/packets/limits.rb +6 -3
  183. data/lib/cosmos/packets/telemetry.rb +34 -3
  184. data/lib/cosmos/processors/new_packet_log_processor.rb +1 -1
  185. data/lib/cosmos/script/commands.rb +20 -2
  186. data/lib/cosmos/script/extract.rb +11 -3
  187. data/lib/cosmos/script/limits.rb +6 -0
  188. data/lib/cosmos/script/scripting.rb +17 -9
  189. data/lib/cosmos/system/system.rb +73 -17
  190. data/lib/cosmos/system/target.rb +10 -5
  191. data/lib/cosmos/tools/cmd_extractor/cmd_extractor.rb +1 -0
  192. data/lib/cosmos/tools/cmd_tlm_server/api.rb +95 -0
  193. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server.rb +8 -4
  194. data/lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb +55 -0
  195. data/lib/cosmos/tools/data_viewer/data_viewer.rb +5 -12
  196. data/lib/cosmos/tools/data_viewer/data_viewer_component.rb +14 -48
  197. data/lib/cosmos/tools/handbook_creator/handbook_creator_config.rb +1 -5
  198. data/lib/cosmos/tools/launcher/launcher.rb +4 -0
  199. data/lib/cosmos/tools/launcher/launcher_config.rb +50 -0
  200. data/lib/cosmos/tools/launcher/launcher_tool.rb +21 -9
  201. data/lib/cosmos/tools/limits_monitor/limits_monitor.rb +607 -566
  202. data/lib/cosmos/tools/replay/replay.rb +51 -45
  203. data/lib/cosmos/tools/script_runner/script_runner.rb +13 -5
  204. data/lib/cosmos/tools/script_runner/script_runner_frame.rb +8 -109
  205. data/lib/cosmos/tools/test_runner/test.rb +65 -6
  206. data/lib/cosmos/tools/test_runner/test_runner.rb +4 -4
  207. data/lib/cosmos/tools/tlm_extractor/tlm_extractor.rb +5 -0
  208. data/lib/cosmos/tools/tlm_grapher/tabbed_plots_tool/tabbed_plots_logfile_thread.rb +3 -0
  209. data/lib/cosmos/tools/tlm_viewer/tlm_viewer.rb +3 -2
  210. data/lib/cosmos/tools/tlm_viewer/tlm_viewer_config.rb +9 -6
  211. data/lib/cosmos/tools/tlm_viewer/widgets/array_widget.rb +1 -5
  212. data/lib/cosmos/tools/tlm_viewer/widgets/block_widget.rb +1 -5
  213. data/lib/cosmos/top_level.rb +86 -3
  214. data/lib/cosmos/version.rb +5 -5
  215. data/lib/cosmos/win32/win32_main.rb +7 -1
  216. data/spec/packet_logs/packet_log_reader_spec.rb +67 -7
  217. data/spec/packets/limits_spec.rb +19 -1
  218. data/spec/packets/telemetry_spec.rb +44 -1
  219. data/spec/script/commands_spec.rb +14 -0
  220. data/spec/script/scripting_spec.rb +5 -1
  221. data/spec/script/telemetry_spec.rb +38 -3
  222. data/spec/system/system_spec.rb +24 -4
  223. data/spec/tools/cmd_tlm_server/api_spec.rb +30 -0
  224. data/test/benchmarks/gsub_benchmark.rb +42 -4
  225. data/test/benchmarks/is_a_benchmark.rb +34 -0
  226. data/test/performance/config/data/crc.txt +161 -171
  227. data/test/performance/config/system/system_packets.txt +10 -10
  228. data/test/performance/config/system/system_threads.txt +30 -30
  229. data/test/performance/config/targets/COSMOS/cmd_tlm/cosmos_server_cmds.txt +7 -2
  230. data/test/performance/config/targets/PACKET/cmd_tlm/packet_cmds.txt +20 -0
  231. data/test/performance/config/targets/PACKET/cmd_tlm/packet_tlm.txt +98 -0
  232. data/test/performance/config/targets/{EXAMPLE → PACKET}/cmd_tlm_server.txt +2 -2
  233. data/test/performance/config/targets/PACKET/lib/packet_interface.rb +22 -0
  234. data/test/performance/config/targets/PACKET/lib/packet_limits_response.rb +24 -0
  235. data/test/performance/config/targets/PACKET/screens/status.txt +25 -0
  236. data/test/performance/config/targets/PACKET/target.txt +28 -0
  237. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_cmds.txt → THREAD/cmd_tlm/thread_cmds.txt} +1 -1
  238. data/test/performance/config/targets/{EXAMPLE/cmd_tlm/example_tlm.txt → THREAD/cmd_tlm/thread_tlm.txt} +1 -1
  239. data/test/performance/config/targets/THREAD/cmd_tlm_server.txt +6 -0
  240. data/test/performance/config/targets/{EXAMPLE/lib/example_interface.rb → THREAD/lib/thread_interface.rb} +1 -1
  241. data/test/performance/config/targets/THREAD/screens/status.txt +25 -0
  242. data/test/performance/config/targets/{EXAMPLE → THREAD}/target.txt +0 -0
  243. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_packets.txt +24 -30
  244. data/test/performance/config/tools/cmd_tlm_server/cmd_tlm_server_threads.txt +31 -31
  245. data/test/performance/config/tools/launcher/launcher_packets.txt +16 -11
  246. data/test/performance/config/tools/launcher/launcher_threads.txt +41 -35
  247. data/test/performance/config/tools/tlm_grapher/tlm_grapher.txt +204 -0
  248. data/test/performance/config/tools/tlm_viewer/tlm_viewer.txt +10 -38
  249. data/test/performance/lib/packet_target.rb +126 -0
  250. data/test/performance/lib/{example_target.rb → thread_target.rb} +9 -9
  251. data/test/performance/tools/CmdTlmServerMemProf +1 -1
  252. data/test/performance/tools/{ExampleTarget → PacketTarget} +2 -2
  253. data/test/performance/tools/{ExampleTarget.bat → PacketTarget.bat} +0 -0
  254. data/test/performance/tools/ThreadTarget +14 -0
  255. data/test/performance/tools/ThreadTarget.bat +59 -0
  256. data/test/performance/tools/TlmGrapherMemProf +1 -1
  257. data/test/performance/tools/TlmViewerMemProf +19 -0
  258. data/{autohotkey/tools/Replay.bat → test/performance/tools/TlmViewerMemProf.bat} +1 -1
  259. metadata +107 -55
  260. data/test/performance/lib/example_background_task.rb +0 -57
  261. data/test/performance/lib/scpi_target.rb +0 -74
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: ascii-8bit
3
3
 
4
- # Copyright 2014 Ball Aerospace & Technologies Corp.
4
+ # Copyright 2015 Ball Aerospace & Technologies Corp.
5
5
  # All Rights Reserved.
6
6
  #
7
7
  # This program is free software; you can modify and/or redistribute it
@@ -9,7 +9,8 @@
9
9
  # as published by the Free Software Foundation; version 3 with
10
10
  # attribution addendums as found in the LICENSE.txt
11
11
 
12
- require 'bundler/setup' unless ENV['COSMOS_DEVEL']
13
- require 'cosmos'
14
- require 'cosmos/tools/tlm_viewer/tlm_viewer'
15
- Cosmos::TlmViewer.run
12
+ require_relative 'tool_launch'
13
+ tool_launch do
14
+ require 'cosmos/tools/tlm_viewer/tlm_viewer'
15
+ Cosmos::TlmViewer.run
16
+ end
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: ascii-8bit
3
+
4
+ # Copyright 2015 Ball Aerospace & Technologies Corp.
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can modify and/or redistribute it
8
+ # under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; version 3 with
10
+ # attribution addendums as found in the LICENSE.txt
11
+
12
+ def tool_launch
13
+ begin
14
+ require 'bundler/setup'
15
+ require 'cosmos'
16
+ yield
17
+ rescue Exception => error
18
+ popup_error = error; popup_error = $cosmos_fatal_exception if defined? $cosmos_fatal_exception
19
+ begin
20
+ raise error if STDIN.isatty # Have a console
21
+ raise error unless defined? $cosmos_fatal_exception or (error.class != SystemExit and error.class != Interrupt)
22
+ case RUBY_PLATFORM
23
+ when /mingw32/
24
+ require 'fiddle'
25
+ Fiddle::Function.new(Fiddle.dlopen('user32')['MessageBox'], [Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG], Fiddle::TYPE_LONG).call(0, "#{popup_error.class}:#{popup_error.message}\n\n#{popup_error.backtrace.join("\n")}\n\nNote: Ctrl-C will copy this information to the clipboard.", "Error Starting COSMOS Tool", 0x50030)
26
+ when /darwin/
27
+ system("osascript -e 'display notification \"#{popup_error.class}:#{popup_error.message}:#{popup_error.backtrace[0].tr("'\"`<>", '')}\" with title \"Error Starting COSMOS Tool\"'")
28
+ else
29
+ message = "#{popup_error.class}:#{popup_error.message}\\n\\n#{popup_error.backtrace.join("\\n").tr("'\"`<>", '')}"
30
+ command = "zenity --info --text=\"#{message}\" --title=\"Error Starting COSMOS Tool\""
31
+ success = system(command)
32
+ system("notify-send \"Error Starting COSMOS Tool\" \"#{message}\"") unless success
33
+ end
34
+ ensure
35
+ raise error
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: ascii-8bit
3
+
4
+ # Copyright 2015 Ball Aerospace & Technologies Corp.
5
+ # All Rights Reserved.
6
+ #
7
+ # This program is free software; you can modify and/or redistribute it
8
+ # under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; version 3 with
10
+ # attribution addendums as found in the LICENSE.txt
11
+
12
+ def tool_launch
13
+ begin
14
+ require 'bundler/setup'
15
+ require 'cosmos'
16
+ yield
17
+ rescue Exception => error
18
+ popup_error = error; popup_error = $cosmos_fatal_exception if defined? $cosmos_fatal_exception
19
+ begin
20
+ raise error if STDIN.isatty # Have a console
21
+ raise error unless defined? $cosmos_fatal_exception or (error.class != SystemExit and error.class != Interrupt)
22
+ case RUBY_PLATFORM
23
+ when /mingw32/
24
+ require 'fiddle'
25
+ Fiddle::Function.new(Fiddle.dlopen('user32')['MessageBox'], [Fiddle::TYPE_LONG, Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG], Fiddle::TYPE_LONG).call(0, "#{popup_error.class}:#{popup_error.message}\n\n#{popup_error.backtrace.join("\n")}\n\nNote: Ctrl-C will copy this information to the clipboard.", "Error Starting COSMOS Tool", 0x50030)
26
+ when /darwin/
27
+ system("osascript -e 'display notification \"#{popup_error.class}:#{popup_error.message}:#{popup_error.backtrace[0].tr("'\"`<>", '')}\" with title \"Error Starting COSMOS Tool\"'")
28
+ else
29
+ message = "#{popup_error.class}:#{popup_error.message}\\n\\n#{popup_error.backtrace.join("\\n").tr("'\"`<>", '')}"
30
+ command = "zenity --info --text=\"#{message}\" --title=\"Error Starting COSMOS Tool\""
31
+ success = system(command)
32
+ system("notify-send \"Error Starting COSMOS Tool\" \"#{message}\"") unless success
33
+ end
34
+ ensure
35
+ raise error
36
+ end
37
+ end
38
+ end
@@ -244,15 +244,16 @@ class String
244
244
  # Converts a String representing a class (i.e. "MyGreatClass") to a Ruby
245
245
  # filename which implements the class (i.e. "my_great_class.rb").
246
246
  #
247
+ # @param include_extension [Boolean] Whether to add '.rb' extension
247
248
  # @return [String] Filename which implements the class name
248
- def class_name_to_filename
249
+ def class_name_to_filename(include_extension = true)
249
250
  filename = ''
250
251
  length = self.length
251
252
  length.times do |index|
252
253
  filename << '_' if index != 0 and self[index..index] == self[index..index].upcase
253
254
  filename << self[index..index].downcase
254
255
  end
255
- filename << '.rb'
256
+ filename << '.rb' if include_extension
256
257
  filename
257
258
  end
258
259
 
@@ -13,6 +13,7 @@ module Cosmos
13
13
  class AboutDialog < Qt::Dialog
14
14
  ABOUT_COSMOS = ''
15
15
  ABOUT_COSMOS << "COSMOS application icons are courtesy of http://icons8.com.\n"
16
+ ABOUT_COSMOS << "COSMOS application sounds are courtesy of http://www.freesfx.co.uk.\n"
16
17
  ABOUT_COSMOS << "\n"
17
18
  ABOUT_COSMOS << "COSMOS utilizes the QtRuby (http://rubyforge.org/projects/korundum) library under "
18
19
  ABOUT_COSMOS << "the GNU Lesser General Public License. QtRuby is a Ruby extension module that provides an "
@@ -97,17 +98,12 @@ module Cosmos
97
98
  interior_layout.addLayout(icon_layout)
98
99
  interior_layout.addWidget(about)
99
100
  scroll_widget.setLayout(interior_layout)
100
- if scroll_widget.minimumSizeHint.height < 800
101
- scroll_area.setMinimumHeight(scroll_widget.minimumSizeHint.height + 80)
102
- scroll_area.setMinimumWidth(scroll_widget.minimumSizeHint.width)
103
- else
104
- scroll_area.setMinimumWidth(scroll_widget.minimumSizeHint.width + 20)
105
- end
101
+ scroll_area.setMinimumWidth(scroll_widget.minimumSizeHint.width + 20)
106
102
  scroll_widget.adjustSize
107
103
  addLayout(button_layout)
108
104
  end
109
105
 
110
- setMaximumWidth(600)
106
+ setMaximumWidth(800)
111
107
  self.raise()
112
108
  exec()
113
109
  dispose()
@@ -8,189 +8,253 @@
8
8
  # as published by the Free Software Foundation; version 3 with
9
9
  # attribution addendums as found in the LICENSE.txt
10
10
 
11
- # This file contains the implementation of the FindDialog class. This class
12
- # provides a dialog box with options for finding text
13
-
14
11
  require 'cosmos'
15
12
  require 'cosmos/gui/qt'
13
+ require 'singleton'
16
14
 
17
15
  module Cosmos
18
-
16
+ # Provides a Qt::Dialog which implements Find and optionally Replace
17
+ # functionality for a Qt::PlainTextEdit.
19
18
  class FindReplaceDialog < Qt::Dialog
20
- signals 'find_next()'
21
- signals 'replace()'
22
- signals 'replace_all()'
23
-
24
- @@find_text = ""
25
- @@replace_text = ""
26
- @@match_whole_word = false
27
- @@match_case = false
28
- @@wrap_around = true
29
- @@find_up = false
30
- @@find_down = true
31
- @@find_flags = 0
32
-
33
- def initialize(parent, replace_dialog = false)
34
- # Call base class constructor
35
- super(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
36
- @replace_dialog = replace_dialog
37
- setWindowTitle('Find') unless @replace_dialog
38
- setWindowTitle('Replace') if @replace_dialog
39
-
40
- @layout = Qt::HBoxLayout.new
41
-
42
- @find_layout = Qt::FormLayout.new
43
- @find_box = Qt::LineEdit.new(@@find_text)
44
- @find_layout.addRow(tr("Fi&nd what:"), @find_box)
45
- if @replace_dialog
46
- @replace_box = Qt::LineEdit.new(@@replace_text)
47
- @find_layout.addRow(tr("Re&place with:"), @replace_box)
48
- end
19
+ include Singleton
49
20
 
50
- @match_whole_word = Qt::CheckBox.new("Match &whole word only")
51
- @match_whole_word.setChecked(@@match_whole_word)
52
- @match_case = Qt::CheckBox.new("Match &case")
53
- @match_case.setChecked(@@match_case)
54
- @wrap_around = Qt::CheckBox.new("Wrap ar&ound")
55
- @wrap_around.setChecked(@@wrap_around)
56
- @checkbox_layout = Qt::VBoxLayout.new
57
- @checkbox_layout.addWidget(@match_whole_word)
58
- @checkbox_layout.addWidget(@match_case)
59
- @checkbox_layout.addWidget(@wrap_around)
60
- @checkbox_layout.addStretch
21
+ # Displays a Find dialog
22
+ # @param text [Qt::PlainTextEdit] Dialog parent
23
+ def self.show_find(text)
24
+ self.instance.show_find(text)
25
+ end
26
+ def show_find(text)
27
+ disable_replace
28
+ show_dialog(text)
29
+ end
61
30
 
62
- @up = Qt::RadioButton.new("&Up")
63
- @up.setChecked(@@find_up)
64
- @down = Qt::RadioButton.new("&Down")
65
- @down.setChecked(@@find_down)
66
- @direction_layout = Qt::VBoxLayout.new
67
- @direction_layout.addWidget(@up)
68
- @direction_layout.addWidget(@down)
69
- @direction_layout.addStretch
70
- @direction = Qt::GroupBox.new(tr("Direction"))
71
- @direction.setLayout(@direction_layout)
72
-
73
- @options_layout = Qt::HBoxLayout.new
74
- @options_layout.addLayout(@checkbox_layout)
75
- @options_layout.addWidget(@direction)
76
-
77
- @left_side = Qt::VBoxLayout.new
78
- @left_side.addLayout(@find_layout)
79
- @left_side.addLayout(@options_layout)
80
-
81
- @find_next = Qt::PushButton.new("&Find Next")
82
- @find_next.setDefault(true)
83
- @find_next.connect(SIGNAL('clicked()')) { emit find_next() }
84
- @cancel = Qt::PushButton.new("Cancel")
85
- @cancel.connect(SIGNAL('clicked()')) { self.reject }
86
- if @replace_dialog
87
- @replace = Qt::PushButton.new("&Replace")
88
- @replace.connect(SIGNAL('clicked()')) { emit replace() }
89
- @replace_all = Qt::PushButton.new("Replace &All")
90
- @replace_all.connect(SIGNAL('clicked()')) { emit replace_all() }
31
+ # Displays a Find/Replace dialog
32
+ # @param text [Qt::PlainTextEdit] Dialog parent
33
+ def self.show_replace(text)
34
+ self.instance.show_replace(text)
35
+ end
36
+ def show_replace(text)
37
+ enable_replace
38
+ show_dialog(text)
39
+ end
40
+
41
+ # @param text [Qt::PlainTextEdit] Text widget to search
42
+ def self.find_next(text)
43
+ self.instance.find_next(text)
44
+ end
45
+ def find_next(text)
46
+ flags = find_flags()
47
+ flags &= ~Qt::TextDocument::FindBackward.to_i
48
+ found = text.find(find_text(), flags)
49
+ if not found and wrap_around?
50
+ cursor = text.textCursor
51
+ cursor.movePosition(Qt::TextCursor::Start)
52
+ text.setTextCursor(cursor)
53
+ text.find(find_text(), flags)
91
54
  end
55
+ end
92
56
 
93
- @button_layout = Qt::VBoxLayout.new
94
- @button_layout.addWidget(@find_next)
95
- if @replace_dialog
96
- @button_layout.addWidget(@replace)
97
- @button_layout.addWidget(@replace_all)
57
+ # @param text [Qt::PlainTextEdit] Text widget to search
58
+ def self.find_previous(text)
59
+ self.instance.find_previous(text)
60
+ end
61
+ def find_previous(text)
62
+ flags = find_flags()
63
+ flags |= Qt::TextDocument::FindBackward.to_i
64
+ found = text.find(find_text(), flags)
65
+ if not found and wrap_around?
66
+ cursor = text.textCursor
67
+ cursor.movePosition(Qt::TextCursor::End)
68
+ text.setTextCursor(cursor)
69
+ text.find(find_text(), flags)
98
70
  end
99
- @button_layout.addWidget(@cancel)
100
- @button_layout.addStretch
71
+ end
101
72
 
102
- @layout.addLayout(@left_side)
103
- @layout.addLayout(@button_layout)
73
+ private
104
74
 
105
- setLayout(@layout)
75
+ def initialize
76
+ # The dialog will be re-parented when shown so pass nil
77
+ super(nil, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
78
+ # Items which are only valid in a Replace dialog
79
+ @replace_items = []
106
80
 
107
- self.connect(SIGNAL('finished(int)')) { dialog_closing }
108
- end # def initialize
81
+ layout = Qt::HBoxLayout.new
82
+ left_side = Qt::VBoxLayout.new
83
+ left_side.addLayout(create_input_layout)
84
+ left_side.addLayout(create_options_layout)
85
+ layout.addLayout(left_side)
86
+ layout.addLayout(create_button_layout)
109
87
 
110
- def show
111
- super
112
- @find_box.selectAll
113
- @find_box.setFocus(Qt::PopupFocusReason)
88
+ setLayout(layout)
114
89
  end
115
90
 
116
- def find_flags
117
- flags = 0
118
- flags |= Qt::TextDocument::FindBackward.to_i if @up.isChecked
119
- flags |= Qt::TextDocument::FindCaseSensitively.to_i if @match_case.isChecked
120
- flags |= Qt::TextDocument::FindWholeWords.to_i if @match_whole_word.isChecked
121
- flags
91
+ def create_input_layout
92
+ input_layout = Qt::FormLayout.new
93
+ @find_box = Qt::LineEdit.new
94
+ input_layout.addRow(tr("Fi&nd what:"), @find_box)
95
+ @replace_box = Qt::LineEdit.new
96
+ replace_label = Qt::Label.new(tr("Re&place with:"))
97
+ replace_label.setBuddy(@replace_box)
98
+ @replace_items << replace_label
99
+ input_layout.addRow(replace_label, @replace_box)
100
+ @replace_items << @replace_box
101
+ input_layout
122
102
  end
123
103
 
124
- def find_text
125
- @find_box.text
104
+ def create_options_layout
105
+ options_layout = Qt::HBoxLayout.new
106
+ options_layout.addLayout(create_checkbox_layout)
107
+ options_layout.addWidget(create_direction_widget)
108
+ options_layout
126
109
  end
127
110
 
128
- def replace_text
129
- @replace_box.text if @replace_dialog
111
+ def create_checkbox_layout
112
+ checkbox_layout = Qt::VBoxLayout.new
113
+ @match_whole_word = Qt::CheckBox.new("Match &whole word only")
114
+ checkbox_layout.addWidget(@match_whole_word)
115
+ @match_case = Qt::CheckBox.new("Match &case")
116
+ checkbox_layout.addWidget(@match_case)
117
+ @wrap_around = Qt::CheckBox.new("Wrap ar&ound")
118
+ @wrap_around.setChecked(true)
119
+ checkbox_layout.addWidget(@wrap_around)
120
+ checkbox_layout.addStretch
121
+ checkbox_layout
130
122
  end
131
123
 
132
- def match_whole_word?
133
- @match_whole_word.isChecked
124
+ def create_direction_widget
125
+ @up = Qt::RadioButton.new("&Up")
126
+ down = Qt::RadioButton.new("&Down")
127
+ down.setChecked(true)
128
+ direction_layout = Qt::VBoxLayout.new
129
+ direction_layout.addWidget(@up)
130
+ direction_layout.addWidget(down)
131
+ direction_layout.addStretch
132
+ direction = Qt::GroupBox.new(tr("Direction"))
133
+ direction.setLayout(direction_layout)
134
+ direction
134
135
  end
135
136
 
136
- def match_case?
137
- @match_case.isChecked
137
+ def create_button_layout
138
+ find_next = Qt::PushButton.new("&Find Next")
139
+ find_next.setDefault(true)
140
+ find_next.connect(SIGNAL('clicked()')) { handle_find_next }
141
+ cancel = Qt::PushButton.new("Cancel")
142
+ cancel.connect(SIGNAL('clicked()')) { reject }
143
+ replace = Qt::PushButton.new("&Replace")
144
+ replace.connect(SIGNAL('clicked()')) { handle_replace }
145
+ @replace_items << replace
146
+ replace_all = Qt::PushButton.new("Replace &All")
147
+ replace_all.connect(SIGNAL('clicked()')) { handle_replace_all }
148
+ @replace_items << replace_all
149
+
150
+ button_layout = Qt::VBoxLayout.new
151
+ button_layout.addWidget(find_next)
152
+ button_layout.addWidget(replace)
153
+ button_layout.addWidget(replace_all)
154
+ button_layout.addWidget(cancel)
155
+ button_layout.addStretch
156
+ button_layout
138
157
  end
139
158
 
140
- def wrap_around?
141
- @wrap_around.isChecked
159
+ def show_dialog(text)
160
+ @find_box.selectAll
161
+ @find_box.setFocus(Qt::PopupFocusReason)
162
+ setParent(text, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | 3)
163
+ show()
142
164
  end
143
165
 
144
- def find_up?
145
- @up.isChecked
166
+ def enable_replace
167
+ @replace_items.each {|item| item.show }
168
+ setWindowTitle('Replace')
146
169
  end
147
170
 
148
- def find_down?
149
- @down.isChecked
171
+ def disable_replace
172
+ @replace_items.each {|item| item.hide }
173
+ setWindowTitle('Find')
150
174
  end
151
175
 
152
- def dialog_closing
153
- @@find_text = @find_box.text
154
- @@replace_text = @replace_box.text if @replace_dialog
155
- @@match_whole_word = @match_whole_word.isChecked
156
- @@match_case = @match_case.isChecked
157
- @@wrap_around = @wrap_around.isChecked
158
- @@find_up = @up.isChecked
159
- @@find_down = @down.isChecked
160
- @@find_flags = find_flags
176
+ def find_flags
177
+ flags = 0
178
+ flags |= Qt::TextDocument::FindBackward.to_i if @up.isChecked
179
+ flags |= Qt::TextDocument::FindCaseSensitively.to_i if @match_case.isChecked
180
+ flags |= Qt::TextDocument::FindWholeWords.to_i if @match_whole_word.isChecked
181
+ flags
161
182
  end
162
183
 
163
- def self.find_text
164
- @@find_text
184
+ def wrap_around?
185
+ @wrap_around.isChecked
165
186
  end
166
187
 
167
- def self.replace_text
168
- @@replace_text
188
+ def find_up?
189
+ @up.isChecked
169
190
  end
170
191
 
171
- def self.match_whole_word?
172
- @@match_whole_word
192
+ def find_text
193
+ @find_box.text
173
194
  end
174
195
 
175
- def self.match_case?
176
- @@match_case
196
+ def replace_text
197
+ @replace_box.text
177
198
  end
178
199
 
179
- def self.wrap_around?
180
- @@wrap_around
200
+ def handle_find_next
201
+ text = parentWidget
202
+ found = text.find(find_text, find_flags)
203
+ if not found and wrap_around?
204
+ cursor = text.textCursor
205
+ if find_up?
206
+ cursor.movePosition(Qt::TextCursor::End)
207
+ else
208
+ cursor.movePosition(Qt::TextCursor::Start)
209
+ end
210
+ text.setTextCursor(cursor)
211
+ text.find(find_text, find_flags)
212
+ end
181
213
  end
182
214
 
183
- def self.find_up?
184
- @@find_up
215
+ def handle_replace
216
+ text = parentWidget
217
+ if text.textCursor.hasSelection &&
218
+ text.textCursor.selectedText == find_text
219
+ found = true
220
+ else
221
+ found = text.find(find_text, find_flags)
222
+ if not found and wrap_around?
223
+ cursor = text.textCursor
224
+ if find_up?
225
+ cursor.movePosition(Qt::TextCursor::End)
226
+ else
227
+ cursor.movePosition(Qt::TextCursor::Start)
228
+ end
229
+ text.setTextCursor(cursor)
230
+ found = text.find(find_text, find_flags)
231
+ end
232
+ end
233
+ if found
234
+ text.textCursor.removeSelectedText
235
+ text.textCursor.insertText(replace_text)
236
+ cursor = text.textCursor
237
+ cursor.setPosition(cursor.position-1)
238
+ cursor.select(Qt::TextCursor::WordUnderCursor)
239
+ text.setTextCursor(cursor)
240
+ end
185
241
  end
186
242
 
187
- def self.find_down?
188
- @@find_down
189
- end
243
+ def handle_replace_all
244
+ text = parentWidget
245
+ cursor = text.textCursor
246
+ # Start the edit block so this can be all undone with a single undo step
247
+ cursor.beginEditBlock
248
+
249
+ cursor.movePosition(Qt::TextCursor::Start)
250
+ text.setTextCursor(cursor)
190
251
 
191
- def self.find_flags
192
- @@find_flags
252
+ while (text.find(find_text, find_flags) == true)
253
+ text.textCursor.removeSelectedText
254
+ text.textCursor.insertText(replace_text)
255
+ end
256
+ cursor.endEditBlock
193
257
  end
194
- end # class FindReplaceDialog
195
258
 
259
+ end # class FindReplaceDialog
196
260
  end # module Cosmos