| Class | MainWindow |
| In: |
lib/json/editor.rb
|
| Parent: | Gtk::Window |
The editor main window
# File lib/json/editor.rb, line 1050
1050: def initialize(encoding)
1051: @changed = false
1052: @encoding = encoding
1053: super(TOPLEVEL)
1054: display_title
1055: set_default_size(800, 600)
1056: signal_connect(:delete_event) { quit }
1057:
1058: vbox = VBox.new(false, 0)
1059: add(vbox)
1060: #vbox.border_width = 0
1061:
1062: @treeview = JSONTreeView.new(self)
1063: @treeview.signal_connect('cursor-changed''cursor-changed') do
1064: display_status('')
1065: end
1066:
1067: menu_bar = create_menu_bar
1068: vbox.pack_start(menu_bar, false, false, 0)
1069:
1070: sw = ScrolledWindow.new(nil, nil)
1071: sw.shadow_type = SHADOW_ETCHED_IN
1072: sw.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC)
1073: vbox.pack_start(sw, true, true, 0)
1074: sw.add(@treeview)
1075:
1076: @status_bar = Statusbar.new
1077: vbox.pack_start(@status_bar, false, false, 0)
1078:
1079: @filename ||= nil
1080: if @filename
1081: data = read_data(@filename)
1082: view_new_model Editor.data2model(data)
1083: end
1084:
1085: signal_connect(:button_release_event) do |_,event|
1086: if event.button == 2
1087: c = Gtk::Clipboard.get(Gdk::Selection::PRIMARY)
1088: if url = c.wait_for_text
1089: location_open url
1090: end
1091: false
1092: else
1093: true
1094: end
1095: end
1096: end
Ask for location URI a to load data from. Returns the URI as a string.
# File lib/json/editor.rb, line 1320
1320: def ask_for_location
1321: dialog = Dialog.new(
1322: "Load data from location...",
1323: nil, nil,
1324: [ Stock::OK, Dialog::RESPONSE_ACCEPT ],
1325: [ Stock::CANCEL, Dialog::RESPONSE_REJECT ]
1326: )
1327: hbox = HBox.new(false, 5)
1328:
1329: hbox.pack_start(Label.new("Location:"), false)
1330: hbox.pack_start(location_input = Entry.new)
1331: location_input.width_chars = 60
1332: location_input.text = @location || ''
1333:
1334: dialog.vbox.pack_start(hbox, false)
1335:
1336: dialog.signal_connect('key-press-event''key-press-event', &DEFAULT_DIALOG_KEY_PRESS_HANDLER)
1337: dialog.show_all
1338: dialog.run do |response|
1339: if response == Dialog::RESPONSE_ACCEPT
1340: return @location = location_input.text
1341: end
1342: end
1343: return
1344: ensure
1345: dialog.destroy if dialog
1346: end
Opens a dialog, asking, if changes should be saved to a file.
# File lib/json/editor.rb, line 1141
1141: def ask_save
1142: if Editor.question_dialog(self,
1143: "Unsaved changes to JSON model. Save?")
1144: if @filename
1145: file_save
1146: else
1147: file_save_as
1148: end
1149: end
1150: end
Sets editor status to changed, to indicate that the edited data containts unsaved changes.
# File lib/json/editor.rb, line 1112
1112: def change
1113: @changed = true
1114: display_title
1115: end
Clear the current model, after asking to save all unsaved changes.
# File lib/json/editor.rb, line 1171
1171: def clear
1172: ask_save if @changed
1173: @filename = nil
1174: self.view_new_model nil
1175: end
Creates the menu bar with the pulldown menus and returns it.
# File lib/json/editor.rb, line 1099
1099: def create_menu_bar
1100: menu_bar = MenuBar.new
1101: @file_menu = FileMenu.new(@treeview)
1102: menu_bar.append @file_menu.create
1103: @edit_menu = EditMenu.new(@treeview)
1104: menu_bar.append @edit_menu.create
1105: @options_menu = OptionsMenu.new(@treeview)
1106: menu_bar.append @options_menu.create
1107: menu_bar
1108: end
Displays text in the status bar.
# File lib/json/editor.rb, line 1133
1133: def display_status(text)
1134: @cid ||= nil
1135: @status_bar.pop(@cid) if @cid
1136: @cid = @status_bar.get_context_id('dummy')
1137: @status_bar.push(@cid, text)
1138: end
Edit the string json in the editor.
# File lib/json/editor.rb, line 1202
1202: def edit(json)
1203: if json.respond_to? :read
1204: json = json.read
1205: end
1206: data = parse_json json
1207: view_new_model Editor.data2model(data)
1208: end
Open the file filename or call the select_file method to ask for a filename.
# File lib/json/editor.rb, line 1195
1195: def file_open(filename = nil)
1196: filename = select_file('Open as a JSON file') unless filename
1197: data = load_file(filename) or return
1198: view_new_model Editor.data2model(data)
1199: end
Save the current file.
# File lib/json/editor.rb, line 1211
1211: def file_save
1212: if @filename
1213: store_file(@filename)
1214: else
1215: file_save_as
1216: end
1217: end
Save the current file as the filename
# File lib/json/editor.rb, line 1220
1220: def file_save_as
1221: filename = select_file('Save as a JSON file')
1222: store_file(filename)
1223: end
Load the file named filename into the editor as a JSON document.
# File lib/json/editor.rb, line 1247
1247: def load_file(filename)
1248: if filename
1249: if File.directory?(filename)
1250: Editor.error_dialog(self, "Try to select a JSON file!")
1251: nil
1252: else
1253: @filename = filename
1254: if data = read_data(filename)
1255: toplevel.display_status("Loaded data from '#@filename'.")
1256: end
1257: display_title
1258: data
1259: end
1260: end
1261: end
Load the data at location uri into the editor as a JSON document.
# File lib/json/editor.rb, line 1264
1264: def load_location(uri)
1265: data = read_data(uri) or return
1266: @filename = nil
1267: toplevel.display_status("Loaded data from '#{uri}'.")
1268: display_title
1269: data
1270: 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 1185
1185: def location_open(uri = nil)
1186: uri = ask_for_location unless uri
1187: uri or return
1188: ask_save if @changed
1189: data = load_location(uri) or return
1190: view_new_model Editor.data2model(data)
1191: end
Quit this editor, that is, leave this editor‘s main loop.
# File lib/json/editor.rb, line 1153
1153: def quit
1154: ask_save if @changed
1155: if Gtk.main_level > 0
1156: destroy
1157: Gtk.main_quit
1158: end
1159: nil
1160: 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 1284
1284: def read_data(filename)
1285: open(filename) do |f|
1286: json = f.read
1287: return parse_json(json)
1288: end
1289: rescue => e
1290: Editor.error_dialog(self, "Failed to parse JSON file: #{e}!")
1291: return
1292: 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 1296
1296: def select_file(message)
1297: filename = nil
1298: fs = FileSelection.new(message)
1299: fs.set_modal(true)
1300: @default_dir = File.join(Dir.pwd, '') unless @default_dir
1301: fs.set_filename(@default_dir)
1302: fs.set_transient_for(self)
1303: fs.signal_connect(:destroy) { Gtk.main_quit }
1304: fs.ok_button.signal_connect(:clicked) do
1305: filename = fs.filename
1306: @default_dir = File.join(File.dirname(filename), '')
1307: fs.destroy
1308: Gtk.main_quit
1309: end
1310: fs.cancel_button.signal_connect(:clicked) do
1311: fs.destroy
1312: Gtk.main_quit
1313: end
1314: fs.show_all
1315: Gtk.main
1316: filename
1317: end
Store the current JSON document to path.
# File lib/json/editor.rb, line 1226
1226: def store_file(path)
1227: if path
1228: data = Editor.model2data(@treeview.model.iter_first)
1229: File.open(path + '.tmp', 'wb') do |output|
1230: data or break
1231: if @options_menu.pretty_item.active?
1232: output.puts JSON.pretty_generate(data, :max_nesting => false)
1233: else
1234: output.write JSON.generate(data, :max_nesting => false)
1235: end
1236: end
1237: File.rename path + '.tmp', path
1238: @filename = path
1239: toplevel.display_status("Saved data to '#@filename'.")
1240: unchange
1241: end
1242: rescue SystemCallError => e
1243: Editor.error_dialog(self, "Failed to store JSON file: #{e}!")
1244: end
Sets editor status to unchanged, to indicate that the edited data doesn‘t containt unsaved changes.
# File lib/json/editor.rb, line 1119
1119: def unchange
1120: @changed = false
1121: display_title
1122: end
# File lib/json/editor.rb, line 1177
1177: def check_pretty_printed(json)
1178: pretty = !!((nl_index = json.index("\n")) && nl_index != json.size - 1)
1179: @options_menu.pretty_item.active = pretty
1180: end
# File lib/json/editor.rb, line 1272
1272: def parse_json(json)
1273: check_pretty_printed(json)
1274: if @encoding && !/^utf8$/i.match(@encoding)
1275: iconverter = Iconv.new('utf8', @encoding)
1276: json = iconverter.iconv(json)
1277: end
1278: JSON::parse(json, :max_nesting => false, :create_additions => false)
1279: end