<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="filechooserdialog.vala" xml:lang="cs">
<info>
<title type="text">FileChooserDialog (Vala)</title>
<link type="guide" xref="beginner.vala#file-selectors"/>
<link type="seealso" xref="textview.vala"/>
<link type="seealso" xref="menubar.vala"/>
<link type="seealso" xref="scrolledwindow.vala"/>
<revision version="0.1" date="2012-07-01" status="draft"/>
<credit type="author copyright">
<name>Tiffany Antopolski</name>
<email its:translate="no">tiffany.antopolski@gmail.com</email>
<years>2012</years>
</credit>
<desc>Dialogové okno vhodné pro příkazy „Otevřít“ a „Uložit“.</desc>
</info>
<title>FileChooserDialog</title>
<links type="sections"/>
<section id="overview"><title>Shrnutí příkladu</title>
<p>Tento příklad předvádí, jak použít <code>FileChooserDialog</code>. Je začleněn do aplikace velmi jednoduchého textového editoru. Všechny <link xref="menubar.vala#win-app">akce</link>, včetně <code>"open"</code>, <code>"save"</code> a <code>"save-as"</code> najdete v <link xref="gmenu.vala">aplikační nabídce</link>. Zde ji vytvoříme pomocí souboru s uživatelským rozhraním ve formátu XML, který do aplikace naimportujeme pomocí <code>Gtk.Builder</code>.</p>
</section>
<section id="xml"><title>Soubor XML s uživatelským rozhraním, který vytvoří nabídku aplikace</title>
<code mime="application/xml" style="numbered"><?xml version="1.0"?>
<interface>
<menu id="appmenu">
<section>
<item>
<attribute name="label">New</attribute>
<attribute name="action">win.new</attribute>
</item>
<item>
<attribute name="label">Open</attribute>
<attribute name="action">win.open</attribute>
</item>
</section>
<section>
<item>
<attribute name="label">Save</attribute>
<attribute name="action">win.save</attribute>
</item>
<item>
<attribute name="label">Save As...</attribute>
<attribute name="action">win.save-as</attribute>
</item>
</section>
<section>
<item>
<attribute name="label">Quit</attribute>
<attribute name="action">app.quit</attribute>
</item>
</section>
</menu>
</interface>
</code>
</section>
<section id="vala-code"><title>Kód v jazyce Vala</title>
<code mime="text/x-csharp" style="numbered">class MyWindow: Gtk.ApplicationWindow {
/* Proměnné instance MyWindow */
GLib.File? file;
Gtk.TextBuffer buffer;
Gtk.TextView textview;
Gtk.ScrolledWindow scrolled_window;
/* Vytvoří ActionEntries. */
const ActionEntry[] actions = {
{ "new", new_cb },
{ "open", open_cb },
{ "save", save_cb },
{ "save-as", save_as_cb }
};
/* Konstruktor vytvoří MyWindow a přidá okno s posuvníky */
internal MyWindow (MyApplication app) {
Object (application: app, title: "FileChooserDialog Example");
this.set_default_size (400, 400);
/* Přidá ActionEntries do MyWindow */
this.add_action_entries (actions, this);
buffer = new Gtk.TextBuffer (null); // uchovává text, který se má zobrazit
textview = new Gtk.TextView.with_buffer (buffer); // zobrazí TextBuffer
textview.set_wrap_mode (Gtk.WrapMode.WORD); // nastaví zalamování řádků
scrolled_window = new Gtk.ScrolledWindow (null, null);
scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC,
Gtk.PolicyType.AUTOMATIC);
scrolled_window.add (textview);
scrolled_window.set_border_width (5);
this.add (scrolled_window);
this.show_all ();
}
void new_cb (SimpleAction action, Variant? parameter) {
file = null;
buffer.set_text ("");
print ("New file created\n");
}
/* Vytvoří FileChooserDialog v režimu OPEN */
void open_cb (SimpleAction action, Variant? parameter) {
var open_dialog = new Gtk.FileChooserDialog ("Pick a file",
this as Gtk.Window,
Gtk.FileChooserAction.OPEN,
Gtk.Stock.CANCEL,
Gtk.ResponseType.CANCEL,
Gtk.Stock.OPEN,
Gtk.ResponseType.ACCEPT);
open_dialog.local_only = false; // umožní zadat URI
open_dialog.set_modal (true);
open_dialog.response.connect (open_response_cb);
open_dialog.show ();
}
/* Buď otevře a načte souboru nebo akci zruší */
void open_response_cb (Gtk.Dialog dialog, int response_id) {
var open_dialog = dialog as Gtk.FileChooserDialog;
switch (response_id) {
case Gtk.ResponseType.ACCEPT: // otevře soubor
file = open_dialog.get_file();
uint8[] file_contents;
try {
file.load_contents (null, out file_contents, null);
}
catch (GLib.Error err) { // obsluha výjimky
error ("%s\n", err.message);
}
/* Nastaví text z vyrovnávací paměti jako obsah souboru */
buffer.set_text ((string) file_contents,
file_contents.length);
print ("opened: %s\n", (open_dialog.get_filename ()));
break;
case Gtk.ResponseType.CANCEL:
print ("cancelled: FileChooserAction.OPEN\n");
break;
}
dialog.destroy ();
}
/* Vytvoří FileChooserDialog v režimu SAVE */
void save_as_cb (SimpleAction action, Variant? parameter) {
var save_dialog = new Gtk.FileChooserDialog ("Pick a file",
this as Gtk.Window,
Gtk.FileChooserAction.SAVE,
Gtk.Stock.CANCEL,
Gtk.ResponseType.CANCEL,
Gtk.Stock.SAVE,
Gtk.ResponseType.ACCEPT);
save_dialog.set_do_overwrite_confirmation (true);
save_dialog.set_modal (true);
if (file != null) {
try {
(save_dialog as Gtk.FileChooser).set_file (file);
}
catch (GLib.Error error) {
print ("%s\n", error.message);
}
}
save_dialog.response.connect (save_as_response_cb);
save_dialog.show ();
}
void save_as_response_cb (Gtk.Dialog dialog, int response_id) {
var save_dialog = dialog as Gtk.FileChooserDialog;
switch (response_id) {
case Gtk.ResponseType.ACCEPT:
file = save_dialog.get_file();
this.save_to_file ();
break;
default:
break;
}
dialog.destroy ();
}
/* Uloží stávající obsah do souboru
* Pokud soubor neexistuje, zavolá save_as_cb
*/
void save_cb (SimpleAction action, Variant? parameter) {
if (file != null) {
this.save_to_file ();
}
else {
save_as_cb (action, parameter);
}
}
void save_to_file (){
Gtk.TextIter start;
Gtk.TextIter end;
buffer.get_bounds (out start, out end);
string current_contents = buffer.get_text (start, end, false);
try {
file.replace_contents (current_contents.data, null, false,
GLib.FileCreateFlags.NONE, null, null);
print ("saved: %s\n", file.get_path ());
}
catch (GLib.Error err) {
error ("%s\n", err.message);
}
}
}
/* Toto je aplikace */
class MyApplication: Gtk.Application {
protected override void activate () {
new MyWindow (this).show_all;
}
const ActionEntry[] actions = {
{ "quit", quit_cb }
};
void quit_cb (SimpleAction action, Variant? parameter) {
this.quit ();
}
protected override void startup () {
base.startup ();
/* Vytvoří akce */
this.add_action_entries (actions, this);
/* Vytvoří nabídky */
var builder = new Gtk.Builder ();
try {
builder.add_from_file ("filechooserdialog.ui");
} catch (GLib.Error err) {
error ("Unable to load file: %s\n", err.message);
}
this.app_menu = builder.get_object ("appmenu") as MenuModel;
}
}
/* main vytvoří a spustí aplikaci */
public int main (string[] args) {
return new MyApplication ().run (args);
}
</code>
</section>
<section id="api"><title>Příslušná dokumentace k API</title>
<p>V této ukázce se používá následující:</p>
<list>
<item><p><link href="http://valadoc.org/gtk+-3.0/Gtk.FileChooser.html">FileChooser</link></p></item>
<item><p><link href="http://valadoc.org/gtk+-3.0/Gtk.FileChooserDialog.html">FileChooserDialog</link></p></item>
<item><p><link href="http://valadoc.org/gtk+-3.0/Gtk.Builder.html">Gtk.Builder</link></p></item>
<item><p><link href="http://valadoc.org/gio-2.0/GLib.ActionEntry.html">GLib.ActionEntry</link></p></item>
</list>
</section>
</page>