# OCFS2Console - GUI frontend for OCFS2 management and debugging
# Copyright (C) 2002, 2005 Oracle.  All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA.

import gtk

import ocfs2

from guiutil import set_props, format_bytes

if gtk.pygtk_version >= (2,4,0):
    class BaseCombo(gtk.ComboBox):
        def __init__(self):
            self.store = gtk.ListStore(str)
            gtk.ComboBox.__init__(self, model=self.store)

            cell = gtk.CellRendererText()
            self.pack_start(cell)
            self.set_attributes(cell, text=0)

        def get_choice(self):
            return self.store[self.get_active_iter()][0]

        def set_choices(self, choices):
            selected = False

            for choice, select in choices:
                iter = self.store.append((choice,))

                if select:
                    self.set_active_iter(iter)
                    selected = True

            if not selected:
                self.set_active(0)

else:
    class BaseCombo(gtk.Combo):
        def __init__(self):
            gtk.Combo.__init__(self)
            self.entry.set_editable(False)

        def get_choice(self):
            return self.entry.get_text()

        def set_choices(self, choices):
            for choice, select in choices:
                item = gtk.ListItem(choice)
                item.show()
                self.list.add(item)

                if select:
                    item.select()

class ValueCombo(BaseCombo):
    def __init__(self, minimum, maximum):
        BaseCombo.__init__(self)

        choices = [('Auto', False)]

        size = minimum
        while size <= maximum:
            choices.append((format_bytes(size), False))
            size = size << 1

        self.set_choices(choices)

    def get_arg(self):
        text = self.get_choice()

        if text != 'Auto':
            s = text.replace(' ', '')
            s = s.replace('B', '')
            s = s.replace('bytes', '')
            return (self.arg, s)
        else:
            return None

class NumSlots(gtk.SpinButton):
    def __init__(self):
        adjustment = gtk.Adjustment(4, 1, ocfs2.MAX_SLOTS, 1, 10)
        gtk.SpinButton.__init__(self, adjustment=adjustment)

        self.set_numeric(True)

    label = 'Number of _node slots'

    def get_arg(self):
        s = self.get_text()

        if s:
            return ('-N', s)
        else:
            return None

class VolumeLabel(gtk.Entry):
    def __init__(self):
        gtk.Entry.__init__(self, max=ocfs2.MAX_VOL_LABEL_LEN)

    label = 'Volume _label'

    def get_arg(self):
        s = self.get_text()

        if s:
            return ('-L', s)
        else:
            return None

class ClusterSize(ValueCombo):
    def __init__(self):
        ValueCombo.__init__(self, ocfs2.MIN_CLUSTERSIZE,
                                  ocfs2.MAX_CLUSTERSIZE)
        self.arg = '-C'

    label = 'Cluster _size'

class BlockSize(ValueCombo):
    def __init__(self):
        ValueCombo.__init__(self, ocfs2.MIN_BLOCKSIZE,
                                  ocfs2.MAX_BLOCKSIZE)
        self.arg = '-b'

    label = '_Block size'

def main():
    import types

    widgets = []

    symbols = globals()

    for class_type in symbols.itervalues():
        if isinstance(class_type, types.TypeType) and hasattr(class_type, 'label'):
            widgets.append(class_type)

    def dummy(*args):
        gtk.main_quit()

    window = gtk.Window()
    window.connect('delete_event', dummy)

    table = gtk.Table(rows=len(widgets), columns=2)
    set_props(table, row_spacing=4,
                     column_spacing=4,
                     border_width=4,
                     parent=window)

    for row, widget_type in enumerate(widgets):
        label = gtk.Label()
        label.set_text_with_mnemonic(widget_type.label + ':')
        set_props(label, xalign=1.0)
        table.attach(label, 0, 1, row, row + 1)

        widget = widget_type()
        table.attach(widget, 1, 2, row, row + 1)

    window.show_all()

    gtk.main()
 
if __name__ == '__main__':
    main()
