class Metasm::Gui::InputBox::IBoxWidget

Public Instance Methods

click(x, y) click to toggle source
# 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
destroy() click to toggle source
# File metasm/gui/win32.rb, line 2733
def destroy
        @parent.destroy
end
dragdropfile(f) click to toggle source
# 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
initial_size() click to toggle source
# File metasm/gui/win32.rb, line 2510
def initial_size
        [40*@font_width, 6*@font_height + @font_height/4]
end
initialize_widget(label, opts, &b) click to toggle source
# 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
keypress(key) click to toggle source
# 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
keypress_ctrl(key) click to toggle source
# 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
mousemove(x, y) click to toggle source
# 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
mouserelease(x, y) click to toggle source
# 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
paint() click to toggle source
# 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
resized(w, h) click to toggle source
# 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
text() click to toggle source
# File metasm/gui/win32.rb, line 2737
def text
        @curline
end
text=(t) click to toggle source
# File metasm/gui/win32.rb, line 2740
def text=(t)
        @curline = t
        @caret_x_select = 0
        @caret_x = t.length
        redraw
end
update_caret() click to toggle source
# 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