cosmos 3.4.2 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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