##########################################################################
# This Python/QT script is an example of the State Design Pattern as
# described in the `Gang Of Four` book.
#
# (C)2002 Romain GUY
# 10/15/2002 - 18:21:54
#
##########################################################################

##########################################################################
# IMPORTS
##########################################################################
import re
import sys
from qt import *

##########################################################################
# DATA
##########################################################################
image0_data = [
'1 2 2 1',
'. c #2d89e3',
'# c #45a1fd',
'.',
'#'
]

##########################################################################
# QT-DESIGNER GENERATED CODE
##########################################################################
class mainFrame(QDialog):
  def __init__(self,parent = None,name = None,modal = 0,fl = 0):
    QDialog.__init__(self,parent,name,modal,fl)

    image0 = QPixmap(image0_data)

    if name == None:
      self.setName('mainFrame')

    self.setEnabled(1)
    self.resize(430,156) 
    self.setSizePolicy(QSizePolicy(5,5,self.sizePolicy().hasHeightForWidth()))
    pal = QPalette()
    cg = QColorGroup()
    cg.setColor(QColorGroup.Foreground,QColor(255,255,0))
    cg.setColor(QColorGroup.Button,QColor(0,170,255))
    cg.setColor(QColorGroup.Light,QColor(255,255,127))
    cg.setColor(QColorGroup.Midlight,QColor(85,85,255))
    cg.setColor(QColorGroup.Dark,QColor(106,104,100))
    cg.setColor(QColorGroup.Mid,QColor(141,138,133))
    cg.setColor(QColorGroup.Text,QColor(255,255,0))
    cg.setColor(QColorGroup.BrightText,Qt.white)
    cg.setColor(QColorGroup.ButtonText,QColor(255,255,0))
    cg.setColor(QColorGroup.Base,QColor(66,183,255))
    cg.setBrush(QColorGroup.Background,QBrush(QColor(255,255,127),image0))
    cg.setColor(QColorGroup.Shadow,QColor(85,0,255))
    cg.setColor(QColorGroup.Highlight,QColor(255,0,0))
    cg.setColor(QColorGroup.HighlightedText,Qt.black)
    pal.setActive(cg)
    cg.setColor(QColorGroup.Foreground,QColor(255,255,0))
    cg.setColor(QColorGroup.Button,QColor(0,170,255))
    cg.setColor(QColorGroup.Light,QColor(127,212,255))
    cg.setColor(QColorGroup.Midlight,QColor(38,183,255))
    cg.setColor(QColorGroup.Dark,QColor(0,85,127))
    cg.setColor(QColorGroup.Mid,QColor(0,113,170))
    cg.setColor(QColorGroup.Text,QColor(255,255,0))
    cg.setColor(QColorGroup.BrightText,Qt.white)
    cg.setColor(QColorGroup.ButtonText,QColor(255,255,0))
    cg.setColor(QColorGroup.Base,QColor(66,183,255))
    cg.setBrush(QColorGroup.Background,QBrush(QColor(255,255,127),image0))
    cg.setColor(QColorGroup.Shadow,Qt.black)
    cg.setColor(QColorGroup.Highlight,QColor(255,0,0))
    cg.setColor(QColorGroup.HighlightedText,Qt.black)
    pal.setInactive(cg)
    cg.setColor(QColorGroup.Foreground,QColor(128,128,128))
    cg.setColor(QColorGroup.Button,QColor(0,170,255))
    cg.setColor(QColorGroup.Light,QColor(127,212,255))
    cg.setColor(QColorGroup.Midlight,QColor(38,183,255))
    cg.setColor(QColorGroup.Dark,QColor(0,85,127))
    cg.setColor(QColorGroup.Mid,QColor(0,113,170))
    cg.setColor(QColorGroup.Text,QColor(255,255,0))
    cg.setColor(QColorGroup.BrightText,Qt.white)
    cg.setColor(QColorGroup.ButtonText,QColor(128,128,128))
    cg.setColor(QColorGroup.Base,QColor(66,183,255))
    cg.setBrush(QColorGroup.Background,QBrush(QColor(255,255,127),image0))
    cg.setColor(QColorGroup.Shadow,Qt.black)
    cg.setColor(QColorGroup.Highlight,QColor(255,0,0))
    cg.setColor(QColorGroup.HighlightedText,Qt.black)
    pal.setDisabled(cg)
    self.setPalette(pal)
    self.setCaption(self.tr("Converter"))
    self.setSizeGripEnabled(0)

    self.grpFrom = QButtonGroup(self,'grpFrom')
    self.grpFrom.setGeometry(QRect(10,10,201,100)) 
    self.grpFrom.setTitle(self.tr("Convert From"))
    self.grpFrom.setRadioButtonExclusive(1)

    self.txtFrom = QLineEdit(self.grpFrom,'txtFrom')
    self.txtFrom.setGeometry(QRect(10,20,181,22))
    self.txtFrom.setText(self.tr("0"))

    self.radioFromHexa = QRadioButton(self.grpFrom,'radioFromHexa')
    self.radioFromHexa.setGeometry(QRect(110,50,80,21))
    self.radioFromHexa.setText(self.tr("Hexadecimal"))
    self.grpFrom.insert(self.radioFromHexa,1)

    self.radioFromDecimal = QRadioButton(self.grpFrom,'radioFromDecimal')
    self.radioFromDecimal.setGeometry(QRect(10,50,71,21))
    self.radioFromDecimal.setText(self.tr("Decimal"))
    self.radioFromDecimal.setChecked(1)
    self.grpFrom.insert(self.radioFromDecimal,0)

    self.radioFromOctal = QRadioButton(self.grpFrom,'radioFromOctal')
    self.radioFromOctal.setGeometry(QRect(10,70,46,17))
    self.radioFromOctal.setText(self.tr("Octal"))
    self.grpFrom.insert(self.radioFromOctal,2) 

    self.grpTo = QButtonGroup(self,'grpTo')
    self.grpTo.setGeometry(QRect(220,10,200,100)) 
    self.grpTo.setTitle(self.tr("Convert To"))
    self.grpTo.setRadioButtonExclusive(1)

    self.txtTo = QLineEdit(self.grpTo,'txtTo')
    self.txtTo.setGeometry(QRect(10,20,181,22))
    self.txtTo.setText(self.tr("0x0"))
    self.txtTo.setEnabled(0)

    self.radioToDecimal = QRadioButton(self.grpTo,'radioToDecimal')
    self.radioToDecimal.setGeometry(QRect(10,50,71,21))
    self.radioToDecimal.setText(self.tr("Decimal"))
    self.radioToDecimal.setChecked(0)

    self.radioToHexa = QRadioButton(self.grpTo,'radioToHexa')
    self.radioToHexa.setGeometry(QRect(110,50,80,21))
    self.radioToHexa.setText(self.tr("Hexadecimal"))
    self.radioToHexa.setChecked(1)

    self.radioToOctal = QRadioButton(self.grpTo,'radioToOctal')
    self.radioToOctal.setGeometry(QRect(10,70,71,21))
    self.radioToOctal.setText(self.tr("Octal"))
    self.radioToOctal.setChecked(0)

    self.btnConvert = QPushButton(self,'btnConvert')
    self.btnConvert.setGeometry(QRect(10,120,80,26))
    self.btnConvert.setText(self.tr("&Convert")) 

    self.connect(self.grpFrom,SIGNAL('clicked(int)'),self.selectFrom)
    self.connect(self.grpTo,SIGNAL('clicked(int)'),self.selectTo)
    self.connect(self.btnConvert,SIGNAL('clicked()'),self.convert)

    self.converters = [DecimalConverter(), HexadecimalConverter(), OctalConverter()]

    self.fromConverter = self.converters[0]
    self.toConverter = self.converters[1]
##########################################################################
# END OF QT-DESIGNER GENERATED CODE
##########################################################################

  def convert(self):
    if self.fromConverter.isValid(self.txtFrom.text()):
      self.txtTo.setText(self.toConverter.convertFrom(self.fromConverter, self.txtFrom.text()))

  def selectTo(self, id):
    self.toConverter = self.converters[id]

  def selectFrom(self, id):
    self.fromConverter = self.converters[id]
##########################################################################
# END OF mainFrame
##########################################################################

##########################################################################
# STATE CLASS
##########################################################################
class Converter:
  def isValid(self, value):
    return None

  def convertFrom(self, fromConverter, value):
    return None

  def toDecimal(self, value):
    return None

##########################################################################
# CONVERTS TO DECIMAL
##########################################################################
class DecimalConverter(Converter):
  def isValid(self, value):
    return re.match("[0-9]+$", str(value))

  def convertFrom(self, fromConverter, value):
    return str(fromConverter.toDecimal(value))

  def toDecimal(self, value):
    return int(str(value))

##########################################################################
# CONVERTS TO HEXADECIMAL
##########################################################################
class HexadecimalConverter(Converter):
  def isValid(self, value):
    return re.match("(0x)?[0-9A-Fa-f]+$", str(value))

  def convertFrom(self, fromConverter, value):
    return hex(fromConverter.toDecimal(value))

  def toDecimal(self, value):
    return int(str(value), 16)

##########################################################################
# CONVERTS TO OCTAL
##########################################################################
class OctalConverter(Converter):
  def isValid(self, value):
    return re.match("0?[0-7]+$", str(value))

  def convertFrom(self, fromConverter, value):
    return oct(fromConverter.toDecimal(value))

  def toDecimal(self, value):
    return int(str(value), 8)

##########################################################################
# START POINT
##########################################################################

if __name__ == '__main__':
  a = QApplication(sys.argv)
  QObject.connect(a,SIGNAL('lastWindowClosed()'),a,SLOT('quit()'))
  w = mainFrame()
  a.setMainWidget(w)
  w.show()
  a.exec_loop()

# end of file
