Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// Возвращает Employee из элемента списка item если item != NULL, иначе возвращает пустой Employee
- Employee getOrCreate(ListItem *item) {
- Employee emp;
- if (item != NULL)
- emp = item->employee;
- else
- memset(&emp, 0, sizeof(Employee));
- return emp;
- }
- /// Преобразует значение currentValue в строку из числа (если numberField == TRUE) или просто копирует в буфер buffer.
- void convertToString(char *buffer, void *currentValue, bool numberField) {
- if (numberField) // Если формат - число переводим число в строку
- sprintf(buffer, "%u", *((unsigned int *) currentValue));
- else // Если формат - строка, то просто копируем её как есть
- strcpy(buffer, currentValue);
- }
- /// Рисует поле ввода для числового или текстового поля с ограничением символов maxChars, в окне win, в строке line с
- /// названием поля label. Текущее значение - currentValue, Буфер для преобразований - buffer
- int
- drawInputField(WINDOW *win, int line, int maxChars, bool numberField, char *buffer, char *label, void *currentValue) {
- convertToString(buffer, currentValue, numberField);
- unsigned firstByteValue = *((unsigned int *) currentValue); // Для числа - его значение, для строки - первый символ
- char *format = firstByteValue == 0 ? "%L16s: " : "%L16s(%s): "; // Шаблон для названия поля
- wprintMB(win, line, 1, A_NORMAL, format, label, buffer); // Название поля
- int xPosition = getcurx(win); // Сохраняем текущую позицию курсора
- wgetnstr(win, buffer, numberField ? maxChars : 40); // Ожидаем ввода не более maxChars для чисел и 40 для строк
- if (!*buffer && firstByteValue != 0)
- // Если поле пусто, и есть значение по-умолчанию, вставляем значение по-умолчанию (текущее)
- convertToString(buffer, currentValue, numberField);
- // Поле должно быть не пусто и содержать только цифры, если оно числовое и не превышает размера maxChars
- bool isValid = *buffer && (!numberField || isNumber(buffer)) && getUTF8StrLen(buffer) <= maxChars;
- // Если в поле введено неверное значение, то подсвечиваем значение, если верное, то выделяем зелёным
- wprintMB(win, line, xPosition, isValid ? COLOR_PAIR(4) : A_REVERSE, "%L14s", buffer);
- wrefresh(win);
- if (isValid) { // Если введённое значение верное, обновляем переменную
- if (numberField)
- sscanf(buffer, "%u", (unsigned *) currentValue);
- else
- strcpy((char *) currentValue, buffer);
- return 1;
- }
- return 0;
- }
- bool showEditDialog(ListItem *item) {
- Employee emp = getOrCreate(item); // Структура о сотруднике из списка или пустая
- WINDOW *editorWindow = createDialog(45, 19);
- char *title = item != NULL ? "Редактирование" : "Вставка";
- char buffer[64]; // Буфер для хранения текущей переменной
- int validFields; // Для подсчёта правильных значений поля
- do {
- validFields = 0;
- wclear(editorWindow);
- box(editorWindow, 0, 0); // Рамка окна
- mvwprintw(editorWindow, 1, (45 - getUTF8StrLen(title)) / 2, title); // Заголовок окна
- echo(); // Включаем отображение введённых символов
- validFields += drawInputField(editorWindow, 3, 6, true, buffer, "Номер отдела", &emp.depNumber);
- validFields += drawInputField(editorWindow, 5, 8, true, buffer, "Таб. номер", &emp.employeeId);
- validFields += drawInputField(editorWindow, 7, 6, true, buffer, "Тема", &emp.topicId);
- validFields += drawInputField(editorWindow, 9, 4, true, buffer, "Длит.работы(мес)", &emp.workDurationInMonth);
- validFields += drawInputField(editorWindow, 11, 6, true, buffer, "Код долж.", &emp.positionCode);
- validFields += drawInputField(editorWindow, 13, 8, true, buffer, "Зарплата (руб)", &emp.salaryAmount);
- validFields += drawInputField(editorWindow, 15, 20, false, buffer, "Фамилия", &emp.lastName);
- noecho();// Отключаем отображение введённых символов
- int choice;
- if (validFields == 7) {
- const char *choices[] = {"Сохранить", "Снова", "Отмена"};
- choice = drawButtonGroup(editorWindow, 17, choices, 3);
- } else {
- const char *choices[] = {"Снова", "Отмена"};
- choice = drawButtonGroup(editorWindow, 17, choices, 2) + 1;
- }
- switch (choice) {
- case 1: // Снова
- continue;
- case 0: // Сохранить
- if (item == NULL) { // Если новая запись - добавить в конец
- if (findListItemById(list, emp.employeeId) == NULL) { // Смотрим, есть ли в базе такой элемент
- add(list, emp);
- return true;
- } else {
- showMessageDialog("Запись с таким номером уже существует");
- continue;
- }
- } else {
- item->employee = emp; // Если редактирование - заменить
- return true;
- }
- default: // Отмена
- return false;
- }
- } while (true);
- }
Add Comment
Please, Sign In to add comment