1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 10:49:24 +02:00

android options dialog (finished)

added empty string after the copyright notice
XHTML reader (in progress)
small improvements (see changes in TODO file)


git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@816 6a642e6f-84f6-412e-ac94-c4a38d5a04b0
This commit is contained in:
Nikolay Pultsin 2008-04-12 15:36:53 +00:00
parent 8151bfa518
commit 08442edafb
335 changed files with 4442 additions and 4364 deletions

66
TODO
View file

@ -36,14 +36,14 @@ DONE избавиться от многократных вычислений (ZL
DONE fb2 (сделать чтение описания книги) DONE fb2 (сделать чтение описания книги)
DELAYED chm DELAYED chm
2 html 2 html
1 oeb/epub 0 oeb/epub
DELAYED openreader DELAYED openreader
3 ztxt DELAYED ztxt
2 palmdoc 2 palmdoc
Марина 1 plucker 1 plucker
DELAYED rtf DELAYED rtf
DELAYED tcr DELAYED tcr
3 txt DELAYED txt
файловая система: файловая система:
архивы архивы
@ -55,9 +55,9 @@ DELAYED bz2
диалоги (abstract): диалоги (abstract):
DONE Selection DONE Selection
DONE открытие книги DONE открытие книги
Оля 0 Option DONE Option
Оля 0 настройки DONE настройки
Оля 0 book info DONE book info
DONE MessageBox DONE MessageBox
DONE WaitMessage DONE WaitMessage
DONE загрузка книги DONE загрузка книги
@ -67,28 +67,28 @@ DELAYED сохранение конфига
DONE диалог поиска DONE диалог поиска
DONE combobox вместо поля для текста DONE combobox вместо поля для текста
1 multisection search 1 multisection search
3 диалог перехода на страницу по номеру DELAYED диалог перехода на страницу по номеру
диалоги (swing): диалоги (swing):
DONE Selection DONE Selection
Оля 0 Option DELAYED Option
DONE MessageBox DONE MessageBox
Оля 0 WaitMessage DELAYED WaitMessage
DONE другие DONE другие
диалоги (android): диалоги (android):
DONE Selection DONE Selection
НМ 0 Option DONE Option
правильное расположение парных опций DELAYED правильное расположение парных опций
кнопки наверху -- со стрелками влево DELAYED кнопки наверху -- со стрелками влево
DONE show/hide option views DONE show/hide option views
DONE boolean option view DONE boolean option view
boolean3 option view DONE boolean3 option view
DONE spin option view DONE spin option view
DONE string option view DONE string option view
combo option view DONE combo option view
DONE color option view DONE color option view
key option view DONE key option view
DONE choice option view DONE choice option view
DONE MessageBox DONE MessageBox
DONE WaitMessage DONE WaitMessage
@ -130,7 +130,7 @@ DONE убрать вывод отладочной информации в анд
DONE ActionCode.SHOW_BOOK_INFO DONE ActionCode.SHOW_BOOK_INFO
1 ActionCode.SCROLL_TO_START_OF_TEXT 1 ActionCode.SCROLL_TO_START_OF_TEXT
1 ActionCode.SCROLL_TO_END_OF_TEXT 1 ActionCode.SCROLL_TO_END_OF_TEXT
1 ActionCode.OPEN_PREVIOUS_BOOK DONE ActionCode.OPEN_PREVIOUS_BOOK
1 ActionCode.GOTO_NEXT_TOC_SECTION 1 ActionCode.GOTO_NEXT_TOC_SECTION
1 ActionCode.GOTO_PREVIOUS_TOC_SECTION 1 ActionCode.GOTO_PREVIOUS_TOC_SECTION
DELAYED ActionCode.COPY_SELECTED_TEXT_TO_CLIPBOARD DELAYED ActionCode.COPY_SELECTED_TEXT_TO_CLIPBOARD
@ -141,26 +141,42 @@ DELAYED ActionCode.CLEAR_SELECTION
DONE поиск DONE поиск
DONE поиск следующего DONE поиск следующего
DONE поиск предыдущего DONE поиск предыдущего
НМ 0 написать другой how-to-start (без иконок) DONE текст в пустом CollectionView
Марина 0 автоопределение языка/кодировки 0 написать другой how-to-start (без иконок)
Марина 0 обработка разных кодировок (в хитрых форматах типа plucker) 0 написать README
1 автоопределение языка/кодировки
1 обработка разных кодировок (в хитрых форматах типа plucker)
DONE выход по escape из view, не из приложения DONE выход по escape из view, не из приложения
получение списка шрифтов в ZLPaintContext получение списка шрифтов в ZLPaintContext
Марина 0 swing DELAYED swing
DONE android DONE android
DELAYED полноэкранный режим DELAYED полноэкранный режим
НМ 0 tap scrolling DONE tap scrolling
DONE возможность отключения
DELAYED обработка архивов в параметре командной строки DELAYED обработка архивов в параметре командной строки
DELAYED добавлять в библиотеку книгу из командной строки DELAYED добавлять в библиотеку книгу из командной строки
DONE xml: сделать нормальную поддержку namespace'ов DONE xml: сделать нормальную поддержку namespace'ов
DONE xml: сделать поддержку внешних DTD (xhtml entities) DONE xml: сделать поддержку внешних DTD (xhtml entities)
DONE fb2descriptionReader: interrupt() DONE fb2descriptionReader: interrupt()
НМ 0 author sort key -> to lowercase DONE author sort key -> to lowercase
DONE при нажатии на кнопку выхода (в swing) и на Esc (android) закрывать текущий View, а не выходить из программы DONE при нажатии на кнопку выхода (в swing) и на Esc (android) закрывать текущий View, а не выходить из программы
проблемы в android: проблемы в android:
combo box: цвет шрифта при первом редактировании нет возможности сделать fullscreen mode
combo box: высота пунктов в списке combo box и кнопки: цвет шрифта совпадает с цветом фона, когда контрол выделен
время работы GZIPInputStream время работы GZIPInputStream
иногда падение при загрузке большой по объему книги (креш виртуальной машины) иногда падение при загрузке большой по объему книги (креш виртуальной машины)
не сделано в андроид:
не имплементированы key and scrolling delays
text selection
засечки для пунктов из оглавления на индикаторе
часы на индикаторе
количество прочитанных страниц на индикаторе
Chinese support
не все форматы
bzip2 support
config autosaving (every 30 seconds)
go to page dialog
book tags support

View file

@ -7,59 +7,6 @@
- <node name="defaultEncoding" value="Кодировка по умолчанию"/> - <node name="defaultEncoding" value="Кодировка по умолчанию"/>
- <node name="useWindows1252Hack" value="Использовать windows-1252 вместо iso-8859-1"/> - <node name="useWindows1252Hack" value="Использовать windows-1252 вместо iso-8859-1"/>
</node> </node>
- <node name="Scrolling" value="Перелистывание">
- <node name="optionsFor" value="Настройки перелистывания">
- <node name="large" value="на большое расстояние"/>
- <node name="small" value="на небольшое расстояние"/>
- <node name="mouse" value="колесом мышки"/>
- <node name="tap" value="нажатием на экран"/>
- </node>
- <node name="delay" value="Задержка, миллисекунды"/>
- <node name="mode" value="Перелистывание">
- <node name="noOverlapping" value="без перекрытия"/>
- <node name="keepLines" value="перекрывает несколько строк"/>
- <node name="scrollLines" value="сдвигает несколько строк"/>
- <node name="scrollPercentage" value="сдвигает часть текста"/>
- <node name="disable" value="выключено"/>
- </node>
- <node name="linesToKeep" value="Сколько строк перекрывать"/>
- <node name="linesToScroll" value="Сколько строк сдвигать"/>
- <node name="percentToScroll" value="Сколько процентов сдвигать"/>
- <node name="fingerOnly" value="Только при нажатии пальцем"/>
- </node>
- <node name="Format" value="Форматирование">
- <node name="optionsFor" value="Настройки для"/>
- <node name="lineSpacing" value="Интервал">
- <node name="unchanged" value="&lt;не менять&gt;"/>
- </node>
- <node name="firstLineIndent" value="Красная строка"/>
- <node name="alignment" value="Выравнивание">
- <node name="left" value="левое"/>
- <node name="right" value="правое"/>
- <node name="center" value="по центру"/>
- <node name="justify" value="по краям"/>
- <node name="unchanged" value="&lt;не менять&gt;"/>
- </node>
- <node name="spaceBefore" value="Пропуск перед"/>
- <node name="spaceAfter" value="Пропуск после"/>
- <node name="leftIndent" value="Отступ слева"/>
- <node name="rightIndent" value="Отступ справа"/>
- </node>
- <node name="Styles" value="Стили">
- <node name="optionsFor" value="Настройки для"/>
- <node name="fontFamily" value="Шрифт">
- <node name="unchanged" value="&lt;не менять&gt;"/>
- </node>
- <node name="fontSize" value="Размер"/>
- <node name="fontSizeDifference" value="Размер"/>
- <node name="bold" value="Жирный"/>
- <node name="italic" value="Курсив"/>
- <node name="allowHyphenations" value="Переносы"/>
- <node name="autoHyphenations" value="Переносы"/>
- </node>
<node name="Keys" value="Клавиши">
<node name="keyDelay" value="Задержка между нажатиями на клавиши"/>
</node>
</node> </node>
</node> </node>
<node name="InfoDialog"> <node name="InfoDialog">

View file

@ -1,135 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>About FBReader</book-title> <lang>en</lang></title-info></description> <FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>About FBReaderJ</book-title> <lang>en</lang></title-info></description>
<body> <body>
<title><p>About FBReader &FBReaderVersion;</p></title> <title><p>About FBReaderJ &FBReaderVersion;</p></title>
<p>FBReader is an e-book reader for Linux/Windows XP PDA/UMPC/desktop computer. FBReader supports several e-book formats: <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>, etc. Direct reading from <code>zip</code>, <code>tar</code>, <code>gzip</code> and <code>bzip2</code> archives is also supported.</p> <p>FBReaderJ is an e-book reader for the <a l:href="http://www.android.com/">Android platform</a>. It is a clone of the <a l:href="http://www.fbreader.org/">FBReader book reader</a> written in Java instead of C++. FBReaderJ supports several e-book formats: <code>oeb</code>, <code>epub</code>, <code>fb2</code>. The list of supported formats will be extended in future releases. Direct reading from <code>zip</code>, <code>tar</code> and <code>gzip</code> archives is also supported.</p>
<p>You can configure FBReaderJ to read books with a pleasure. Colors, fonts, key bindings, etc. could be changed in <code>Preferences Dialog</code>.</p>
<p>FBReader is distributed under the terms of the <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p> <p>FBReader is distributed under the terms of the <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
<empty-line/> <empty-line/>
<subtitle><p>How To Start</p></subtitle> <subtitle><p>How To Start</p></subtitle>
<p>FBReader looks for <code>fb2</code>, <code>oeb</code> and <code>OpenReader</code> books in directories listed in the <code>Book Path</code> option. First of all you need to set this path. Open the options dialog (just click on <image l:href="#settings.png" voffset="-6"/> in the toolbar) and change the value of <code>Book Path</code> option in the <code>Library</code> tab. This option contains the list of directories containing <code>*.fb2</code>, <code>*.oebzip</code>, <code>*.orb</code> or archive files. Directories in the list are separated by colons.</p> <p>FBReaderJ looks for <code>epub</code>, <code>oeb</code> and <code>fb2</code> books in directories listed in the <code>Book Path</code> option. First of all you need to set this path. Open the <code>Preferences Dialog</code> (open menu and select <code>Preferences...</code> item, or just press <code>O</code> key), select the top item (<code>Library</code>) and change the value of <code>Book Path</code> option. This option contains the list of directories containing <code>*.epub</code>, <code>*.oebzip</code>, <code>*.fb2</code> or archive files. Directories in the list are separated by colons.</p>
<p>Open <code>library</code> (click on <image l:href="#books.png" voffset="-6"/>), select a book from the list and read it.</p> <p>Open <code>library</code> (<code>menu->Library->Open</code> or <code>L</code> key), select a book from the list and read it.</p>
<p>To read a file in another format, you need to add it to the library. Start <code>add to library dialog</code> (<image l:href="#addbook.png"/>), select a file and edit the file information. Next time you can open this file using <code>library</code> (<image l:href="#books.png" voffset="-6"/>).</p> <p>Alternatively, you can manually add a file to the library. Start <code>add to library dialog</code> (<code>menu->Library->Add Book...</code> or <code>A</code> key), select a file and edit the file information. Next time you can open this file using <code>library</code>.</p>
<empty-line/> <empty-line/>
<subtitle><p>Related sites</p></subtitle> <subtitle><p>Related sites</p></subtitle>
<p>More information about this program can be found at <a l:href="http://www.fbreader.org">FBReader homepage</a>.</p> <p>More information about FBReader and FBReaderJ can be found at <a l:href="http://www.fbreader.org">FBReader site</a>.</p>
<p>If you want to be notified about new releases, please subscribe to <a l:href="http://freshmeat.net/projects/fbreader">FBReader project at freshmeat</a>.</p> <p>If you want to be notified about new releases, please subscribe to <a l:href="http://freshmeat.net/projects/fbreaderj">FBReaderJ project at freshmeat</a>.</p>
<p>If you have any questions or suggestions, please use <a l:href="http://groups.google.com/group/fbreader">FBReader group at googlegroups</a>.</p> <p>If you have any questions or suggestions, please use <a l:href="http://groups.google.com/group/fbreader">FBReader group at googlegroups</a>.</p>
</body> </body>
<binary content-type="image/png" id="settings.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgI
fAhkiAAACAhJREFUWIXtlmtQVOcZx//nuvddgWXBZUEuahWQmzqI8UKsouJE
Y2qt7Uynrdrxi1OVYEF0UqcpsGJ1tNZkSIyZZDptwrRaDUaIhqGdxppO0iji
hQUVuS3swsIuLHvupx/CZlYFsZMP/dJn5pn3fc95n+f/e573nTMH+L/9j42Y
bkNNTdVymqXfB0gdCNyXBeHDYFB46/Dhw9zzilQff6dIA/WLkpKdvv8K4MiR
IyaVkAJpqbORl7sQ/kAArbdbOO+g180FhYKDBw8OTCd+5MS7+xVVqaEoqlsQ
pOWHSnc+inxPPiu4rKxslCapld09j8b9gYDiSHBg7Zr12qzM7CSDSXf+WbF1
dXXU0VPvnWV1ml8tLihAYkqKnWGof1eeeDvruQEAoLS0/O+cKK365MplUlVV
XpIkZC3Ipgx6w4Lqo68XTlr1kXdMDwfGm0xm89acvEUGVqNBgsNB2R2OaFIl
b9bW1jJTAlRVVcU8+axif8XnAPyiKPYCAM/zSE1NM7C0Zsuk1Drqq/j4+Pys
3BwDRVMAAFmR4fV6ggRB/HjXrl3ipABOZ+VaklYHT5068f3I59XHqnMBWGia
DtI0DZIkYTQaCZqmUybTJ1TEzJmdohEEAaLAQxJ5tN9t4wRebCjfu/0PkXsf
A2A0zNmc7FxIivTH2to3XgaAmprKHEJSLs1Jm/uawWBI0Wg00Gq14DhOBeB+
UtzprLXIijxDkkQIfAiyKGDQ41F9Q94RgpN/9uR++jEAhhlKdCTZk2el0H+9
eO68s6YSCoDMBQtOrVhWWKGqqlaSJNA0jd7eHkkUxccKOFxbqyc4tnn+vDRR
lSXG7/MhFBpHX5+HIBRlU1nZztGnuhW5OH6ipjJ9fmZZbs5CiiQfvx6yLCMY
DEJRFDAMA17g0dBQzwmSuG1/SfmFw7W1em2IacrKmJNntpiYllbXeCAwdhcq
PoWKa+Ul2y9MelyRi8rKyjijWe/a8spWM8uykGUZJEmCIAhIkgSKouDz+dDa
2gqbzQZbnA0NDfUcL8obFSb2YF7mvIKoKCN741b7+PCw/82yvdtLJxONNCpy
0dTUFCxat8btcrWtcyQ4aKvVCoZhwDAMZFmGPzACRVYgiiII4mv29IwM2vVw
4EdZ6d9xxNmi2dY7HSHv4Mjb5fu2l0wn/lQHwnb0qHMTzdJnjAajLsZqJYPB
oOLxDNCiKGo2FL+kCrxIAICqqmh1dcMaEw37zFi03Ong+93eM+X7dux+HvEp
AYCvv2QPHtxLVykijlSIMYbR35Tl0ByKYT9bW7TeIPAiceteJywWCxId8bjT
9hDuni6BV4ZmH3r1UPe3BpjMktZXpceasSMjgdq9YuE8NsZiwKwkO9o6HoEh
CSTZZyjXrn82ND7GZ1RUVHifJ+e0n+KwpW6o3q5lmX+9sm7FnpAmlfrd+Q4Y
LdHouN8NKDLS5yYhISGRzM7KjdYZNV86nU7L8+Slpt8CpGyo2siy7Nkfbi7U
Fy5MJrV6Azk8yuODxpvITTUjP2cuaJoGz/NwOBJJWZIN/tHhzUvyC95tbm4W
n5V7WoDk4qp8mqIubi5epg/yKv5xy41O9zDsNgsGPH5ZHnfLS3LnUAABiqLA
cRySk1NIf8AfJYr82vz8gvebm5vlqfI/8whmra9eRZHUlfWr8/UKQcHrG4P7
fgu6736O8WAQoyE+6A2K+y43fswpqgJFUUCSJAKBAF4oWE7H2mw5MdYZ9XV1
dVMWOiVAWnHVLoalPtpcvMyk1emIPo8fw333EAqOIMGRiI5Or8Dzwo3zpw+e
VkTp5YbGS7wsSwAAgiAQDAZRuGIVazZbVg54+/6kquqkF/4pgLkv/daassFZ
rzPoj/1gU6FeISmIAo+xARf8wz7Y7QkYGiWF7r6BdoTUjQBQWlreqKjKlsuN
lwRe4EEQBGRZBs/zWP3dIlar0W48/cbJN6cFSC6u+oUE8aHdbluzbfOLBgUE
HDFa9Dy4De/gIOLj4zE0RgmdPQMucHjhwdVyfzj21b2/rIeCbZ9cucxzHAea
pr+BWPXiGg1FMz89+ftjB54E+KYtKcXOFayG+Shzfpo5KyMFM/QUZkZpce7j
ZnR29SAu1gqBskht7b0u8FgaKR5px08e3UaoxHurV69lWYZFIBDA4OAgHA4H
Gq9c5kReth84cGD4qQ6oUFfF2WJMq5fOQ0aSGWkzTTjXeB2dj3pgNppA6qy4
19E3KhBS0VTiAFCyZ/8HJE3tvHq1UQhxIfj9fng8HgQCAURFRckkqSya4giU
Ti1Dhkw6Gl39AZy58AU6H3aAZjSITUhFa1t3iB/zbu2pP+TDE/8REd2kAWj2
7N73Z57jS5qbPxWioqOQnp4Og9GAkZFhMhQS2yKDKAAsAL0qjHk5rePnoDTa
UU5C14M2CLyApJS56Hb7BZ+3/2JPk/MvALQANBNx5IQoC0A/4QYAhqtXm1x5
eTked797+YCnX3C57knDwyOHXv/1b65P6BIAFAKAZSKp1rboJytNM+fXLl2c
qeUD/QCjh0IZ8OVXt8f7/vnW93hf5yAALsLlCZciimEBMOG51WolsrOzo9vb
23u7uroCAAQA4sTIEwBMYQAAGtviHUUGW9pRs9kgkxRDDfv85FjPjdcGWz78
WzhowrmIuRwhTE/AhKtUASgRoOEcQrgDRASxDgBjTMyKNiYsWQiS1Ad7W26M
PrrmiahWiOiAOJE88h6QE2PY1QiI8PyxgMkuU3iMfK9ikgTf1v4DrpeFJVeZ
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook> </FictionBook>

View file

@ -1,135 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>Tietoja FBReaderista</book-title> <lang>fi</lang></title-info></description>
<body>
<title><p>Tietoja FBReaderista &FBReaderVersion;</p></title>
<p>FBReader on sähköisten kirjojen (e-kirja) lukemiseen tarkoitettu ohjelmisto Linux, Windows XP, PDA ja UMPC -tietokoneille. FBReader tukee mm. seuraavia e-kirjojen tiedostomuotoja: <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>. Kirjojen lukeminen onnistuu suoraan myös <code>zip</code>, <code>tar</code>, <code>gzip</code> ja <code>bzip2</code>-muotoihin pakatuista tiedostoista.</p>
<p>FBReader ohjelmistoa levitetään <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>-lisenssin mukaisilla ehdoilla.</p>
<empty-line/>
<subtitle><p>Aloitusohje</p></subtitle>
<p>FBReader etsii <code>fb2</code>, <code>oeb</code> ja <code>OpenReader</code>-muodossa olevia kirjoja asetusten <code>Kirjaston polku</code>-kohdassa olevista kansioista. Avaa asetukset valintaikkuna (työkalupalkin <image l:href="#settings.png" voffset="-6"/>-kuvakkeesta) ja muuta <code>Kirjasto</code>-välilehdellä olevaa <code>Kirjaston polku</code>-asetusta. Tämä asetus sisältää listauksen niistä kansioista, jotka sisältävät <code>*.fb2</code>, <code>*.oebzip</code>, <code>*.orb</code> tai kyseisiä tiedostomuotoja sisältäviä pakattuja tiedostoja. Määritettäessä useita kansioita, tulee ne erottaa toisistaan puolipilkulla.</p>
<p>Avaa <code>kirjasto</code> (työkalupalkin <image l:href="#books.png" voffset="-6"/>-kuvakkeesta), valitse kirja listasta ja voit aloittaa sen lukemisen.</p>
<p>Lukeaksesi jossakin muussa tiedostomuodossa olevan kirjan, sinuun täytyy ensin lisätä kyseinen kirja kirjastoosi. Avaa <code>lisää kirja kirjastoon</code>-valintaikkuna (työkalupalkin <image l:href="#addbook.png"/>-kuvakkeesta). Valitse kirjan tiedosto ja muokkaa kirjan tiedot haluamiksesi. Tämän jälkeen voit avata lisätyn kirjan työkalupalkin <code>kirjasto-kuvakkeen</code> (<image l:href="#books.png" voffset="-6"/>) listauksesta.</p>
<empty-line/>
<subtitle><p>Liittyvät sivustot</p></subtitle>
<p>Tästä ohjelmasta löytyy englanniksi lisätietoja <a l:href="http://www.fbreader.org">FBReaderin kotisivulta</a>.</p>
<p>Jos haluat tiedon uusien versioiden julkaisuista, tilaa <a l:href="http://freshmeat.net/projects/fbreader">FBReader-projekti freshmeat palvelussa</a>.</p>
<p>Jos sinulla on kysymyksiä tai ehdotuksia, käytä <a l:href="http://groups.google.com/group/fbreader">FBReader-ryhmää googlegroups palvelussa</a>.</p>
</body>
<binary content-type="image/png" id="settings.png">
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
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook>

View file

@ -1,135 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>À propos de FBReader</book-title> <lang>fr</lang></title-info></description>
<body>
<title><p>À propos de FBReader &FBReaderVersion;</p></title>
<p>FBReader est un lecteur de livres électroniques (e-books) pour PDA, ordinateur de bureau et UMPC sous Linux ou Windows XP. FBReader supporte plusieurs formats de livres électroniques : <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>, etc. La lecture directe à partir d'archives <code>zip</code>, <code>tar</code>, <code>gzip</code> et <code>bzip2</code> est également supportée.</p>
<p>FBReader est distribué selon les termes de la licence <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
<empty-line/>
<subtitle><p>Débuts avec FBReader</p></subtitle>
<p>FBReader cherche des livres aux formats <code>fb2</code>, <code>oeb</code> et <code>OpenReader</code> dans les répertoires indiqués dans l'option <code>Chemin des livres</code>. La première chose à faire est de remplir ce chemin. Ouvrez la boîte de dialogue d'options (il suffit de cliquer sur <image l:href="#settings.png" voffset="-6"/> dans la barre d'outils) et changez la valeur de l'option <code>Chemin des livres</code> dans l'onglet <code>Bibliothèque</code>. Cette option contient la liste des répertoires contenant des fichiers <code>*.fb2</code>, <code>*.oebzip</code>, <code>*.orb</code> ou des fichiers archives. Les répertoires de cette liste sont séparés par des caractères deux-points.</p>
<p>Ouvrez la <code>bibliothèque</code> (cliques sur <image l:href="#books.png" voffset="-6"/>) et sélectionnez un livre de la liste afin de le lire.</p>
<p>Pour lire un fichier dans un autre format, vous devez l'ajouter à la bibliothèque. Ouvrez le dialogue <code>Ajouter un livre</code> (<image l:href="#addbook.png"/>), sélectionnez un fichier et éditez les informations correspondantes. Dans l'avenir, vous pourrez ouvrir ce livre directement depuis la <code>bibliothèque</code> (<image l:href="#books.png" voffset="-6"/>).</p>
<empty-line/>
<subtitle><p>Informations complémentaires</p></subtitle>
<p>Davantage d'informations sur ce programme se trouvent sur la <a l:href="http://www.fbreader.org">page Web de FBReader</a>.</p>
<p>Si vous souhaitez être prévenu des nouvelles versions, veuillez vous inscrire au <a l:href="http://freshmeat.net/projects/fbreader">projet FBReader de freshmeat</a>.</p>
<p>Si vous avez des questions ou des suggestions, veuillez utiliser le <a l:href="http://groups.google.com/group/fbreader">groupe FBReader de googlegroups</a>.</p>
</body>
<binary content-type="image/png" id="settings.png">
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
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook>

View file

@ -1,135 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>Mengenai FBReader</book-title> <lang>id</lang></title-info></description>
<body>
<title><p>Mengenai FBReader &FBReaderVersion;</p></title>
<p>FBReader adalah aplikasi pembaca buku elektronik (e-book) untuk komputer PDA/UMPC/desktop dengan sistem operasi Linux/Windows XP. FBReader mendukung beberapa format buku elektronik: <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>, dan lain-lain. Juga mendukung pembacaan langsung dari berkas terkompresi dalam format <code>zip</code>, <code>tar</code>, <code>gzip</code> dan <code>bzip2</code>.</p>
<p>FBReader didistribusikan di bawah lisensi <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
<empty-line/>
<subtitle><p>Bagaimana Memulainya</p></subtitle>
<p>FBReader mencari buku format <code>fb2</code>, <code>oeb</code> dan <code>OpenReader</code> dalam direktori yang tercantum dalam pengaturan <code>Lokasi Buku</code>. Anda perlu mengatur lokasi ini terlebih dahulu. Buka dialog pengaturan (klik pada ikon <image l:href="#settings.png" voffset="-6"/> di toolbar) dan ubah pengaturan <code>Lokasi Buku</code> pada halaman <code>Pustaka</code>. Pengaturan ini berisi daftar direktori yang terdapat berkas <code>*.fb2</code>, <code>*.oebzip</code>, <code>*.orb</code> atau berkas terkompresi. Daftar direktori ini dipisahkan oleh titik dua.</p>
<p>Buka <code>pustaka</code> (klik pada ikon <image l:href="#books.png" voffset="-6"/>), pilih sebuah buku dari daftar dan Anda bisa mulai membaca.</p>
<p>Untuk membaca berkas dalam format lain, Anda perlu menambahkannya ke pustaka. Mulailah <code>dialog tambah ke pustaka</code> (<image l:href="#addbook.png"/>), pilih sebuah berkas dan ubah informasi berkasnya jika perlu. Di lain waktu Anda dapat membuka berkas ini menggunakan <code>pustaka</code> (<image l:href="#books.png" voffset="-6"/>).</p>
<empty-line/>
<subtitle><p>Alamat yang berkaitan</p></subtitle>
<p>Informasi tambahan mengenai aplikasi ini dapat ditemukan di <a l:href="http://www.fbreader.org">situs FBReader</a>.</p>
<p>Jika ingin menerima informasi mengenai rilis baru aplikasi ini, silakan daftarkan diri ke <a l:href="http://freshmeat.net/projects/fbreader">proyek FBReader di freshmeat</a>.</p>
<p>Jika Anda memiliki pertanyaan atau masukan, silakan gunakan <a l:href="http://groups.google.com/group/fbreader">grup FBReader di googlegroups</a>.</p>
</body>
<binary content-type="image/png" id="settings.png">
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
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook>

View file

@ -1,135 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>Informazioni su FBReader</book-title> <lang>it</lang></title-info></description>
<body>
<title><p>Informazioni su FBReader &FBReaderVersion;</p></title>
<p>FBReader è un lettore di e-book per PDA/UMPC/computer Linux/Windows. FBReader supporta diversi formati di e-book: <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>, etc. E' anche supportata la lettura diretta da archivi <code>zip</code>, <code>tar</code>, <code>gzip</code> e <code>bzip2</code>.</p>
<p>FBReader è distribuito nei termini is della licenza <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
<empty-line/>
<subtitle><p>Come Iniziare</p></subtitle>
<p>FBReader cerca i libri <code>fb2</code>, <code>oeb</code> e <code>OpenReader</code> nelle cartelle elencate nell'opzione <code>Percorso Libri</code>. Prima di tutto occorre impostare questo percorso. Apri la finestra Opzioni (basta fare clic su <image l:href="#settings.png" voffset="-6"/> nella barra degli strumenti) and cambiare il valore dell'opzione <code>Percorso Libri</code> nella scheda <code>Biblioteca</code>. Questa opzione contiene l'elenco delle cartelle contenenti file <code>*.fb2</code>, <code>*.oebzip</code>, <code>*.orb</code> o archivi. Le cartelle dell'elenco sono separate da due punti.</p>
<p>Apri <code>biblioteca</code> (fare clic su <image l:href="#books.png" voffset="-6"/>), seleziona un libro dall'elenco e leggi.</p>
<p>Per leggere un file in un altro formato, devi aggiungerlo alla biblioteca. Apri la <code>finestra aggiungi alla biblioteca</code> (<image l:href="#addbook.png"/>), seleziona un file e modifica le informazioni sul file. La prossima volta puoi aprire questo file usando la <code>biblioteca</code> (<image l:href="#books.png" voffset="-6"/>).</p>
<empty-line/>
<subtitle><p>Siti correlati</p></subtitle>
<p>Ulteriori informazioni su questo programma possono essere trovate alla <a l:href="http://www.fbreader.org">homepage di FBReader</a>.</p>
<p>Se vuoi essere informato sull'uscita di nuove versioni, per favore iscriviti al <a l:href="http://freshmeat.net/projects/fbreader">progetto FBReader su freshmeat</a>.</p>
<p>Se hai domande o suggerimenti, per favore usa il <a l:href="http://groups.google.com/group/fbreader">gruppo di FBReader su google gruppi</a>.</p>
</body>
<binary content-type="image/png" id="settings.png">
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
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook>

View file

@ -1,135 +1,19 @@
<?xml version="1.0" encoding="koi8-r"?> <?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>ï ÐÒÏÇÒÁÍÍÅ FBReader</book-title> <lang>ru</lang></title-info></description> <FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>О программе FBReaderJ</book-title> <lang>ru</lang></title-info></description>
<body> <body>
<title><p>ï ÐÒÏÇÒÁÍÍÅ FBReader &FBReaderVersion;</p></title> <title><p>О программе FBReaderJ &FBReaderVersion;</p></title>
<p>FBReader &#8211; ÐÒÏÇÒÁÍÍÁ ÄÌÑ ÞÔÅÎÉÑ ÜÌÅËÔÒÏÎÎÙÈ ËÎÉÇ, ÒÁÂÏÔÁÀÝÁÑ ÐÏÄ ÏÐÅÒÁÃÉÏÎÎÙÍÉ ÓÉÓÔÅÍÁÍÉ Linux, FreeBSD, Windows XP. FBReader ÐÏÚ×ÏÌÑÅÔ ÞÉÔÁÔØ ËÎÉÇÉ ×Ï ÍÎÏÇÉÈ ÆÏÒÍÁÔÁÈ: <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>, É&#160;Ô.&#160;Ä. æÁÊÌÙ ÍÏÖÎÏ ÞÉÔÁÔØ ÎÁÐÒÑÍÕÀ ÉÚ ÁÒÈÉ×Ï× <code>zip</code>, <code>tar</code>, <code>gzip</code> É <code>bzip2</code>.</p> <p>FBReaderJ &#8211; программа для чтения электронных книг, работающая на платформе <a l:href="http://www.android.com/">Android</a>. Она представляет из себя клон программы <a l:href="http://www.fbreader.org/">FBReader</a>, написанный на Java вместо C++. FBReaderJ позволяет читать книги в разных форматах: <code>oeb</code>, <code>epub</code>, <code>fb2</code>. Список поддерживаемых форматов увеличится в новых версиях. Файлы можно читать напрямую из архивов <code>zip</code>, <code>tar</code> и <code>gzip</code>.</p>
<p>FBReader ÒÁÓÐÒÏÓÔÒÁÎÑÅÔÓÑ Ó×ÏÂÏÄÎÏ, ×ËÌÀÞÁÑ ÉÓÈÏÄÎÙÅ ÔÅËÓÔÙ, ÐÏÄ ÌÉÃÅÎÚÉÅÊ <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p> <p>Вы можете настроить FBReaderJ, чтобы читать так, как удобнее именно вам. Цвета, шрифты, настройки клавиш и многое другое можно поменять в <code>диалоге настроек</code>.</p>
<p>FBReaderJ распространяется свободно, включая исходные тексты, под лицензией <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
<empty-line/> <empty-line/>
<subtitle><p>ó ÞÅÇÏ ÎÁÞÁÔØ</p></subtitle> <subtitle><p>С чего начать</p></subtitle>
<p>FBReader Á×ÔÏÍÁÔÉÞÅÓËÉ ÓÏÂÉÒÁÅÔ × ÂÉÂÌÉÏÔÅËÕ ÆÁÊÌÙ ÆÏÒÍÁÔÏ× <code>fb2</code>, <code>oeb</code> É <code>OpenReader</code>, ÌÅÖÁÝÉÅ × ËÁÔÁÌÏÇÁÈ, ÚÁÄÁÎÎÙÈ ÐÁÒÁÍÅÔÒÏÍ <code>&#171;ëÁÔÁÌÏÇÉ Ó ËÎÉÇÁÍÉ&#187;</code>. ðÏÜÔÏÍÕ ÐÒÅÖÄÅ ×ÓÅÇÏ ÎÕÖÎÏ ÏÐÒÅÄÅÌÉÔØ ÜÔÏÔ ÐÁÒÁÍÅÔÒ. ïÔËÒÏÊÔÅ ÄÉÁÌÏÇ ÎÁÓÔÒÏÅË (ÎÁÖÍÉÔÅ ÎÁ ËÎÏÐËÕ <image l:href="#settings.png" voffset="-6"/>) É ÏÔÒÅÄÁËÔÒÕÊÔÅ <code>&#171;ËÁÔÁÌÏÇÉ Ó ËÎÉÇÁÍÉ&#187;</code> × ÒÁÚÄÅÌÅ <code>&#171;âÉÂÌÉÏÔÅËÁ&#187;</code>. ëÁÔÁÌÏÇÉ ÐÅÒÅÞÉÓÌÑÀÔÓÑ ÞÅÒÅÚ Ä×ÏÅÔÏÞÉÅ, × ÜÔÉÈ ËÁÔÁÌÏÇÁÈ ÄÏÌÖÎÙ ÌÅÖÁÔØ ÆÁÊÌÙ Ó ÒÁÓÛÉÒÅÎÉÑÍÉ <code>fb2</code>, <code>oebzip</code> ÉÌÉ <code>orb</code>, ÉÌÉ ÓÏÄÅÒÖÁÝÉÅ ÉÈ ÁÒÈÉ×Ù.</p> <p>FBReader автоматически собирает в библиотеку файлы форматов <code>epub</code>, <code>oeb</code> и <code>fb2</code>, лежащие в каталогах, заданных параметром <code>&#171;Каталоги с книгами&#187;</code>. Поэтому прежде всего нужно определить этот параметр. Откройте диалог настроек (выберите в меню пункт &#171;Настройки...&#187; или просто нажмите букву &#171;O&#187;) и отредактруйте <code>&#171;каталоги с книгами&#187;</code> в разделе <code>&#171;Библиотека&#187;</code>. Каталоги перечисляются через двоеточие, в этих каталогах должны лежать файлы с расширениями <code>epub</code>, <code>oebzip</code> или <code>fb2</code>, или содержащие их архивы.</p>
<p>ôÅÐÅÒØ ÏÔËÒÏÊÔÅ <code>ÂÉÂÌÉÏÔÅËÕ</code> (ÎÁÖÍÉÔÅ ÎÁ <image l:href="#books.png" voffset="-6"/>), ×ÙÂÅÒÉÔÅ ËÎÉÇÕ, É ÐÒÉÓÔÕÐÁÊÔÅ Ë ÞÔÅÎÉÀ.</p> <p>Теперь откройте <code>библиотеку</code> (&#171;меню->Библиотека->Открыть&#187; или буква &#171;L&#187;), выберите книгу, и приступайте к чтению.</p>
<p>þÔÏÂÙ ÞÉÔÁÔØ ËÎÉÇÕ × ÄÒÕÇÏÍ ÆÏÒÍÁÔÅ, ÅÅ ÎÕÖÎÏ ×ÒÕÞÎÕÀ ÄÏÂÁ×ÉÔØ × ÂÉÂÌÉÏÔÅËÕ. úÁÐÕÓÔÉÔÅ <code>ÄÉÁÌÏÇ ÄÏÂÁ×ÌÅÎÉÑ ËÎÉÇÉ</code> (<image l:href="#addbook.png"/>), ×ÙÂÅÒÉÔÅ ÆÁÊÌ É ÏÔÒÅÄÁËÔÉÒÕÊÔÅ ÉÎÆÏÒÍÁÃÉÀ Ï ËÎÉÇÅ. ÷ ÓÌÅÄÕÀÝÉÊ ÒÁÚ ×Ù ÓÍÏÖÅÔÅ ÏÔËÒÙÔØ ÜÔÕ ËÎÉÇÕ ÕÖÅ Ó ÐÏÍÏÝØÀ <code>ÂÉÂÌÉÏÔÅËÉ</code> (<image l:href="#books.png" voffset="-6"/>).</p> <p>Есть и другой вариант, книгу можно вручную добавить в библиотеку. Запустите <code>диалог добавления книги</code> (&#171;меню->Библиотека->Добавить...&#187; или буква &#171;A&#187;), выберите файл и отредактируйте информацию о книге. В следующий раз вы сможете открыть эту книгу уже с помощью <code>библиотеки</code>.</p>
<empty-line/> <empty-line/>
<subtitle><p>óÓÙÌËÉ</p></subtitle> <subtitle><p>Ссылки</p></subtitle>
<p>éÎÆÏÒÍÁÃÉÀ Ï FBReader'Å É Ó×ÅÖÕÀ ×ÅÒÓÉÀ ÐÒÏÇÒÁÍÍÙ ÍÏÖÎÏ ÎÁÊÔÉ ÎÁ <a l:href="http://www.fbreader.org">ÓÁÊÔÅ FBReader'Á</a>.</p> <p>Информацию о программах FBReader и FBReaderJ и их свежие версии можно найти на <a l:href="http://www.fbreader.org">сайте FBReader'а</a>.</p>
<p>åÓÌÉ ×Ù ÈÏÔÉÔÅ ÐÏÌÕÞÁÔØ ÓÏÏÂÝÅÎÉÑ Ï ÎÏ×ÙÈ ×ÅÒÓÉÑÈ, ÐÏÄÐÉÛÉÔÅÓØ ÎÁ <a l:href="http://freshmeat.net/projects/fbreader">ÐÒÏÅËÔ FBReader ÎÁ freshmeat</a>.</p> <p>Если вы хотите получать сообщения о новых версиях, подпишитесь на <a l:href="http://freshmeat.net/projects/fbreaderj">проект FBReaderJ на freshmeat</a>.</p>
<p>þÔÏÂÙ Ó×ÑÚÁÔØÓÑ Ó Á×ÔÏÒÁÍÉ ÐÒÏÇÒÁÍÍÙ, ×ÏÓÐÏÌØÚÕÊÔÅÓØ <a l:href="http://groups.google.com/group/fbreader">ÇÒÕÐÐÏÊ FBReader ÎÁ googlegroups</a>.</p> <p>Чтобы связаться с авторами программы, воспользуйтесь <a l:href="http://groups.google.com/group/fbreader">группой FBReader на googlegroups</a>.</p>
</body> </body>
<binary content-type="image/png" id="settings.png">
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
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook> </FictionBook>

View file

@ -1,135 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>Om FBReader</book-title> <lang>sv</lang></title-info></description>
<body>
<title><p>Om FBReader &FBReaderVersion;</p></title>
<p>FBReader är en e-boksläsare för Linux/Windows XP PDA/UMPC/skrivbordsdator. FBReader har stöd för flera e-boksformat: <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>, etc. Direktläsning från arkivformaten <code>zip</code>, <code>tar</code>, <code>gzip</code> och <code>bzip2</code> stöds också.</p>
<p>FBReader distribueras under villkoren för <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
<empty-line/>
<subtitle><p>Hur man kommer igång</p></subtitle>
<p>FBReader letar efter böcker i formaten <code>fb2</code>, <code>oeb</code> och <code>OpenReader</code> i kataloger som listas i alternativet <code>Boksökväg</code>. Först måste du ange denna sökväg. Öppna alternativdialogrutan (klicka helt enkelt på <image l:href="#settings.png" voffset="-6"/> i verktygsraden) och ändra värdet för alternativet <code>Boksökväg</code> under fliken <code>Bibliotek</code>. Detta alternativ innehåller listan över kataloger som innehåller <code>*.fb2</code>, <code>*.oebzip</code>, <code>*.orb</code> eller arkivfiler. Kataloger i listan separeras med kolon.</p>
<p>Öppna <code>biblioteket</code> (klicka på <image l:href="#books.png" voffset="-6"/>), välj en bok från listan och läs den.</p>
<p>För att läsa en fil i ett annat format måste du lägga till den till biblioteket. Starta <code>Lägg till i biblioteket</code> (<image l:href="#addbook.png"/>), välj en fil och redigera filinformationen. Nästa gång så kan du öppna denna fil med <code>biblioteket</code> (<image l:href="#books.png" voffset="-6"/>).</p>
<empty-line/>
<subtitle><p>Relaterade webbplatser</p></subtitle>
<p>Mer information om det här programmet kan hittas på <a l:href="http://www.fbreader.org">FBReaders webbplats</a>.</p>
<p>Om du vill bli informerad om nya utgåvor kan du prenumerera på <a l:href="http://freshmeat.net/projects/fbreader">FBReaders projektsida på Freshmeat</a>.</p>
<p>Om du har några frågor eller förslag kan du använda <a l:href="http://groups.google.com/group/fbreader">FBReaders grupp hos Google Groups</a>.</p>
</body>
<binary content-type="image/png" id="settings.png">
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
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook>

View file

@ -1,135 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink"><description><title-info><author><last-name>FBReader</last-name></author> <book-title>Про програму FBReader</book-title> <lang>uk</lang></title-info></description>
<body>
<title><p>Про програму FBReader &FBReaderVersion;</p></title>
<p>FBReader &#8211; програма для читання електронних книг, яка працює під операційними системами Linux, FreeBSD, Windows XP. FBReader дозволяє читати книги у багатьох форматах: <code>fb2</code>, <code>html</code>, <code>chm</code>, <code>rtf</code>, <code>plucker</code>, і&#160;т.&#160;д. Файли можна читати напряму з архівів <code>zip</code>, <code>tar</code>, <code>gzip</code> та <code>bzip2</code>.</p>
<p>FBReader поширюється вільно, разом з джерельними текстами, під лицензією <a l:href="http://www.gnu.org/licenses/gpl.html">GNU GPL</a>.</p>
<empty-line/>
<subtitle><p>З чого почати</p></subtitle>
<p>FBReader автоматично збирає у бібліотеку файли форматів <code>fb2</code>, <code>oeb</code> та <code>OpenReader</code>, що лежать у каталогах, які задані параметром <code>&#8220;Каталоги з книгами&#8221;</code>. Тому передусім треба визначити цей параметр. Відкрийте діалог налаштувань (натисніть на кнопку <image l:href="#settings.png" voffset="-6"/>) і відредагуйте <code>&#8220;каталоги з книгами&#8221;</code> у розділі <code>&#8220;Бібліотека&#8221;</code>. Каталоги перелічуються через двокрапку i повинні містити файли з розширеннями <code>fb2</code>, <code>oebzip</code> або <code>orb</code>, чи архіви, що їх містять.</p>
<p>Тепер відкрийте <code>бібліотеку</code> (натисніть на <image l:href="#books.png" voffset="-6"/>), виберіть книгу і починайте читати.</p>
<p>Щоб читати книгу у іншому форматі, її потрібно вручну додати у бібліотеку. Запустіть <code>діалог додавання книги</code> (<image l:href="#addbook.png"/>), виберіть файл і відредагуйте інформацію про книгу. Наступного разу ви зможете відкрити цю книгу вже за допомогою <code>бібліотеки</code> (<image l:href="#books.png" voffset="-6"/>).</p>
<empty-line/>
<subtitle><p>Посилання</p></subtitle>
<p>Інформацію про FBReader та нову версію програми можна знайти на <a l:href="http://www.fbreader.org">сайтi FBReader'у</a>.</p>
<p>Якщо ви бажаєте отримувати повідомлення про нові версії, підпишіться на <a l:href="http://freshmeat.net/projects/fbreader">проект FBReader на freshmeat</a>.</p>
<p>Для зв'язку з авторами програми скористуйтесь <a l:href="http://groups.google.com/group/fbreader">групою FBReader на googlegroups</a>.</p>
</body>
<binary content-type="image/png" id="settings.png">
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
L6EAAAAASUVORK5CYII=
====
</binary>
<binary content-type="image/png" id="books.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA9rAAAPawHzS2yFAAAAB3RJTUUH1wIFECMDtXeg
zgAABUNJREFUWMPVVmtsU2UYfr5zabt2W3e6nXYr3aVjY2zDbtxHwGG4GI3B
amJi9A8STfSX0fhT/Gc0Uf/AfxMkMcSoQMVIgAUwoKJmsBUBGSuMyVjXrlvv
PT23zx+udB0bO7olxDc5Oed833vyPO/zXr4DGDTR528Sff6qedbNC6zXiD7/
gXnWiejzv114ZwyCr7ay0iUHN7V7LrjJbDkO4NU563aeKCcFU+p534ZNZPae
yWz5TBBd+wvvnAFwbxmbP7O22ebSNPMhwda7I5uTbjAMa0/y1j2dW55Zf+n0
0ROz/G08Ub7vWMFsqK4SEYmyP2/cuu08ADqZr9pUv27HzlR0NGqIgOjzr7Aw
+b5ub5nHXmkDAKtDsL9FKcWfYcC76mnkVE6f5W/hiHqsrRbbVrgEAECDp7YH
QM+diAKPuxdZ3VaCwT0C3Glm5DO+JkuzYC8v2bsZpqho3Y1EjgGRJsiMP88S
7atWp76rwV1T4j86qYDWbYVE7AClixMQfX7BRORTa+r59hqhomRvKKyhvGUX
EhIHKRlBdvg0MTOUUyl/eGWNusfrEUtyPhZToIibIbMOUJ0+hMXNA17BE+WH
Tg/X7aqxl+yFJlSUNe9AUjYjn45BGjmL9a2VCN5JfypYFdPKerHEPzytICes
h2pyQdf0eZVm5oCXcUT9rt1NeuqcpZ11J6KAb9yOlGJFPhNH9nYf1nrLcHdS
h92imVY1iiCkGHwkoSJV0QXN6oG2AHgJAdHnN3FE/batlj7lqXU8lEPG8yQy
eiXkXBLp4T50N5pwbwrQ8km0NdWUgMdSKqYtHaAVXqiq9sguY4oP+qEWUX+2
0V2NuTnUXT3IEQFyLo3kUB+6GhhIGo9YPIN2rwiGKQqZyGgYUz1ghVYoirro
jCkq4GneBktp5OG4Cs21GaTcA1nKIj7UB5+HorLcClWjcHdsRSiiQ5sprkhC
xX29HozZjrysGpqwD4pwVVsbnljzIvpOBkDT98GUCajyboacikNTZEzfPIs1
dQqqKostubO3BwzXi3PnL0DKZWCvb0STUIfQjUGjE75IgBCCHl8zdbveIGOx
LKaSWYSjCSSnJzEx3IcOZxbVVaUtSQCs9rphr3wO45NphKcyiKcl/Bub04YE
PMdQCwcQXQdAoKkqcfIxiI7KEs9UTp/1FaGFIizcjBJY+DAi/1wmiwW8eyPG
YgooAJ0CoQkFcvlKzB0rszvhPyowD0OGxb69r+C3/iAGBwZAwcDV1YZsNg1Q
LNkWJQAC8ByDLes60dTYiHAsg/FYGplsBsthzFI+po+bAB4/Afr/SwHHsVDk
nLw8ClAAIIZ5cCwDLR7KT4yG9i0PAUIoIcbGDssyQPovZeTa7y9Hg4EzSyZA
AJ0AuqE8MwSsNK6Frv6yNxoMBJZcAzMTj1KDviZlkg4PXHwzOnj8yBKLkBTk
pkaJltE4vXXlx3ciA8c+X3IXkJmDp1iEC4tACGAlKdy6fG7/xJWjB5ehDQlA
jEYO2NgcbvWf/Xi8/5uPlnYWFCKfB3whNnJmCsO3rx1U5Pz7hgcRpXTesqK6
TnN59WFwqpPRe+OMNudfX5WzdPxu6HBeyr4bDQYWVYwtPOg2D08t9p3VDoHk
JAXpnIJsJoXr/Rc/Gbx6Q6xx1zt4nicZSUE8kcDVX88d+WPwypeRhLTd4XQj
rwGjI7eVyxdOfa0q8uvRYEA1qu4Dc3a9sLuls/tDp6tubVaSrg8F+z8Y+enw
CdHnLzeZLe81tLS/xDCMPjJ07Qs5Lx2IBgOa6PN3EkJeY1jOpqnKaQABI5EX
7G/d4Snob6JgdQAAAABJRU5ErkJggg==
====
</binary>
<binary content-type="image/png" id="addbook.png">
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/
AP+gvaeTAAAACXBIWXMAAA+XAAAPlwEpEhtWAAAAB3RJTUUH1wIFEDYsKRN7
gwAABC5JREFUWMO1V11IW2cYfr6Tk5MTE40ajkm0xVbbatkaFUY7xoadbWGF
UZlMZOxijIErbHRXg93uYtdju2yvynq1tWyR4XBjjMFaxsQiapuqtNRqJelJ
NMbEnJyf791FjtmqVZMYHzgf5IHzvs/3fu/3nDcOlAkl3H/FE+ikjfjs0y38
K55A55GN+OxiOfGEMpN/Uu/MfC0LWmgLf9IfbBkF0FHuhsQykn/QVJP7NnxM
EVZW09eavW/05XUjZsJ1CErbYLC9R0nGbuFABCjh/nf9cu5auL1RkJxOBJv8
SrDJf0UzOOZSjfAcOQ1N11AJhBKSX2xw5W50HWtwSpKzyOsmYW7VB++R16Dl
LVQKYY/kvT4p90N3e71LdklF3rAIs0kP6tpeR24fyXcVoIT7T9c6tUh3e53H
7XYVeYsTHqgy6tp7kdU49gthh+SnPKI22t3m9Xlq3EWecyAad8J3/E1kqpD8
hQKUcP9xtyM/1n3U46/11hR5IiAaF+A7cQ7rOUK1IGwn+M/hVjnkq/M8x88s
6vCdOI90DlXFNgFNh9qCMa0BeYOKZx5d5nAFXobBZFQb23wgGApg8J2PcCsy
irS6BCbXo7nnFOJP5nbehZiFt/U7dLXe/7jmU+mCTY+NDOvXKzKiw4F6Ghq4
xJaTGcSTGcSSWex26kzQ0XEyi/Ndn58h0Jl0dhXf3/4mAeB6hdeQgTFGAmME
xggMxPYIJIkyLGcWCXoAr9tXeQ8QbZXy37o3mB2DV8+KSwIVl4JfkFWyarHi
jIyDgQBGYIKxmdpeLQAQL12V3FvfHBnWc/sS4A2NorXzT7js2Mxe6r0dILsK
gsAQaGy5TKDLm5UhEFLpJACd7SqgFI87Fx6C4lfAwQuhiYPAkTGTBVGSgYuv
DoGDg2DBIhMCEzF25yaA7H6PgLBuPMPTtTuwyLD3xsHJAocFTiYsMsFhwiID
nAoia0UFGk+X0AO0twCDNITkTlhkwIIJToUnqS8gZSbQLL9kizJh2aJedMMq
qgA3vfjt9u/Fa0cEiA5CsIWjtVMBAGhZA+N3x1cAxOwSEQFEfLuEsntgQz2L
DfVs8bfsciAT+0MNvP+Lsnn/LTLBLboxMqx/VoEPlP6plV0i1hYmli3X+ECh
E6yigAM3IpckYn1pMhFbmL9wtPfeQyJedEC+LwElFECSRORiM2vLj6JvqVOR
+wDItEwIphu11IJ8GRNy2T0gOUXoidns4vz02+pUZMKmtdXV1M3xvyeZ7U0M
wHTVrdgpOpBX57SF6N0BdSry1//sNQVgsFpD6Y5FsNYeG49m/nlPnYr8emAT
kWGY4Px5DYLAkNc2rIf3Jj5UpyI/VXMkc2wl8mKjvpLjfc0thwVdN5HVLSw9
ntPnp8e/eDb549Vqz4Rsh/8FfY1NoS/9gVBPKpmIqstPvqr2zjfxL9Ru5qeZ
IAUkAAAAAElFTkSuQmCC
====
</binary>
</FictionBook>

View file

@ -372,6 +372,6 @@
<node name="caption" value="Library"/> <node name="caption" value="Library"/>
<node name="allBooks" value="All Books"/> <node name="allBooks" value="All Books"/>
<node name="booksWithoutTags" value="Books with no Tags"/> <node name="booksWithoutTags" value="Books with no Tags"/>
<node name="noBooks" value="FBReader found no books in the configured locations. Please specify the path to your books in the Preferences Dialog (&#8220;Library&#8221; tab, &#8220;Book Path&#8221; entry). Alternatively, you can add books to your library using &#8220;Add Book&#8221; button."/> <node name="noBooks" value="FBReader found no books in the configured locations. Please specify the path to your books in the Preferences Dialog (&#8220;Library&#8221; tab, &#8220;Book Path&#8221; entry). Alternatively, you can add books to your library using &#8220;Add Book&#8221; menu item."/>
</node> </node>
</resources> </resources>

View file

@ -25,4 +25,5 @@
<binding key="&lt;Ctrl&gt;+&lt;DownArrow&gt;" action="nextTOCSection"/> <binding key="&lt;Ctrl&gt;+&lt;DownArrow&gt;" action="nextTOCSection"/>
<binding key="&lt;Ctrl&gt;+&lt;UpArrow&gt;" action="previousTOCSection"/> <binding key="&lt;Ctrl&gt;+&lt;UpArrow&gt;" action="previousTOCSection"/>
<binding key="&lt;Ctrl&gt;+&lt;C&gt;" action="copyToClipboard"/> <binding key="&lt;Ctrl&gt;+&lt;C&gt;" action="copyToClipboard"/>
<binding key="&lt;1&gt;" action="previousBook"/>
</keymap> </keymap>

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.sqliteconfig; package org.geometerplus.zlibrary.core.sqliteconfig;
import android.database.Cursor; import android.database.Cursor;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.sqliteconfig; package org.geometerplus.zlibrary.core.sqliteconfig;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.application; package org.geometerplus.zlibrary.ui.android.application;
import java.util.*; import java.util.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.app.Dialog; import android.app.Dialog;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import java.util.HashMap; import java.util.HashMap;

View file

@ -0,0 +1,137 @@
/*
* Copyright (C) 2007-2008 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.zlibrary.ui.android.dialogs;
import android.content.Context;
import android.view.*;
import android.widget.*;
import org.geometerplus.zlibrary.core.util.ZLBoolean3;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.core.dialogs.ZLBoolean3OptionEntry;
class ZLAndroidBoolean3OptionView extends ZLAndroidOptionView {
private TextView myLabel;
private Spinner mySpinner;
protected ZLAndroidBoolean3OptionView(ZLAndroidDialogContent tab, String name, ZLBoolean3OptionEntry option) {
super(tab, name, option);
}
protected void createItem() {
final Context context = myTab.getView().getContext();
if (myName != null) {
myLabel = new TextView(context);
myLabel.setText(myName);
myLabel.setPadding(0, 12, 0, 12);
myLabel.setTextSize(18);
}
mySpinner = new Spinner(context);
final ComboAdapter adapter = new ComboAdapter();
mySpinner.setAdapter(adapter);
mySpinner.setOnItemSelectedListener(adapter);
mySpinner.setSelection(((ZLBoolean3OptionEntry)myOption).initialState());
}
void addAndroidViews() {
myTab.addAndroidView(myLabel, false);
myTab.addAndroidView(mySpinner, true);
}
protected void reset() {
// TODO: implement
/*
final ZLBoolean3OptionEntry comboEntry = (ZLBoolean3OptionEntry)myOption;
comboEntry.onReset();
*/
if (mySpinner != null) {
mySpinner.setSelection(((ZLBoolean3OptionEntry)myOption).initialState());
}
}
protected void _onAccept() {
int index = mySpinner.getSelectedItemPosition();
if (index != -1) {
((ZLBoolean3OptionEntry)myOption).onAccept(index);
}
}
private class ComboAdapter extends BaseAdapter implements Spinner.OnItemSelectedListener {
EditText myEditor;
public void onItemSelected(AdapterView parent, View v, int position, long id) {
//final ZLBoolean3OptionEntry comboEntry = (ZLBoolean3OptionEntry)myOption;
//comboEntry.onValueSelected(position);
}
public void onNothingSelected(AdapterView parent) {
}
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
TextView textView = new TextView(parent.getContext());
textView.setPadding(0, 12, 0, 12);
textView.setTextSize(20);
textView.setText((String)getItem(position));
convertView = textView;
}
return convertView;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
EditText editor = new EditText(parent.getContext()) {
protected boolean getDefaultEditable() {
return false;
}
};
editor.setText((String)getItem(position));
return editor;
}
return convertView;
}
public int getCount() {
return 3;
}
public Object getItem(int position) {
final ZLResource resource = ZLResource.resource("boolean3");
switch (position) {
case ZLBoolean3.B3_TRUE:
return resource.getResource("on").getValue();
case ZLBoolean3.B3_FALSE:
return resource.getResource("off").getValue();
default:
case ZLBoolean3.B3_UNDEFINED:
return resource.getResource("unchanged").getValue();
}
}
public long getItemId(int position) {
return position;
}
public boolean stableIds() {
return true;
}
}
}

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.view.*; import android.view.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.content.Context; import android.content.Context;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.content.Context; import android.content.Context;

View file

@ -16,16 +16,17 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.content.Context; import android.content.Context;
import android.view.*; import android.view.*;
import android.widget.*; import android.widget.*;
import android.database.DataSetObserver;
import org.geometerplus.zlibrary.core.dialogs.ZLComboOptionEntry; import org.geometerplus.zlibrary.core.dialogs.ZLComboOptionEntry;
class ZLAndroidComboOptionView extends ZLAndroidOptionView { class ZLAndroidComboOptionView extends ZLAndroidOptionView {
private TextView myLabel;
private Spinner mySpinner; private Spinner mySpinner;
protected ZLAndroidComboOptionView(ZLAndroidDialogContent tab, String name, ZLComboOptionEntry option) { protected ZLAndroidComboOptionView(ZLAndroidDialogContent tab, String name, ZLComboOptionEntry option) {
@ -33,27 +34,57 @@ class ZLAndroidComboOptionView extends ZLAndroidOptionView {
} }
protected void createItem() { protected void createItem() {
mySpinner = new Spinner(myTab.getView().getContext()); final Context context = myTab.getView().getContext();
mySpinner.setAdapter(new ComboAdapter()); if (myName != null) {
myLabel = new TextView(context);
myLabel.setText(myName);
myLabel.setPadding(0, 12, 0, 12);
myLabel.setTextSize(18);
}
mySpinner = new Spinner(context);
final ComboAdapter adapter = new ComboAdapter();
mySpinner.setAdapter(adapter);
mySpinner.setOnItemSelectedListener(adapter);
mySpinner.setSelection(initialIndex((ZLComboOptionEntry)myOption));
} }
void addAndroidViews() { void addAndroidViews() {
myTab.addAndroidView(myLabel, false);
myTab.addAndroidView(mySpinner, true); myTab.addAndroidView(mySpinner, true);
} }
private static int initialIndex(ZLComboOptionEntry comboEntry) {
int index = comboEntry.getValues().indexOf(comboEntry.initialValue());
return (index >= 0) ? index : 0;
}
protected void reset() { protected void reset() {
((ZLComboOptionEntry)myOption).onReset(); final ZLComboOptionEntry comboEntry = (ZLComboOptionEntry)myOption;
// TODO: implement comboEntry.onReset();
if (mySpinner != null) {
mySpinner.setSelection(initialIndex(comboEntry));
}
} }
protected void _onAccept() { protected void _onAccept() {
EditText editor = ((ComboAdapter)mySpinner.getAdapter()).myEditor; final EditText editor = ((ComboAdapter)mySpinner.getAdapter()).myEditor;
((ZLComboOptionEntry)myOption).onAccept(editor.getText().toString()); if (editor != null) {
((ZLComboOptionEntry)myOption).onAccept(editor.getText().toString());
}
} }
private class ComboAdapter implements SpinnerAdapter { private class ComboAdapter extends BaseAdapter implements Spinner.OnItemSelectedListener {
EditText myEditor; EditText myEditor;
public void onItemSelected(AdapterView parent, View v, int position, long id) {
final ZLComboOptionEntry comboEntry = (ZLComboOptionEntry)myOption;
comboEntry.onValueSelected(position);
}
public void onNothingSelected(AdapterView parent) {
}
public View getDropDownView(int position, View convertView, ViewGroup parent) { public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) { if (convertView == null) {
TextView textView = new TextView(parent.getContext()); TextView textView = new TextView(parent.getContext());
@ -66,9 +97,13 @@ class ZLAndroidComboOptionView extends ZLAndroidOptionView {
} }
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
((ZLComboOptionEntry)myOption).onValueSelected(position); final ZLComboOptionEntry comboEntry = (ZLComboOptionEntry)myOption;
if (convertView == null) { if (convertView == null) {
myEditor = new EditText(parent.getContext()); myEditor = new EditText(parent.getContext()) {
protected boolean getDefaultEditable() {
return comboEntry.isEditable();
}
};
myEditor.setSingleLine(true); myEditor.setSingleLine(true);
myEditor.setText((String)getItem(position), TextView.BufferType.EDITABLE); myEditor.setText((String)getItem(position), TextView.BufferType.EDITABLE);
convertView = myEditor; convertView = myEditor;
@ -76,11 +111,6 @@ class ZLAndroidComboOptionView extends ZLAndroidOptionView {
return convertView; return convertView;
} }
public View getMeasurementView(ViewGroup parent) {
// TODO: implement
return null;
}
public int getCount() { public int getCount() {
return ((ZLComboOptionEntry)myOption).getValues().size(); return ((ZLComboOptionEntry)myOption).getValues().size();
} }
@ -93,18 +123,8 @@ class ZLAndroidComboOptionView extends ZLAndroidOptionView {
return position; return position;
} }
public int getNewSelectionForKey(int currentSelection, int keyCode, KeyEvent event) {
return NO_SELECTION;
}
public boolean stableIds() { public boolean stableIds() {
return true; return false;
}
public void registerDataSetObserver(DataSetObserver observer) {
}
public void unregisterDataSetObserver(DataSetObserver observer) {
} }
} }
} }

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.app.Dialog; import android.app.Dialog;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import java.util.ArrayList; import java.util.ArrayList;
@ -76,11 +77,8 @@ class ZLAndroidDialogContent extends ZLDialogContent {
void invalidateView() { void invalidateView() {
if (!myAndroidViews.isEmpty()) { if (!myAndroidViews.isEmpty()) {
myAndroidViews.clear(); myAndroidViews.clear();
android.util.Log.i("invalidateView", "0");
myListView.setAdapter(new ViewAdapter()); myListView.setAdapter(new ViewAdapter());
android.util.Log.i("invalidateView", "1");
myListView.invalidate(); myListView.invalidate();
android.util.Log.i("invalidateView", "2");
} }
} }
@ -96,7 +94,9 @@ class ZLAndroidDialogContent extends ZLDialogContent {
); );
break; break;
case ZLOptionKind.BOOLEAN3: case ZLOptionKind.BOOLEAN3:
// view = new Boolean3OptionView(name, tooltip, (ZLBoolean3OptionEntry*)option, *this, from, to); view = new ZLAndroidBoolean3OptionView(
this, name, (ZLBoolean3OptionEntry)option
);
break; break;
case ZLOptionKind.STRING: case ZLOptionKind.STRING:
view = new ZLAndroidStringOptionView( view = new ZLAndroidStringOptionView(
@ -124,7 +124,9 @@ class ZLAndroidDialogContent extends ZLDialogContent {
); );
break; break;
case ZLOptionKind.KEY: case ZLOptionKind.KEY:
// view = new KeyOptionView(name, tooltip, (ZLKeyOptionEntry*)option, *this, from, to); view = new ZLAndroidKeyOptionView(
this, name, (ZLKeyOptionEntry)option
);
break; break;
case ZLOptionKind.ORDER: case ZLOptionKind.ORDER:
// TODO: implement // TODO: implement
@ -165,13 +167,7 @@ class ZLAndroidDialogContent extends ZLDialogContent {
private class ViewAdapter extends BaseAdapter { private class ViewAdapter extends BaseAdapter {
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) { if (convertView == null) {
final ArrayList views = getAndroidViews(); convertView = (View)getAndroidViews().get(position);
// just a hack
// TODO: make a correct fix for a problem in Scrollings tab
if (position >= views.size()) {
position = views.size() - 1;
}
convertView = (View)views.get(position);
} }
return convertView; return convertView;

View file

@ -16,111 +16,112 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs;
package org.geometerplus.zlibrary.ui.android.dialogs;
import android.app.*;
import android.view.View; import android.app.*;
import android.content.*; import android.view.View;
import android.os.*; import android.content.*;
import android.os.*;
import org.geometerplus.zlibrary.core.dialogs.*;
import org.geometerplus.zlibrary.core.application.ZLApplication; import org.geometerplus.zlibrary.core.dialogs.*;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.application.ZLApplication;
import org.geometerplus.zlibrary.ui.android.application.ZLAndroidApplicationWindow; import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.ui.android.application.ZLAndroidApplicationWindow;
import org.geometerplus.zlibrary.ui.android.library.*;
import org.geometerplus.zlibrary.ui.android.library.*;
public class ZLAndroidDialogManager extends ZLDialogManager {
private final Activity myActivity; public class ZLAndroidDialogManager extends ZLDialogManager {
private final Activity myActivity;
public ZLAndroidDialogManager(Activity activity) {
myActivity = activity; public ZLAndroidDialogManager(Activity activity) {
} myActivity = activity;
}
public void runSelectionDialog(String key, ZLTreeHandler handler, Runnable actionOnAccept) {
new ZLAndroidSelectionDialog(myActivity, getDialogTitle(key), handler, actionOnAccept).run(); public void runSelectionDialog(String key, ZLTreeHandler handler, Runnable actionOnAccept) {
} new ZLAndroidSelectionDialog(myActivity, getDialogTitle(key), handler, actionOnAccept).run();
}
public void showErrorBox(String key, String message) {
showAlert(0, key, message); public void showErrorBox(String key, String message) {
} showAlert(0, key, message);
}
public void showInformationBox(String key, String message) {
showAlert(0, key, message); public void showInformationBox(String key, String message) {
} showAlert(0, key, message);
}
private void showAlert(int iconId, String key, String message) {
AlertDialog.show(myActivity, null, iconId, message, getButtonText(OK_BUTTON), null, true, null); private void showAlert(int iconId, String key, String message) {
} AlertDialog.show(myActivity, null, iconId, message, getButtonText(OK_BUTTON), null, true, null);
}
private static class AlertListener implements DialogInterface.OnClickListener {
private final Runnable myAction0, myAction1, myAction2; private static class AlertListener implements DialogInterface.OnClickListener {
private final Runnable myAction0, myAction1, myAction2;
public AlertListener(Runnable action0, Runnable action1, Runnable action2) {
myAction0 = action0; public AlertListener(Runnable action0, Runnable action1, Runnable action2) {
myAction1 = action1; myAction0 = action0;
myAction2 = action2; myAction1 = action1;
} myAction2 = action2;
}
public void onClick(DialogInterface dialog, int which) {
Runnable action = null; public void onClick(DialogInterface dialog, int which) {
switch (which) { Runnable action = null;
case DialogInterface.BUTTON1: switch (which) {
action = myAction0; case DialogInterface.BUTTON1:
break; action = myAction0;
case DialogInterface.BUTTON2: break;
action = myAction1; case DialogInterface.BUTTON2:
break; action = myAction1;
case DialogInterface.BUTTON3: break;
action = myAction2; case DialogInterface.BUTTON3:
break; action = myAction2;
} break;
if (action != null) { }
new Handler().post(action); if (action != null) {
} new Handler().post(action);
dialog.dismiss(); }
} dialog.dismiss();
} }
}
public void showQuestionBox(String key, String message, String button0, Runnable action0, String button1, Runnable action1, String button2, Runnable action2) {
final AlertListener al = new AlertListener(action0, action1, action2); public void showQuestionBox(String key, String message, String button0, Runnable action0, String button1, Runnable action1, String button2, Runnable action2) {
AlertDialog.show(myActivity, null, 0, message, button0, al, button1, al, button2, al, true, null); final AlertListener al = new AlertListener(action0, action1, action2);
} AlertDialog.show(myActivity, null, 0, message, button0, al, button1, al, button2, al, true, null);
}
public ZLAndroidApplicationWindow createApplicationWindow(ZLApplication application) {
// TODO: implement public ZLAndroidApplicationWindow createApplicationWindow(ZLApplication application) {
//myApplicationWindow = new ZLAndroidApplicationWindow(application); // TODO: implement
//return myApplicationWindow; //myApplicationWindow = new ZLAndroidApplicationWindow(application);
return null; //return myApplicationWindow;
} return null;
}
/*
static JButton createButton(String key) { /*
String text = getButtonText(key).replace("&", ""); static JButton createButton(String key) {
return new JButton(text); String text = getButtonText(key).replace("&", "");
} return new JButton(text);
*/ }
*/
public ZLOptionsDialog createOptionsDialog(String key, Runnable exitAction, Runnable applyAction, boolean showApplyButton) {
return new ZLAndroidOptionsDialog(myActivity, getResource().getResource(key), exitAction, applyAction); public ZLOptionsDialog createOptionsDialog(String key, Runnable exitAction, Runnable applyAction, boolean showApplyButton) {
} return new ZLAndroidOptionsDialog(myActivity, getResource().getResource(key), exitAction, applyAction);
}
public ZLDialog createDialog(String key) {
return new ZLAndroidDialog(myActivity, getResource().getResource(key)); public ZLDialog createDialog(String key) {
} return new ZLAndroidDialog(myActivity, getResource().getResource(key));
}
public void wait(String key, final Runnable runnable) {
final ProgressDialog progress = ProgressDialog.show(myActivity, null, getWaitMessageText(key), true, true); public void wait(String key, final Runnable runnable) {
final Handler handler = new Handler() { final ProgressDialog progress = ProgressDialog.show(myActivity, null, getWaitMessageText(key), true, false);
public void handleMessage(Message message) { final Handler handler = new Handler() {
progress.dismiss(); public void handleMessage(Message message) {
} progress.dismiss();
}; }
new Thread(new Runnable() { };
public void run() { new Thread(new Runnable() {
runnable.run(); public void run() {
handler.sendEmptyMessage(0); runnable.run();
} handler.sendEmptyMessage(0);
}).start(); }
} }).start();
} }
}

View file

@ -0,0 +1,154 @@
/*
* Copyright (C) 2007-2008 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.zlibrary.ui.android.dialogs;
import java.util.ArrayList;
import android.content.Context;
import android.view.*;
import android.widget.*;
import android.text.*;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.core.dialogs.ZLKeyOptionEntry;
import org.geometerplus.zlibrary.ui.android.util.ZLAndroidKeyUtil;
class ZLAndroidKeyOptionView extends ZLAndroidOptionView {
private TextView myLabel;
private EditText myEditor;
private Spinner mySpinner;
protected ZLAndroidKeyOptionView(ZLAndroidDialogContent tab, String name, ZLKeyOptionEntry option) {
super(tab, name, option);
}
private void setKeyName(String keyName) {
myEditor.setText(keyName);
myTab.invalidateView();
final ZLKeyOptionEntry keyEntry = (ZLKeyOptionEntry)myOption;
mySpinner.setSelection(keyEntry.actionIndex(keyName));
keyEntry.onKeySelected(keyName);
}
protected void createItem() {
final Context context = myTab.getView().getContext();
myLabel = new TextView(context);
myLabel.setText(ZLResource.resource("keyOptionView").getResource("actionFor").getValue());
myLabel.setPadding(0, 12, 0, 12);
myLabel.setTextSize(18);
final ZLKeyOptionEntry keyEntry = (ZLKeyOptionEntry)myOption;
myEditor = new EditText(context) {
protected boolean getDefaultEditable() {
return false;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
setKeyName(ZLAndroidKeyUtil.getKeyNameByCode(keyCode));
return true;
}
};
myEditor.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mySpinner = new Spinner(context);
final ComboAdapter adapter = new ComboAdapter(keyEntry.getActionNames());
mySpinner.setAdapter(adapter);
mySpinner.setOnItemSelectedListener(adapter);
}
void addAndroidViews() {
myTab.addAndroidView(myLabel, false);
myTab.addAndroidView(myEditor, true);
if (myEditor.getText().length() > 0) {
myTab.addAndroidView(mySpinner, true);
}
}
protected void reset() {
final ZLKeyOptionEntry keyEntry = (ZLKeyOptionEntry)myOption;
keyEntry.onReset();
if (myEditor != null) {
setKeyName("");
}
}
protected void _onAccept() {
((ZLKeyOptionEntry)myOption).onAccept();
}
private class ComboAdapter extends BaseAdapter implements Spinner.OnItemSelectedListener {
private final ArrayList myValues;
ComboAdapter(ArrayList values) {
myValues = values;
}
public void onItemSelected(AdapterView parent, View v, int position, long id) {
final ZLKeyOptionEntry keyEntry = (ZLKeyOptionEntry)myOption;
keyEntry.onValueChanged(myEditor.getText().toString(), position);
}
public void onNothingSelected(AdapterView parent) {
}
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
TextView textView = new TextView(parent.getContext());
textView.setPadding(0, 12, 0, 12);
textView.setTextSize(20);
textView.setText((String)getItem(position));
convertView = textView;
}
return convertView;
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
EditText editor = new EditText(parent.getContext()) {
protected boolean getDefaultEditable() {
return false;
}
};
editor.setText((String)getItem(position));
return editor;
}
return convertView;
}
public int getCount() {
return myValues.size();
}
public Object getItem(int position) {
return myValues.get(position);
}
public long getItemId(int position) {
return position;
}
public boolean stableIds() {
return true;
}
}
}

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.view.View; import android.view.View;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import java.util.ArrayList; import java.util.ArrayList;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.content.Context; import android.content.Context;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.content.Context; import android.content.Context;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.dialogs; package org.geometerplus.zlibrary.ui.android.dialogs;
import android.content.Context; import android.content.Context;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.image; package org.geometerplus.zlibrary.ui.android.image;
import android.graphics.Bitmap; import android.graphics.Bitmap;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.image; package org.geometerplus.zlibrary.ui.android.image;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.library; package org.geometerplus.zlibrary.ui.android.library;
import android.app.Activity; import android.app.Activity;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.library; package org.geometerplus.zlibrary.ui.android.library;
import java.io.*; import java.io.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.util; package org.geometerplus.zlibrary.ui.android.util;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -134,9 +135,9 @@ public final class ZLAndroidKeyUtil {
case KeyEvent.KEYCODE_EXPLORER: case KeyEvent.KEYCODE_EXPLORER:
return "<Explorer>"; return "<Explorer>";
case KeyEvent.KEYCODE_GRAVE: case KeyEvent.KEYCODE_GRAVE:
return "<???>"; return "<??? 0>";
case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_HEADSETHOOK:
return "<???>"; return "<??? 1>";
case KeyEvent.KEYCODE_HOME: case KeyEvent.KEYCODE_HOME:
return "<Home>"; return "<Home>";
case KeyEvent.KEYCODE_LEFT_BRACKET: case KeyEvent.KEYCODE_LEFT_BRACKET:
@ -148,9 +149,9 @@ public final class ZLAndroidKeyUtil {
case KeyEvent.KEYCODE_NUM: case KeyEvent.KEYCODE_NUM:
return "<Num>"; return "<Num>";
case KeyEvent.KEYCODE_PERIOD: case KeyEvent.KEYCODE_PERIOD:
return "<???>"; return "<??? 2>";
case KeyEvent.KEYCODE_POUND: case KeyEvent.KEYCODE_POUND:
return "<???>"; return "<??? 3>";
case KeyEvent.KEYCODE_POWER: case KeyEvent.KEYCODE_POWER:
return "<Power>"; return "<Power>";
case KeyEvent.KEYCODE_RIGHT_BRACKET: case KeyEvent.KEYCODE_RIGHT_BRACKET:
@ -160,9 +161,9 @@ public final class ZLAndroidKeyUtil {
case KeyEvent.KEYCODE_SLASH: case KeyEvent.KEYCODE_SLASH:
return "</>"; return "</>";
case KeyEvent.KEYCODE_SOFT_LEFT: case KeyEvent.KEYCODE_SOFT_LEFT:
return "<???>"; return "<Menu>";
case KeyEvent.KEYCODE_SOFT_RIGHT: case KeyEvent.KEYCODE_SOFT_RIGHT:
return "<???>"; return "<??? 4>";
case KeyEvent.KEYCODE_SPACE: case KeyEvent.KEYCODE_SPACE:
return "<Space>"; return "<Space>";
case KeyEvent.KEYCODE_STAR: case KeyEvent.KEYCODE_STAR:

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.view; package org.geometerplus.zlibrary.ui.android.view;
import java.util.ArrayList; import java.util.ArrayList;
@ -202,15 +203,15 @@ public final class ZLAndroidPaintContext extends ZLPaintContext {
public String realFontFamilyName(String fontFamily) { public String realFontFamilyName(String fontFamily) {
// TODO: implement // TODO: implement
if ("DroidSerif".equals(fontFamily)) { if ("Serif".equals(fontFamily)) {
return fontFamily; return fontFamily;
} }
return "DroidSans"; return "Sans";
} }
protected void fillFamiliesList(ArrayList families) { protected void fillFamiliesList(ArrayList families) {
// TODO: implement // TODO: implement
families.add("DroidSans"); families.add("Sans");
families.add("DroidSerif"); families.add("Serif");
} }
} }

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.view; package org.geometerplus.zlibrary.ui.android.view;
import org.geometerplus.zlibrary.core.view.ZLView; import org.geometerplus.zlibrary.core.view.ZLView;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.android.view; package org.geometerplus.zlibrary.ui.android.view;
import java.util.Map; import java.util.Map;
@ -136,11 +137,18 @@ public class ZLAndroidWidget extends View {
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
final String keyName = ZLAndroidKeyUtil.getKeyNameByCode(keyCode); final String keyName = ZLAndroidKeyUtil.getKeyNameByCode(keyCode);
if (keyName.equals("<Menu>")) {
return false;
}
myViewWidget.getView().getApplication().doActionByKey(keyName); myViewWidget.getView().getApplication().doActionByKey(keyName);
return true; return true;
} }
public boolean onKeyUp(int keyCode, KeyEvent event) { public boolean onKeyUp(int keyCode, KeyEvent event) {
final String keyName = ZLAndroidKeyUtil.getKeyNameByCode(keyCode);
if (keyName.equals("<Menu>")) {
return false;
}
return true; return true;
} }
} }

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package java.util.zip; package java.util.zip;
public class ZipEntry { public class ZipEntry {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package java.util.zip; package java.util.zip;
public class ZipException extends Exception { public class ZipException extends Exception {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package java.util.zip; package java.util.zip;
import java.io.IOException; import java.io.IOException;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package java.util.zip; package java.util.zip;
import java.io.InputStream; import java.io.InputStream;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.util; package org.geometerplus.zlibrary.core.util;
import java.util.Vector; import java.util.Vector;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.util; package org.geometerplus.zlibrary.core.util;
public abstract class Collections { public abstract class Collections {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.util; package org.geometerplus.zlibrary.core.util;
public interface Comparator { public interface Comparator {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.util; package org.geometerplus.zlibrary.core.util;
import java.io.IOException; import java.io.IOException;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.util; package org.geometerplus.zlibrary.core.util;
import java.util.Hashtable; import java.util.Hashtable;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.util; package org.geometerplus.zlibrary.core.util;
public final class Locale { public final class Locale {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.application; package org.geometerplus.zlibrary.ui.j2me.application;
import org.geometerplus.zlibrary.core.application.*; import org.geometerplus.zlibrary.core.application.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.config; package org.geometerplus.zlibrary.ui.j2me.config;
import org.geometerplus.zlibrary.core.config.ZLConfig; import org.geometerplus.zlibrary.core.config.ZLConfig;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.config; package org.geometerplus.zlibrary.ui.j2me.config;
import org.geometerplus.zlibrary.core.config.ZLConfig; import org.geometerplus.zlibrary.core.config.ZLConfig;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.image; package org.geometerplus.zlibrary.ui.j2me.image;
import javax.microedition.lcdui.Image; import javax.microedition.lcdui.Image;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.image; package org.geometerplus.zlibrary.ui.j2me.image;
import javax.microedition.lcdui.Image; import javax.microedition.lcdui.Image;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.library; package org.geometerplus.zlibrary.ui.j2me.library;
import java.io.InputStream; import java.io.InputStream;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.library; package org.geometerplus.zlibrary.ui.j2me.library;
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDlet;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.view; package org.geometerplus.zlibrary.ui.j2me.view;
import javax.microedition.lcdui.*; import javax.microedition.lcdui.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.view; package org.geometerplus.zlibrary.ui.j2me.view;
import javax.microedition.lcdui.*; import javax.microedition.lcdui.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.j2me.view; package org.geometerplus.zlibrary.ui.j2me.view;
import org.geometerplus.zlibrary.core.view.ZLViewWidget; import org.geometerplus.zlibrary.core.view.ZLViewWidget;

View file

@ -29,4 +29,5 @@
<binding key="&lt;Ctrl&gt;+&lt;DownArrow&gt;" action="nextTOCSection"/> <binding key="&lt;Ctrl&gt;+&lt;DownArrow&gt;" action="nextTOCSection"/>
<binding key="&lt;Ctrl&gt;+&lt;UpArrow&gt;" action="previousTOCSection"/> <binding key="&lt;Ctrl&gt;+&lt;UpArrow&gt;" action="previousTOCSection"/>
<binding key="&lt;Ctrl&gt;+&lt;C&gt;" action="copyToClipboard"/> <binding key="&lt;Ctrl&gt;+&lt;C&gt;" action="copyToClipboard"/>
<binding key="&lt;1&gt;" action="previousBook"/>
</keymap> </keymap>

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import java.util.*; import java.util.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import java.io.*; import java.io.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import java.io.*; import java.io.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import java.util.*; import java.util.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import java.util.*; import java.util.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import java.util.Set; import java.util.Set;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
final class ZLOptionID { final class ZLOptionID {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
final class ZLOptionInfo { final class ZLOptionInfo {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
public interface ZLReader { public interface ZLReader {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import java.util.Set; import java.util.Set;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
public interface ZLWriter { public interface ZLWriter {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.core.xmlconfig; package org.geometerplus.zlibrary.core.xmlconfig;
import org.geometerplus.zlibrary.core.config.*; import org.geometerplus.zlibrary.core.config.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.application; package org.geometerplus.zlibrary.ui.swing.application;
import java.util.HashMap; import java.util.HashMap;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.*; import java.awt.*;

View file

@ -16,115 +16,113 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs;
package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.util.ArrayList;
import java.util.ArrayList;
import java.awt.*;
import java.awt.event.*; import java.awt.*;
import javax.swing.*; import java.awt.event.*;
import javax.swing.*;
import org.geometerplus.zlibrary.core.dialogs.ZLComboOptionEntry;
import org.geometerplus.zlibrary.core.dialogs.ZLComboOptionEntry;
public class ZLComboOptionView extends ZLSwingOptionView {
private JComboBox myComboBox; public class ZLComboOptionView extends ZLSwingOptionView {
private JLabel myLabel; private JComboBox myComboBox;
private JPanel myPanel; private JLabel myLabel;
private JPanel myPanel;
public ZLComboOptionView(String name, ZLComboOptionEntry option,
ZLSwingDialogContent tab, GridBagLayout layout) { public ZLComboOptionView(String name, ZLComboOptionEntry option,
super(name, option, tab, layout); ZLSwingDialogContent tab, GridBagLayout layout) {
} super(name, option, tab, layout);
}
protected void _onAccept() {
((ZLComboOptionEntry) myOption).onAccept((String) myComboBox.getSelectedItem()); protected void _onAccept() {
} ((ZLComboOptionEntry) myOption).onAccept((String) myComboBox.getSelectedItem());
}
protected void createItem() {
final ZLComboOptionEntry option = (ZLComboOptionEntry) myOption; protected void createItem() {
final ArrayList values = option.getValues(); final ZLComboOptionEntry option = (ZLComboOptionEntry)myOption;
final String initialValue = option.initialValue(); final ArrayList values = option.getValues();
int index = 0; final String initialValue = option.initialValue();
for (int i = 0; i < values.size(); ++i) { int index = 0;
if (values.get(i).equals(initialValue)) { for (int i = 0; i < values.size(); ++i) {
index = i; if (values.get(i).equals(initialValue)) {
break; index = i;
} break;
} }
myComboBox = new JComboBox(values.toArray()); }
myComboBox.setSelectedIndex(index); myComboBox = new JComboBox(values.toArray());
myComboBox.setEditable(option.isEditable()); myComboBox.setSelectedIndex(index);
myComboBox.addItemListener(new MyItemListener()); myComboBox.setEditable(option.isEditable());
if (option.useOnValueEdited()) { myComboBox.addItemListener(new MyItemListener());
myComboBox.getEditor().getEditorComponent().addKeyListener(new MyKeyListener()); if (option.useOnValueEdited()) {
} myComboBox.getEditor().getEditorComponent().addKeyListener(new MyKeyListener());
if (myName == null || "".equals(myName)) { }
myLabel = null; if (myName == null || "".equals(myName)) {
myTab.insertWidget(myComboBox); myLabel = null;
} else { myTab.insertWidget(myComboBox);
myComboBox.setMinimumSize(new Dimension(0, myComboBox.getPreferredSize().height)); } else {
JPanel panel1 = new JPanel(); myComboBox.setMinimumSize(new Dimension(0, myComboBox.getPreferredSize().height));
panel1.setLayout(new BoxLayout(panel1, BoxLayout.LINE_AXIS)); JPanel panel1 = new JPanel();
myComboBox.setMaximumSize(new Dimension(myComboBox.getMaximumSize().width, myComboBox.getPreferredSize().height)); panel1.setLayout(new BoxLayout(panel1, BoxLayout.LINE_AXIS));
panel1.add(myComboBox); myComboBox.setMaximumSize(new Dimension(myComboBox.getMaximumSize().width, myComboBox.getPreferredSize().height));
myLabel = new JLabel(myName); panel1.add(myComboBox);
JPanel panel2 = new JPanel(new BorderLayout()); myLabel = new JLabel(myName);
panel2.add(myLabel, BorderLayout.LINE_END); JPanel panel2 = new JPanel(new BorderLayout());
myPanel = new JPanel(new GridLayout(1, 2, 10, 0)); panel2.add(myLabel, BorderLayout.LINE_END);
myPanel.add(panel2); myPanel = new JPanel(new GridLayout(1, 2, 10, 0));
myPanel.add(panel1); myPanel.add(panel2);
myTab.insertWidget(myPanel); myPanel.add(panel1);
} myTab.insertWidget(myPanel);
} }
}
protected void hide() {
if (myPanel != null) { protected void hide() {
hide(myPanel); if (myPanel != null) {
} else { hide(myPanel);
hide(myComboBox); } else {
} hide(myComboBox);
} }
}
protected void show() {
if (myPanel != null) { protected void show() {
show(myPanel); if (myPanel != null) {
} else { show(myPanel);
show(myComboBox); } else {
} show(myComboBox);
} }
}
protected void _setActive(boolean active) {
myComboBox.setEnabled(active); protected void _setActive(boolean active) {
} myComboBox.setEnabled(active);
}
public void reset() {
ZLComboOptionEntry o = (ZLComboOptionEntry) myOption; public void reset() {
o.onReset(); ZLComboOptionEntry o = (ZLComboOptionEntry) myOption;
final ArrayList values = o.getValues(); o.onReset();
final String initialValue = o.initialValue(); final ArrayList values = o.getValues();
int index = 0; final String initialValue = o.initialValue();
for (int i = 0; i < values.size(); ++i) { int index = 0;
if (values.get(i).equals(initialValue)) { for (int i = 0; i < values.size(); ++i) {
index = i; if (values.get(i).equals(initialValue)) {
break; index = i;
} break;
} }
myComboBox.setModel(new DefaultComboBoxModel(values.toArray())); }
myComboBox.setSelectedIndex(index); myComboBox.setModel(new DefaultComboBoxModel(values.toArray()));
} myComboBox.setSelectedIndex(index);
}
private class MyItemListener implements ItemListener {
private class MyItemListener implements ItemListener {
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
((ZLComboOptionEntry) myOption).onValueSelected(myComboBox.getSelectedIndex()); ((ZLComboOptionEntry) myOption).onValueSelected(myComboBox.getSelectedIndex());
} }
}
}
private class MyKeyListener extends KeyAdapter {
private class MyKeyListener extends KeyAdapter { public void keyTyped(KeyEvent e) {
public void keyTyped(KeyEvent e) { ((ZLComboOptionEntry) myOption).onValueEdited((String) myComboBox.getSelectedItem());
((ZLComboOptionEntry) myOption).onValueEdited((String) myComboBox.getSelectedItem()); }
} }
} }
}

View file

@ -16,204 +16,179 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs;
package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.*;
import java.awt.GridBagLayout; import java.awt.event.*;
import java.awt.GridLayout; import javax.swing.*;
import java.awt.Insets; import javax.swing.text.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import org.geometerplus.zlibrary.core.dialogs.ZLKeyOptionEntry;
import java.awt.event.KeyAdapter; import org.geometerplus.zlibrary.core.resources.ZLResource;
import java.awt.event.KeyEvent;
import javax.swing.BoxLayout; public class ZLKeyOptionView extends ZLSwingOptionView {
import javax.swing.JComboBox; private JComboBox myComboBox;
import javax.swing.JComponent; private KeyEditor myKeyEditor;
import javax.swing.JLabel; private JLabel myLabel;
import javax.swing.JPanel; private JPanel myPanel;
import javax.swing.JTextField; private String myCurrentKey = "";
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException; public ZLKeyOptionView(String name, ZLKeyOptionEntry option, ZLSwingDialogContent tab, GridBagLayout layout) {
import javax.swing.text.Document; super(name, option, tab, layout);
import javax.swing.text.PlainDocument; }
import org.geometerplus.zlibrary.core.dialogs.ZLKeyOptionEntry; protected void _onAccept() {
import org.geometerplus.zlibrary.core.resources.ZLResource; ((ZLKeyOptionEntry) myOption).onAccept();
}
public class ZLKeyOptionView extends ZLSwingOptionView {
private JComboBox myComboBox; protected void _setActive(boolean active) {
private KeyEditor myKeyEditor; // TODO Auto-generated method stub
private JLabel myLabel; }
private JPanel myPanel;
private String myCurrentKey = ""; protected void createItem() {
myKeyEditor = new KeyEditor("");
public ZLKeyOptionView(String name, ZLKeyOptionEntry option, ZLSwingDialogContent tab, myKeyEditor.setInputMap(JComponent.WHEN_FOCUSED, null);
GridBagLayout layout) { myKeyEditor.setCaretPosition(0);
super(name, option, tab, layout); myKeyEditor.setMargin(new Insets(0, 5, 0, 0));
} myKeyEditor.addKeyListener(new MyKeyListener());
JPanel panel1 = new JPanel();
protected void _onAccept() { panel1.setLayout(new BoxLayout(panel1, BoxLayout.LINE_AXIS));
((ZLKeyOptionEntry) myOption).onAccept(); myKeyEditor.setMaximumSize(new Dimension(myKeyEditor.getMaximumSize().width, myKeyEditor.getPreferredSize().height));
} panel1.add(myKeyEditor);
myLabel = new JLabel(ZLResource.resource("keyOptionView").getResource("actionFor").getValue());
protected void _setActive(boolean active) { JPanel panel2 = new JPanel(new BorderLayout());
// TODO Auto-generated method stub panel2.add(myLabel, BorderLayout.LINE_END);
myPanel = new JPanel(new GridLayout(1, 2, 10, 0));
} myPanel.add(panel2);
myPanel.add(panel1);
protected void createItem() { myTab.insertWidget(myPanel);
myKeyEditor = new KeyEditor("");
myKeyEditor.setInputMap(JComponent.WHEN_FOCUSED, null); myComboBox = new JComboBox(((ZLKeyOptionEntry) myOption).getActionNames().toArray());
myKeyEditor.setCaretPosition(0); myComboBox.addItemListener(new MyItemListener());
myKeyEditor.setMargin(new Insets(0, 5, 0, 0)); myTab.insertWidget(myComboBox);
myKeyEditor.addKeyListener(new MyKeyListener()); }
JPanel panel1 = new JPanel();
panel1.setLayout(new BoxLayout(panel1, BoxLayout.LINE_AXIS)); protected void hide() {
myKeyEditor.setMaximumSize(new Dimension(myKeyEditor.getMaximumSize().width, myKeyEditor.getPreferredSize().height)); hide(myPanel);
panel1.add(myKeyEditor); hide(myComboBox);
myLabel = new JLabel(ZLResource.resource("keyOptionView").getResource("actionFor").getValue()); }
JPanel panel2 = new JPanel(new BorderLayout());
panel2.add(myLabel, BorderLayout.LINE_END); protected void show() {
myPanel = new JPanel(new GridLayout(1, 2, 10, 0)); show(myPanel);
myPanel.add(panel2); if (! "".equals(myCurrentKey)) {
myPanel.add(panel1); show(myComboBox);
myTab.insertWidget(myPanel); }
}
myComboBox = new JComboBox(((ZLKeyOptionEntry) myOption).getActionNames().toArray());
myComboBox.addItemListener(new MyItemListener()); public void reset() {
myTab.insertWidget(myComboBox); myCurrentKey = null;
} myKeyEditor.setText("");
myComboBox.setVisible(false);
protected void hide() { }
hide(myPanel);
hide(myComboBox); private class MyItemListener implements ItemListener {
} public void itemStateChanged(ItemEvent e) {
((ZLKeyOptionEntry) myOption).onValueChanged(myCurrentKey, myComboBox.getSelectedIndex());
protected void show() { }
show(myPanel); }
if (! "".equals(myCurrentKey)) {
show(myComboBox); private class MyKeyListener extends KeyAdapter {
} public void keyPressed(KeyEvent e) {
} final String modifiers = e.getModifiersExText(e.getModifiersEx());
final int code = e.getKeyCode();
public void reset() { String main;
myCurrentKey = null; switch (code) {
myKeyEditor.setText(""); case 27:
myComboBox.setVisible(false); main = "Esc";
} break;
case 33:
private class MyItemListener implements ItemListener { main = "Page Up";
public void itemStateChanged(ItemEvent e) { break;
((ZLKeyOptionEntry) myOption).onValueChanged(myCurrentKey, myComboBox.getSelectedIndex()); case 34:
} main = "Page Down";
} break;
case 35:
private class MyKeyListener extends KeyAdapter { main = "End";
break;
public void keyPressed(KeyEvent e) { case 36:
final String modifiers = e.getModifiersExText(e.getModifiersEx()); main = "Home";
final int code = e.getKeyCode(); break;
String main; case 37:
switch (code) { main = "LeftArrow";
case 27: break;
main = "Esc"; case 38:
break; main = "UpArrow";
case 33: break;
main = "Page Up"; case 39:
break; main = "RightArrow";
case 34: break;
main = "Page Down"; case 40:
break; main = "DownArrow";
case 35: break;
main = "End"; default:
break; main = e.getKeyText(code);
case 36: break;
main = "Home"; }
break; final String keyCode = keyTextModifiersParse(modifiers) + keyTextParse(main);
case 37: if (keyCode.equals("<Ctrl>+<Ctrl>") || keyCode.equals("<Shift>+<Shift>")) {
main = "LeftArrow"; myCurrentKey = "";
break; } else {
case 38: myCurrentKey = keyCode;
main = "UpArrow"; }
break; myKeyEditor.setText(myCurrentKey);
case 39: myComboBox.setVisible(!"".equals(myCurrentKey));
main = "RightArrow"; myComboBox.setSelectedIndex(((ZLKeyOptionEntry) myOption).actionIndex(myCurrentKey));
break; ((ZLKeyOptionEntry) myOption).onKeySelected(myCurrentKey);
case 40: }
main = "DownArrow";
break; private String keyTextParse(String str) {
default: if (str.equals("Left") || str.equals("Down") ||
main = e.getKeyText(code); str.equals("Right") || str.equals("Up")) {
break; str = str + "Arrow";
} } else if (str.equals("Escape")) {
final String keyCode = keyTextModifiersParse(modifiers) + keyTextParse(main); str = "Esc";
if (keyCode.equals("<Ctrl>+<Ctrl>") || keyCode.equals("<Shift>+<Shift>")) { } else if (str.equals("Equals")) {
myCurrentKey = ""; str = "=";
} else { } else if (str.equals("Minus")) {
myCurrentKey = keyCode; str = "-";
} } else if (str.startsWith("Page")) {
myKeyEditor.setText(myCurrentKey); str = "Page" + str.substring("Page".length() + 1, str.length());
myComboBox.setVisible(!"".equals(myCurrentKey)); } else if (str.equals("Enter")) {
myComboBox.setSelectedIndex(((ZLKeyOptionEntry) myOption).actionIndex(myCurrentKey)); str = "Return";
((ZLKeyOptionEntry) myOption).onKeySelected(myCurrentKey); }
}
return "<" + str + ">";
private String keyTextParse(String str) { }
if (str.equals("Left") || str.equals("Down") ||
str.equals("Right") || str.equals("Up")) { private String keyTextModifiersParse(String str) {
str = str + "Arrow"; if (str.equals("")) {
} else if (str.equals("Escape")) { return "";
str = "Esc"; }
} else if (str.equals("Equals")) { return "<" + str + ">+";
str = "="; }
} else if (str.equals("Minus")) { }
str = "-";
} else if (str.startsWith("Page")) { private static class KeyEditor extends JTextField {
str = "Page" + str.substring("Page".length() + 1, str.length()); public KeyEditor(String string) {
} else if (str.equals("Enter")) { super(string);
str = "Return"; }
}
protected Document createDefaultModel() {
return "<" + str + ">"; return new KeyEditorDocument();
} }
private String keyTextModifiersParse(String str) { private static class KeyEditorDocument extends PlainDocument {
if (str.equals("")) { public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
return ""; if (str == null) {
} return;
return "<" + str + ">+"; }
} if (str.startsWith("<") || str.startsWith("+")) {
super.insertString(offs, str, a);
} } else {
super.insertString(offs, "", a);
}
}
private static class KeyEditor extends JTextField { }
}
public KeyEditor(String string) { }
super(string);
}
protected Document createDefaultModel() {
return new KeyEditorDocument();
}
private static class KeyEditorDocument extends PlainDocument {
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null) {
return;
}
if (str.startsWith("<") || str.startsWith("+")) {
super.insertString(offs, str, a);
} else {
super.insertString(offs, "", a);
}
}
}
}
}

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.BorderLayout; import java.awt.BorderLayout;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.BorderLayout; import java.awt.BorderLayout;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import org.geometerplus.zlibrary.core.dialogs.ZLDialog; import org.geometerplus.zlibrary.core.dialogs.ZLDialog;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.BorderLayout; import java.awt.BorderLayout;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.util.*; import java.util.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.dialogs; package org.geometerplus.zlibrary.ui.swing.dialogs;
import java.util.HashMap; import java.util.HashMap;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.image; package org.geometerplus.zlibrary.ui.swing.image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.image; package org.geometerplus.zlibrary.ui.swing.image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.library; package org.geometerplus.zlibrary.ui.swing.library;
public class Main { public class Main {

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.library; package org.geometerplus.zlibrary.ui.swing.library;
import java.io.*; import java.io.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.util; package org.geometerplus.zlibrary.ui.swing.util;
import java.net.URL; import java.net.URL;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.view; package org.geometerplus.zlibrary.ui.swing.view;
import java.util.*; import java.util.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.zlibrary.ui.swing.view; package org.geometerplus.zlibrary.ui.swing.view;
import java.awt.*; import java.awt.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.fbreader.bookmodel; package org.geometerplus.fbreader.bookmodel;
import java.util.*; import java.util.*;

View file

@ -16,291 +16,300 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.fbreader.bookmodel;
package org.geometerplus.fbreader.bookmodel;
import java.util.*;
import org.geometerplus.zlibrary.core.util.*; import java.util.*;
import org.geometerplus.zlibrary.core.util.*;
import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.zlibrary.core.util.ZLArrayUtils; import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.zlibrary.core.util.ZLTextBuffer; import org.geometerplus.zlibrary.core.util.ZLArrayUtils;
import org.geometerplus.zlibrary.text.model.ZLTextParagraph; import org.geometerplus.zlibrary.core.util.ZLTextBuffer;
import org.geometerplus.zlibrary.text.model.ZLTextTreeParagraph; import org.geometerplus.zlibrary.text.model.ZLTextParagraph;
import org.geometerplus.zlibrary.text.model.impl.ZLTextPlainModelImpl; import org.geometerplus.zlibrary.text.model.ZLTextTreeParagraph;
import org.geometerplus.zlibrary.text.model.impl.ZLTextPlainModelImpl;
public class BookReader {
private final BookModel myBookModel; public class BookReader {
private ZLTextPlainModelImpl myCurrentTextModel = null; private final BookModel myBookModel;
private ZLTextPlainModelImpl myCurrentTextModel = null;
private boolean myTextParagraphExists = false;
private boolean myTextParagraphExists = false;
private final ZLTextBuffer myBuffer = new ZLTextBuffer();
private boolean myBufferIsNotEmpty = false; private final ZLTextBuffer myBuffer = new ZLTextBuffer();
private final ZLTextBuffer myContentsBuffer = new ZLTextBuffer(); private boolean myBufferIsNotEmpty = false;
private final ZLTextBuffer myContentsBuffer = new ZLTextBuffer();
private byte[] myKindStack = new byte[20];
private int myKindStackSize; private byte[] myKindStack = new byte[20];
private int myKindStackSize;
private byte myHyperlinkKind;
private String myHyperlinkReference = ""; private byte myHyperlinkKind;
private String myHyperlinkReference = "";
private boolean myInsideTitle = false;
private boolean mySectionContainsRegularContents = false; private boolean myInsideTitle = false;
private boolean mySectionContainsRegularContents = false;
private boolean myContentsParagraphExists = false;
private final ArrayList myTOCStack = new ArrayList(); private boolean myContentsParagraphExists = false;
private boolean myLastTOCParagraphIsEmpty = false; private final ArrayList myTOCStack = new ArrayList();
private boolean myLastTOCParagraphIsEmpty = false;
private final char[] PERIOD = "...".toCharArray();
private final char[] PERIOD = "...".toCharArray();
public BookReader(BookModel model) {
myBookModel = model; public BookReader(BookModel model) {
} myBookModel = model;
}
private final void flushTextBufferToParagraph() {
if (myBufferIsNotEmpty) { private final void flushTextBufferToParagraph() {
final ZLTextBuffer buffer = myBuffer; if (myBufferIsNotEmpty) {
myCurrentTextModel.addText(buffer); final ZLTextBuffer buffer = myBuffer;
buffer.clear(); myCurrentTextModel.addText(buffer);
myBufferIsNotEmpty = false; buffer.clear();
} myBufferIsNotEmpty = false;
} }
}
public final void addControl(byte kind, boolean start) {
if (myTextParagraphExists) { public final void addControl(byte kind, boolean start) {
flushTextBufferToParagraph(); if (myTextParagraphExists) {
myCurrentTextModel.addControl(kind, start); flushTextBufferToParagraph();
} myCurrentTextModel.addControl(kind, start);
if (!start && (myHyperlinkReference.length() != 0) && (kind == myHyperlinkKind)) { }
myHyperlinkReference = ""; if (!start && (myHyperlinkReference.length() != 0) && (kind == myHyperlinkKind)) {
} myHyperlinkReference = "";
} }
}
public final void pushKind(byte kind) {
byte[] stack = myKindStack; public final void pushKind(byte kind) {
if (stack.length == myKindStackSize) { byte[] stack = myKindStack;
stack = ZLArrayUtils.createCopy(stack, myKindStackSize, myKindStackSize << 1); if (stack.length == myKindStackSize) {
myKindStack = stack; stack = ZLArrayUtils.createCopy(stack, myKindStackSize, myKindStackSize << 1);
} myKindStack = stack;
stack[myKindStackSize++] = kind; }
} stack[myKindStackSize++] = kind;
}
public final boolean popKind() {
if (myKindStackSize != 0) { public final boolean popKind() {
--myKindStackSize; if (myKindStackSize != 0) {
return true; --myKindStackSize;
} return true;
return false; }
} return false;
}
public final void beginParagraph(byte kind) {
final ZLTextPlainModelImpl textModel = myCurrentTextModel; public final void beginParagraph() {
if (textModel != null) { beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
textModel.createParagraph(kind); }
final byte[] stack = myKindStack;
final int size = myKindStackSize; public final void beginParagraph(byte kind) {
for (int i = 0; i < size; ++i) { final ZLTextPlainModelImpl textModel = myCurrentTextModel;
textModel.addControl(stack[i], true); if (textModel != null) {
} textModel.createParagraph(kind);
if (myHyperlinkReference.length() != 0) { final byte[] stack = myKindStack;
textModel.addHyperlinkControl(myHyperlinkKind, myHyperlinkReference); final int size = myKindStackSize;
} for (int i = 0; i < size; ++i) {
myTextParagraphExists = true; textModel.addControl(stack[i], true);
} }
} if (myHyperlinkReference.length() != 0) {
textModel.addHyperlinkControl(myHyperlinkKind, myHyperlinkReference);
public final void endParagraph() { }
if (myTextParagraphExists) { myTextParagraphExists = true;
flushTextBufferToParagraph(); }
myTextParagraphExists = false; }
}
} public final void endParagraph() {
if (myTextParagraphExists) {
// new method flushTextBufferToParagraph();
public boolean isTextParagraphExists() { myTextParagraphExists = false;
return myTextParagraphExists; }
} }
private final void insertEndParagraph(byte kind) { // new method
final ZLTextPlainModelImpl textModel = myCurrentTextModel; public boolean isTextParagraphExists() {
if ((textModel != null) && mySectionContainsRegularContents) { return myTextParagraphExists;
int size = textModel.getParagraphsNumber(); }
if ((size > 0) && (textModel.getParagraph(size-1).getKind() != kind)) {
textModel.createParagraph(kind); private final void insertEndParagraph(byte kind) {
mySectionContainsRegularContents = false; final ZLTextPlainModelImpl textModel = myCurrentTextModel;
} if ((textModel != null) && mySectionContainsRegularContents) {
} int size = textModel.getParagraphsNumber();
} if ((size > 0) && (textModel.getParagraph(size-1).getKind() != kind)) {
textModel.createParagraph(kind);
public final void insertEndOfSectionParagraph() { mySectionContainsRegularContents = false;
insertEndParagraph(ZLTextParagraph.Kind.END_OF_SECTION_PARAGRAPH); }
} }
}
public final void unsetCurrentTextModel() {
myCurrentTextModel = null; public final void insertEndOfSectionParagraph() {
} insertEndParagraph(ZLTextParagraph.Kind.END_OF_SECTION_PARAGRAPH);
}
public final void enterTitle() {
myInsideTitle = true; public final void unsetCurrentTextModel() {
} myCurrentTextModel = null;
}
public final void exitTitle() {
myInsideTitle = false; public final void enterTitle() {
} myInsideTitle = true;
}
public final void setMainTextModel() {
myCurrentTextModel = myBookModel.getBookTextModel(); public final void exitTitle() {
} myInsideTitle = false;
}
public final void setFootnoteTextModel(String id) {
myCurrentTextModel = myBookModel.getFootnoteModel(id); public final void setMainTextModel() {
} myCurrentTextModel = myBookModel.getBookTextModel();
}
public final void addData(char[] data) {
addData(data, 0, data.length); public final void setFootnoteTextModel(String id) {
} myCurrentTextModel = myBookModel.getFootnoteModel(id);
}
public final void addData(char[] data, int offset, int length) {
if (myTextParagraphExists) { public final void addData(char[] data) {
myBuffer.append(data, offset, length); addData(data, 0, data.length);
myBufferIsNotEmpty = true; }
if (!myInsideTitle) {
mySectionContainsRegularContents = true; public final void addData(char[] data, int offset, int length) {
} else { if (myTextParagraphExists) {
addContentsData(data, offset, length); myBuffer.append(data, offset, length);
} myBufferIsNotEmpty = true;
} if (!myInsideTitle) {
} mySectionContainsRegularContents = true;
} else {
public final void addDataFinal(char[] data, int offset, int length) { addContentsData(data, offset, length);
if (myBufferIsNotEmpty) { }
addData(data, offset, length); }
} else { }
if (myTextParagraphExists) {
myCurrentTextModel.addText(data, offset, length); public final void addDataFinal(char[] data, int offset, int length) {
if (!myInsideTitle) { if (myBufferIsNotEmpty) {
mySectionContainsRegularContents = true; addData(data, offset, length);
} else { } else {
addContentsData(data, offset, length); if (myTextParagraphExists) {
} myCurrentTextModel.addText(data, offset, length);
} if (!myInsideTitle) {
} mySectionContainsRegularContents = true;
} } else {
addContentsData(data, offset, length);
public final void addHyperlinkControl(byte kind, String label) { }
if (myTextParagraphExists) { }
flushTextBufferToParagraph(); }
myCurrentTextModel.addHyperlinkControl(kind, label); }
}
myHyperlinkKind = kind; public final void addHyperlinkControl(byte kind, String label) {
myHyperlinkReference = label; if (myTextParagraphExists) {
} flushTextBufferToParagraph();
myCurrentTextModel.addHyperlinkControl(kind, label);
public final void addHyperlinkLabel(String label) { }
final ZLTextPlainModelImpl textModel = myCurrentTextModel; myHyperlinkKind = kind;
if (textModel != null) { myHyperlinkReference = label;
int paragraphNumber = textModel.getParagraphsNumber(); }
if (myTextParagraphExists) {
--paragraphNumber; public final void addHyperlinkLabel(String label) {
} final ZLTextPlainModelImpl textModel = myCurrentTextModel;
myBookModel.addHyperlinkLabel(label, textModel, paragraphNumber); if (textModel != null) {
} int paragraphNumber = textModel.getParagraphsNumber();
} if (myTextParagraphExists) {
--paragraphNumber;
public final void addContentsData(char[] data) { }
addContentsData(data, 0, data.length); myBookModel.addHyperlinkLabel(label, textModel, paragraphNumber);
} }
}
public final void addContentsData(char[] data, int offset, int length) {
if ((length != 0) && !myTOCStack.isEmpty()) { public final void addContentsData(char[] data) {
myContentsBuffer.append(data, offset, length); addContentsData(data, 0, data.length);
} }
}
public final void addContentsData(char[] data, int offset, int length) {
public final void beginContentsParagraph(int referenceNumber) { if ((length != 0) && !myTOCStack.isEmpty()) {
final ZLTextPlainModelImpl textModel = myCurrentTextModel; myContentsBuffer.append(data, offset, length);
final ArrayList tocStack = myTOCStack; }
if (textModel == myBookModel.getBookTextModel()) { }
ContentsModel contentsModel = myBookModel.getContentsModel();
if (referenceNumber == -1) { public final void beginContentsParagraph(int referenceNumber) {
referenceNumber = textModel.getParagraphsNumber(); final ZLTextPlainModelImpl textModel = myCurrentTextModel;
} final ArrayList tocStack = myTOCStack;
int size = tocStack.size(); if (textModel == myBookModel.getBookTextModel()) {
ZLTextTreeParagraph peek = (size != 0) ? (ZLTextTreeParagraph)tocStack.get(size - 1) : null; ContentsModel contentsModel = myBookModel.getContentsModel();
final ZLTextBuffer contentsBuffer = myContentsBuffer; if (referenceNumber == -1) {
if (!contentsBuffer.isEmpty()) { referenceNumber = textModel.getParagraphsNumber();
contentsModel.addText(contentsBuffer); }
contentsBuffer.clear(); int size = tocStack.size();
myLastTOCParagraphIsEmpty = false; ZLTextTreeParagraph peek = (size != 0) ? (ZLTextTreeParagraph)tocStack.get(size - 1) : null;
} else if (myLastTOCParagraphIsEmpty) { final ZLTextBuffer contentsBuffer = myContentsBuffer;
contentsModel.addText(PERIOD); if (!contentsBuffer.isEmpty()) {
} contentsModel.addText(contentsBuffer);
ZLTextTreeParagraph para = contentsModel.createParagraph(peek); contentsBuffer.clear();
contentsModel.addControl(FBTextKind.CONTENTS_TABLE_ENTRY, true); myLastTOCParagraphIsEmpty = false;
contentsModel.setReference(para, referenceNumber); } else if (myLastTOCParagraphIsEmpty) {
tocStack.add(para); contentsModel.addText(PERIOD);
myLastTOCParagraphIsEmpty = true; }
myContentsParagraphExists = true; ZLTextTreeParagraph para = contentsModel.createParagraph(peek);
} contentsModel.addControl(FBTextKind.CONTENTS_TABLE_ENTRY, true);
} contentsModel.setReference(para, referenceNumber);
tocStack.add(para);
public final void endContentsParagraph() { myLastTOCParagraphIsEmpty = true;
final ArrayList tocStack = myTOCStack; myContentsParagraphExists = true;
if (!tocStack.isEmpty()) { }
ContentsModel contentsModel = myBookModel.getContentsModel(); }
final ZLTextBuffer contentsBuffer = myContentsBuffer;
if (!contentsBuffer.isEmpty()) { public final void endContentsParagraph() {
contentsModel.addText(contentsBuffer); final ArrayList tocStack = myTOCStack;
contentsBuffer.clear(); if (!tocStack.isEmpty()) {
myLastTOCParagraphIsEmpty = false; ContentsModel contentsModel = myBookModel.getContentsModel();
} else if (myLastTOCParagraphIsEmpty) { final ZLTextBuffer contentsBuffer = myContentsBuffer;
contentsModel.addText(PERIOD); if (!contentsBuffer.isEmpty()) {
myLastTOCParagraphIsEmpty = false; contentsModel.addText(contentsBuffer);
} contentsBuffer.clear();
tocStack.remove(tocStack.size() - 1); myLastTOCParagraphIsEmpty = false;
} } else if (myLastTOCParagraphIsEmpty) {
myContentsParagraphExists = false; contentsModel.addText(PERIOD);
} myLastTOCParagraphIsEmpty = false;
}
public final void setReference(int contentsParagraphNumber, int referenceNumber) { tocStack.remove(tocStack.size() - 1);
ContentsModel contentsModel = myBookModel.getContentsModel(); }
if (contentsParagraphNumber < contentsModel.getParagraphsNumber()) { myContentsParagraphExists = false;
contentsModel.setReference( }
contentsModel.getTreeParagraph(contentsParagraphNumber), referenceNumber
); public final void setReference(int contentsParagraphNumber, int referenceNumber) {
} ContentsModel contentsModel = myBookModel.getContentsModel();
} if (contentsParagraphNumber < contentsModel.getParagraphsNumber()) {
contentsModel.setReference(
public final boolean contentsParagraphIsOpen() { contentsModel.getTreeParagraph(contentsParagraphNumber), referenceNumber
return myContentsParagraphExists; );
} }
}
public final void beginContentsParagraph() {
beginContentsParagraph(-1); public final boolean paragraphIsOpen() {
} return myTextParagraphExists;
}
public final BookModel getModel() {
return myBookModel; public final boolean contentsParagraphIsOpen() {
} return myContentsParagraphExists;
}
public final void addImageReference(String ref, short offset) {
final ZLTextPlainModelImpl textModel = myCurrentTextModel; public final void beginContentsParagraph() {
if (textModel != null) { beginContentsParagraph(-1);
mySectionContainsRegularContents = true; }
if (myTextParagraphExists) {
flushTextBufferToParagraph(); public final BookModel getModel() {
textModel.addImage(ref, myBookModel.getImageMap(), offset); return myBookModel;
} else { }
beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
textModel.addControl(FBTextKind.IMAGE, true); public final void addImageReference(String ref, short offset) {
textModel.addImage(ref, myBookModel.getImageMap(), offset); final ZLTextPlainModelImpl textModel = myCurrentTextModel;
textModel.addControl(FBTextKind.IMAGE, false); if (textModel != null) {
endParagraph(); mySectionContainsRegularContents = true;
} if (myTextParagraphExists) {
} flushTextBufferToParagraph();
} textModel.addImage(ref, myBookModel.getImageMap(), offset);
} else {
public final void addImage(String id, ZLImage image) { beginParagraph(ZLTextParagraph.Kind.TEXT_PARAGRAPH);
myBookModel.addImage(id, image); textModel.addControl(FBTextKind.IMAGE, true);
} textModel.addImage(ref, myBookModel.getImageMap(), offset);
} textModel.addControl(FBTextKind.IMAGE, false);
endParagraph();
}
}
}
public final void addImage(String id, ZLImage image) {
myBookModel.addImage(id, image);
}
}

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.fbreader.bookmodel; package org.geometerplus.fbreader.bookmodel;
import java.util.*; import java.util.*;

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.fbreader.bookmodel; package org.geometerplus.fbreader.bookmodel;
public interface FBTextKind { public interface FBTextKind {

View file

@ -16,320 +16,321 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.fbreader.collection;
package org.geometerplus.fbreader.collection;
import java.io.*;
import java.util.*; import java.io.*;
import org.geometerplus.zlibrary.core.util.*; import java.util.*;
import org.geometerplus.zlibrary.core.util.*;
import org.geometerplus.fbreader.description.Author;
import org.geometerplus.fbreader.description.BookDescription; import org.geometerplus.fbreader.description.Author;
import org.geometerplus.fbreader.description.BookDescriptionUtil; import org.geometerplus.fbreader.description.BookDescription;
import org.geometerplus.fbreader.formats.FormatPlugin.PluginCollection; import org.geometerplus.fbreader.description.BookDescriptionUtil;
import org.geometerplus.zlibrary.core.filesystem.ZLDir; import org.geometerplus.fbreader.formats.FormatPlugin.PluginCollection;
import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.filesystem.ZLDir;
import org.geometerplus.zlibrary.core.options.ZLBooleanOption; import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption; import org.geometerplus.zlibrary.core.options.ZLBooleanOption;
import org.geometerplus.zlibrary.core.options.ZLOption; import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption;
import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.options.ZLOption;
import org.geometerplus.zlibrary.core.options.ZLStringOption;
public class BookCollection {
public final ZLStringOption PathOption; public class BookCollection {
public final ZLBooleanOption ScanSubdirsOption; public final ZLStringOption PathOption;
private final static String OPTIONS = "Options"; public final ZLBooleanOption ScanSubdirsOption;
private final static String OPTIONS = "Options";
private final ArrayList/*Author*/ myAuthors = new ArrayList();
private HashMap/*<Author, ArrayList<Description>>*/ myCollection = new HashMap(); private final ArrayList/*Author*/ myAuthors = new ArrayList();
private final ArrayList myExternalBooks = new ArrayList(); private HashMap/*<Author, ArrayList<Description>>*/ myCollection = new HashMap();
private final ArrayList myExternalBooks = new ArrayList();
private String myPath;
private boolean myScanSubdirs; private String myPath;
private boolean myDoStrongRebuild; private boolean myScanSubdirs;
private boolean myDoWeakRebuild; private boolean myDoStrongRebuild;
private boolean myDoWeakRebuild;
public BookCollection() {
PathOption = new ZLStringOption(ZLOption.CONFIG_CATEGORY, OPTIONS, "BookPath", "/home/geometer/FBooks"); public BookCollection() {
ScanSubdirsOption = new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, OPTIONS, "ScanSubdirs", false); PathOption = new ZLStringOption(ZLOption.CONFIG_CATEGORY, OPTIONS, "BookPath", "/FBooks");
myDoStrongRebuild = true; ScanSubdirsOption = new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, OPTIONS, "ScanSubdirs", false);
myDoWeakRebuild = false; myDoStrongRebuild = true;
} myDoWeakRebuild = false;
}
private void addExternalBook(BookDescription bookDescription) {
if (!myExternalBooks.contains(bookDescription)) { private void addExternalBook(BookDescription bookDescription) {
myExternalBooks.add(bookDescription); if (!myExternalBooks.contains(bookDescription)) {
} myExternalBooks.add(bookDescription);
} }
}
public ArrayList authors() {
synchronize(); public ArrayList authors() {
return myAuthors; synchronize();
} return myAuthors;
}
public ArrayList books(Author author) {
synchronize(); public ArrayList books(Author author) {
return (ArrayList)myCollection.get(author); synchronize();
} return (ArrayList)myCollection.get(author);
}
public boolean isBookExternal(BookDescription description) {
synchronize(); public boolean isBookExternal(BookDescription description) {
return myExternalBooks.contains(description); synchronize();
} return myExternalBooks.contains(description);
}
public void rebuild(boolean strong) {
if (strong) { public void rebuild(boolean strong) {
myDoStrongRebuild = true; if (strong) {
} else { myDoStrongRebuild = true;
myDoWeakRebuild = true; } else {
} myDoWeakRebuild = true;
} }
}
public boolean synchronize() {
boolean doStrongRebuild = public boolean synchronize() {
myDoStrongRebuild || boolean doStrongRebuild =
(myScanSubdirs != ScanSubdirsOption.getValue()) || myDoStrongRebuild ||
(myPath != PathOption.getValue()); (myScanSubdirs != ScanSubdirsOption.getValue()) ||
(myPath != PathOption.getValue());
if (!doStrongRebuild && !myDoWeakRebuild) {
return false; if (!doStrongRebuild && !myDoWeakRebuild) {
} return false;
}
myPath = PathOption.getValue();
myScanSubdirs = ScanSubdirsOption.getValue(); myPath = PathOption.getValue();
myDoWeakRebuild = false; myScanSubdirs = ScanSubdirsOption.getValue();
myDoStrongRebuild = false; myDoWeakRebuild = false;
myDoStrongRebuild = false;
if (doStrongRebuild) {
myAuthors.clear(); if (doStrongRebuild) {
myCollection.clear(); myAuthors.clear();
myExternalBooks.clear(); myCollection.clear();
myExternalBooks.clear();
final ArrayList fileNamesSet = collectBookFileNames();
final int sizeOfSet = fileNamesSet.size(); final ArrayList fileNamesSet = collectBookFileNames();
for (int i = 0; i < sizeOfSet; ++i) { final int sizeOfSet = fileNamesSet.size();
addDescription(BookDescription.getDescription((String)fileNamesSet.get(i))); for (int i = 0; i < sizeOfSet; ++i) {
} addDescription(BookDescription.getDescription((String)fileNamesSet.get(i)));
}
final ArrayList bookListFileNames = new BookList().fileNames();
final int sizeOfList = bookListFileNames.size(); final ArrayList bookListFileNames = new BookList().fileNames();
for (int i = 0; i < sizeOfList; ++i) { final int sizeOfList = bookListFileNames.size();
final String fileName = (String)bookListFileNames.get(i); for (int i = 0; i < sizeOfList; ++i) {
if (!fileNamesSet.contains(fileName)) { final String fileName = (String)bookListFileNames.get(i);
BookDescription description = BookDescription.getDescription(fileName); if (!fileNamesSet.contains(fileName)) {
if (description != null) { BookDescription description = BookDescription.getDescription(fileName);
addDescription(description); if (description != null) {
addExternalBook(description); addDescription(description);
} addExternalBook(description);
} }
} }
} else { }
//System.out.println("strange code form BookCollection"); } else {
// something strange :( //System.out.println("strange code form BookCollection");
final BookList bookList = new BookList(); // something strange :(
final ArrayList bookListSet = bookList.fileNames(); final BookList bookList = new BookList();
final ArrayList fileNames = new ArrayList(); final ArrayList bookListSet = bookList.fileNames();
final ArrayList fileNames = new ArrayList();
// TEMPORARY COMMENTED FOR J2ME COMPILABILITY
final ArrayList list = new ArrayList(myCollection.keySet()); // TEMPORARY COMMENTED FOR J2ME COMPILABILITY
for (int i = 0; i < list.size(); ++i) { final ArrayList list = new ArrayList(myCollection.keySet());
final ArrayList books = (ArrayList)myCollection.get(list.get(i)); for (int i = 0; i < list.size(); ++i) {
final int numberOfBooks = books.size(); final ArrayList books = (ArrayList)myCollection.get(list.get(i));
for (int j = 0; j < numberOfBooks; ++j) { final int numberOfBooks = books.size();
final BookDescription description = (BookDescription)books.get(j); for (int j = 0; j < numberOfBooks; ++j) {
final String fileName = description.getFileName(); final BookDescription description = (BookDescription)books.get(j);
if (!myExternalBooks.contains(description) || bookListSet.contains(fileName)) { final String fileName = description.getFileName();
fileNames.add(fileName); if (!myExternalBooks.contains(description) || bookListSet.contains(fileName)) {
} fileNames.add(fileName);
} }
} }
}
myCollection.clear();
myAuthors.clear(); myCollection.clear();
final int fileNamesSize = fileNames.size(); myAuthors.clear();
for (int i = 0; i < fileNamesSize; ++i) { final int fileNamesSize = fileNames.size();
addDescription(BookDescription.getDescription((String)fileNames.get(i), false)); for (int i = 0; i < fileNamesSize; ++i) {
} addDescription(BookDescription.getDescription((String)fileNames.get(i), false));
} }
}
if (myAuthors != null) {
Collections.sort(myAuthors, new Author.AuthorComparator()); if (myAuthors != null) {
} Collections.sort(myAuthors, new Author.AuthorComparator());
DescriptionComparator descriptionComparator = new DescriptionComparator(); }
for (Iterator it = myCollection.keySet().iterator(); it.hasNext();) { DescriptionComparator descriptionComparator = new DescriptionComparator();
ArrayList list = (ArrayList)myCollection.get(it.next()); for (Iterator it = myCollection.keySet().iterator(); it.hasNext();) {
if (list != null) { ArrayList list = (ArrayList)myCollection.get(it.next());
Collections.sort(list, descriptionComparator); if (list != null) {
} Collections.sort(list, descriptionComparator);
} }
return true; }
} return true;
}
private ArrayList collectDirNames() {
ArrayList nameQueue = new ArrayList(); private ArrayList collectDirNames() {
ArrayList nameSet = new ArrayList(); ArrayList nameQueue = new ArrayList();
ArrayList nameSet = new ArrayList();
String path = myPath;
int pos = path.indexOf(File.pathSeparator); String path = myPath;
while (pos != -1) { int pos = path.indexOf(File.pathSeparator);
nameQueue.add(path.substring(0, pos)); while (pos != -1) {
path = path.substring(0, pos + 1); nameQueue.add(path.substring(0, pos));
pos = path.indexOf(File.pathSeparator); path = path.substring(0, pos + 1);
} pos = path.indexOf(File.pathSeparator);
if (path.length() != 0) { }
nameQueue.add(path); if (path.length() != 0) {
} nameQueue.add(path);
}
while (!nameQueue.isEmpty()) {
String name = (String)nameQueue.get(0); while (!nameQueue.isEmpty()) {
nameQueue.remove(0); String name = (String)nameQueue.get(0);
if (!nameSet.contains(name)) { nameQueue.remove(0);
if (myScanSubdirs) { if (!nameSet.contains(name)) {
ZLDir dir = new ZLFile(name).getDirectory(); if (myScanSubdirs) {
if (dir != null) { ZLDir dir = new ZLFile(name).getDirectory();
ArrayList subdirs = dir.collectSubDirs(); if (dir != null) {
for (int i = 0; i < subdirs.size(); ++i) { ArrayList subdirs = dir.collectSubDirs();
nameQueue.add(dir.getItemPath((String)subdirs.get(i))); for (int i = 0; i < subdirs.size(); ++i) {
} nameQueue.add(dir.getItemPath((String)subdirs.get(i)));
} }
} }
nameSet.add(name); }
} nameSet.add(name);
} }
return nameSet; }
} return nameSet;
}
private ArrayList collectBookFileNames() {
final ArrayList bookFileNames = new ArrayList(); private ArrayList collectBookFileNames() {
final ArrayList dirs = collectDirNames(); final ArrayList bookFileNames = new ArrayList();
final int numberOfDirs = dirs.size(); final ArrayList dirs = collectDirNames();
for (int i = 0; i < numberOfDirs; ++i) { final int numberOfDirs = dirs.size();
final String dirfile = (String)dirs.get(i); for (int i = 0; i < numberOfDirs; ++i) {
final ZLDir dir = new ZLFile(dirfile).getDirectory(); final String dirfile = (String)dirs.get(i);
if (dir == null) { final ZLDir dir = new ZLFile(dirfile).getDirectory();
continue; if (dir == null) {
} continue;
}
final ArrayList files = dir.collectFiles();
final ArrayList files = dir.collectFiles();
final int numberOfFiles = files.size();
for (int j = 0; j < numberOfFiles; ++j) { final int numberOfFiles = files.size();
String fileName = dir.getItemPath((String)files.get(j)); for (int j = 0; j < numberOfFiles; ++j) {
ZLFile file = new ZLFile(fileName); String fileName = dir.getItemPath((String)files.get(j));
if (PluginCollection.instance().getPlugin(file, true) != null) { ZLFile file = new ZLFile(fileName);
if (!bookFileNames.contains(fileName)) { if (PluginCollection.instance().getPlugin(file, true) != null) {
bookFileNames.add(fileName); if (!bookFileNames.contains(fileName)) {
} bookFileNames.add(fileName);
// TODO: zip -> any archive }
} else if (file.getExtension().equals("zip")) { // TODO: zip -> any archive
if (!BookDescriptionUtil.checkInfo(file)) { } else if (file.getExtension().equals("zip")) {
BookDescriptionUtil.resetZipInfo(file); if (!BookDescriptionUtil.checkInfo(file)) {
BookDescriptionUtil.saveInfo(file); BookDescriptionUtil.resetZipInfo(file);
} BookDescriptionUtil.saveInfo(file);
final ArrayList zipEntries = new ArrayList(); }
BookDescriptionUtil.listZipEntries(file, zipEntries); final ArrayList zipEntries = new ArrayList();
final int numberOfZipEntries = zipEntries.size(); BookDescriptionUtil.listZipEntries(file, zipEntries);
for (int k = 0; k < numberOfZipEntries; ++k) { final int numberOfZipEntries = zipEntries.size();
String str = (String)zipEntries.get(k); for (int k = 0; k < numberOfZipEntries; ++k) {
if (!bookFileNames.contains(str)) { String str = (String)zipEntries.get(k);
bookFileNames.add(str); if (!bookFileNames.contains(str)) {
} bookFileNames.add(str);
} }
} }
} }
} }
return bookFileNames; }
} return bookFileNames;
}
private void addDescription(BookDescription description) {
if (description == null) { private void addDescription(BookDescription description) {
return; if (description == null) {
} return;
}
final Author author = description.getAuthor();
ArrayList books = (ArrayList)myCollection.get(author); final Author author = description.getAuthor();
if (books == null) { ArrayList books = (ArrayList)myCollection.get(author);
books = new ArrayList(); if (books == null) {
myCollection.put(author, books); books = new ArrayList();
myAuthors.add(author); myCollection.put(author, books);
} myAuthors.add(author);
books.add(description); }
} books.add(description);
}
private class DescriptionComparator implements Comparator {
public int compare(Object descr1, Object descr2) { private class DescriptionComparator implements Comparator {
BookDescription d1 = (BookDescription)descr1; public int compare(Object descr1, Object descr2) {
BookDescription d2 = (BookDescription)descr2; BookDescription d1 = (BookDescription)descr1;
String sequenceName1 = d1.getSequenceName(); BookDescription d2 = (BookDescription)descr2;
String sequenceName2 = d2.getSequenceName(); String sequenceName1 = d1.getSequenceName();
String sequenceName2 = d2.getSequenceName();
if ((sequenceName1.length() == 0) && (sequenceName2.length() == 0)) {
return d1.getTitle().compareTo(d2.getTitle()); if ((sequenceName1.length() == 0) && (sequenceName2.length() == 0)) {
} return d1.getTitle().compareTo(d2.getTitle());
if (sequenceName1.length() == 0) { }
return d1.getTitle().compareTo(sequenceName2); if (sequenceName1.length() == 0) {
} return d1.getTitle().compareTo(sequenceName2);
if (sequenceName2.length() == 0) { }
return sequenceName1.compareTo(d2.getTitle()); if (sequenceName2.length() == 0) {
} return sequenceName1.compareTo(d2.getTitle());
if (!sequenceName1.equals(sequenceName2)) { }
return sequenceName1.compareTo(sequenceName2); if (!sequenceName1.equals(sequenceName2)) {
} return sequenceName1.compareTo(sequenceName2);
return (d1.getNumberInSequence() - d2.getNumberInSequence()); }
} return (d1.getNumberInSequence() - d2.getNumberInSequence());
} }
}
static public class LastOpenedBooks {
public ZLIntegerRangeOption MaxListSizeOption; static public class LastOpenedBooks {
static private final String GROUP = "LastOpenedBooks"; public ZLIntegerRangeOption MaxListSizeOption;
static private final String BOOK = "Book"; static private final String GROUP = "LastOpenedBooks";
private final ArrayList/*BookDescription*/ myBooks = new ArrayList(); static private final String BOOK = "Book";
private final ArrayList/*BookDescription*/ myBooks = new ArrayList();
public LastOpenedBooks() {
MaxListSizeOption = new ZLIntegerRangeOption(ZLOption.STATE_CATEGORY, GROUP, "MaxSize", 1, 100, 10); public LastOpenedBooks() {
final int size = MaxListSizeOption.getValue(); MaxListSizeOption = new ZLIntegerRangeOption(ZLOption.STATE_CATEGORY, GROUP, "MaxSize", 1, 100, 10);
for (int i = 0; i < size; ++i) { final int size = MaxListSizeOption.getValue();
String num = BOOK; for (int i = 0; i < size; ++i) {
num += i; String num = BOOK;
String name = new ZLStringOption(ZLOption.STATE_CATEGORY, GROUP, num, "").getValue(); num += i;
if (name.length() != 0) { String name = new ZLStringOption(ZLOption.STATE_CATEGORY, GROUP, num, "").getValue();
BookDescription description = BookDescription.getDescription(name); if (name.length() != 0) {
if (description != null) { BookDescription description = BookDescription.getDescription(name);
myBooks.add(description); if (description != null) {
} myBooks.add(description);
} }
} }
} }
}
public void addBook(String fileName) {
for (int i = 0; i < myBooks.size(); i++) { public void addBook(String fileName) {
if (((BookDescription)(myBooks.get(i))).getFileName().equals(fileName)) { for (int i = 0; i < myBooks.size(); i++) {
myBooks.remove(myBooks.get(i)); if (((BookDescription)(myBooks.get(i))).getFileName().equals(fileName)) {
break; myBooks.remove(myBooks.get(i));
} break;
} }
}
BookDescription description = BookDescription.getDescription(fileName);
if (description != null) { BookDescription description = BookDescription.getDescription(fileName);
myBooks.add(0, description); if (description != null) {
} myBooks.add(0, description);
}
final int maxSize = MaxListSizeOption.getValue();
while (myBooks.size() > maxSize) { final int maxSize = MaxListSizeOption.getValue();
myBooks.remove(myBooks.size() - 1); while (myBooks.size() > maxSize) {
} myBooks.remove(myBooks.size() - 1);
save(); }
} save();
}
public ArrayList/*BookDescription*/ books() {
return myBooks; public ArrayList/*BookDescription*/ books() {
} return myBooks;
}
public void save() {
int size = Math.min(MaxListSizeOption.getValue(), myBooks.size()); public void save() {
for (int i = 0; i < size; ++i) { int size = Math.min(MaxListSizeOption.getValue(), myBooks.size());
String num = BOOK; for (int i = 0; i < size; ++i) {
num += i; String num = BOOK;
new ZLStringOption(ZLOption.STATE_CATEGORY, GROUP, num, "").setValue(((BookDescription)myBooks.get(i)).getFileName()); num += i;
} new ZLStringOption(ZLOption.STATE_CATEGORY, GROUP, num, "").setValue(((BookDescription)myBooks.get(i)).getFileName());
} }
} }
} }
}

View file

@ -16,6 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA. * 02110-1301, USA.
*/ */
package org.geometerplus.fbreader.collection; package org.geometerplus.fbreader.collection;
import java.util.*; import java.util.*;

Some files were not shown because too many files have changed in this diff Show more