なんじゃくにっき

プログラミングの話題中心。

Atndから参加者リストを取得して抽選するアプリ Scala Swing編

前回Scala勉強会in渋谷用のくじびきアプリをAndroidで作ったが、
http://d.hatena.ne.jp/nanjakkun/20101120/1290211247
これを実行するためだけにAndroidエミュレータをインストールのはちょっと…という人のために
Scala Swing用に翻案してみた。
 
こんなの↓  

 
ソース

/**
* Atndから参加者リストを取得してクジ引きで座れる人を決めるScala Swingアプリ
* @author nanjakkun
*/

package example

import javax.swing.JOptionPane
import swing._
import event._
import FlowPanel.Alignment._
import util.Random

object Main extends SimpleSwingApplication {
def top = new MainFrame {
title = "ScalaShuffle"

class Spinner extends Component with Container.Wrapper {
override lazy val peer = new javax.swing.JSpinner with SuperMixin
}

val spinner1 = new Spinner { peer.setValue(5) }
val spinner2 = new Spinner { peer.setValue(5) }
val textField1 = new TextField("http://api.atnd.org/events/users/?event_id=10100")
val listView1 = new ListView[String] { peer.setPreferredSize(new Dimension(300, 300)) }

val button1 = new Button(new Action("参加者を取得") {
def apply {
try {
listView1.listData = xml.XML.loadString(io.Source.fromURL(textField1.text)
.mkString) \\ "nickname" map{_.text}
} catch {
case e: Exception => JOptionPane.showMessageDialog(null, "取得失敗!")
}
}})

val button2 = new Button(new Action("抽選") {
def apply {
val num1 = spinner1.peer.getValue.asInstanceOf[Int]
val num2 = spinner2.peer.getValue.asInstanceOf[Int]
//座れるのが確実な人たち
val list1 = (listView1.listData.filter(s => s != "kaigaiengineer")) take num1 toList
//抽選で座れる人たち
val list2 = Random.shuffle(listView1.listData.filter(s => s != "kaigaiengineer")
.drop(num1).toList) take num2
listView1.listData = list1 ::: list2
JOptionPane.showMessageDialog(null, "抽選完了!")
}})

contents = new BoxPanel(Orientation.Vertical) {
contents += new FlowPanel(Left)(new Label("席数(確定)"), spinner1)
contents += new FlowPanel(Left)(new Label("席数(抽選)"), spinner2)
contents += new FlowPanel(Left)(textField1)
contents += new FlowPanel(Left)(button1, button2)
contents += new FlowPanel(Left)(listView1)
}
}
}