scala/menudsl.scala
author david@mel
Tue Apr 29 09:58:11 2008 +0100 (4 months ago)
changeset 7 f22f83eae2d7
permissions -rw-r--r--
Added the menu DSL.
        1 import javax.swing._;
        2 
        3 class MenuBar extends JMenuBar with MenuHolder{
        4 
        5 }
        6 
        7 trait MenuHolder{
        8   def add(menu : JMenu) : JMenu;
        9 
       10   class Menu(name : String) extends JMenu(name) with MenuHolder{
       11     MenuHolder.this.add(this);
       12 
       13     def add(menu : JMenu) = add(menu : JMenuItem).asInstanceOf[JMenu]
       14 
       15     import java.awt.event._;
       16     class Item(name : String) extends JMenuItem(name){
       17       Menu.this.add(this);
       18       
       19       def does(performAction : => Unit) = {
       20         addActionListener(new ActionListener{
       21           def actionPerformed(e : ActionEvent) = performAction;
       22         });
       23         this
       24       }
       25     }
       26 
       27     class CheckboxItem(name : String) extends JCheckBoxMenuItem(name){
       28       Menu.this.add(this);
       29       def toggles(toggle : Boolean => Unit) = {
       30         addActionListener(new ActionListener{
       31           def actionPerformed(e : ActionEvent) = toggle(isSelected);
       32         });
       33         this
       34       } 
       35       def is (x : Boolean) = { setSelected(x); this}
       36     }
       37 
       38     implicit def item(name : String) = new Item(name);
       39     implicit def checkboxItem(name : String) = new CheckboxItem(name);
       40 
       41     def --- = add(new JSeparator()); 
       42   }
       43 }
       44 
       45 val frame = new JFrame(){
       46 }
       47 
       48 frame.setJMenuBar(new MenuBar{
       49   new Menu("File"){
       50     "Save" does { }
       51     "Open" does { }   
       52     ---
       53     "Quit" does { System.exit(0) }
       54   }
       55   new Menu("Edit"){
       56     "I like kitties" is true toggles (x => if(x) println("I like kitties") else println("I appear to be lying"))
       57     new Menu("A sub menu"){
       58       "There are no kitties in this submenu" does { }
       59     }
       60   }
       61 });
       62 
       63 frame.setSize(500, 500);
       64 frame.setVisible(true);