Перем РасширениеФайлаМодуля;
Перем ИсторияГита;

Процедура ПриОткрытии()
	мПлатформа.ЗагрузитьКэшМодулейВПамятьОС();
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	ирКлиент.ИмяФайлаМодуляВПапкеГитаЛкс("", ПапкаГита); // Чтобы настройки Гита открылись
	Если Не ЗначениеЗаполнено(ПапкаГита) Тогда
		Возврат;
	КонецЕсли;
	ирКлиент.ДопСвойстваЭлементаФормыЛкс(ЭтаФорма, ЭлементыФормы.ИзмененныеМодули).МенеджерПоиска = ирКлиент.СоздатьМенеджерПоискаВТабличномПолеЛкс(Новый Структура("Текст")); // Для отключения раскраски
	ЭтаФорма.ДатаОбновленияКэша = ирОбщий.ДатаОбновленияКэшаМодулейЛкс();
	ИсторияГита = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирИсторияГита");
	ЭтаФорма.ЭлементыФормы.НадписьПоследнийКоммит.Заголовок = ИсторияГита.ДатаПоследнегоКоммита();
	ПодключитьОбработчикОжидания("ПриОткрытииОтложенно", 0.1, Истина); // - 0.1 не хватает при открытии из Турбоконфа
КонецПроцедуры

Процедура ПриОткрытииОтложенно()
	ОбновитьДанные();
КонецПроцедуры

Процедура ОбновитьДанные() Экспорт
	Если Не ЗначениеЗаполнено(ПапкаГита) Тогда
		Возврат;
	КонецЕсли;
	ТабличноеПолеСостояние = ирКлиент.ТабличноеПолеСостояниеСтрокЛкс(ЭлементыФормы.ИзмененныеМодули, "Модуль"); /// Нельзя делать рекурсивно, т.к. модули расширений смогут перекрывать оригиналы
	ИзмененныеМодули.Очистить();
	ФайлыМодулейКэша = НайтиФайлы(мПлатформа.ПапкаКэшаМодулей.ПолноеИмя, "*." + РасширениеФайлаМодуля);
	ТекстовыйДокументНовый = Новый ТекстовыйДокумент;
	ТекстовыйДокументСтарый = Новый ТекстовыйДокумент;
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ФайлыМодулейКэша.Количество(), "Анализ файлов");
	ПроверенныеМодулиГита = Новый Соответствие;
	Для Каждого Файл Из ФайлыМодулейКэша Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		ФайлГита = Новый файл(ирКлиент.ИмяФайлаМодуляВПапкеГитаЛкс(Файл.ИмяБезРасширения, ПапкаГита));
		Если Не ФайлГита.Существует() Тогда
			Продолжить;
		КонецЕсли; 
		ПроверенныеМодулиГита[ФайлГита.ПолноеИмя] = 1;
		ТекстовыйДокументНовый.Прочитать(Файл.ПолноеИмя);
		ТекстовыйДокументСтарый.Прочитать(ФайлГита.ПолноеИмя, КодировкаТекста.UTF8);
		СтарыйТекст = ТекстовыйДокументСтарый.ПолучитьТекст();
		Если СтарыйТекст = ТекстовыйДокументНовый.ПолучитьТекст() Тогда
			Продолжить;
		КонецЕсли;
		СтрокаМодуля = ИзмененныеМодули.Добавить();
		СтрокаМодуля.Модуль = Файл.ИмяБезРасширения;
		СтрокаМодуля.ФайлГита = ФайлГита.ПолноеИмя;
		СтрокаМодуля.ФайлКэша = Файл.ПолноеИмя;
		СтрокаМодуля.ДатаИзмененияКэша = Файл.ПолучитьВремяИзменения();
		Если СтрокаМодуля.Модуль = ПараметрИмяТекущегоМодуля Тогда
			ЭлементыФормы.ИзмененныеМодули.ТекущаяСтрока = СтрокаМодуля;
			ТабличноеПолеСостояние = Неопределено;
		КонецЕсли;
	КонецЦикла;
	ФайлыМодулейГита = НайтиФайлы(ПапкаГита, "*.bsl", Истина);
	Для Каждого Файл Из ФайлыМодулейГита Цикл
		Если Ложь
			Или ПроверенныеМодулиГита[Файл.ПолноеИмя] <> Неопределено 
			Или Файл.Размер() = 0
		Тогда
			Продолжить;
		КонецЕсли;
		СтрокаМодуля = ИзмененныеМодули.Добавить();
		СтрокаМодуля.ФайлГита = Файл.ПолноеИмя;
		ВнутреннееИмяФайла = СтрЗаменить(Сред(Файл.ПолноеИмя, СтрДлина(ПапкаГита) + 2), ирОбщий.РазделительПутиКФайлуЛкс(), "/");
		СтрокаМодуля.Модуль = ирКлиент.ИмяМодуляИзИмениФайлаГитаЛкс(ВнутреннееИмяФайла);
		СтрокаМодуля.ФайлКэша = мПлатформа.ИмяФайлаМодуляИзИмениМодуля(СтрокаМодуля.Модуль);
	КонецЦикла;
	ИзмененныеМодули.Сортировать("Модуль");
	ЭтаФорма.ПараметрИмяТекущегоМодуля = "";
	ЭтаФорма.Количество = ИзмененныеМодули.Количество();
	ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
	Если ТабличноеПолеСостояние <> Неопределено Тогда
		ирКлиент.ТабличноеПолеВосстановитьСостояниеСтрокЛкс(ЭлементыФормы.ИзмененныеМодули, ТабличноеПолеСостояние);
	КонецЕсли;
	ПодключитьОбработчикОжидания("ОбновитьДатыКоммитов", 0.1, Истина);
КонецПроцедуры

Процедура ОбновитьДатыКоммитов() Экспорт
	Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ИзмененныеМодули.Количество(), "Даты изменения Гита");
	Для Каждого СтрокаМодуля Из ИзмененныеМодули Цикл
		ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
		СтрокаМодуля.ДатаИзмененияГита = ИсторияГита.ДатаПоследнегоКоммита(СтрокаМодуля.ФайлГита);
	КонецЦикла;
КонецПроцедуры

Процедура ПриЗакрытии()
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
КонецПроцедуры

Функция ТекстФайлаСтроки(Знач ВыбраннаяСтрока = Неопределено)
	Если ВыбраннаяСтрока = Неопределено Тогда
		ВыбраннаяСтрока = ЭлементыФормы.ИзмененныеМодули.ТекущаяСтрока;
	КонецЕсли;
	ФайлМодуля = мПлатформа.ФайлМодуляИзИмениМодуля(ВыбраннаяСтрока.Модуль);
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ФайлМодуля.ПолноеИмя);
	ТекстФайла = ТекстовыйДокумент.ПолучитьТекст();
	Возврат ТекстФайла;
КонецФункции

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);
КонецПроцедуры

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);
КонецПроцедуры

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник);
КонецПроцедуры

Процедура КлсКомандаНажатие(Кнопка) Экспорт
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
КонецПроцедуры

Процедура НадписьКэшМодулейНажатие(Элемент)
	ПолучитьФорму("Настройки", ФормаВладелец).Открыть();
КонецПроцедуры

Процедура ИзмененныеМодулиВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	Если Ложь
		Или Колонка = Элемент.Колонки.ФайлГита 
		Или Колонка = Элемент.Колонки.ФайлКэша 
	Тогда
		ирКлиент.ОткрытьФайлВПроводникеЛкс(ВыбраннаяСтрока[Колонка.Данные]);
	Иначе
		ТекстовыйДокументНовый = Новый ТекстовыйДокумент;
		ТекстовыйДокументСтарый = Новый ТекстовыйДокумент;
		ТекстовыйДокументНовый.Прочитать(ВыбраннаяСтрока.ФайлКэша);
		ТекстовыйДокументСтарый.Прочитать(ВыбраннаяСтрока.ФайлГита, КодировкаТекста.UTF8);
		ПараметрНомерСтроки = 0;
		Если Истина
			И мМодульМетаданных <> Неопределено
			И мМодульМетаданных.Имя = ВыбраннаяСтрока.Модуль 
		Тогда
			ПараметрНомерСтроки = мНачальнаяСтрока;
		КонецЕсли;
		ЗаголовокСтороны2 = мПлатформа.ЗаголовокСтороныМодуляКонфигуратора(); 
		ирКлиент.Сравнить2ЗначенияВФормеЛкс(ТекстовыйДокументСтарый, ТекстовыйДокументНовый,, "Гит (старый)", ЗаголовокСтороны2,,, ВыбраннаяСтрока.Модуль,, "ВстроенныйЯзык", ВыбраннаяСтрока.Модуль,,,, ПараметрНомерСтроки);
	КонецЕсли;
КонецПроцедуры

Процедура ДействияФормыОткрытьВКонфигураторе(Кнопка)
	Строка = ЭлементыФормы.ИзмененныеМодули.ТекущаяСтрока;
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Ссылка = ирКлиент.СсылкаНаМодульКонфигурацииЛкс(Строка.Модуль);
	ирКлиент.ОткрытьСсылкуВКонфигуратореЛкс(Ссылка);
КонецПроцедуры

Процедура ДействияФормыЗаменитьМодуль(Кнопка)
	Сообщить("Не реализовано");
КонецПроцедуры

Процедура ИзмененныеМодулиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	ОформлениеСтроки.Ячейки.ФайлГита.УстановитьТекст("<Открыть>");
	ОформлениеСтроки.Ячейки.ФайлКэша.УстановитьТекст("<Открыть>");
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
КонецПроцедуры

Процедура ПапкаГитаОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗапуститьПриложение(Элемент.Значение);
КонецПроцедуры

Процедура ИзмененныеМодулиПриАктивизацииСтроки(Элемент)
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
КонецПроцедуры

Процедура ДействияФормыОбновить(Кнопка)
	ОбновитьДанные();
КонецПроцедуры

Процедура ДействияФормыОткрытьФайлГитаВVSCode(Кнопка)
	ТекущаяСтрока = ЭлементыФормы.ИзмененныеМодули.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ОткрытьМодульВГите(ТекущаяСтрока.Модуль);
КонецПроцедуры

Процедура ПриПовторномОткрытии(СтандартнаяОбработка)
	ПодключитьОбработчикОжидания("ПриОткрытииОтложенно", 0.1, Истина); // - 0.1 не хватает при открытии из Турбоконфа
КонецПроцедуры

Процедура ДействияФормыОткрытьИсториюГита(Кнопка)
	Если ЭлементыФормы.ИзмененныеМодули.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ПараметрИмяМодуля = ЭлементыФормы.ИзмененныеМодули.ТекущаяСтрока.Модуль;
	ирКлиент.ОткрытьИсториюГитаЛкс(, ПараметрИмяМодуля);
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирКлсПолеТекстаПрограммы.Форма.ИзмененныеМодули");
Если мПлатформа = Неопределено Тогда
	ИнициироватьНеинтерактивно();
КонецЕсли;
РасширениеФайлаМодуля = "txt";
