# File metasm/gui/win32.rb, line 2688 def click(x, y) if y >= @texty and y < @texty+@texth @caret_x_select = nil @caret_x = x.to_i / @font_width - 1 + @caret_x_start @caret_x = [[@caret_x, 0].max, @curline.length].min @textdown = @caret_x update_caret elsif click_buttons(x, y) redraw end end
# File metasm/gui/win32.rb, line 2733 def destroy @parent.destroy end
# File metasm/gui/win32.rb, line 2747 def dragdropfile(f) cx = @caret_x_select || @caret_x @caret_x_select = nil c1, c2 = [cx, @caret_x].sort @curline[c1...c2] = f @caret_x_select = nil @caret_x = c1 + f.length redraw end
# File metasm/gui/win32.rb, line 2510 def initial_size [40*@font_width, 6*@font_height + @font_height/4] end
# File metasm/gui/win32.rb, line 2482 def initialize_widget(label, opts, &b) @label = label @action = b @textdown = false @curline = opts[:text].to_s.dup @oldsel_x = @caret_x_select = 0 @caret_x = @curline.length @caret_x_start = 0 @@history ||= {} histkey = opts[:history] || label[0, 10] @history = (@@history[histkey] ||= []) @history_off = @history.length add_button('Ok', :btnc1, :btnc2) { keypress(:enter) } add_button('Cancel', :btnc1, :btnc2) { keypress(:esc) } @default_color_association = { :background => :winbg, :label => :black, :text => :black, :textbg => :white, :caret => :black, :btnc1 => :palegrey, :btnc2 => :grey, :textsel => :white, :textselbg => :darkblue } end
# File metasm/gui/win32.rb, line 2596 def keypress(key) case key when :left if keyboard_state(:shift) @caret_x_select ||= @caret_x else @caret_x_select = nil end @caret_x -= 1 if @caret_x > 0 update_caret when :right if keyboard_state(:shift) @caret_x_select ||= @caret_x else @caret_x_select = nil end @caret_x += 1 if @caret_x < @curline.length update_caret when :home if keyboard_state(:shift) @caret_x_select ||= @caret_x else @caret_x_select = nil end @caret_x = 0 update_caret when :end if keyboard_state(:shift) @caret_x_select ||= @caret_x else @caret_x_select = nil end @caret_x = @curline.length update_caret when :up, :down if @history_off < @history.length or @curline.strip != @history.last @history[@history_off] = @curline.strip end @history_off += (key == :up ? -1 : 1) @history_off = @history.length @curline = @history[@history_off].to_s @caret_x = @curline.length if @caret_x > @curline.length redraw when :enter @history << @curline.strip @history.pop if @history.last == '' @history.pop if @history.last == @history[-2] destroy Gui.main_iter protect { @action.call(@curline.strip) } when :esc if @buttons.find { |b| b.down } @buttons.each { |b| b.down = false } redraw else destroy end when \x20..\x7e cx = @caret_x_select || @caret_x @caret_x_select = nil c1, c2 = [cx, @caret_x].sort @curline[c1...c2] = key.chr @caret_x = c1+1 redraw when :delete if @caret_x_select c1, c2 = [@caret_x, @caret_x_select].sort @curline[c1...c2] = '' @caret_x_select = nil @caret_x = c1 redraw elsif @caret_x < @curline.length @curline[@caret_x, 1] = '' redraw end when :backspace if @caret_x_select c1, c2 = [@caret_x, @caret_x_select].sort @curline[c1...c2] = '' @caret_x_select = nil @caret_x = c1 redraw elsif @caret_x > 0 @caret_x -= 1 @curline[@caret_x, 1] = '' redraw end else return false end true end
# File metasm/gui/win32.rb, line 2562 def keypress_ctrl(key) case key when a @caret_x_select = 0 @caret_x = @curline.length redraw when c if @caret_x_select c1, c2 = [@caret_x, @caret_x_select].sort clipboard_copy @curline[c1...c2] end when v cptext = clipboard_paste.to_s cx = @caret_x_select || @caret_x @caret_x_select = nil c1, c2 = [cx, @caret_x].sort @curline[c1...c2] = cptext @caret_x_select = nil @caret_x = c1 + cptext.length redraw when x if @caret_x_select c1, c2 = [@caret_x, @caret_x_select].sort clipboard_copy @curline[c1...c2] @curline[c1..c2] = '' @caret_x_select = nil @caret_x = c1 redraw end else return false end true end
# File metasm/gui/win32.rb, line 2700 def mousemove(x, y) if @textdown x = x.to_i / @font_width - 1 + @caret_x_start x = [[x, 0].max, @curline.length].min if x != @textdown @caret_x_select = @textdown @caret_x = x redraw end end end
# File metasm/gui/win32.rb, line 2712 def mouserelease(x, y) if @textdown x = x.to_i / @font_width - 1 + @caret_x_start x = [[x, 0].max, @curline.length].min if x != @textdown @caret_x_select = @textdown @caret_x = x redraw end @textdown = false elsif mouserelease_buttons(x, y) end end
# File metasm/gui/win32.rb, line 2514 def paint y = @font_height/2 fixedfont = Win32Gui.selectobject(@hdc, Win32Gui.getstockobject(Win32Gui::ANSI_VAR_FONT)) sz = Win32Gui.alloc_c_struct('POINT') Win32Gui.gettextextentpoint32a(@hdc, 'x', 1, sz) var_font_height = sz[:y] @label.each_line { |l| draw_string_color(:label, @font_width, y, l) y += var_font_height } y += @font_height @texty = y-1 @texth = @font_height+1 Win32Gui.selectobject(@hdc, fixedfont) y += @font_height*2 @buttons.each { |b| b.y = y } paint_buttons w_c = width/@font_width - 2 if @caret_x <= @caret_x_start @caret_x_start = [@caret_x-1, 0].max elsif @caret_x_start > 0 and @curline[@caret_x_start..-1].length < w_c-1 @caret_x_start = [@curline.length-w_c+1, 0].max elsif @caret_x_start + w_c <= @caret_x @caret_x_start = [@caret_x-w_c+1, 0].max end draw_rectangle_color(:textbg, @font_width, @texty-1, @width-2*@font_width, @font_height+1) draw_string_color(:text, @font_width+1, @texty, @curline[@caret_x_start, w_c]) if @caret_x_select c1, c2 = [@caret_x_select, @caret_x].sort c1 = [[c1, @caret_x_start].max, @caret_x_start+w_c].min c2 = [[c2, @caret_x_start].max, @caret_x_start+w_c].min if c1 != c2 draw_rectangle_color(:textselbg, @font_width+1+(c1-@caret_x_start)*@font_width, @texty-1, (c2-c1)*@font_width, @font_height+1) draw_string_color(:textsel, @font_width+1+(c1-@caret_x_start)*@font_width, @texty, @curline[c1...c2]) end end cx = [@caret_x-@caret_x_start+1, w_c].min*@font_width+1 draw_line_color(:caret, cx, @texty, cx, @texty+@font_height-1) @oldcaret_x = @caret_x end
# File metasm/gui/win32.rb, line 2503 def resized(w, h) bw = 10*@font_width bh = @font_height*3/2 @buttons[0].move((w-2*bw-3*@font_width)/2, 0, bw, bh) @buttons[1].move(@buttons[0].x + 3*@font_width + bw, 0, bw, bh) end
# File metasm/gui/win32.rb, line 2737 def text @curline end
# File metasm/gui/win32.rb, line 2740 def text=(t) @curline = t @caret_x_select = 0 @caret_x = t.length redraw end
# File metasm/gui/win32.rb, line 2726 def update_caret return if @oldcaret_x == @caret_x and @oldsel_x == @caret_x_select redraw @oldsel_x = @caret_x_select @oldcaret_x = @caret_x end