902: def ask_for_element(parent = nil, default_type = nil, value_text = @content)
903: type_input = value_input = nil
904:
905: dialog = Dialog.new(
906: "New element into #{parent ? parent.type : 'root'}",
907: nil, nil,
908: [ Stock::OK, Dialog::RESPONSE_ACCEPT ],
909: [ Stock::CANCEL, Dialog::RESPONSE_REJECT ]
910: )
911: hbox = HBox.new(false, 5)
912: hbox.pack_start(Label.new("Type:"), false)
913: hbox.pack_start(type_input = ComboBox.new(true))
914: default_active = 0
915: types = parent ? ALL_TYPES : CONTAINER_TYPES
916: types.each_with_index do |t, i|
917: type_input.append_text(t)
918: if t == default_type
919: default_active = i
920: end
921: end
922: type_input.active = default_active
923: dialog.vbox.pack_start(hbox, false)
924: type_input.signal_connect(:changed) do
925: configure_value(value_input, types[type_input.active])
926: end
927:
928: hbox = HBox.new(false, 5)
929: hbox.pack_start(Label.new("Value:"), false)
930: hbox.pack_start(value_input = Entry.new)
931: value_input.width_chars = 60
932: value_input.text = value_text if value_text
933: configure_value(value_input, types[type_input.active])
934:
935: dialog.vbox.pack_start(hbox, false)
936:
937: dialog.signal_connect('key-press-event''key-press-event', &DEFAULT_DIALOG_KEY_PRESS_HANDLER)
938: dialog.show_all
939: self.focus = dialog
940: dialog.run do |response|
941: if response == Dialog::RESPONSE_ACCEPT
942: type = types[type_input.active]
943: @content = case type
944: when 'Numeric'
945: if (t = value_input.text) == 'Infinity'
946: 1 / 0.0
947: else
948: Integer(t) rescue Float(t) rescue 0
949: end
950: else
951: value_input.text
952: end.to_s
953: return type, @content
954: end
955: end
956: return
957: ensure
958: dialog.destroy if dialog
959: end