Class | MainWindow |
In: |
lib/json/editor.rb
|
Parent: | Gtk::Window |
The editor main window
# File lib/json/editor.rb, line 1009 1009: def initialize(encoding) 1010: @changed = false 1011: @encoding = encoding 1012: super(TOPLEVEL) 1013: display_title 1014: set_default_size(800, 600) 1015: signal_connect(:delete_event) { quit } 1016: 1017: vbox = VBox.new(false, 0) 1018: add(vbox) 1019: #vbox.border_width = 0 1020: 1021: @treeview = JSONTreeView.new(self) 1022: @treeview.signal_connect('cursor-changed''cursor-changed') do 1023: display_status('') 1024: end 1025: 1026: menu_bar = create_menu_bar 1027: vbox.pack_start(menu_bar, false, false, 0) 1028: 1029: sw = ScrolledWindow.new(nil, nil) 1030: sw.shadow_type = SHADOW_ETCHED_IN 1031: sw.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC) 1032: vbox.pack_start(sw, true, true, 0) 1033: sw.add(@treeview) 1034: 1035: @status_bar = Statusbar.new 1036: vbox.pack_start(@status_bar, false, false, 0) 1037: 1038: @filename ||= nil 1039: if @filename 1040: data = read_data(@filename) 1041: view_new_model Editor.data2model(data) 1042: end 1043: end
Ask for location URI a to load data from. Returns the URI as a string.
# File lib/json/editor.rb, line 1247 1247: def ask_for_location 1248: dialog = Dialog.new( 1249: "Load data from location...", 1250: nil, nil, 1251: [ Stock::OK, Dialog::RESPONSE_ACCEPT ], 1252: [ Stock::CANCEL, Dialog::RESPONSE_REJECT ] 1253: ) 1254: hbox = HBox.new(false, 5) 1255: 1256: hbox.add(Label.new("Location:")) 1257: hbox.pack_start(location_input = Entry.new) 1258: location_input.width_chars = 60 1259: location_input.text = @location || '' 1260: 1261: dialog.vbox.add(hbox) 1262: 1263: dialog.signal_connect('key-press-event''key-press-event', &DEFAULT_DIALOG_KEY_PRESS_HANDLER) 1264: dialog.show_all 1265: dialog.run do |response| 1266: if response == Dialog::RESPONSE_ACCEPT 1267: return @location = location_input.text 1268: end 1269: end 1270: return 1271: ensure 1272: dialog.destroy if dialog 1273: end
Opens a dialog, asking, if changes should be saved to a file.
# File lib/json/editor.rb, line 1088 1088: def ask_save 1089: if Editor.question_dialog(self, 1090: "Unsaved changes to JSON model. Save?") 1091: if @filename 1092: file_save 1093: else 1094: file_save_as 1095: end 1096: end 1097: end
Sets editor status to changed, to indicate that the edited data containts unsaved changes.
# File lib/json/editor.rb, line 1059 1059: def change 1060: @changed = true 1061: display_title 1062: end
Clear the current model, after asking to save all unsaved changes.
# File lib/json/editor.rb, line 1118 1118: def clear 1119: ask_save if @changed 1120: @filename = nil 1121: self.view_new_model nil 1122: end
Creates the menu bar with the pulldown menus and returns it.
# File lib/json/editor.rb, line 1046 1046: def create_menu_bar 1047: menu_bar = MenuBar.new 1048: @file_menu = FileMenu.new(@treeview) 1049: menu_bar.append @file_menu.create 1050: @edit_menu = EditMenu.new(@treeview) 1051: menu_bar.append @edit_menu.create 1052: @options_menu = OptionsMenu.new(@treeview) 1053: menu_bar.append @options_menu.create 1054: menu_bar 1055: end
Displays text in the status bar.
# File lib/json/editor.rb, line 1080 1080: def display_status(text) 1081: @cid ||= nil 1082: @status_bar.pop(@cid) if @cid 1083: @cid = @status_bar.get_context_id('dummy') 1084: @status_bar.push(@cid, text) 1085: end
Open the file filename or call the select_file method to ask for a filename.
# File lib/json/editor.rb, line 1141 1141: def file_open(filename = nil) 1142: filename = select_file('Open as a JSON file') unless filename 1143: data = load_file(filename) or return 1144: view_new_model Editor.data2model(data) 1145: end
Save the current file.
# File lib/json/editor.rb, line 1148 1148: def file_save 1149: if @filename 1150: store_file(@filename) 1151: else 1152: file_save_as 1153: end 1154: end
Save the current file as the filename
# File lib/json/editor.rb, line 1157 1157: def file_save_as 1158: filename = select_file('Save as a JSON file') 1159: store_file(filename) 1160: end
Load the file named filename into the editor as a JSON document.
# File lib/json/editor.rb, line 1183 1183: def load_file(filename) 1184: if filename 1185: if File.directory?(filename) 1186: Editor.error_dialog(self, "Try to select a JSON file!") 1187: nil 1188: else 1189: @filename = filename 1190: if data = read_data(filename) 1191: toplevel.display_status("Loaded data from '#@filename'.") 1192: end 1193: display_title 1194: data 1195: end 1196: end 1197: end
Load the data at location uri into the editor as a JSON document.
# File lib/json/editor.rb, line 1200 1200: def load_location(uri) 1201: data = read_data(uri) or return 1202: @filename = nil 1203: toplevel.display_status("Loaded data from '#{uri}'.") 1204: display_title 1205: data 1206: end
Open the data at the location uri, if given. Otherwise open a dialog to ask for the uri.
# File lib/json/editor.rb, line 1132 1132: def location_open(uri = nil) 1133: uri = ask_for_location unless uri 1134: uri or return 1135: data = load_location(uri) or return 1136: view_new_model Editor.data2model(data) 1137: end
Quit this editor, that is, leave this editor‘s main loop.
# File lib/json/editor.rb, line 1100 1100: def quit 1101: ask_save if @changed 1102: if Gtk.main_level > 0 1103: destroy 1104: Gtk.main_quit 1105: end 1106: nil 1107: end
Read a JSON document from the file named filename, parse it into a ruby data structure, and return the data.
# File lib/json/editor.rb, line 1210 1210: def read_data(filename) 1211: open(filename) do |f| 1212: json = f.read 1213: check_pretty_printed(json) 1214: if @encoding && !/^utf8$/i.match(@encoding) 1215: iconverter = Iconv.new('utf8', @encoding) 1216: json = iconverter.iconv(json) 1217: end 1218: return JSON::parse(json, :max_nesting => false) 1219: end 1220: rescue => e 1221: Editor.error_dialog(self, "Failed to parse JSON file: #{e}!") 1222: return 1223: end
Open a file selecton dialog, displaying message, and return the selected filename or nil, if no file was selected.
# File lib/json/editor.rb, line 1227 1227: def select_file(message) 1228: filename = nil 1229: fs = FileSelection.new(message).set_modal(true). 1230: set_filename(Dir.pwd + "/").set_transient_for(self) 1231: fs.signal_connect(:destroy) { Gtk.main_quit } 1232: fs.ok_button.signal_connect(:clicked) do 1233: filename = fs.filename 1234: fs.destroy 1235: Gtk.main_quit 1236: end 1237: fs.cancel_button.signal_connect(:clicked) do 1238: fs.destroy 1239: Gtk.main_quit 1240: end 1241: fs.show_all 1242: Gtk.main 1243: filename 1244: end
Store the current JSON document to path.
# File lib/json/editor.rb, line 1163 1163: def store_file(path) 1164: if path 1165: data = Editor.model2data(@treeview.model.iter_first) 1166: File.open(path + '.tmp', 'wb') do |output| 1167: if @options_menu.pretty_item.active? 1168: output.puts JSON.pretty_generate(data) 1169: else 1170: output.write JSON.unparse(data) 1171: end 1172: end 1173: File.rename path + '.tmp', path 1174: @filename = path 1175: toplevel.display_status("Saved data to '#@filename'.") 1176: unchange 1177: end 1178: rescue SystemCallError => e 1179: Editor.error_dialog(self, "Failed to store JSON file: #{e}!") 1180: end
Sets editor status to unchanged, to indicate that the edited data doesn‘t containt unsaved changes.
# File lib/json/editor.rb, line 1066 1066: def unchange 1067: @changed = false 1068: display_title 1069: end