title = 'Pmw.Counter demonstration'

# Import Pmw from this directory tree.
import sys
sys.path[:0] = ['../../..']

import string
import time
import Tkinter
import Pmw

class Demo:
    def __init__(self, parent):
        # Need to use long ints here because on the Macintosh the maximum size
        # of an integer is smaller than the value returned by time.time().
        now = (long(time.time()) / 300) * 300

        # Create the Counters.
        self._date = Pmw.Counter(parent,
                                 labelpos = 'w',
                                 label_text = 'Date (4-digit year):',
                                 entryfield_value =
                                 time.strftime('%d/%m/%Y', time.localtime(now)),
                                 entryfield_command = self.execute,
                                 entryfield_validate = {'validator' : 'date', 'format' : 'dmy'},
                                 datatype = {'counter' : 'date', 'format' : 'dmy', 'yyyy' : 1})

        self._isodate = Pmw.Counter(parent,
                                    labelpos = 'w',
                                    label_text = 'ISO-Date (4-digit year):',
                                    entryfield_value =
                                    time.strftime('%Y-%m-%d', time.localtime(now)),
                                    entryfield_command = self.execute,
                                    entryfield_validate = {'validator' : 'date', 'format' : 'ymd',
                                                           'separator' : '-' },
                                    datatype = {'counter' : 'date', 'format' : 'ymd', 'yyyy' : 1,
                                                'separator' : '-' })

        self._time = Pmw.Counter(parent,
                                 labelpos = 'w',
                                 label_text = 'Time:',
                                 entryfield_value =
                                 time.strftime('%H:%M:%S', time.localtime(now)),
                                 entryfield_validate = {'validator' : 'time',
                                                        'min' : '00:00:00', 'max' : '23:59:59',
                                                        'minstrict' : 0, 'maxstrict' : 0},
                                 datatype = {'counter' : 'time', 'time24' : 1},
                                 increment=5*60)
        self._real = Pmw.Counter(parent,
                                 labelpos = 'w',
                                 label_text = 'Real (with comma)\nand extra\nlabel lines:',
                                 label_justify = 'left',
                                 entryfield_value = '1,5',
                                 datatype = {'counter' : 'real', 'separator' : ','},
                                 entryfield_validate = {'validator' : 'real',
                                                        'min' : '-2,0', 'max' : '5,0',
                                                        'separator' : ','},
                                 increment = 0.1)
        self._custom = Pmw.Counter(parent,
                                   labelpos = 'w',
                                   label_text = 'Custom:',
                                   entryfield_value = specialword[:4],
                                   datatype = _custom_counter,
                                   entryfield_validate = _custom_validate)
        self._int = Pmw.Counter(parent,
                                labelpos = 'w',
                                label_text = 'Vertical integer:',
                                orient = 'vertical',
                                entry_width = 2,
                                entryfield_value = 50,
                                entryfield_validate = {'validator' : 'integer',
                                                       'min' : 0, 'max' : 99}
                                )

        counters = (self._date, self._isodate, self._time, self._real,
                    self._custom)
        Pmw.alignlabels(counters)

        # Pack them all.
        for counter in counters:
            counter.pack(fill='both', expand=1, padx=10, pady=5)
        self._int.pack(padx=10, pady=5)

    def execute(self):
        print 'Return pressed, value is', self._date.get()

specialword = 'Monti Python ik den Holie Grailen (Bok)'

def _custom_validate(text):
    if string.find(specialword, text) == 0:
        return 1
    else:
        return -1

def _custom_counter(text, factor, increment):
    # increment is ignored here.
    if string.find(specialword, text) == 0:
        length = len(text)
        if factor == 1:
            if length >= len(specialword):
                raise ValueError, 'maximum length reached'
            return specialword[:length + 1]
        else:
            if length == 0:
                raise ValueError, 'empty string'
            return specialword[:length - 1]
    else:
        raise ValueError, 'bad string ' + text

######################################################################

# Create demo in root window for testing.
if __name__ == '__main__':
    root = Tkinter.Tk()
    Pmw.initialise(root)
    root.title(title)

    exitButton = Tkinter.Button(root, text = 'Exit', command = root.destroy)
    exitButton.pack(side = 'bottom')
    widget = Demo(root)
    root.mainloop()
