[fxruby-users] ProgressiveSelectTextField
Meinrad Recheis
meinrad.recheis at gmail.com
Wed Mar 1 01:34:32 EST 2006
it's quite nice. i definitely will have use for that.
there are also some little things, that are not so cool about it:
* configuration via constructor (yes, fox is all like this, but it makes
classes definitly less easy to use ... especially if there are many of them)
* inconsequent coding style: appendItem vs append_array.
but that is easy to fix ;)
i appreciate that you share your code with us. should be done more often on
this list.
thanks a lot!!
-- henon
On 2/28/06, Uwe Hartl <uwe.hartl at gmx.net> wrote:
>
> Hello,
>
> is somebody interested on something like this? There is a little problem
> with
> the FXChoiceBox.ask which I just replaced by a
>
> p "Warning"
>
> and I have some difficulties how to quote a "\" and "(" in a regular
> expression but everything else seems to work in here. Can somebody help me
> out here?
>
> Is there a database of code snippets, where I would put something like
> this,
> or do you guys think, people should write this kind of stuff (extensions
> of
> widgets) themselves?
>
> See you,
>
> Uwe
>
> by the way, "*" is a wildcard in here...
>
> require 'fox14'
> include Fox
>
>
> class ProgressiveSelectTextField < FXTextField
> include Responder
>
> def initialize(parent, new_entries_allowed = true,
> confirm_new_entries =
> true, nc = 3, tgt=nil, sel=0, opts=TEXTFIELD_NORMAL, x=0, y=0, w=0, h=0,
> pl=DEFAULT_PAD, pr=DEFAULT_PAD, pt=DEFAULT_PAD, pb=DEFAULT_PAD)
> super(parent, nc, tgt=nil, sel=0, opts = LAYOUT_FILL_X)
> @new_entries_allowed = new_entries_allowed
> @confirm_new_entries = confirm_new_entries
> @fields = []
> @items = []
> @selected = 0
> @old_text = ""
> connect(SEL_CHANGED, method(:on_changed))
> connect(SEL_KEYPRESS, method(:on_key))
> connect(SEL_FOCUSIN, method(:on_focus_in))
> connect(SEL_FOCUSOUT, method(:on_focus_out))
> connect(SEL_LEFTBUTTONPRESS, method(:on_clicked))
> enable
> @sp = FXMenuPane.new(self,
> POPUP_VERTICAL|FRAME_RAISED|FRAME_THICK)
> @list = FXList.new(@sp, nil, 0,
> LIST_SINGLESELECT|LAYOUT_FILL_X|
> LAYOUT_FILL_Y)
> @list.connect(SEL_DOUBLECLICKED) { |sender, sel, data|
> self.text = @items[data]
> self. selectAll
> @sp.popdown
> }
> @list.connect(SEL_KEYPRESS) { |sender, sel, event|
> self.text = event.to_s
> @sp.popdown
> }
> end
> def appendItem(text)
> @fields << text
> end
> def append_array(txt)
> txt.each do |tt|
> appendItem(tt)
> end
> end
> def set_default_text(def_text = "*")
> self.text = def_text
> @old_text = def_text
> end
> def on_clicked(sender, sel, event)
> on_focus_in(sender, sel, event)
> end
> def on_focus_in(sender, sel, event)
> if !@sp.shown?()
> populateList(self.text)
> ret = true
> @selected = 0
> else
> ret = false
> end
> ret
> end
> def on_focus_out(sender, sel, data)
> if (@new_entries_allowed && @confirm_new_entries && !@
> fields.include?
> (self.text))
> f = File.open("icons/bigpenguin.png", "rb")
> icon = FXPNGIcon.new(getApp(), f.read)
> p "here there is the need for asking if the user
> wants to get a new text
> string in the field (not existent in the Array. Not implemented"
> #choice = FXChoiceBox.ask(getApp(), opts = 0,
> caption = "Unbekannter
> Eintrag", text = "Wirklich neuen Wert anlegen?", icon, ["Ja", "Nein"])
> #self.text = "" if choice == 1
> end
> end
> def on_changed(sender, sel, data)
> new = !populateList(data)
> if !@new_entries_allowed && new
> self.text = @old_text
> end
> @old_text = self.text
> @selected = 0
> end
> def sel
> if @selected < @list.numItems
> @list.makeItemVisible(@selected)
> @list.selectItem(@selected)
> end
> end
> def on_key(sender, sel, event)
> if populateList(self.text)
> if ((@selected < ((@list.numItems) - 1)) &&
> event.code == 65364) #arrow
> down
> @selected += 1
> self.sel
> elsif ((@selected > 0) && event.code == 65362)
> #arrow up
> @selected -= 1
> self.sel
> elsif event.code == 65293 # Enter key
> self.text = @list.getItem(@selected).text
> self.cursorPos = self.text.length
> self.selectAll
> @sp.popdown
> end
> end
> false
> end
> def popup
> xy = translateCoordinatesTo(getRoot(), x, y)
> @sp.popup(nil, xy[0], xy[1]+height, self.width, 100)
> @sp.recalc
> @sp.create
> end
> def populateList(searchString = "")
> ss = searchString.gsub("(", ".")
> ss.gsub!(")", ".")
> p ss
> re = Regexp.new(ss.gsub("*", "(\\D*|\\d*)"))
> p re
> @items = @fields.collect { |val| val if val.match(re).to_s
> != ""}
> @items.delete(nil)
> @list.clearItems
> if @items.length > 0
> @items.each do |it|
> @list.appendItem(it)
> end
> popup
> sel
> ret = true
> else
> @sp.popdown()
> ret = false
> end
> return ret
> end
> end
>
>
>
> class Welcome < FXMainWindow
> def initialize()
> super($theApp, 'ComboBox', icon=nil, miniIcon=nil,
> opts=DECOR_ALL, x=0, y=0,
> width=300, height=300)
>
> ta = ProgressiveSelectTextField.new(self)
> txt = ["able", "apartment", "apple", "Appolinaris",
> "andruide", "berta",
> "aparent", "aple", "Apinaris", "anduide", "beta", "Zeta"]
> ta.append_array(txt)
> ta.set_default_text(txt[2])
> end
> end
>
> if $0 == __FILE__
> $theApp = FXApp.new
> $wn = Welcome.new
> $wn.show
> $theApp.create
>
> $theApp.run
> end
>
> --
> ***********************************************************************
> Uwe Hartl e-mail: Uwe.Hartl at gmx.net
> 91522 Ansbach Telephone: (0981) 9724526
> Am Mühlfeld 8 Notfall-Mobil: (0160)90418680
> Germany
> ***********************************************************************
>
>
> _______________________________________________
> fxruby-users mailing list
> fxruby-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/fxruby-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://rubyforge.org/pipermail/fxruby-users/attachments/20060301/cdb1b1c5/attachment-0001.htm
More information about the fxruby-users
mailing list