#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = "Volker Helm äöü"
__version__ = "0.1"
__date__ = "Date: 2007/01/22"
__copyright__ = "Copyright (c) 2007 Volker Helm"
__license__ = "GPL"

import string

try:
    import pygtk
    pygtk.require("2.0")
except:
    pass

import gtk,pango
import gtk.glade
import gobject,locale


class TransformData(object):
    """Transformation der Oracledaten für gtk"""
    
    def __init__(self, dsn='shc/shc@shc', betrieb=1):
        self.new_db(dsn,betrieb)
        
    def new_db(self, dsn, betrieb = 1):
        self.betrieb = betrieb
        try:
            self.encoding = self.db.encoding
        except:
            self.encoding = 'cp1252'

    def trans_header(self,cursor):
        """Datendefinition für Header
            0 - Spalte
            1 - Titel in Unicode
            2 - Datentyp (1 - String, 
                          2 - Text (nicht proportional), 
                          10 - Integer
                          11 - Float
                          20 - datetime
                          99 - noch nicht definiert)
            3 - Länge des Datenbankfeldes 
            4 - Formatierung nach String
            5 - Sichtbar (0 - sichtbar,
                          1 - unsichtbar,
                          2 - entfernen)
        """
        try:
            result = []
            for i,head in enumerate(cursor.description):
                daten = []
                daten.extend([i,head[0].decode(self.encoding)])
                
                if str(head[1]) in ("<type 'cx_Oracle.FIXED_CHAR'>",
                                    "<type 'cx_Oracle.STRING'>"):
                    daten.extend([1,head[3],None,0])
                elif str(head[1]) in ("<type 'cx_Oracle.LONG_STRING'>"):
                    daten.extend([2,head[3],None,0])
                elif str(head[1]) == "<type 'cx_Oracle.NUMBER'>":
                    if head[5] > 0:
                        daten.extend([11,head[4],'%'+'.%if' % head[5],0])
                    elif head[2]==127:
                        daten.extend([11,head[4],'%.2f',0])
                    else:
                        daten.extend([10,head[4],'%d',0])
                elif str(head[1]) in ("<type 'datetime.datetime'>"):
                    daten.extend([20,10,'%d.%m.%Y',0])
                else:
                    daten.extend([99,head[1],None,0])

                result.append(daten)
        except:
            result = "Fehlerhafte Daten"
        return result
    
    def trans_data(self, header=None, data=None):
        if data!=None and header!=None:
            if header[2] in (1,2):
                result = data.decode(self.encoding).strip(' \r\n')
            elif header[2] == 10:
                result = locale.format(header[4],data)
#                result = data
            elif header[2] == 11:
                result = locale.format(header[4],data,True)
            elif header[2] == 20:
                result = data.strftime(header[4])
            else:
                result = str(data)
        elif data==None:
            if header[2] in (1,2,11,20):
                result = u''
            else: err, result= 1,"Fehler keine Kopfdaten"
        else: err, result= 1,"Fehler"
        return result
            
    def trans_row(self, header=None, row=None):
        err = 0
        result = []
        if header!=None and row!=None:
            if len(header)==len(row):
                [result.append(self.trans_data(header[i],v)) for i,v in enumerate(row)]
            else:
                err,result = 1,"Fehler Zeilenlängen ungleich"
        else:
            err, result = 1,"Fehler keine Daten"
        return result
                
    def trans_gettype(self, row=None):
        err = 0
        result = []
        if row!=None:
            for i,v in enumerate(row):
                if type(v) in (type(u' '),str):
                    result.append(str)
                elif type(v)==int:
                    result.append(int)
                elif type(v)==float:
                    result.append(float)
                else:
                    result.append(str)
        return result


class CellRTL(gtk.CellRendererText):
    def __init__(self):
        gtk.CellRendererText.__init__(self)
        self.set_property('xalign',0)        
        self.set_property('yalign',0)
        
class Suche(object):
    def callback(self, widget, data):
        if data == 'button 1':
            adsearch = AddressSearch(1,'K',"''",'bau')
            result, value = adsearch.run()
            print value

    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def show_error_dialog(self, error_string):
        """This Function is used to show an error dialog when
        an error occurs.
        error_string - The error string that will be displayed
        on the dialog.
        """
        error_dialog = gtk.MessageDialog(type=gtk.MESSAGE_ERROR,
                                         message_format=error_string,
                                         buttons=gtk.BUTTONS_OK)
        error_dialog.run()
        error_dialog.destroy()
#Hier enden die Basisfunktionen
                
    def __init__(self):
        # Create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        setting = gtk.settings_get_default()

        try:
            setting.set_property("gtk-theme-name","quatro")
        except:
            pass

        self.window.set_title("Hello Buttons!")
        self.window.connect("delete_event", self.delete_event)
        self.window.set_border_width(10)
        self.box1 = gtk.HBox(False, 0)
        self.window.add(self.box1)
        self.button1 = gtk.Button("AdressSuche")
        self.button1.connect("clicked", self.callback, "button 1")
        self.box1.pack_start(self.button1, True, True, 0)

        self.box1.show()
        self.window.show_all()

class AddressSearch(object):
    def __init__(self, betrieb, sart, scrit='',begriff=None):
        self.list = []
        self.betrieb, self.sart, self.scrit, self.begriff = betrieb, sart, scrit, begriff
        self.s = TransformData()
        
    def changed_cb(self, combobox):
        model = combobox.get_model()
        index = combobox.get_active()
        self.scrit = model[index][0][0]
        print "Match %s"%self.scrit

    def search_cb(self, widget, entry):
        begriff = entry.get_text()
        loeid = self.sdel.get_active()

    def on_selection_changed(self,selection): 
        model, iters = selection.get_selected()
        self.list = model.get(iters,0,1,2,3,4,5)
        print self.list

    def run(self):
        self.gladefile="Dialoge.glade"
        self.Tree = gtk.glade.XML(self.gladefile, "dialogAdSearch")
        dic = {"on_cb_AdSearch_changed" : self.changed_cb}
        self.Tree.signal_autoconnect(dic)
        self.dialog = self.Tree.get_widget("dialogAdSearch")
        if self.sart == 'K':
            self.dialog.set_title('Kundensuche')
        elif self.sart == 'L':
            self.dialog.set_title('Lieferantensuche')

    
        self.model_scrit = gtk.ListStore(str)
        i = 0
        ad_search_crit={"Matchcode":"''", 
                    "Name":"#", 
                    "Telefon":"?"}
        for k,v in ad_search_crit.iteritems():
            self.model_scrit.append(["%s - %s"%(v,k)])
            if self.scrit != v:
                i += 1
            else:
                number = i
        self.sdel = self.Tree.get_widget("chkbtn_delrep")
        self.cb = self.Tree.get_widget("cb_AdSearch")
        self.cb.set_model(self.model_scrit)
        cell = gtk.CellRendererText()
        self.cb.pack_start(cell)
        self.cb.add_attribute(cell,'text',0)
        self.cb.set_active(number)
        
        # Get Data
        self.search = self.Tree.get_widget("en_AdSearch")
        self.search.connect("activate",self.search_cb, self.search)

        self.tv = self.Tree.get_widget("tv_AdSearch")
        self.tv.set_rules_hint(True)
        self.tv.set_headers_clickable(True)
        self.tv.set_search_column(5)
        ##Somewhere here lies the problem
        if self.begriff!=None:
            self.search.set_text(self.begriff)
            pth =[[0, u'Betrieb', 10, 6, '%d', 0], [1, u'SART', 1, 2, None, 0], [2, u'AdressNR', 1, 8, None, 0], [3, u'Vtr', 1, 3, None, 0], [4, u'SORT', 1, 35, None, 0], [5, u'Name', 1, 128, None, 0], [6, u'Stra\xdfe', 1, 44, None, 0], [7, u'PLZ', 1, 6, None, 0], [8, u'Ort', 1, 35, None, 0]]
            r =(1, 'K', '137100', 'MO', ' Figura Bauunternehmen', 'Figura Bauunternehmen\rInh. Dirk Figura', 'Daimlerring 55', '31135', 'Hildesheim')
            r = self.s.trans_row(pth,r)
            model_ad = gtk.ListStore(*self.s.trans_gettype(r))
            r = [(1, 'K', '137100', 'MO', ' Figura Bauunternehmen', 'Figura Bauunternehmen\rInh. Dirk Figura', 'Daimlerring 55', '31135', 'Hildesheim'),(1, 'K', '101300', 'BE', 'Afemann GmbH', 'Wilfried Afemann GmbH\rBauschlosserei', 'Postfach 12 16', '30882', 'Barsinghausen'), (1, 'K', '102200', 'MO', 'Albrecht Bau GmbH', 'Albrecht Bau GmbH\r', 'Hauptstra\xdfe 29', '31079', 'Westfeld'), (1, 'K', '105100', 'BE', 'ATLAS HANNOVER', 'ATLAS HANNOVER\rBaumaschinen GmbH & Co.', 'Bremer Stra\xdfe 4-6', '30880', 'Laatzen'), (1, 'K', '108450', 'H\xc4', 'B & D Bau GbR', 'B & D Bau GbR\r', 'Geldkulenfeld 1', '31177', 'Harsum'), (1, 'K', '107000', 'H\xc4', 'Barthel', 'Peter Barthel\rBauunternehmen', 'Schlesierring 36', '31177', 'Harsum'), (1, 'K', '108400', 'MO', 'bau Tec', 'bau Tec\rBaugesellschaft mbH', 'Langer Kamp 14', '31139', 'Hildesheim'), (1, 'K', '107300', 'H\xc4', 'Bau- und Hobby Markt', 'Bau- und Hobby Markt\rSehnde GmbH', 'Peinerstr. 71', '31319', 'Sehnde'), (1, 'K', '107600', 'H\xc4', 'Bauer GmbH & Co. KG', 'Wilhelm Bauer GmbH & Co. KG\r', 'H\xe4genstra\xdfe 15', '30559', 'Hannover'), (1, 'K', '107800', 'GL', 'Bauking Nienburg GmbH & Co. KG', 'Bauking Nienburg GmbH & Co. KG\r', 'Celler Stra\xdfe 24', '31582', 'Nienburg')]
            [model_ad.append(self.s.trans_row(pth,v)) for i,v in enumerate(r)]
           
        # Addressselection
        self.tv.set_model(model_ad)
        for i,h in enumerate(pth):
            self.col = gtk.TreeViewColumn(h[1],CellRTL(),markup = i)
            if  i in (0,1,4):
                self.col.set_visible(False)
            self.tv.append_column(self.col)
            self.col.set_sort_column_id(i)

        sel = self.tv.get_selection()
        sel.connect('changed', self.on_selection_changed)
        # Start of Dialog

        self.result = self.dialog.run()
        self.dialog.destroy()
        return self.result, self.list

if __name__ == "__main__":
    Suche = Suche()
    gtk.main()
