試作高橋メソッドプレゼンツール

@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のプログラムとかあんまし書いたこと無くても、書ける人は相当書けるものと考えられる。

test