31 мая 2009 г.

Программа расчёта хеш-суммы. Часть 2.

В первой части мы создали программу, которая рассчитывает MD5-хэш для введённой строки. Сегодня я предлагаю дополнить её, добавив возможность выбора между алгоритмами MD5 и SHA1, а также будем выводить диалоговое окно, если пользователь не ввёл исходный текст.

Для смены алгоритма создадим простое меню и поместим его в GtkVBox(), а потом туда же добавим и уже созданную таблицу. Обратите внимание, в зависимости от выбранного алгоритма мы будем менять содержимое нижнего GtkLabel(), поэтому код создания меню нужно расположить ниже создаваемой таблицы, т.к. должна быть доступна переменная $label_hash. Но добавляем их в GtkVBox() в логически верном порядке.

При смене алгоритма вызываем функцию change_alg(), которая устанавливает новое значение в GtkLabel() и помещает его в глобальную переменную $g_alg.

Функцию расчёта хэша on_calc() мы изменили, а именно добавили проверку на пустоту значения GtkLabel() и теперь расчёт производится в зависимости от выбранного алгоритма.

Если вы внимательно читали предыдущие статьи, то проблем с пониманием кода возникнуть не должно. Но если всё-таки что-то непонятно, то спрашивайте в комментариях.

Полный код программы:
<?php
 
$window = new GtkWindow();
$window->set_title('Расчёт хеш-суммы');
$window->set_position(Gtk::WIN_POS_CENTER);
$window->set_resizable(FALSE);
$window->set_size_request(500, -1);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$vbox = new GtkVBox();
 
//////////////////////////
///// Таблица с содержимым
//////////////////////////
$table = new GtkTable();
 
$label_source = new GtkLabel('Исходный текст:');
$label_hash = new GtkLabel('Получившийся MD5:');
$entry_source = new GtkEntry();
$entry_hash = new GtkEntry();
$button_close = new GtkButton('_Закрыть');
$button_calc = new GtkButton('_Расчитать');
 
$table->attach($label_source, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
$table->attach($entry_source, 1, 2, 0, 1);
$table->attach($label_hash, 0, 1, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
$table->attach($entry_hash, 1, 2, 1, 2);
$table->attach($button_close, 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
$table->attach($button_calc, 1, 2, 2, 3, Gtk::FILL, Gtk::FILL);
 
$button_close->connect_simple('clicked', array('Gtk', 'main_quit'));
$button_calc->connect_simple('clicked', 'on_calc',
$entry_source, $entry_hash);
$entry_source->connect_simple('activate', 'on_calc',
$entry_source, $entry_hash);
 
//////////
///// Меню
//////////
$menubar = new GtkMenuBar();
 
$algoritm = new GtkMenuItem('_Алгоритм');
$menubar->append($algoritm);
$sub_algoritm = new GtkMenu();
$algoritm->set_submenu($sub_algoritm);
 
$md5 = new GtkRadioMenuItem(NULL, 'MD5');
$md5->connect_simple('toggled', 'change_alg', 'md5');
$md5->set_active(TRUE);
$sub_algoritm->append($md5);
 
$sha1 = new GtkRadioMenuItem($md5, 'SHA1');
$sha1->connect_simple('toggled', 'change_alg', 'sha1');
$sub_algoritm->append($sha1);
 
/////////////
///// Функции
/////////////
 
function change_alg($alg)
{
global $label_hash, $g_alg;
 
$g_alg = $alg;
$label_hash->set_text('Получившийся '.strtoupper($alg).':');
}
 
function on_calc($source, $hash)
{
$input = $source->get_text();
 
if (empty($input) AND !preg_match('#0#', $input))
{
$dialog = new GtkDialog('Ошибка', NULL, Gtk::DIALOG_MODAL);
$dialog->set_position(Gtk::WIN_POS_CENTER);
$dialog->set_resizable(FALSE);
$dialog->set_size_request(250, 100);
$top_area = $dialog->vbox;
$top_area->pack_start($hbox = new GtkHBox());
$hbox->pack_start(GtkImage::new_from_stock(Gtk::STOCK_DIALOG_WARNING,
Gtk::ICON_SIZE_DIALOG));
$hbox->pack_start(new GtkLabel('Вы не ввели текст!'));
$dialog->add_button(Gtk::STOCK_OK, Gtk::RESPONSE_OK);
$dialog->set_has_separator(FALSE);
$dialog->show_all();
$dialog->run();
$dialog->destroy();
}
else
{
global $g_alg;
 
$input = $source->get_text();
if ($g_alg == 'md5')
$hash->set_text(md5($input));
elseif ($g_alg == 'sha1')
$hash->set_text(sha1($input));
}
 
$source->set_text('');
$source->grab_focus();
}
 
$vbox->pack_start($menubar, FALSE, FALSE, 0);
$vbox->pack_start($table);
$window->add($vbox);
$window->show_all();
Gtk::main();
 
?>
 

Комментариев нет: