Продолжаем разрабатывать текстовый редактор. Сегодня добавим в него меню и функции открытия и сохранения файлов.
Про создание меню я писал в статьях Часть 1 и Часть 2. Создание диалога для открытия файлов описывалось в Диалоговые окна. Выбор файлов. Более детального рассмотрения требует только метод save_file(), предназначенный для сохранения файлов.
public function save_file()
{
$start = $this->buffer->get_start_iter();
$end = $this->buffer->get_end_iter();
$text = $this->buffer->get_text($start, $end);
$fopen = fopen($this->filename, 'w+');
fwrite($fopen, $text);
fclose($fopen);
}
Для того, чтобы получить текст, находящийся в данный момент в текстовом буфере применяется метод get_text(). Ему передаются два параметра: начальная и конечная позиции. Начальную возвращает метод get_start_iter(), а конечную - get_end_iter().
Полный код программы:
<?php
class TextEditor
{
private $buffer, $filename;
public function __construct()
{
$window = new GtkWindow;
$window->set_size_request(600, 300);
$window->set_title('PHP-GTK2::Текстовый редактор');
$window->set_position(Gtk::WIN_POS_CENTER);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$menubar = new GtkMenuBar();
$file_menu_item = new GtkMenuItem('_Файл');
$menubar->append($file_menu_item);
$sub_file = new GtkMenu();
$file_menu_item->set_submenu($sub_file);
$open = new GtkImageMenuItem(Gtk::STOCK_OPEN);
$open->connect_simple('activate', array($this, 'open_file'));
$sub_file->append($open);
$save = new GtkImageMenuItem(Gtk::STOCK_SAVE);
$save->connect_simple('activate', array($this, 'save_file'));
$sub_file->append($save);
$sub_file->append(new GtkSeparatorMenuItem());
$close = new GtkImageMenuItem(Gtk::STOCK_CLOSE);
$close->connect_simple('activate', array('Gtk', 'main_quit'));
$sub_file->append($close);
$this->buffer = new GtkTextBuffer();
$text = new GtkTextView();
$text->set_buffer($this->buffer);
$scroll = new GtkScrolledWindow();
$scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
$scroll->add($text);
$vbox = new GtkVBox();
$vbox->pack_start($menubar, FALSE, FALSE, 0);
$vbox->pack_start($scroll, TRUE, TRUE);
$window->add($vbox);
$window->show_all();
}
public function open_file()
{
$dialog = new GtkFileChooserDialog(
'Выбрать файл',
NULL,
Gtk::FILE_CHOOSER_ACTION_OPEN,
array(
Gtk::STOCK_CANCEL, Gtk::RESPONSE_CANCEL,
Gtk::STOCK_OK, Gtk::RESPONSE_OK
)
);
$dialog->show_all();
$result = $dialog->run();
if ($result == Gtk::RESPONSE_OK)
{
$this->filename = $dialog->get_filename();
$text = trim(file_get_contents($this->filename));
$this->buffer->set_text($text);
}
$dialog->destroy();
}
public function save_file()
{
$start = $this->buffer->get_start_iter();
$end = $this->buffer->get_end_iter();
$text = $this->buffer->get_text($start, $end);
$fopen = fopen($this->filename, 'w+');
fwrite($fopen, $text);
fclose($fopen);
}
}
new TextEditor();
Gtk::main();
2 комментария:
Вопрос любопытства ради, версия FlightFiles из транка вроде как с поддержкой Виндовс, хотелось бы узнать, а получилось ли у вас запустить её под Виндой? У меня всё время сыпятся ошибки загрузки дллок.
Да, программа запускается и все функции вполне корретно работают.
Основной проблемой является кодировка. В сегодняшней ревизии добавил пользовательский выбор языка при запуске. Не идеал, но лучше, чем было.
Для работы программы каких-то специфических библиотек не требуется, необходимо подключить php_sqlite.dll и php_pdo.dll (они, по моему, по умолчанию входят в поставку PHP). Напишите текст ошибки, может смогу помочь.
P.S С подобными вопросами лучше обращаться сюда.
Отправить комментарий