import wx
import wx.grid
import string
import datetime
from conf.config import *
from viewController.gsgrid.custom import customeditordatepicker2
#from viewController.gsgrid.grid_properties import *
#from viewController.calendar.calendar import *

BITMAP_HEIGHT = 16
class MyDatePickerCtrl(wx.DatePickerCtrl):
       def __init__(self,*args,**kwargs):
           print 'entro qui'
           wx.DatePickerCtrl.__init__(self,*args,**kwargs)
       def SetValue(self,value):
           print 'setvalue'
           """Set either datetime.datetime or wx.DateTime"""
           if isinstance(value,(datetime.date,datetime.datetime)):
               wxvalue=wx.DateTime()
               wxvalue.Set(year=value.year,month=value.month-1,day=value.day)
               value=wxvalue
           elif value is None:
               value=wx.DateTime()
           wx.DatePickerCtrl.SetValue(self,value)
       def GetValue(self):
           print 'getvalue'
           """Returns datetime.datetime values"""
           value=wx.DatePickerCtrl.GetValue(self)
           if not value.IsValid(): #Manage null dates (useful whenwx.DP_ALLOWNONE is set)
                return None
           else:
                return datetime.datetime(value.GetYear(),value.GetMonth()+1,value.GetDay())
class GridTable(wx.grid.PyGridTableBase):
    def __init__(self, nomicampi,data,numberrows, tipi):
        wx.grid.PyGridTableBase.__init__(self)
        self.nomicampi = nomicampi
        self.numberrows = numberrows
        self.numbercols = len(nomicampi)
        self.data = data
        self.tipi = tipi
        self._rows = self.GetNumberRows()
        self._cols = self.GetNumberCols()
        
    def GetNumberRows(self):
        return self.numberrows

    def GetNumberCols(self):
        return self.numbercols

    def IsEmptyCell(self, row, col):
        return self.data[row][col] is not None

    def GetValue(self, row, col):
        if not col <0  and  not row <0: 
            value = self.data[row][col]
            if value is not None\
            and value != '':
                    
                return value
            else:
                return ''

    def SetValue(self, row, col, value):
        #print 'SetValue'
        # per il campo data bisogna fare un distinguo
        allBlank = 's'
        for i in range(len(value)):
            if value != ' ':
                allBlank = 'n'
        if allBlank == 's' \
        and len(value) > 0:
            value = ''
        self.data[(row,col)] = value

    def GetColLabelValue(self, col):
        '''imposta i nomi campi sulle colonne'''
        return self.nomicampi[col]

    def GetRowLabelValue(self, row):
        '''imposta a blank i nomi sulle righe'''
        return ''

    def AppendRows(self, numRows=1):
        return True

    def InsertRows(self,pos=0, numRows=1):
        ''' qui si definiscono i permessi per l'inserimento
            True -  e' possibile inserire una riga
            False - NON e' possibile inserire una riga
        '''
        return True

    def DeleteRows(self,pos=0, numRows=1):
        ''' qui si definiscono i permessi per la cancellazione
            True -  e' possibile cancellare una riga
            False - NON e' possibile cancellare una riga '''
        return True


class GridDef():
    def __init__(self,frame, container,nomicampi,data,tipi,numberrows,flagIns,flagUpd,modalita):
        self.FONT = wx.Font(10, wx.NORMAL,wx.NORMAL, wx.NORMAL)
        
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.grid = wx.grid.Grid(container,-1,size=(-1,-1),pos=(-1,-1),style=wx.BORDER|wx.HSCROLL)
        self.grid.SetDefaultEditor(wx.grid.GridCellAutoWrapStringEditor())
        self.row = 0
        self.col = 0
        #attr = wx.grid.GridCellAttr()
        self.modalita = modalita


        self.nomicampi = nomicampi
        self.frame = frame
        self.container = container
        print 'data',data
        self.data = data
        self.numberrows = numberrows
        self.tipi = tipi
        self.date_picker_exists = False

        self.setTable(self.frame,self.nomicampi,data,numberrows,tipi)


        
        self.flagIns = flagIns
        self.flagUpd = flagUpd
        self.modalita = modalita
        ##########self.grid.SetColFormatFloat(1)

        

        self.sizer.Add(self.grid,1,wx.EXPAND)
        #sizer.Add(sizeG)
        #sizerTot = wx.GridSizer(rows=1, cols=9, hgap=0, vgap=5)
        self.sizertot = wx.BoxSizer(wx.HORIZONTAL)


        self.button_ann = wx.Button(container, -1, 'refresh')
        self.t1 = wx.TextCtrl(container, -1, "", size=(130, -1))

        frame.Bind(wx.EVT_BUTTON, self.OnTest)


        self.sizertot.Add(self.button_ann,0,wx.EXPAND)
        self.sizertot.Add((30,-1))
        self.sizertot.Add(self.t1,0,wx.EXPAND)



        self.sizer.Add((-1,30))
        self.sizer.Add(self.sizertot,0,wx.EXPAND)
        container.SetSizer(self.sizer)
        container.Layout()
        
        self.selDelSel = -1        

        
    def OnTest(self,evt):
        #date_textctrl_exists = False
        #test if already there
        for child in self.container.GetChildren():
            if isinstance(child, wx.GenericDatePickerCtrl):
                self.date_picker_exists = True
            #if isinstance(child, wx.TextCtrl):
            #    date_textctrl_exists = True

        if self.date_picker_exists == False:
            self.dpc = wx.GenericDatePickerCtrl(self.container,
                                         pos=(-200,-200),
                                         size=(140,-1),
                                style = wx.DP_DROPDOWN
                                     | wx.DP_SHOWCENTURY)
            print 'result',self.sizertot.Replace(self.t1,self.dpc)
            self.t1.Hide()
            self.container.Layout()
            self.dpc.SetPosition((-1,-1))
            #print help(self.dpc)
        else:
            #print help(self.dpc)
            if self.dpc.IsShown():
                #date_picker_exists = False
                self.dpc.Hide()
                self.t1.Show()
            else:
                self.dpc.Show()
                self.t1.Hide()
            #print 'result',self.sizertot.Replace(self.dpc,self.t1)
            self.container.Layout()
    
    def OnCtrAnn(self,evt):
        print 'OnCtrAnn',__name__
        #self.setTable(self.frame,self.nomicampi,self.data,self.numberrows,self.tipi)        
        #self.table.ResetView()
        bb = self.table.data[0][0]
        try:
             bb = bb.replace(',','.')
        except:pass
        f = float(bb)
        print f
        
    def setTable(self,frame,nomicampi,data,numberrows,tipi):
        self.grid.SetRowLabelSize(30)
        self.grid.SetLabelFont(wx.Font(10, wx.NORMAL,wx.NORMAL, wx.BOLD))
        self.grid.ClearGrid()
        self.table = GridTable(nomicampi,data,numberrows,tipi)
        self.grid.SetTable(self.table, True)
        self.grid.EnableDragGridSize()


        self.grid.SetDefaultColSize(250)
        self.grid.SetDefaultRowSize(25)
        self.grid.Bind(wx.grid.EVT_GRID_SELECT_CELL,self.OnGridSelectCell)
        self.grid.Bind(wx.grid.EVT_GRID_LABEL_RIGHT_CLICK, self.OnLabelRightClicked)

    def OnLabelRightClicked(self, evt):
        #print 'OnLabelRightClicked'
        # Did we click on a row or a column?
        try:
        #    #nColSelectXOrder = self.GetSelectedRows()
        #    #self.DeselectRow(nColSelectXOrder[0])
            self.grid.SelectRow(evt.GetRow())
        except:pass

        row, col = evt.GetRow(), evt.GetCol()
        
        if row != -1:
            self.rowPopup(row, evt)
        evt.Skip()

    def rowPopup(self, row, evt):
        #disabilita qualsiasi control
        #fai prima sparire qualsiasi tooltip a livello di riga
        self.grid.DisableCellEditControl()
        #self.GetGridRowLabelWindow().SetToolTip(None)
        #print 'rowPopup'
        """(row, evt) -> display a popup menu when a row label is right clicked"""
        deleteID = wx.NewId()

        #print 'self.GetRowSize',self.GetRowSize(row)
        x = self.grid.GetRowSize(row)/2

        #if not self.GetSelectedRows():
        #    self.SelectRow(row)

        menu = wx.Menu()
        xo, yo = evt.GetPosition()
        menu.Append(deleteID, 'delete')

        def delete(event, self=self, row=row):
            #print 'row',row
            self.grid.DeselectRow(evt.GetRow())
            #rows = self.GetSelectedRows()
            #print 'PRIMA',row,self.GetCellValue(row,6)
            self.table.DeleteRow(row)
            self.table.ResetView(self.grid)
            #print 'DOPO',row,self.GetCellValue(row,6)

            #if len(self.colsWithCheckBox) > 0:
            #    self.setGridCheckBox() #creazione check box       

            #creazione choise editor
            #if len(self.colsWithChoiseEditor) > 0:            
            #    self.createGridCellChoiseEditor(self.table.numberrows - 1)
            self.grid.SetFocus()
            self.grid.SetGridCursor(self.table.numberrows - 1, 0)
            self.grid.MakeCellVisible(self.table.numberrows - 1,0)

            
        self.grid.Bind(wx.EVT_MENU, delete, id=deleteID)
        self.grid.PopupMenu(menu)
        menu.Destroy()
        return
        

    def OnGridSelectCell(self,evt):
        print 'EVT_GRID_SELECT_CELL',__name__
        evt.Skip()
        
    def ctrAbilUpdRow(self,evt):
        print 'ctrAbilUpdRow',__name__
        self.row = evt.Row
        self.col = evt.Col
        evt.Skip()
        
    def OnSize(self, event):
        print 'oOnSize'
        self.paintRefresh = True
        event.Skip()
        
    def OnScroll(self, event):
        self.paintRefresh = True
        wx.CallAfter(self.grid.ForceRefresh)
        event.Skip()
        
    def AutoSizeColumns(self):
        print 'AutoSizeColumns'
        self.paintRefresh = True
        super(GridDef, self.grid).AutoSizeColumns()
    
    def on_col_size(self, evt):
        print 'on_col_size'
        self.paintRefresh = True
        evt.Skip()
            

    def onCtrInsRow(self,nomicampi,data,tipi,numberrows):
        '''metodo per controllare che non si inserisca un riga prima ancora di
           finire di inserire quella precedente '''
        if self.grid.InsertRows() == True: # controllo se si e' autorizzati a inserire dati
            #if numberrows > 0:
            #    for i in range(0,self.table.numbercols):
            #        if self.grid.GetCellValue(numberrows - 1, i) == '':
            #            return False
            numberrows = numberrows + 1
            self.refreshGrid(nomicampi,data,tipi,numberrows)
        else:
            return False

    def onCtrDelRow(self):
        '''
            controllo se si e' atorizzati a cancellare dati
        '''
        return self.grid.DeleteRows() # controllo se si e' autorizzati a cancellare dati

    def refreshGrid(self,nomicampi,data,numberrows,tipi):
        print 'refreshGrid',__name__
        #self.setTable(self.frame,nomicampi,data,numberrows,tipi)
        self.grid.ForceRefresh()

            

class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        loc = wx.Locale(wx.LANGUAGE_ENGLISH_US)
        wx.Frame.__init__(self, parent, -1, "Custom Grid Cell Editor Test",
                         size=(640,480))
        panel = wx.Panel(self,-1)
        nomicampi = ['name','type']
        data =  [[0.4,''],
                 [0.44,''],
                 [0.444,'']
                 ]
        numberrows = 3
        tipi = ['float','blob']
        #tipi = ['text','text','text']
        grid = GridDef(self, panel,nomicampi,data,tipi,numberrows,'n','n',False)
        grid.button_ann.SetFocus()
#---------------------------------------------------------------------------

if __name__ == '__main__':
    import sys
    app = wx.PySimpleApp()
    frame = TestFrame(None, sys.stdout)
    frame.Show(True)
    app.MainLoop()


