#! /usr/bin/env groovy import java.awt.Color import java.awt.Dimension import java.awt.Font import java.awt.Graphics import java.awt.Graphics2D import java.awt.GridLayout import java.awt.Toolkit import javax.swing.JFrame import javax.swing.JLabel import javax.swing.JPanel import javax.swing.JTextField import groovy.swing.SwingBuilder class DrawingPanel extends JPanel { private list = [] private current = -1 private Map defaults def addSlide ( List l ) { list += [ l ] } def previous ( ) { if ( current > 0 ) { --current } } def next ( ) { if ( ( 0 <= current ) && ( current < list.size ( ) -1 ) ) { ++current } } DrawingPanel ( final Binding binding ) { defaults = binding.variables.defaults preferredSize = new Dimension ( defaults.width ? defaults.width : 300, defaults.height ? defaults.height : 300 ) background = defaults.background ? defaults.background : Color.yellow } public void paint ( final Graphics g ) { final Graphics2D g2d = (Graphics2D) g ; list[current].each { item -> def fontName = item.fontName ? item.fontName : defaults.fontName def fontStyle = item.fontStyle ? item.fontStyle : defaults.fontStyle def fontSize = item.fontSize ? item.fontSize : defaults.fontSize g2d.font = new Font ( fontName ? fontName : "Sans Serif" , fontStyle ? fontStyle : Font.PLAIN , fontSize ? fontSize : 20 ) if ( item.string ) { g2d.drawString ( item.string , item.x ? item.x : 10 , item.y ? item.y : 10 ) } if ( item.image ) {g2d.drawImage ( Toolkit.getDefaultToolkit ( ).getImage ( item.image ) , null , null ) } } } } ( new GroovyShell ( binding ) ).evaluate ( new File ( 'slides' ) ) swing = new SwingBuilder ( ) mainFrame = swing.frame ( title : "Main Panel" , defaultCloseOperation : JFrame.EXIT_ON_CLOSE ) mainPanel = new DrawingPanel ( binding ) mainPanel.addSlide ( slide_1 ) mainPanel.addSlide ( slide_2 ) mainPanel.current = 0 mainFrame.add ( mainPanel ) mainFrame.pack ( ) update = { pageField.text = ( mainPanel.current + 1 ).toString ( ) mainFrame.repaint ( ) controlFrame.repaint ( ) } controlFrame = swing.frame ( title : "Control Panel" , defaultCloseOperation : JFrame.EXIT_ON_CLOSE ) { panel ( layout : new GridLayout ( 2 , 1 ) ) { panel { label ( 'Page : ' ) pageField = textField ( columns : 3 , horizontalAlignment : JTextField.RIGHT , editable : false , text : '1' ) } panel { button ( label : 'previous' , actionPerformed : { mainPanel.previous ( ) ; update ( ) } ) button ( label : 'next' , actionPerformed : { mainPanel.next ( ) ; update ( ) } ) } } } controlFrame.pack ( ) mainFrame.visible = true controlFrame.visible = true