<?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="textview.py" xml:lang="cs">
  <info>
    <title type="text">TextView (Python)</title>
    <link type="guide" xref="beginner.py#multiline"/>
    <link type="seealso" xref="strings.py"/>
    <link type="seealso" xref="scrolledwindow.py"/>
    <link type="next" xref="dialog.py"/>
    <revision version="0.2" date="2012-06-19" status="draft"/>

    <credit type="author copyright">
      <name>Sebastian Pölsterl</name>
      <email its:translate="no">sebp@k-d-w.org</email>
      <years>2011</years>
    </credit>

    <credit type="author copyright editor">
      <name>Marta Maria Casetti</name>
      <email its:translate="no">mmcasetti@gmail.com</email>
      <years>2012</years>
    </credit>

    <desc>Widget, který zobrazuje GtkTextBuffer</desc>
  </info>

  <title>TextView</title>

  <note style="sidebar"><p>Toto je příklad widgetu Gtk.TextView.</p>
  <p>Když zmáčkneme <key>Enter</key>, dostaneme nový řádek.</p>
  <p>Můžeme se ale také dostat na nový řádek, když píšeme dlouhé věty (text bude zalomen na řádky mezi slovy).</p>
  <p>Když máme dlouhééééééééééééééééééééééééééééééééééé</p>
  <p>(to bylo dlouhé)</p>
  <p>slovo, objeví se vodorovný posuvník.</p></note>

  <media type="image" mime="image/png" src="media/textview.png"/>

  <links type="section"/>

  <section id="code">
  <title>Kód použitý k vygenerování tohoto příkladu</title>

  <code mime="text/x-python" style="numbered">from gi.repository import Gtk
import sys


class MyWindow(Gtk.ApplicationWindow):

    def __init__(self, app):
        Gtk.Window.__init__(self, title="TextView Example", application=app)
        self.set_default_size(300, 450)

        # Posuvníky pro synovský widget (což bude TextView)
        scrolled_window = Gtk.ScrolledWindow()
        scrolled_window.set_border_width(5)
        # Posuvníky zobrazit jen v případě potřeby
        scrolled_window.set_policy(
            Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)

        # Textová vyrovnávací paměť (uchovává text)
        buffer1 = Gtk.TextBuffer()

        # TextView (zobrazuje obsah vyrovnávací paměti)
        textview = Gtk.TextView(buffer=buffer1)
        # wrap the text, if needed, breaking lines in between words
        textview.set_wrap_mode(Gtk.WrapMode.WORD)

        # TextView má posuvníky
        scrolled_window.add(textview)

        self.add(scrolled_window)


class MyApplication(Gtk.Application):

    def __init__(self):
        Gtk.Application.__init__(self)

    def do_activate(self):
        win = MyWindow(self)
        win.show_all()

    def do_startup(self):
        Gtk.Application.do_startup(self)

app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)
</code>
  </section>

  <section id="methods">
  <title>Užitečné metody pro widget TextView</title>
  <p><code>Gtk.TextView</code> zobrazuje text uchovávaný v <code>Gtk.TextBuffer</code>. Většina zásahů do textu je však prováděna pomocí iterátorů představovaných objektem <code>Gtk.TextIter</code> – pozicí mezi dvěma znaky v textové vyrovnávací paměti. Iterátory nemají trvalou platnost. Vždy, když dojde ke změně ve vyrovnávací paměti způsobem, který ovlivní obsah, stanou se všechny zasažené iterátory neplatnými. Z tohoto důvodu nelze iterátory použít k uchování pozic mezi změnami vyrovnávací paměti. K uchování pozice použijeme značky <code>Gtk.TextMark</code>, které lze zviditelnit pomocí <code>visible(True)</code>. Textová vyrovnávací paměť obsahuje dvě vestavěné značky. Značku „insert“ (pozice kurzoru) a „selection_bound“ (hranice výběru).</p>
  <p>Metody pro widget TextView:</p>
  <list>
    <item><p>Widget <code>TextView</code> umožňuje ve výchozím stavu úpravy. Pokud požadujete opak, použijte <code>set_editable(False)</code>. Pokud vyrovnávací paměť nemá upravitelný text, je dobrý nápad také použít <code>set_cursor_visible(False)</code> ke skrytí kurzoru.</p></item>
    <item><p>Zarovnání textu se nastavuje pomocí <code>set_justification(Gtk.Justification.JUSTIFICATION)</code>, kde <code>JUSTIFICATION</code> je něco z <code>LEFT, RIGHT, CENTER, FILL</code>.</p></item>
    <item><p>Zalamování textu se nastavuje pomocí <code>set_wrap_mode(Gtk.WrapMode.WRAP)</code>, kde <code>WRAP</code> je jedno z <code>NONE</code> (textová oblast bude rozšířena), <code>CHAR</code> (řádky se zalamují, kdekoliv se může vyskytnout kurzor), <code>WORD</code> (řádky se zalamují za celými slovy), <code>WORD_CHAR</code> (řádky se zalamují mezi slovy, ale když to není možné, tak i mezi znaky).</p></item>
  </list>
  <p>Metody pro widget TextBuffer:</p>
  <list>
    <item><p><code>get_insert()</code> vrací <code>Gtk.TextMark</code>, který představuje kurzor, což je místo vkládání.</p></item>
    <item><p><code>get_selection_bound()</code> vrací <code>Gtk.TextMark</code>, který představuje hranice výběru.</p></item>
    <item><p><code>set_text("nějaký text", délka)</code>, kde <code>délka</code> je celé kladné číslo nebo <code>-1</code>, nastaví obsah vyrovnávací paměti prvních <code>délka</code> znaků z textu <code>"nějaký text"</code>. Jestliže je <code>délka</code> vynechána nebo <code>-1</code>, je text vložen celý. Pokud byl ve vyrovnávací paměti před tím nějaký obsah, je zlikvidován.</p></item>
    <item><p><code>insert(iterátor, "nějaký text", délka)</code>, kde <code>iterárot</code> je textový iterátor a <code>délka</code> je celé kladné číslo nebo <code>-1</code>, vloží do vyrovnávací paměti na pozici danou <code>iterátorem</code> prvních <code>délka</code> znaků z textu <code>"nějaký text"</code>. Jestliže je <code>délka</code> vynechána nebo je <code>-1</code>, je text vložen celý.</p></item>
    <item><p><code>insert_at_cursor("nějaký text", délka)</code> dělá to stejné, co <code>insert(iterátor, "nějaký text", délka)</code> s tím, že aktuální kurzor se vezme jako <code>iterátor</code>.</p></item>
    <item><p><code>create_mark("název_značky", iterátor, přitahovat_vlevo)</code>, kde <code>iterátor</code> je <code>Gtk.TextIter</code> a <code>přitahovat_vlevo</code> je pravdivostní hodnota, vytvoří značku <code>Gtk.TextMark</code> na pozici <code>iterátor</code>. Pokud je <code>"název_značky"</code> zadán jako <code>None</code>, je značka anonymní, v opačném případě ji lze získat pomocí <code>get_mark()</code>. Když je přitahována vlevo, a na místo aktuální značky je vkládán text, posouvá se značka nalevo od nově vkládaného textu. V případe, že je <code>přitahovat_vlevo</code> vynecháno, je výchozí hodnotou <code>False</code>.</p></item>
    <item><p>Abyste nějakému textu ve vyrovnávací paměti určili konkrétní formát, musíte nadefinovat značku (<code>tag</code>), která si bude pamatovat formátovací informace, a pak ji použít na úsek textu pomocí <code>create_tag("název značky", vlastnost)</code> a <code>apply_tag(značka, iterátor_počátku, iterátor_konce)</code>. Například:</p>
      <code>
tag = textbuffer.create_tag("orange_bg", background="orange")
textbuffer.apply_tag(tag, start_iter, end_iter)</code>
     <p>Následují některé obvyklé styly používané u textu:</p>
      <list>
        <item><p>Barva pozadí (vlastnost „background“)</p></item>
        <item><p>Barva popředí (vlastnost „foreground“)</p></item>
        <item><p>Podtržení (vlastnost „underline“)</p></item>
        <item><p>Tučné (vlastnost „weight“)</p></item>
        <item><p>Kurzíva (vlastnost „style“)</p></item>
        <item><p>Přeškrtnutí (vlastnost „strikethrouhg“)</p></item>
        <item><p>Zarovnání (vlastnost „justification“)</p></item>
        <item><p>Velikost (vlastnosti „size“ a „size-points“)</p></item>
        <item><p>Zalamování textu (vlastnost „wrap-mode“)</p></item>
      </list>
    <p>Můžete také dodatečně konkrétní značky smazat pomocí <code>remove_tag()</code> nebo smazat všechny značky v zadané oblasti zavoláním <code>remove_all_tags()</code>.</p></item>
  </list>
  <p>Metody pro widget TextIter</p>
  <list>
    <item><p><code>forward_search(co_hledat, příznaky, omezení)</code> hledá směrem od začátku ke konci <code>co_hledat</code>. Hledání nepokračuje při při dosažení omezení <code>Gtk.TextIter</code>. Parametr <code>příznaky</code> může být nastaven na něco z následujícího, případně i na kombinaci více možností pospojovaných bitovým operátorem OR <code>|</code>: <code>0</code> (musí se shodovat přesně), <code>Gtk.TextSearchFlags.VISIBLE_ONLY</code> (nalezená shoda může být oproti hledanému proložená neviditelným textem), <code>Gtk.TextSearchFlags.TEXT_ONLY</code> (nalezená shoda může mít uvnitř obrázky nebo jiné synovské widgety), <code>Gtk.TextSearchFlags.CASE_INSENSITIVE</code> (text bude porovnáván bez ohledu na velikost písmen). Metoda vrací dvojici obsahující <code>Gtk.TextIter</code> ukazující na začátek shody a na první znak za shodu. Pokud není nic nalezeno, je vráceno <code>None</code>.</p></item>
    <item><p><code>backward_search(co_hledat, příznaky, omezení)</code> dělá to stejné jako <code>forward_search()</code>, akorát směrem od konce k začátku.</p></item>
  </list>
  </section>

  <section id="references">
  <title>Odkazy k API</title>
  <p>V této ukázce se používá následující:</p>
  <list>
    <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTextView.html">GtkTextView</link></p></item>
    <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTextBuffer.html">GtkTextBuffer</link></p></item>
    <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTextTag.html">GtkTextTag</link></p></item>
    <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkScrolledWindow.html">GtkScrolledWindow</link></p></item>
    <item><p><link href="http://developer.gnome.org/gtk3/unstable/gtk3-Standard-Enumerations.html">Standardní výčtové konstanty</link></p></item>
  </list>
  </section>
</page>
