# coding: utf8
"""
Модуль диспетчера событий.
Нужен для того, чтобы отвязать графику от логики
"""

if True:
	import time as мВрем
	from пакОберон.пакКомпилятор import тКомпилер

class тДиспетчер:
	__slots__ = ("__оберон", "__стрФайл_исх", "__стрУровень", "__конс", "__гуи", "__окнГлав")
	def __init__(сам, пОберон, пУровень):
		сам.__оберон = пОберон
		сам.__стрФайл_исх :str = ""
		сам.__стрУровень = пУровень + "  "

	def Старт(сам):
		сам.__конс = сам.__оберон.конс
		сам.__гуи = сам.__оберон.гуи
		сам.__окнГлав = сам.__гуи.окнГлав
		теги = ["MODULE", "IMPORT","CONST", "TYPE", "VAR", "PROCEDURE", "BEGIN", \
				"END", "FLOOR", "REAL", "INTEGER", "BOOLEAN", "RECORD", "POINTER", \
				"TO", "ARRAY", "OF", "CHAR", "RECORD"]
		сам.__окнГлав.рамкаСред.Теги_Добавить(теги)
		сам.__конс.Шапка_Печать()
		сам.__гуи.Пуск()

	def Исх_Открыть(сам,):
		сам.__оберон.конс.Отладить(сам.__стрУровень + "тДиспетчер.Файл_Открыть()")
		from tkinter import filedialog as fd
		сам.__стрФайл_исх = fd.askopenfilename(filetypes=(("Оберон файлы", "*.o7"),
													 ("Текстовые файлы", "*.txt;*.me"),
																("Все файлы", "*.*") ))
		if сам.__стрФайл_исх != "":
			f = open(сам.__стрФайл_исх, 'r', encoding='utf-8')
			сИсх = f.read()
			f.close()
			сам.__окнГлав.рамкаСред.Исх_Вставить(сИсх)

	def Приложение_Закрыть(сам, событие=None):
		import sys
		sys.exit()

	def Компилировать(сам):
		сам.__окнГлав.консоль.Очистить()
		сам.__конс.Шапка_Печать()
		сам.__конс.Отладить(сам.__стрУровень + "тДиспетчер.Компилировать()")
		стрИсх = сам.__окнГлав.рамкаСред.текстКод.get('1.0','end')
		стрИсх = стрИсх[:-1]
		if сам.__стрФайл_исх != "":
			f = open(сам.__стрФайл_исх, 'w', encoding='utf-8')
			f.write(стрИсх)
			f.close()

			сам.__конс.Печать(сам.__стрУровень + сам.__оберон.рес.компиляция + "\"" + сам.__стрФайл_исх + "\"")

			врем_нач = мВрем.time()
			компилер = тКомпилер(сам.__оберон, сам.__стрФайл_исх)
			компилер.Обработать()

			врем_кон = мВрем.time()
			врем_дельта = врем_кон - врем_нач
			время = str(врем_дельта*1000)[0:7]
			стрВремя = "Время компиляции: " + время + " мс"
			сам.__конс.Печать(стрВремя)
		else:
			сам.__конс.Ошибка(сам.__стрУровень + "тДиспетчер.Компилировать(): нет файла для компиляции")
			return

	@property
	def стрИмяФайла(сам):
		return сам.__стрФайл_исх
