import sys, re
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from lechat.DataTree import DataTree
from lechat.Utils import *

STATE_VALID = 0
STATE_WARNING = 1
STATE_INVALID = 2
STATE_NOT_SET = 255

_dnEditLineWidgetBrush = { STATE_VALID: QBrush(Qt.white),
                           STATE_WARNING: QBrush( QColor(255, 63, 63, 31) ),
                           STATE_INVALID: QBrush( QColor(255, 63, 63, 255) ) }

for b in _dnEditLineWidgetBrush.itervalues():
    b.setStyle(Qt.SolidPattern)

class DNLineEditWidget(QLineEdit):

    def __init__(self, parent):
        QLineEdit.__init__(self, parent)
        QObject.connect(self, SIGNAL("textChanged(QString)"), self.textChanged)
        self.setBackgroundRole(QPalette.Base)
        self.setAutoFillBackground(True)
        self.valid = STATE_NOT_SET
        self._palette = QPalette()
        
        self.textChanged(self.text())
        
    def dropEvent(self, event):
        event.ignore()
        if not event.mimeData().hasText():
            return
        dns = eval(str(event.mimeData().text()))
        for dn in dns:
            if not self.parent().parent().filter_re.match(dn):
                return
        self.setText( ','.join(dns) )
        self.setFocus(Qt.MouseFocusReason)
        event.acceptProposedAction()

    def dragEnterEvent(self, event):
        event.ignore()
        if not event.mimeData().hasText():
            return
        dns = eval(str(event.mimeData().text()))
        for dn in dns:
            if not self.parent().parent().filter_re.match(dn):
                return
        self.selectAll()
        event.acceptProposedAction()

    def _setPalette(self, state):
        if self.valid != state:
            self._palette.setBrush(QPalette.Active, QPalette.Base,
                                   _dnEditLineWidgetBrush[state])
            self._palette.setCurrentColorGroup(QPalette.Active)
            self.setPalette(self._palette)
            self.valid = state        
        
    def textChanged(self, text):
        if self.parent().parent().filter_re.match( str(text) ):
            if self.parent().parent().ui.entries.has_key( str(text) ):
                self._setPalette(STATE_VALID)
            else:
                if self.valid != STATE_WARNING:
                    self._setPalette(STATE_WARNING)

        elif self.valid != STATE_INVALID:
            self._setPalette(STATE_INVALID)

class DNSelectQtWidget(QWidget):
    """
    DN selection by browsing tree.
    """
    def __init__(self, parent, ui, filter_re='.*'):
        QWidget.__init__(self, parent)

        #self.parent = parent
        self.ui = ui
        self.filter_re = re.compile(filter_re)
        
        self.setObjectName("DNSelect")
        self.resize(QSize(QRect(0,0,484,521).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.verticalLayout = QWidget(self)
        self.verticalLayout.setGeometry(QRect(0,140,441,129))
        self.verticalLayout.setObjectName("verticalLayout")

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

        self.comboBox = QComboBox(self)
        #self.comboBox.setPopupMode(QToolButton.DelayedPopup)
        #self.comboBox.setAutoRaise(True)
        #self.comboBox.setArrowType(Qt.DownArrow)
        self.comboBox.setObjectName("comboBox")

        self.lineEdit = DNLineEditWidget(self.comboBox)
        self.lineEdit.setObjectName("lineEdit")
        self.comboBox.setLineEdit(self.lineEdit)
        
        self.vboxlayout.addWidget(self.comboBox)

        self.showEntries()
        self.setAcceptDrops(True)
           
    def _addSubItems(self, parent, dn, attrs):

        for k, v in attrs.items():
            if isinstance(v, DataTree):
                self._addSubItems(parent + dn + '/', k, v)

        if self.filter_re.match( parent + dn + '/'):
            self.comboBox.addItem(parent + dn + '/')
            
    def showEntries(self):

        for k, v in self.ui.entries.items():
            self._addSubItems('/', k, v)

    def setData(self, value):
        if not value:
            self.lineEdit.setText( QString( '' ) )
        else:
            self.lineEdit.setText( QString( dnToPath(value[0], self.ui.config.base_dn) ) )

    def getData(self):
        text = str(self.lineEdit.text())
        if not text:
            return None
        value = pathToDN( text, self.ui.config.base_dn )
        if value:
            return [ value ]
        else:
            return None
        

