15 июля 2009 г.

Текстовый редактор. Часть 2

Текстовый редактор. Часть 1

Продолжаем разрабатывать текстовый редактор. Сегодня добавим в него меню и функции открытия и сохранения файлов.


Про создание меню я писал в статьях Часть 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 из транка вроде как с поддержкой Виндовс, хотелось бы узнать, а получилось ли у вас запустить её под Виндой? У меня всё время сыпятся ошибки загрузки дллок.

Shecspi комментирует...

Да, программа запускается и все функции вполне корретно работают.
Основной проблемой является кодировка. В сегодняшней ревизии добавил пользовательский выбор языка при запуске. Не идеал, но лучше, чем было.
Для работы программы каких-то специфических библиотек не требуется, необходимо подключить php_sqlite.dll и php_pdo.dll (они, по моему, по умолчанию входят в поставку PHP). Напишите текст ошибки, может смогу помочь.

P.S С подобными вопросами лучше обращаться сюда.