/* * This file is part of the Haven & Hearth game client. * Copyright (C) 2009 Fredrik Tolf <fredrik@dolda2000.com>, and * Björn Johannessen <johannessen.bjorn@gmail.com> * * Redistribution and/or modification of this file is subject to the * terms of the GNU Lesser General Public License, version 3, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Other parts of this source tree adhere to other copying * rights. Please see the file `COPYING' in the root directory of the * source tree for details. * * A copy the GNU Lesser General Public License is distributed along * with the source tree of which this file is a part in the file * `doc/LPGL-3'. If it is missing for any reason, please see the Free * Software Foundation's website at <http://www.fsf.org/>, or write * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA */ package haven; import java.awt.Color; import static haven.Window.fbox; public abstract class Dropbox<T> extends ListWidget<T> { public static final Tex drop = Resource.loadtex("gfx/hud/drop"); public final int listh; private final Coord dropc; private Droplist dl; public Dropbox(Coord c, Widget parent, int w, int listh, int itemh) { super(c, new Coord(w, itemh).add(fbox.bisz()), parent, itemh); this.listh = listh; dropc = new Coord(sz.x - fbox.bl.sz().x - drop.sz().x, fbox.bt.sz().y); } private class Droplist extends Listbox<T> { private Droplist() { super(Dropbox.this.rootpos().add(0, Dropbox.this.sz.y), Dropbox.this.ui.root, Dropbox.this.sz.x - fbox.bisz().x, Math.min(listh, Dropbox.this.listitems()), Dropbox.this.itemh); ui.grabmouse(this); sel = Dropbox.this.sel; } protected T listitem(int i) {return(Dropbox.this.listitem(i));} protected int listitems() {return(Dropbox.this.listitems());} protected void drawitem(GOut g, T item) {Dropbox.this.drawitem(g, item);} public boolean mousedown(Coord c, int btn) { if(!c.isect(Coord.z, sz)) { reqdestroy(); return(true); } return(super.mousedown(c, btn)); } public void destroy() { ui.grabmouse(null); super.destroy(); dl = null; } public void change(T item) { Dropbox.this.change(item); reqdestroy(); } } public void draw(GOut g) { g.chcolor(Color.BLACK); g.frect(Coord.z, sz); g.chcolor(); fbox.draw(g, Coord.z, sz); Coord off = fbox.btloff(); if(sel != null) drawitem(g.reclip(off, new Coord(sz.x - drop.sz().x, itemh).sub(fbox.bisz())), sel); g.image(drop, dropc); super.draw(g); } public boolean mousedown(Coord c, int btn) { if(super.mousedown(c, btn)) return(true); if((dl == null) && (btn == 1)) { dl = new Droplist(); return(true); } return(true); } }