Fantom

 

//
// Copyright (c) 2011, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   13 Jan 11  Andy Frank  Creation
//

using fwt
using gfx

**
** MiniCombo.
**
@NoDoc
@Js
class MiniCombo : Pane
{

//////////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////////

  ** Constructor.
  new make(|This|? f := null)
  {
    if (f != null) f(this)
  }

  ** Callback when item is selected.
  EventListeners onSelect := EventListeners() { private set }

  ** Text for button.  Defaults to "".
  native Str text

  ** List of selection items.
  Obj[] items := [,]

  ** Selected item.
  Obj selected
  {
    get { i := selectedIndex; return i == null ? "" : items[i] }
    set { i := index(it); if (i != null) selectedIndex = i }
  }

  ** Index of selected item.
  Int? selectedIndex
  {
    set { &selectedIndex=it; select }
  }

  ** Get index of specified item.
  Int? index(Obj item) { return items.index(item) }

//////////////////////////////////////////////////////////////////////////
// Widget
//////////////////////////////////////////////////////////////////////////

  override native Size prefSize(Hints hints := Hints.defVal)
  override Void onLayout() {}

//////////////////////////////////////////////////////////////////////////
// Popup
//////////////////////////////////////////////////////////////////////////

  private Void select()
  {
    text = selected.toStr
    relayout
  }

  private Void openDropDown()
  {
    vpane := VPane()
    popup := HudPopup
    {
      insets = Insets(6)
      body = ConstraintPane { minw=125; vpane, }
      onClose.add { dropDownClosed }
    }

    items.each |item,i|
    {
      vpane.add(BorderPane
      {
        it.onMouseUp.add
        {
          popup.close
          text = item.toStr
          relayout
          onSelect.fire(Event { id=EventId.select; it.widget=this; it.index=i; data=item })
        }
        insets = Insets(4)
        Label { it.text=item.toStr; fg=Color.white },
      })
    }

    popup.open(this, Point(0, size.h))
  }

  private native Void dropDownClosed()

}