# -*- coding: utf-8 -*-

import sys, re
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from lechat.DataTree import DataTree
from lechat.LDAPMapping import *
import pickle
from TDBBrowserModel import TDBBrowserModel

class TDBTreeView(QTreeView):
    def __init__(self, parent):
        QTreeView.__init__(self, parent)

        self.setDragDropMode(QAbstractItemView.DragOnly)
        self.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.drag_start_pos = QPoint(0,0)

        self.setEditTriggers(QAbstractItemView.DoubleClicked|QAbstractItemView.EditKeyPressed|QAbstractItemView.NoEditTriggers)
        self.setAlternatingRowColors(True)
        self.setSortingEnabled(True)
        #self.setAnimated(True)
        self.setObjectName("tdb_treeview")

        sizePolicy = QSizePolicy(QSizePolicy.Policy(3),QSizePolicy.Policy(3))
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
        self.setSizePolicy(sizePolicy)

        self.resizeColumnToContents(0)

        QObject.connect(self, SIGNAL("activated(QModelIndex)"), self.editItem)
        
    def indexPath(self, index):
        if not index.isValid():
            return ''
        
        path = ''
        node = index.internalPointer()
        while node:
            path = node.data() + '/' + path
            node = node.parent()
        return path
        
    def editItem(self, index):
        if index.column() == 0:
            self.parent().ui.parent.editEntry(self.indexPath(index))
        elif index.column() == 1:
            self.parent().ui.parent.deleteEntry(self.indexPath(index))
        
    def mousePressEvent(self,event):
        if event.button() == Qt.LeftButton:
            self.drag_start_pos = QPoint(event.pos())
        QTreeView.mousePressEvent(self, event)
            
    def mouseMoveEvent(self, event):
        if not event.buttons() & Qt.LeftButton:
            QTreeView.mouseMoveEvent(self, event)
            return

        if (event.pos() - self.drag_start_pos).manhattanLength() < qApp.startDragDistance():
            return

        drag = QDrag(self)
        data = QMimeData()

        entries = []

        for item in self.selectedIndexes():
            path = self.indexPath(item)
            if path not in entries:
                entries.append(path)

        data.setText( repr(entries) )
        drag.setMimeData(data)

        drag.start()

class TDBBrowserWidget(QWidget):
    def __init__(self, ui):
        QWidget.__init__(self)

        self.setObjectName("browser")
        self.ui = ui
        self.resize(QSize(QRect(0,0,443,287).size()).expandedTo(self.minimumSizeHint()))

        sizePolicy = QSizePolicy(QSizePolicy.Policy(7),QSizePolicy.Policy(7))
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
        self.setSizePolicy(sizePolicy)
        self.setWindowIcon(QIcon(":/lechat/resources/users.png"))

        self.vboxlayout = QVBoxLayout(self)
        self.vboxlayout.setMargin(9)
        self.vboxlayout.setSpacing(6)
        self.vboxlayout.setObjectName("vboxlayout")

        self.filterboxlayout = QHBoxLayout()
        self.filterboxlayout.setMargin(0)
        self.filterboxlayout.setSpacing(0)
        self.filterboxlayout.setObjectName("filterboxlayout")

        self.vboxlayout.addLayout(self.filterboxlayout)

        self.erasefilter_button = QToolButton()
        self.erasefilter_button.setText( _("Erasefilter") )
        self.erasefilter_button.setIcon(QIcon(":/lechat/resources/locationbar_erase.png"))
        self.erasefilter_button.setPopupMode(QToolButton.DelayedPopup)
        self.erasefilter_button.setAutoRaise(True)
        self.erasefilter_button.setObjectName("erasefilter_button")
        self.filterboxlayout.addWidget(self.erasefilter_button)

        self.filter_widget = QLineEdit()
        self.filterboxlayout.addWidget(self.filter_widget)

        self.filter_button = QToolButton()
        self.filter_button.setText( _("Filter") )
        self.filter_button.setIcon(QIcon(":/lechat/resources/filter.png"))
        self.filter_button.setPopupMode(QToolButton.DelayedPopup)
        self.filter_button.setAutoRaise(True)
        self.filter_button.setObjectName("filter_button")
        
        self.filterboxlayout.addWidget(self.filter_button)

        self.tdb_model = TDBBrowserModel( self.ui.parent.entries, self )
        self.tdb_widget = TDBTreeView(self)
        self.tdb_widget.setModel( self.tdb_model )
        self.tdb_widget.expandAll()
        self.tdb_widget.resizeColumnToContents(0)
        self.tdb_widget.setColumnWidth(1,32)

        self.vboxlayout.addWidget(self.tdb_widget)

        self.setWindowTitle( _("Users") )

        QObject.connect(self.filter_widget, SIGNAL("textChanged(QString)"), self.filterChanged)
        QObject.connect(self.filter_button, SIGNAL("clicked()"), self.applyFilter)
        QObject.connect(self.erasefilter_button, SIGNAL("clicked()"), self.clearFilter)

        self.ui.parent.entries_changed.addWatcher(self.applyFilter)

    def __del__(self):
        self.ui.parent.entries_changed.delWatcher(self.applyFilter)
        QObject.disconnect(self.filter_widget, SIGNAL("textChanged(QString)"), self.filterChanged)
        QObject.disconnect(self.filter_button, SIGNAL("clicked()"), self.applyFilter)
        
    def applyFilter(self):
        text = self.filter_widget.text()
        self.filterChanged(text)

    def clearFilter(self):
        self.filter_widget.setText('')
        
    def filterChanged(self, text):
        filter_re = re.compile( str(text), re.I )
        if filter_re:
            self.tdb_model.updateDB(filter_re)
            self.tdb_widget.expandAll()
            self.tdb_widget.resizeColumnToContents(0)
            self.tdb_widget.setColumnWidth(1,32)
        else:
            debug('invalid regexp %s' % text)


    """
    def updateEntriesList(self):
        self.tdb_widget.clear()

        #for k in self.context.changeset.deletes :
        #    del self.entries[k]

        for k, v in self.ui.parent.changeset.renames.items() :
            critical("Renaming node is not supported, yet.")
            #self.entries[v] = self.entries[k]
            #del self.entries[k]
            
        for dn, attributes in self.ui.parent.changeset.changes.items() :
            for k, v in attributes.items():
                self.ui.parent.entries[dn][k].value =  v

        self.showEntries()    

    @staticmethod
    def _addSubItems(top, widget, dn, attrs):
        icon = QIcon(":/lechat/resources/stop.png")
        
        subitem = QTreeWidgetItem( [ QString( dn ), ''] )
        subitem.setIcon(1, icon)
        
        for k, v in attrs.items():
            if isinstance(v, DataTree):
                TDBBrowserWidget._addSubItems(top, subitem, k, v)

        if widget:
            widget.addChild(subitem)
        else:
            top.addTopLevelItem(subitem)
        top.expandItem(subitem)

    def showEntries(self):
        self.tdb_widget.clear()
        icon = QIcon(":/lechat/resources/stop.png")

        for k, v in self.ui.parent.entries.items():
            TDBBrowserWidget._addSubItems(self.tdb_widget, None, k, v)
        
        self.tdb_widget.sortItems(0, Qt.AscendingOrder)
        self.tdb_widget.resizeColumnToContents(0)
    """



