def __init__(self, appManager, ktable, parent = None):
        super(EntryTablePanel, self).__init__(parent)
        
        self.appManager = appManager
        
        self.ktable = ktable
        
        self.dataAccessService = appManager.dataAccessService
        
        self.entryTableModel = EntryTableModel(appManager, ktable)
#        self.entryTableDelegate = EntryTableDelegate(ktable)
        
        self.entryTableView = EntryListTableView(self)
        self.entryTableView.setModel(self.entryTableModel)
#        self.entryTableView.setItemDelegate(self.entryTableDelegate)
        
        self.addEntryButton = QPushButton("Add")
        self.removeEntryButton = QPushButton("Remove")
        
        
        """LAYOUT"""
        layout=QVBoxLayout()
        layout.addWidget(self.entryTableView)
        
        buttonLayout = QHBoxLayout()
        buttonLayout.addStretch()
        buttonLayout.addWidget(self.addEntryButton)
        buttonLayout.addWidget(self.removeEntryButton)
        
        layout.addLayout(buttonLayout)
        
        self.setLayout(layout)
        
        
        """CONNECTIONS"""
        self.connect(self.addEntryButton, SIGNAL('pressed()'), self.addEntry)
        self.connect(self.removeEntryButton, SIGNAL('pressed()'), self.removeEntry)
        
        self.connect(self.entryTableView, SIGNAL('entrySelected'), self.entrySelected)
        
        self.connect(self.entryTableView, SIGNAL('activated(QModelIndex)'), self.editEntry)
        
        
        self.resizeColumns()
class EntryTablePanel(QWidget):
    
    def __init__(self, appManager, ktable, parent = None):
        super(EntryTablePanel, self).__init__(parent)
        
        self.appManager = appManager
        
        self.ktable = ktable
        
        self.dataAccessService = appManager.dataAccessService
        
        self.entryTableModel = EntryTableModel(appManager, ktable)
#        self.entryTableDelegate = EntryTableDelegate(ktable)
        
        self.entryTableView = EntryListTableView(self)
        self.entryTableView.setModel(self.entryTableModel)
#        self.entryTableView.setItemDelegate(self.entryTableDelegate)
        
        self.addEntryButton = QPushButton("Add")
        self.removeEntryButton = QPushButton("Remove")
        
        
        """LAYOUT"""
        layout=QVBoxLayout()
        layout.addWidget(self.entryTableView)
        
        buttonLayout = QHBoxLayout()
        buttonLayout.addStretch()
        buttonLayout.addWidget(self.addEntryButton)
        buttonLayout.addWidget(self.removeEntryButton)
        
        layout.addLayout(buttonLayout)
        
        self.setLayout(layout)
        
        
        """CONNECTIONS"""
        self.connect(self.addEntryButton, SIGNAL('pressed()'), self.addEntry)
        self.connect(self.removeEntryButton, SIGNAL('pressed()'), self.removeEntry)
        
        self.connect(self.entryTableView, SIGNAL('entrySelected'), self.entrySelected)
        
        self.connect(self.entryTableView, SIGNAL('activated(QModelIndex)'), self.editEntry)
        
        
        self.resizeColumns()
        
    def editEntry(self, modelIndex):
        entry = self.entryTableModel.getEntryByModelIndex(modelIndex)
        dlg = EntryEditDialog(entry, self.ktable, self)
        if dlg.exec_():
            self.entryTableModel.updateRow(dlg.entry, modelIndex)
            self.entrySelected(dlg.entry)
            self.resizeColumns()
            
        
    def addEntry(self):
        entry = self.entryTableModel.createEntry()
        dlg = EntryEditDialog(entry, self.ktable, self)
        if dlg.exec_():
            modelIndex = self.entryTableModel.addRow(entry)
            
            self.entryTableView.setFocus()
            self.entryTableView.setCurrentIndex(modelIndex)
            self.resizeColumns()
        
    def removeEntry(self):
        answer = QMessageBox.question(self, self.trUtf8(u'Remove entry?'),
                    self.trUtf8(u'Are you sure you want to remove the selected row(s)?'),
                    QMessageBox.Yes | QMessageBox.No,
                    QMessageBox.No)
        if answer == QMessageBox.Yes:
            indexes = self.entryTableView.selectedIndexes()
            rows = set()
            for index in indexes:
                if index.isValid():
                    rows.add(index.row()) 
            rows = sorted(rows, reverse = True)
            print rows
            for row in rows:
                self.entryTableModel.removeRows(row)
                    
            self.resizeColumns()
            
        
    def updateEntryList(self):
        pass
    
    def filterEntryList(self, columnName, text):
        self.entryTableModel.beginResetModel()
#        print "%s: %s" % (columnName, text)
        self.entryTableModel.entries = self.dataAccessService.getEntriesByFilter(self.ktable, columnName, text)
        
        self.entryTableModel.endResetModel()
        
        self.resizeColumns()
        
    def entrySelected(self, entry):
        self.emit(SIGNAL('entrySelected'), entry)
        
    def resizeColumns(self):
        self.entryTableView.resizeColumnsToContents()
        # resize to content anything but BIG_TEXT columns
#        for index, column in enumerate(self.ktable.columns):
#            if column.type != BIG_TEXT:
#                self.entryTableView.resizeColumnToContents(index)
#            else:
#                colWidth = self.calculateColumnHeaderWidth(index) + 20
#                self.entryTableView.setColumnWidth(index, colWidth)
                
    def selectEntryAtIndex(self, rowIndex):
        modelIndex = self.entryTableModel.index(rowIndex, 0)
        if modelIndex.isValid():
            self.entryTableView.setCurrentIndex(modelIndex)
            
    def calculateColumnHeaderWidth(self, index):
#        font = self.entryTableView.font()
#        painter = QPainter()
#        painter.setFont(font)
#        painter.fontMetrics()
        fontMetrics = self.entryTableView.fontMetrics()
        text = self.entryTableModel.headerData(index).toString()
        width = fontMetrics.width(text)
        
        return width