試作高橋メソッドプレゼンツール
@hayamizu主催のT大生twitter忘年会なる謎の会合に参加。プロジェクタとか用意されてるらしいけど、自己紹介プレゼンとか何も用意してなかった。で、もう忘年会当日の深夜の1時くらいに急に「プレゼンツール作ろう!」という気分になったので作った。言語はScala。
http://konbu.s13.xrea.com/lib/Presc.jar
Prescって名前はなんだろうね。たぶんプレゼンするためのScalaプログラム、とかの略だと思う。引数でプレゼンファイルを渡して、以下のように実行します。
>java -jar Presc.jar t-univ-off20071220.txt
これで全画面表示でプレゼンを開始します。可能な操作はマウスの左右クリックによるページ切り替えのみ。
どうでもよくはあるんだけど、今日プレゼンで使ったプレゼンファイルは以下に。
http://konbu.s13.xrea.com/lib/t-univ-off20071220.txt
これだけ読んでもさっぱりわからんですね。喋りの補助ツール的な使い方をしました。
このプログラムの実装で完徹した、おかげですっごいねむい
以下にソースコードはっつけます。上のPresc.jarにもソースは含まれてるんですけどね。
import javax.swing.JFrame import javax.swing.JTextArea import java.awt.GraphicsEnvironment import java.awt.GraphicsDevice import java.io.IOException import java.io.FileReader import java.io.BufferedReader import java.awt.Dimension import java.awt.Color import java.awt.Font import java.awt.event.MouseAdapter import java.awt.event.MouseEvent import java.awt.event.KeyAdapter import java.awt.event.KeyEvent import scala.collection.mutable.ArrayBuffer object Presc{ object screen extends JFrame{} val device = GraphicsEnvironment.getLocalGraphicsEnvironment.getDefaultScreenDevice val dmode = device.getDisplayMode val screensize = new Dimension(dmode.getWidth, dmode.getHeight) object presArea extends JTextArea{ var curpage = 0 var prespages = new ArrayBuffer[String] def fitArea() : Unit = { var lfont = presArea.getFont var fontsize = 1.0 var prefsize : Dimension = null do{ fontsize += 10.0 lfont = lfont.deriveFont(fontsize.asInstanceOf[Float]) setFont(lfont) prefsize = getPreferredSize } while(prefsize.width < screensize.width && prefsize.height < screensize.height); while(prefsize.width > screensize.width || prefsize.height > screensize.height){ fontsize -= 1.0 lfont = lfont.deriveFont(fontsize.asInstanceOf[Float]) setFont(lfont) prefsize = getPreferredSize } } def pageNext() : Unit ={ curpage += 1 if(curpage >= prespages.size){ curpage = 0 } setPageNum(curpage) } def pagePrev() : Unit ={ curpage -= 1 if(curpage < 0){ curpage = prespages.size - 1 } setPageNum(curpage) } def setPageNum(pagenum : Int) : Unit = { setText(prespages(pagenum)) fitArea } def addPage(page : String) : Unit = { prespages += page } } object cycleMouseListener extends MouseAdapter{ override def mousePressed(e: MouseEvent) : Unit = { e.getButton match{ case MouseEvent.BUTTON1 => presArea.pagePrev case MouseEvent.BUTTON3 => presArea.pageNext case x => println(x) } } } def main(args: Array[String]){ if(args.length == 1){ val presfile = new BufferedReader(new FileReader(args(0))) var page = "" var line: String = null while((line=presfile.readLine)==() && line!=null){ if(line=="----"){ println(page) presArea.addPage(page) page = "" } else{ page += (line + "\r\n") } } if(page != ""){ presArea.addPage(page) } presArea.setEditable(false) presArea.addMouseListener(cycleMouseListener) screen.add(presArea) screen.setUndecorated(true) screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) device.setFullScreenWindow(screen) presArea.setPageNum(0) } } }
ここで使ってるライブラリはほとんどJavaのもの。なので、Scalaのプログラムとかあんまし書いたこと無くても、書ける人は相当書けるものと考えられる。