from PyQt4.QtGui import *
from PyQt4.QtCore import *
from logging import warning, debug, critical
from DNSelectQtWidget import *

class AttributeWidget(object):
    def __init__(self, parent):
        self.widget = None
        self.parent = parent
        
    def setData(self, value):
        pass
    
    def getData(self):
        pass

class StaticWidget(AttributeWidget):
    def __init__(self, parent):
        self.widget = None
        self.value = None

    def setData(self, value):
        self.value = value
    
    def getData(self):
        return self.value


class DNWidget(AttributeWidget):
    def __init__(self, parent, main_ui, filter_re=None):
        self.widget = DNSelectQtWidget(parent, main_ui, filter_re)

    def setData(self, value):
        self.widget.setData(value)
    
    def getData(self):
        return self.widget.getData()

class TextWidget(AttributeWidget):
    def __init__(self, parent):
        self.widget = QTextEdit(parent)

    def setData(self, value):
        text = ''
        for t in value:
            text += t
        self.widget.setText(QString.fromUtf8(t))
    
    def getData(self):
        value = unicode(self.widget.toPlainText()).encode('utf-8')
        if value:
            return [ value ]
        else:
            return None

class LineWidget(AttributeWidget):
    def __init__(self, parent):
        self.widget = QLineEdit(parent)

    def setData(self, value):
        self.widget.setText( QString.fromUtf8(value[0]) )
    
    def getData(self):
        value = unicode(self.widget.text()).encode('utf-8')
        if value:
            return [ value ]
        else:
            return None

class MailQtWidget(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self, parent)

class MailWidget(LineWidget):
    pass

class PasswordWidget(LineWidget):
    def __init__(self, parent):
        self.widget = QLineEdit(parent)
        self.widget.setEchoMode(QLineEdit.Password)

class BooleanWidget(AttributeWidget):
    def __init__(self, parent):
        self.widget = QCheckBox(parent)

    def setData(self, value):
        if value[0]:
            self.widget.setCheckState( Qt.Checked )
        else:
            self.widget.setCheckState( Qt.Unchecked )

    def getData(self):
        if self.widget.checkState() == Qt.Checked:
            return [ True ]
        else:
            return [ False ]

class MultiValuedQtListView(QListView):
    def __init__(self, parent = None):
        QListView.__init__(self, parent)
        self.setAlternatingRowColors(True)
        self.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.setDragDropMode(QAbstractItemView.DragDrop)
        self.setDragEnabled(True)
        self.setAcceptDrops(True)
        self.setDropIndicatorShown(True)
        self.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.SelectedClicked | QAbstractItemView.EditKeyPressed )

    def mouseDoubleClickEvent(self, event):
        index = self.indexAt(event.pos())
        if ( index.isValid() ):
            QListView.mouseDoubleClickEvent(self, event)
        else:
            model = self.model() 
            model._cleanup()            
            item = QStandardItem( QString('') )
            model.appendRow(item)
            last = model.indexFromItem(item)
            self.setCurrentIndex(last)
            self.edit(last)

    """
    def dragEnterEvent(self, event):
        #event.ignore()
        print 'drag event %s' % event.mimeData().formats().join(', ')
        event.acceptProposedAction()

    def dropEvent(self, event):
        print 'drop event %s' % event.mimeData().formats().join(', ')
        event.ignore()
        if not event.mimeData().hasText():
            return
        dns = eval(str(event.mimeData().text()))
        for dn in dns:
            self.model().appendRow( QStandardItem( QString(dn)))
        event.acceptProposedAction()
    """
        
class MultiValuedQtListModel(QStandardItemModel):
    def __init__(self, parent = None):
        QStandardItemModel.__init__(self, 0, 1, parent)
        QObject.connect(self, SIGNAL("itemChanged(QStandardItem*)"), self.itemChanged)
        QObject.connect(self, SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.dataChanged)
        
    def _cleanup(self):
        i = 0
        end = self.rowCount()
        content = []
        while i < end:
            item = self.item(i)
            if not item:
                break
            text = item.text()
            if text.isEmpty() or text.toAscii() in content:
                self.removeRow(i)
                end = end - 1
            else:
                content.append(text.toAscii())
                i = i + 1
    
    def itemChanged(self, item):
        self._cleanup()

    def dataChanged(self, top_left, bottom_right):
        self._cleanup()

    def dropMimeData(self, data, action, row, column, parent):
        print 'data dropped : %s' % data
        return True

    def flags(self, index):
        return QStandardItemModel.flags(self, index) | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled
        
class MultiValuedQtWidget(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self, parent)

        self.setAcceptDrops(True)

        self.layout = QHBoxLayout(self)
        self.layout.setMargin(9)
        self.layout.setSpacing(6)

        self.frame = QFrame(self)
        sizePolicy = QSizePolicy(QSizePolicy.Policy(7),QSizePolicy.Policy(7))
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
        self.frame.setSizePolicy(sizePolicy)
        self.frame.setFrameShape(QFrame.NoFrame)
        self.frame.setFrameShadow(QFrame.Raised)

        #self.itemlist = QListView(self)
        self.itemlist = MultiValuedQtListView()
        #self.itemmodel = QStandardItemModel(0, 1, self)
        self.itemmodel = MultiValuedQtListModel()
        self.itemlist.setModel(self.itemmodel)
        self.layout.addWidget(self.itemlist)
        
        addbutton = QPushButton(self.frame)
        addbutton.setIcon(QIcon(":/lechat/resources/add.png"))
        self.layout.addWidget(addbutton)

        QObject.connect(self.itemlist, SIGNAL("doubleClicked(bool)"), self.onAddButton)
        QObject.connect(addbutton, SIGNAL("clicked(bool)"), self.onAddButton)
    
    def newItem(self, item = ''):
        item = QStandardItem( QString(item) )
        self.itemmodel.appendRow(item)
        return item

    def onAddButton(self):
        item = self.newItem()
        last = self.itemmodel.indexFromItem(item)
        self.itemlist.setCurrentIndex(last)
        self.itemlist.edit(last)
        
    def setData(self, items):
        for item in items:
            self.newItem(item)
        return True
        
    def getData(self):
        result = []
        count = self.itemmodel.rowCount()
        for i in xrange(0, count):
            item = self.itemmodel.item(i).data(Qt.DisplayRole)
            text = unicode( item.toString() ).encode('utf-8')
            if text:
                result.append( text )
        return result

    def dragEnterEvent(self, event):
        event.ignore()
        event.acceptProposedAction()

    def dropEvent(self, event):
        event.ignore()
        if not event.mimeData().hasText():
            return
        dns = eval(str(event.mimeData().text()))
        for dn in dns:
            #print self.parent().ui.entries[dn]
            node = self.parent().parent().parent().parent().ui.parent.entries[dn]['node'].value[0]
            self.itemmodel.appendRow( QStandardItem( QString(node)))
        event.acceptProposedAction()

class MultiValuedWidget(AttributeWidget):
    def __init__(self, parent):
        AttributeWidget.__init__(self, parent)
        self.widget = MultiValuedQtWidget(parent)


    def setData(self, value):
        self.widget.setData( value )
    
    def getData(self):
        return self.widget.getData()

        






