# THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
# APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
# HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
# OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
# IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
# ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

# IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
# WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
# THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
# GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
# USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
# DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
# PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
# EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGES.

# Copyright (c) 2018 Dr. Oliver Barth <info@drb-electronic.de>
# Frame for table

import Tkinter as tk
import ttk
from tableCell import *

#
class DrbTable():
	#
	def __init__(self, frame, name, numRows, numCols, colWidth, header):
		self.frame = frame
		self.name = name
		self.selRow = 0
		self.selCol = 0
		self.numRows = numRows
		self.numCols = numCols + 1 # additional table index left
		self.colWidth = colWidth
		self.header = header
		
		self.scrbar = tk.Scrollbar(frame)
		self.scrbar.grid(row=0, column=1, sticky='ns')
		self.posTableCanvas = tk.Canvas(frame, yscrollcommand=self.scrbar.set)
		self.posTableCanvas.grid(row=0, column=0)
		self.scrbar.config(command=self.posTableCanvas.yview)
		self.innerFrame = ttk.Frame(self.posTableCanvas)
		self.innerFrame.bind('<Configure>', self.OnFrameConfigure)
		self.posTableCanvas.bind('<Configure>', self.FrameWidth)
		self.posTableCanvas.create_window((0,0), window=self.innerFrame, anchor='nw')
		self.entries = []
		self.addHeader()

	#
	def addHeader(self):
		entryRow = []
		self.colWidth.insert(0, 5)
		self.header.insert(0, '')
		for i in range(0, self.numCols):
			en = TableCell(self.innerFrame, width=self.colWidth[i], style='TableHeader.TEntry')
			en.setLoc(0, i)
			en.grid(row=0, column=i, sticky="ew", padx=0, pady=0)
			en.delete(0, tk.END)
			en.insert(0, self.header[i])
			en.bind("<FocusIn>", self.focusInEvent)
			entryRow.append(en)
		self.entries.append(entryRow)
	
	#
	def FrameWidth(self, event):
		canvas_width = event.width
		self.posTableCanvas.itemconfig(self.innerFrame, width = canvas_width)

	#
	def OnFrameConfigure(self, event):
		self.posTableCanvas.configure(scrollregion=self.posTableCanvas.bbox("all"), width=self.innerFrame.winfo_width())

	#
	def addRow(self, values):
		entryRow = []
		values.insert(0, str(self.numRows))
		for i in range(0, self.numCols):
			en = TableCell(self.innerFrame, width=self.colWidth[i], style='TableCell.TEntry')
			en.setLoc(self.numRows, i)
			en.grid(row=self.numRows, column=i, sticky="ew", padx=0, pady=0)
			en.delete(0, tk.END)
			en.insert(0, values[i])
			en.bind("<FocusIn>", self.focusInEvent)
			entryRow.append(en)
		self.entries.append(entryRow)
		self.numRows += 1

	#
	def getRowCount(self):
		return self.numRows
		
	#
	def getRow(self, row):
		entryRow = self.entries[row]
		ret = []
		for i in range(1, self.numCols): # don't return index
			ret.append(entryRow[i].get())
		return ret

	#
	def setCellValue(self, row, col, value):
		if (row <= self.numRows) and (col <= self.numCols):
			entryRow = self.entries[row]
			entryRow[col].delete(0, tk.END)
			entryRow[col].insert(0, value)
			return True
		else:
			return False

	#
	def delSelRow(self):
		entryRow = self.entries[self.selRow]
		for k in range(0, self.numCols):
			entryRow[k].destroy()
		self.entries.pop(self.selRow)
		self.selRow = 0
		self.numRows -= 1
		# renumber
		for i in range (0, self.numRows):
			entryRow = self.entries[i]
			for k in range (0, self.numCols):
				entryRow[k].setLoc(i, k)
	#
	def focusInEvent(self, event):
		actRow = event.widget.getRow()
		actCol = event.widget.getCol()
		if actRow > 0:
			# remove selected color
			if self.selRow > 0:
				entryRow = self.entries[self.selRow]
				for i in range(0, self.numCols):
					entryRow[i].config(style='TableCell.TEntry')
			# set selected color
			entryRow = self.entries[actRow]
			for i in range(0, self.numCols):
				entryRow[i].config(style='TableCellSel.TEntry')
			self.selRow = actRow

	#
	def getSelRowIdx(self):
		return self.selRow

	#
	def getSelRow(self):
		entryRow = self.entries[self.selRow]
		ret = []
		for i in range(1, self.numCols):
			ret.append(entryRow[i].get())
		return ret



