mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-05 02:39:23 +02:00
options: cleanup (category has been removed)
new view for TOC git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@901 6a642e6f-84f6-412e-ac94-c4a38d5a04b0
This commit is contained in:
parent
738eb18e99
commit
ef6680465d
55 changed files with 842 additions and 441 deletions
|
@ -1,5 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
<node name="libraryView">
|
||||||
|
<node name="byAuthor" value="By Author"/>
|
||||||
|
<node name="byTag" value="By Tag"/>
|
||||||
|
<node name="recent" value="Recent"/>
|
||||||
|
</node>
|
||||||
<node name="menu">
|
<node name="menu">
|
||||||
<node name="preferences" value="Preferences">
|
<node name="preferences" value="Preferences">
|
||||||
<node name="preferences" value="FBReader..."/>
|
<node name="preferences" value="FBReader..."/>
|
||||||
|
@ -40,22 +45,6 @@
|
||||||
</node>
|
</node>
|
||||||
<node name="quit" value="Close"/>
|
<node name="quit" value="Close"/>
|
||||||
</node>
|
</node>
|
||||||
<node name="toolbar">
|
|
||||||
<node name="showLibrary" value="Show Library Tree"/>
|
|
||||||
<node name="showRecent" value="Show Recent Books List"/>
|
|
||||||
<node name="addBook" value="Add File to Library"/>
|
|
||||||
<node name="gotoHome" value="Go to Start of Text"/>
|
|
||||||
<node name="undo" value="Go Back"/>
|
|
||||||
<node name="redo" value="Go Forward"/>
|
|
||||||
<node name="toc" value="Table of Contents"/>
|
|
||||||
<node name="search" value="Text Search"/>
|
|
||||||
<node name="findNext" value="Find Next"/>
|
|
||||||
<node name="findPrevious" value="Find Previous"/>
|
|
||||||
<node name="bookInfo" value="Show Book Info Dialog"/>
|
|
||||||
<node name="preferences" value="Show Preferences Dialog"/>
|
|
||||||
<node name="rotate" value="Rotate Text"/>
|
|
||||||
<node name="showHelp" value="About FBReader"/>
|
|
||||||
</node>
|
|
||||||
<node name="dialog">
|
<node name="dialog">
|
||||||
<node name="button">
|
<node name="button">
|
||||||
<node name="go" value="&Go!"/>
|
<node name="go" value="&Go!"/>
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
<node name="libraryView">
|
||||||
|
<node name="byAuthor" value="По автору"/>
|
||||||
|
<node name="byTag" value="По категории"/>
|
||||||
|
<node name="recent" value="Недавние"/>
|
||||||
|
</node>
|
||||||
<node name="menu">
|
<node name="menu">
|
||||||
<node name="bookInfo" value="Информация о книге..."/>
|
<node name="bookInfo" value="Информация о книге..."/>
|
||||||
<node name="toc" value="Содержание"/>
|
<node name="toc" value="Содержание"/>
|
||||||
|
@ -38,22 +43,6 @@
|
||||||
<node name="preferences" value="Настройки..."/>
|
<node name="preferences" value="Настройки..."/>
|
||||||
<node name="quit" value="Закрыть"/>
|
<node name="quit" value="Закрыть"/>
|
||||||
</node>
|
</node>
|
||||||
<node name="toolbar">
|
|
||||||
<node name="showLibrary" value="Библиотека"/>
|
|
||||||
<node name="showRecent" value="Прочитанные книги"/>
|
|
||||||
<node name="addBook" value="Добавить файл в библиотеку"/>
|
|
||||||
<node name="gotoHome" value="В начало книги"/>
|
|
||||||
<node name="undo" value="Назад"/>
|
|
||||||
<node name="redo" value="Вперед"/>
|
|
||||||
<node name="toc" value="Оглавление"/>
|
|
||||||
<node name="search" value="Поиск"/>
|
|
||||||
<node name="findNext" value="Найти следующий"/>
|
|
||||||
<node name="findPrevious" value="Найти предыдущий"/>
|
|
||||||
<node name="bookInfo" value="Информация о книге"/>
|
|
||||||
<node name="preferences" value="Настройки"/>
|
|
||||||
<node name="rotate" value="Поворот текста"/>
|
|
||||||
<node name="showHelp" value="О программе"/>
|
|
||||||
</node>
|
|
||||||
<node name="dialog">
|
<node name="dialog">
|
||||||
<node name="button">
|
<node name="button">
|
||||||
<node name="go" value="&Искать"/>
|
<node name="go" value="&Искать"/>
|
||||||
|
|
|
@ -8,6 +8,7 @@ raw_res_dir = platform_dir + "/res/raw"
|
||||||
drawable_res_dir = platform_dir + "/res/drawable"
|
drawable_res_dir = platform_dir + "/res/drawable"
|
||||||
data_dir_common = project_dir + "/data"
|
data_dir_common = project_dir + "/data"
|
||||||
application_icons_dir_common = project_dir + "/icons/application"
|
application_icons_dir_common = project_dir + "/icons/application"
|
||||||
|
tree_icons_dir_android = platform_dir + "/icons/tree"
|
||||||
data_dir_android = platform_dir + "/data"
|
data_dir_android = platform_dir + "/data"
|
||||||
|
|
||||||
print os.getcwd()
|
print os.getcwd()
|
||||||
|
@ -35,3 +36,4 @@ clean_res_dir(drawable_res_dir)
|
||||||
process_data_dir("data__", data_dir_common, raw_res_dir)
|
process_data_dir("data__", data_dir_common, raw_res_dir)
|
||||||
process_data_dir("data__", data_dir_android, raw_res_dir)
|
process_data_dir("data__", data_dir_android, raw_res_dir)
|
||||||
shutil.copyfile(application_icons_dir_common + "/48x48.png", drawable_res_dir + "/fbreader.png")
|
shutil.copyfile(application_icons_dir_common + "/48x48.png", drawable_res_dir + "/fbreader.png")
|
||||||
|
process_data_dir("tree_icon_", tree_icons_dir_android, drawable_res_dir, 0)
|
||||||
|
|
BIN
platform/android/icons/tree/group_closed.png
Normal file
BIN
platform/android/icons/tree/group_closed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 250 B |
BIN
platform/android/icons/tree/group_empty.png
Normal file
BIN
platform/android/icons/tree/group_empty.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 190 B |
BIN
platform/android/icons/tree/group_open.png
Normal file
BIN
platform/android/icons/tree/group_open.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 242 B |
25
platform/android/res/layout/toc_tree_item.xml
Normal file
25
platform/android/res/layout/toc_tree_item.xml
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||||
|
android:paddingLeft="5dip"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
>
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/toc_tree_item_icon"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:singleLine="true"
|
||||||
|
/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/toc_tree_item_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:layout_marginLeft="5dip"
|
||||||
|
android:layout_marginTop="5dip"
|
||||||
|
android:layout_marginBottom="5dip"
|
||||||
|
android:gravity="center_vertical|left"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007-2009 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.android.fbreader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.widget.ListView;
|
||||||
|
|
||||||
|
import org.geometerplus.fbreader.description.Author;
|
||||||
|
import org.geometerplus.fbreader.collection.BookCollection;
|
||||||
|
|
||||||
|
final class AuthorListAdapter extends ZLListAdapter {
|
||||||
|
private final ArrayList<Author> myAuthors = new ArrayList(BookCollection.Instance().authors());
|
||||||
|
private final ZLListItem[] myItems = new ZLListItem[myAuthors.size()];
|
||||||
|
private final ListView myView;
|
||||||
|
private final Author mySelectedAuthor;
|
||||||
|
|
||||||
|
AuthorListAdapter(ListView view, Author selectedAuthor) {
|
||||||
|
super(view.getContext(), null);
|
||||||
|
myView = view;
|
||||||
|
mySelectedAuthor = selectedAuthor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return myItems.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZLListItem getItem(final int position) {
|
||||||
|
ZLListItem item = myItems[position];
|
||||||
|
if (item == null) {
|
||||||
|
item = new AuthorItem(myView, myAuthors.get(position));
|
||||||
|
myItems[position] = item;
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSelectedIndex() {
|
||||||
|
if (mySelectedAuthor == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int count = 0;
|
||||||
|
for (Author author : myAuthors) {
|
||||||
|
if (author.equals(mySelectedAuthor)) {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -28,13 +28,25 @@ import android.widget.ListView;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.ui.android.R;
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
||||||
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.description.Author;
|
import org.geometerplus.fbreader.description.Author;
|
||||||
import org.geometerplus.fbreader.description.BookDescription;
|
import org.geometerplus.fbreader.description.BookDescription;
|
||||||
import org.geometerplus.fbreader.collection.BookCollection;
|
import org.geometerplus.fbreader.collection.BookCollection;
|
||||||
|
|
||||||
public class LibraryTabActivity extends TabActivity {
|
public class LibraryTabActivity extends TabActivity {
|
||||||
static LibraryTabActivity ourActivity;
|
static LibraryTabActivity ourActivity;
|
||||||
|
|
||||||
|
final ZLStringOption mySelectedTabOption = new ZLStringOption("TabActivity", "SelectedTab", "");
|
||||||
|
|
||||||
|
private ListView createTab(String tag, int id) {
|
||||||
|
final TabHost host = getTabHost();
|
||||||
|
final String label = ZLResource.resource("libraryView").getResource(tag).getValue();
|
||||||
|
host.addTab(host.newTabSpec(tag).setIndicator(label).setContent(id));
|
||||||
|
return (ListView)findViewById(id);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
|
@ -42,14 +54,13 @@ public class LibraryTabActivity extends TabActivity {
|
||||||
final TabHost host = getTabHost();
|
final TabHost host = getTabHost();
|
||||||
LayoutInflater.from(this).inflate(R.layout.library, host.getTabContentView(), true);
|
LayoutInflater.from(this).inflate(R.layout.library, host.getTabContentView(), true);
|
||||||
|
|
||||||
host.addTab(host.newTabSpec("By Author").setIndicator("By Author").setContent(R.id.by_author));
|
|
||||||
host.addTab(host.newTabSpec("By Tag").setIndicator("By Tag").setContent(R.id.by_tag));
|
|
||||||
host.addTab(host.newTabSpec("Recent").setIndicator("Recent").setContent(R.id.recent));
|
|
||||||
//host.addTab(host.newTabSpec("Network").setIndicator("Network").setContent(R.id.network));
|
//host.addTab(host.newTabSpec("Network").setIndicator("Network").setContent(R.id.network));
|
||||||
|
|
||||||
LibraryTabUtil.setAuthorList((ListView)findViewById(R.id.by_author), null);
|
LibraryTabUtil.setAuthorList(createTab("byAuthor", R.id.by_author), null);
|
||||||
LibraryTabUtil.setTagList((ListView)findViewById(R.id.by_tag), "");
|
LibraryTabUtil.setTagList(createTab("byTag", R.id.by_tag), "");
|
||||||
LibraryTabUtil.setRecentBooksList((ListView)findViewById(R.id.recent));
|
LibraryTabUtil.setRecentBooksList(createTab("recent", R.id.recent));
|
||||||
|
|
||||||
|
host.setCurrentTabByTag(mySelectedTabOption.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -63,4 +74,10 @@ public class LibraryTabActivity extends TabActivity {
|
||||||
ourActivity = null;
|
ourActivity = null;
|
||||||
super.onPause();
|
super.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop() {
|
||||||
|
mySelectedTabOption.setValue(getTabHost().getCurrentTabTag());
|
||||||
|
super.onStop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,53 +24,19 @@ import android.widget.ListView;
|
||||||
import org.geometerplus.fbreader.description.Author;
|
import org.geometerplus.fbreader.description.Author;
|
||||||
import org.geometerplus.fbreader.description.BookDescription;
|
import org.geometerplus.fbreader.description.BookDescription;
|
||||||
import org.geometerplus.fbreader.collection.BookCollection;
|
import org.geometerplus.fbreader.collection.BookCollection;
|
||||||
import org.geometerplus.fbreader.collection.RecentBooks;
|
|
||||||
|
|
||||||
class LibraryTabUtil {
|
class LibraryTabUtil {
|
||||||
static void setAuthorList(ListView view, Author selectedAuthor) {
|
static void setAuthorList(ListView view, Author selectedAuthor) {
|
||||||
final ZLListAdapter adapter = new ZLListAdapter(view.getContext());
|
setAdapter(view, new AuthorListAdapter(view, selectedAuthor));
|
||||||
int selectedIndex = -1;
|
|
||||||
int count = 0;
|
|
||||||
for (final Author author : BookCollection.Instance().authors()) {
|
|
||||||
adapter.addItem(new AuthorItem(view, author));
|
|
||||||
if (author.equals(selectedAuthor)) {
|
|
||||||
selectedIndex = count;
|
|
||||||
}
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
setAdapter(view, adapter);
|
|
||||||
if (selectedIndex >= 0) {
|
|
||||||
view.setSelection(selectedIndex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setTagList(ListView view, String selectedTag) {
|
static void setTagList(ListView view, String selectedTag) {
|
||||||
final ZLListAdapter adapter = new ZLListAdapter(view.getContext());
|
setAdapter(view, new TagListAdapter(view, selectedTag));
|
||||||
int selectedIndex = -1;
|
|
||||||
int count = 0;
|
|
||||||
if (!BookCollection.Instance().booksByTag(null).isEmpty()) {
|
|
||||||
adapter.addItem(new TagItem(view, null));
|
|
||||||
if (selectedTag == null) {
|
|
||||||
selectedIndex = count;
|
|
||||||
}
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
for (final String tag : BookCollection.Instance().tags()) {
|
|
||||||
adapter.addItem(new TagItem(view, tag));
|
|
||||||
if (tag.equals(selectedTag)) {
|
|
||||||
selectedIndex = count;
|
|
||||||
}
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
setAdapter(view, adapter);
|
|
||||||
if (selectedIndex >= 0) {
|
|
||||||
view.setSelection(selectedIndex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setBookList(final ListView view, final Author author, String selectedSeries) {
|
static void setBookList(final ListView view, final Author author, String selectedSeries) {
|
||||||
ZLListAdapter adapter =
|
ZLListAdapterImpl adapter =
|
||||||
new ZLListAdapter(
|
new ZLListAdapterImpl(
|
||||||
view.getContext(),
|
view.getContext(),
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -106,8 +72,8 @@ class LibraryTabUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setBookList(final ListView view, final String tag) {
|
static void setBookList(final ListView view, final String tag) {
|
||||||
ZLListAdapter adapter =
|
ZLListAdapterImpl adapter =
|
||||||
new ZLListAdapter(
|
new ZLListAdapterImpl(
|
||||||
view.getContext(),
|
view.getContext(),
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -122,16 +88,12 @@ class LibraryTabUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setRecentBooksList(final ListView view) {
|
static void setRecentBooksList(final ListView view) {
|
||||||
ZLListAdapter adapter = new ZLListAdapter(view.getContext());
|
setAdapter(view, new RecentBooksListAdapter(view.getContext()));
|
||||||
for (BookDescription book : RecentBooks.Instance().books()) {
|
|
||||||
adapter.addItem(new BookItem(book));
|
|
||||||
}
|
|
||||||
setAdapter(view, adapter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setSeriesBookList(final ListView view, final Author author, final String series) {
|
static void setSeriesBookList(final ListView view, final Author author, final String series) {
|
||||||
ZLListAdapter adapter =
|
ZLListAdapterImpl adapter =
|
||||||
new ZLListAdapter(
|
new ZLListAdapterImpl(
|
||||||
view.getContext(),
|
view.getContext(),
|
||||||
new Runnable() {
|
new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
@ -151,5 +113,9 @@ class LibraryTabUtil {
|
||||||
view.setAdapter(adapter);
|
view.setAdapter(adapter);
|
||||||
view.setOnKeyListener(adapter);
|
view.setOnKeyListener(adapter);
|
||||||
view.setOnItemClickListener(adapter);
|
view.setOnItemClickListener(adapter);
|
||||||
|
int selectedIndex = adapter.getSelectedIndex();
|
||||||
|
if (selectedIndex >= 0) {
|
||||||
|
view.setSelection(selectedIndex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007-2009 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.android.fbreader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import org.geometerplus.fbreader.description.BookDescription;
|
||||||
|
import org.geometerplus.fbreader.collection.RecentBooks;
|
||||||
|
|
||||||
|
final class RecentBooksListAdapter extends ZLListAdapter {
|
||||||
|
final ArrayList<BookDescription> myBooks = RecentBooks.Instance().books();
|
||||||
|
final ZLListItem[] myItems = new ZLListItem[myBooks.size()];
|
||||||
|
|
||||||
|
RecentBooksListAdapter(Context context) {
|
||||||
|
super(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return myItems.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZLListItem getItem(final int position) {
|
||||||
|
ZLListItem item = myItems[position];
|
||||||
|
if (item == null) {
|
||||||
|
item = new BookItem(myBooks.get(position));
|
||||||
|
myItems[position] = item;
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSelectedIndex() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,33 @@
|
||||||
package org.geometerplus.android.fbreader;
|
package org.geometerplus.android.fbreader;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.content.Context;
|
||||||
import android.app.ListActivity;
|
import android.app.ListActivity;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.tree.ZLTextTree;
|
||||||
|
import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication;
|
||||||
|
|
||||||
public class TOCActivity extends ListActivity {
|
public class TOCActivity extends ListActivity {
|
||||||
|
public final static Object DATA_KEY = new Object();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle bundle) {
|
||||||
|
super.onCreate(bundle);
|
||||||
|
|
||||||
|
ZLTextTree tree = (ZLTextTree)((ZLAndroidApplication)getApplication()).getData(DATA_KEY);
|
||||||
|
|
||||||
|
ZLTreeAdapter adapter = new ZLTreeAdapter(getListView(), tree);
|
||||||
|
getListView().setAdapter(adapter);
|
||||||
|
getListView().setOnKeyListener(adapter);
|
||||||
|
getListView().setOnItemClickListener(adapter);
|
||||||
|
/*
|
||||||
|
int selectedIndex = adapter.getSelectedIndex();
|
||||||
|
if (selectedIndex >= 0) {
|
||||||
|
view.setSelection(selectedIndex);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007-2009 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.android.fbreader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.widget.ListView;
|
||||||
|
|
||||||
|
import org.geometerplus.fbreader.collection.BookCollection;
|
||||||
|
|
||||||
|
final class TagListAdapter extends ZLListAdapter {
|
||||||
|
private final ArrayList<String> myTags = new ArrayList<String>(BookCollection.Instance().tags());
|
||||||
|
private final ZLListItem[] myItems;
|
||||||
|
private final ListView myView;
|
||||||
|
private final String mySelectedTag;
|
||||||
|
private final boolean myHasBooksWithNoTags;
|
||||||
|
|
||||||
|
TagListAdapter(ListView view, String selectedTag) {
|
||||||
|
super(view.getContext(), null);
|
||||||
|
myView = view;
|
||||||
|
mySelectedTag = selectedTag;
|
||||||
|
myHasBooksWithNoTags = !BookCollection.Instance().booksByTag(null).isEmpty();
|
||||||
|
int count = myTags.size();
|
||||||
|
if (myHasBooksWithNoTags) {
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
myItems = new ZLListItem[count];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return myItems.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZLListItem getItem(final int position) {
|
||||||
|
ZLListItem item = myItems[position];
|
||||||
|
if (item == null) {
|
||||||
|
int pos = position;
|
||||||
|
if (myHasBooksWithNoTags) {
|
||||||
|
if (pos == 0) {
|
||||||
|
item = new TagItem(myView, null);
|
||||||
|
} else {
|
||||||
|
--pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item == null) {
|
||||||
|
item = new TagItem(myView, myTags.get(pos));
|
||||||
|
}
|
||||||
|
myItems[position] = item;
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSelectedIndex() {
|
||||||
|
if (mySelectedTag == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (mySelectedTag.length() == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int count = myHasBooksWithNoTags ? 1 : 0;
|
||||||
|
for (String tag : myTags) {
|
||||||
|
if (tag.equals(mySelectedTag)) {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,8 +19,6 @@
|
||||||
|
|
||||||
package org.geometerplus.android.fbreader;
|
package org.geometerplus.android.fbreader;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
@ -33,9 +31,8 @@ import android.widget.TextView;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.ui.android.R;
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
|
|
||||||
final class ZLListAdapter extends BaseAdapter implements AdapterView.OnItemClickListener, View.OnKeyListener {
|
abstract class ZLListAdapter extends BaseAdapter implements AdapterView.OnItemClickListener, View.OnKeyListener {
|
||||||
private final Context myContext;
|
private final Context myContext;
|
||||||
private final ArrayList<ZLListItem> myItems = new ArrayList<ZLListItem>();
|
|
||||||
private final Runnable myCancelAction;
|
private final Runnable myCancelAction;
|
||||||
|
|
||||||
ZLListAdapter(Context context, Runnable cancelAction) {
|
ZLListAdapter(Context context, Runnable cancelAction) {
|
||||||
|
@ -43,17 +40,9 @@ final class ZLListAdapter extends BaseAdapter implements AdapterView.OnItemClick
|
||||||
myCancelAction = cancelAction;
|
myCancelAction = cancelAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZLListAdapter(Context context) {
|
public abstract int getCount();
|
||||||
this(context, null);
|
public abstract ZLListItem getItem(final int position);
|
||||||
}
|
public abstract int getSelectedIndex();
|
||||||
|
|
||||||
void addItem(ZLListItem item) {
|
|
||||||
myItems.add(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCount() {
|
|
||||||
return myItems.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean areAllItemsEnabled() {
|
public boolean areAllItemsEnabled() {
|
||||||
return true;
|
return true;
|
||||||
|
@ -63,10 +52,6 @@ final class ZLListAdapter extends BaseAdapter implements AdapterView.OnItemClick
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZLListItem getItem(final int position) {
|
|
||||||
return myItems.get(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getItemId(int position) {
|
public long getItemId(int position) {
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007-2009 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.android.fbreader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
|
|
||||||
|
final class ZLListAdapterImpl extends ZLListAdapter {
|
||||||
|
private final ArrayList<ZLListItem> myItems = new ArrayList<ZLListItem>();
|
||||||
|
|
||||||
|
ZLListAdapterImpl(Context context, Runnable cancelAction) {
|
||||||
|
super(context, cancelAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZLListAdapterImpl(Context context) {
|
||||||
|
this(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
void addItem(ZLListItem item) {
|
||||||
|
myItems.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return myItems.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZLListItem getItem(final int position) {
|
||||||
|
return myItems.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSelectedIndex() {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,163 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007-2009 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.android.fbreader;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.tree.ZLTextTree;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
|
|
||||||
|
final class ZLTreeAdapter extends BaseAdapter implements AdapterView.OnItemClickListener, View.OnKeyListener {
|
||||||
|
private final ListView myParent;
|
||||||
|
private final ZLTextTree myTree;
|
||||||
|
private final ZLTreeItem[] myItems;
|
||||||
|
private final HashSet<ZLTextTree> myOpenItems = new HashSet<ZLTextTree>();
|
||||||
|
|
||||||
|
ZLTreeAdapter(ListView parent, ZLTextTree tree) {
|
||||||
|
myParent = parent;
|
||||||
|
myTree = tree;
|
||||||
|
myItems = new ZLTreeItem[tree.getSize() - 1];
|
||||||
|
myOpenItems.add(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getCount(ZLTextTree tree) {
|
||||||
|
int count = 1;
|
||||||
|
if (myOpenItems.contains(tree)) {
|
||||||
|
for (ZLTextTree subtree : tree.subTrees()) {
|
||||||
|
count += getCount(subtree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return getCount(myTree) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int indexByPosition(int position, ZLTextTree tree) {
|
||||||
|
if (position == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--position;
|
||||||
|
int index = 1;
|
||||||
|
for (ZLTextTree subtree : tree.subTrees()) {
|
||||||
|
int count = getCount(subtree);
|
||||||
|
if (count <= position) {
|
||||||
|
position -= count;
|
||||||
|
index += subtree.getSize();
|
||||||
|
} else {
|
||||||
|
return index + indexByPosition(position, subtree);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException("That's impossible!!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZLTreeItem getItem(int position) {
|
||||||
|
final int index = indexByPosition(position + 1, myTree) - 1;
|
||||||
|
ZLTreeItem item = myItems[index];
|
||||||
|
if (item == null) {
|
||||||
|
item = new ZLTreeItem(myTree.getTree(index + 1));
|
||||||
|
myItems[index] = item;
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean areAllItemsEnabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled(int position) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return indexByPosition(position + 1, myTree);
|
||||||
|
}
|
||||||
|
|
||||||
|
public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
|
final View view = (convertView != null) ? convertView :
|
||||||
|
LayoutInflater.from(myParent.getContext()).inflate(R.layout.toc_tree_item, parent, false);
|
||||||
|
final ZLTextTree tree = getItem(position).Tree;
|
||||||
|
ImageView image = (ImageView)view.findViewById(R.id.toc_tree_item_icon);
|
||||||
|
if (tree.subTrees().isEmpty()) {
|
||||||
|
image.setImageResource(R.drawable.tree_icon_group_empty);
|
||||||
|
} else {
|
||||||
|
if (myOpenItems.contains(tree)) {
|
||||||
|
image.setImageResource(R.drawable.tree_icon_group_open);
|
||||||
|
} else {
|
||||||
|
image.setImageResource(R.drawable.tree_icon_group_closed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
image.setPadding(25 * (tree.getLevel() - 1), image.getPaddingTop(), 0, image.getPaddingBottom());
|
||||||
|
TextView text = (TextView)view.findViewById(R.id.toc_tree_item_text);
|
||||||
|
text.setText(tree.getText());
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean runTreeItem(ZLTreeItem item) {
|
||||||
|
return runTree(item.Tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean runTree(ZLTextTree tree) {
|
||||||
|
if (tree.subTrees().isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (myOpenItems.contains(tree)) {
|
||||||
|
myOpenItems.remove(tree);
|
||||||
|
} else {
|
||||||
|
myOpenItems.add(tree);
|
||||||
|
}
|
||||||
|
myParent.invalidateViews();
|
||||||
|
myParent.requestLayout();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
runTreeItem((ZLTreeItem)getItem(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
|
||||||
|
switch (keyEvent.getAction()) {
|
||||||
|
case KeyEvent.ACTION_UP:
|
||||||
|
switch (keyCode) {
|
||||||
|
case KeyEvent.KEYCODE_DPAD_CENTER:
|
||||||
|
case KeyEvent.KEYCODE_ENTER:
|
||||||
|
runTreeItem((ZLTreeItem)((ListView)view).getSelectedItem());
|
||||||
|
return true;
|
||||||
|
case KeyEvent.KEYCODE_BACK:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,10 +17,14 @@
|
||||||
* 02110-1301, USA.
|
* 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.geometerplus.fbreader.option;
|
package org.geometerplus.android.fbreader;
|
||||||
|
|
||||||
public interface FBOptions {
|
import org.geometerplus.zlibrary.core.tree.ZLTextTree;
|
||||||
String BOOKS_CATEGORY = "books";
|
|
||||||
String SEARCH_CATEGORY = "search";
|
final class ZLTreeItem {
|
||||||
String EXTERNAL_CATEGORY = "external";
|
final ZLTextTree Tree;
|
||||||
|
|
||||||
|
ZLTreeItem(ZLTextTree tree) {
|
||||||
|
Tree = tree;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -71,7 +71,7 @@ public final class ZLSQLiteConfig extends ZLConfig {
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setValue(String group, String name, String value, String category) {
|
public void setValue(String group, String name, String value) {
|
||||||
database().execSQL(
|
database().execSQL(
|
||||||
"INSERT OR REPLACE INTO config (groupName, name, value) VALUES (?, ?, ?)",
|
"INSERT OR REPLACE INTO config (groupName, name, value) VALUES (?, ?, ?)",
|
||||||
new String[] { group, name, value });
|
new String[] { group, name, value });
|
||||||
|
|
|
@ -55,6 +55,17 @@ public class ZLAndroidDialogManager extends ZLDialogManager {
|
||||||
myActivity.startActivity(new Intent(myActivity, activityClass));
|
myActivity.startActivity(new Intent(myActivity, activityClass));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void runActivity(Class activityClass, Object key, Object data) {
|
||||||
|
((ZLAndroidApplication)myActivity.getApplication()).putData(key, data);
|
||||||
|
myActivity.startActivity(new Intent(myActivity, activityClass));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public void runActivity(Intent intent) {
|
||||||
|
myActivity.startActivity(intent);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
public void showInformationBox(String key, String message) {
|
public void showInformationBox(String key, String message) {
|
||||||
showAlert(0, key, message);
|
showAlert(0, key, message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||||
import org.geometerplus.zlibrary.core.image.*;
|
import org.geometerplus.zlibrary.core.image.*;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.text.model.*;
|
import org.geometerplus.zlibrary.text.model.*;
|
||||||
|
import org.geometerplus.zlibrary.core.tree.ZLTextTree;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.description.BookDescription;
|
import org.geometerplus.fbreader.description.BookDescription;
|
||||||
import org.geometerplus.fbreader.formats.*;
|
import org.geometerplus.fbreader.formats.*;
|
||||||
|
@ -32,7 +33,7 @@ import org.geometerplus.fbreader.formats.*;
|
||||||
public final class BookModel {
|
public final class BookModel {
|
||||||
public final BookDescription Description;
|
public final BookDescription Description;
|
||||||
public final ZLTextPlainModel BookTextModel = new ZLTextPlainModel(65536, "/sdcard/Books/.FBReader", "cache");
|
public final ZLTextPlainModel BookTextModel = new ZLTextPlainModel(65536, "/sdcard/Books/.FBReader", "cache");
|
||||||
public final ContentsModel ContentsModel = new ContentsModel();
|
public final ContentsTree ContentsTree = new ContentsTree();
|
||||||
|
|
||||||
private final HashMap<String,ZLTextPlainModel> myFootnotes = new HashMap<String,ZLTextPlainModel>();
|
private final HashMap<String,ZLTextPlainModel> myFootnotes = new HashMap<String,ZLTextPlainModel>();
|
||||||
private final HashMap myInternalHyperlinks = new HashMap();
|
private final HashMap myInternalHyperlinks = new HashMap();
|
||||||
|
|
|
@ -24,6 +24,7 @@ import org.geometerplus.zlibrary.core.util.*;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.image.ZLImage;
|
import org.geometerplus.zlibrary.core.image.ZLImage;
|
||||||
import org.geometerplus.zlibrary.text.model.*;
|
import org.geometerplus.zlibrary.text.model.*;
|
||||||
|
import org.geometerplus.zlibrary.core.tree.ZLTextTree;
|
||||||
|
|
||||||
public class BookReader {
|
public class BookReader {
|
||||||
public final BookModel Model;
|
public final BookModel Model;
|
||||||
|
@ -45,14 +46,11 @@ public class BookReader {
|
||||||
private boolean myInsideTitle = false;
|
private boolean myInsideTitle = false;
|
||||||
private boolean mySectionContainsRegularContents = false;
|
private boolean mySectionContainsRegularContents = false;
|
||||||
|
|
||||||
private boolean myContentsParagraphExists = false;
|
private ZLTextTree myCurrentContentsTree;
|
||||||
private final ArrayList myTOCStack = new ArrayList();
|
|
||||||
private boolean myLastTOCParagraphIsEmpty = false;
|
|
||||||
|
|
||||||
private final char[] PERIOD = "...".toCharArray();
|
|
||||||
|
|
||||||
public BookReader(BookModel model) {
|
public BookReader(BookModel model) {
|
||||||
Model = model;
|
Model = model;
|
||||||
|
myCurrentContentsTree = model.ContentsTree;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void flushTextBufferToParagraph() {
|
private final void flushTextBufferToParagraph() {
|
||||||
|
@ -220,8 +218,8 @@ public class BookReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void addHyperlinkLabel(String label, int paragraphNumber) {
|
public final void addHyperlinkLabel(String label, int paragraphIndex) {
|
||||||
Model.addHyperlinkLabel(label, myCurrentTextModel, paragraphNumber);
|
Model.addHyperlinkLabel(label, myCurrentTextModel, paragraphIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void addContentsData(char[] data) {
|
public final void addContentsData(char[] data) {
|
||||||
|
@ -229,7 +227,7 @@ public class BookReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void addContentsData(char[] data, int offset, int length) {
|
public final void addContentsData(char[] data, int offset, int length) {
|
||||||
if ((length != 0) && !myTOCStack.isEmpty()) {
|
if ((length != 0) && (myCurrentContentsTree != null)) {
|
||||||
myContentsBuffer.append(data, offset, length);
|
myContentsBuffer.append(data, offset, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -240,47 +238,42 @@ public class BookReader {
|
||||||
|
|
||||||
public final void beginContentsParagraph(ZLTextModel bookTextModel, int referenceNumber) {
|
public final void beginContentsParagraph(ZLTextModel bookTextModel, int referenceNumber) {
|
||||||
final ZLTextPlainModel textModel = myCurrentTextModel;
|
final ZLTextPlainModel textModel = myCurrentTextModel;
|
||||||
final ArrayList tocStack = myTOCStack;
|
|
||||||
if (textModel == bookTextModel) {
|
if (textModel == bookTextModel) {
|
||||||
ContentsModel contentsModel = Model.ContentsModel;
|
|
||||||
if (referenceNumber == -1) {
|
if (referenceNumber == -1) {
|
||||||
referenceNumber = textModel.getParagraphsNumber();
|
referenceNumber = textModel.getParagraphsNumber();
|
||||||
}
|
}
|
||||||
int size = tocStack.size();
|
ZLTextTree parentTree = myCurrentContentsTree;
|
||||||
ZLTextTreeParagraph peek = (size != 0) ? (ZLTextTreeParagraph)tocStack.get(size - 1) : null;
|
if (parentTree.getLevel() > 0) {
|
||||||
final ZLTextBuffer contentsBuffer = myContentsBuffer;
|
final ZLTextBuffer contentsBuffer = myContentsBuffer;
|
||||||
if (!contentsBuffer.isEmpty()) {
|
if (!contentsBuffer.isEmpty()) {
|
||||||
contentsModel.addText(contentsBuffer);
|
parentTree.setText(contentsBuffer.toString());
|
||||||
contentsBuffer.clear();
|
contentsBuffer.clear();
|
||||||
myLastTOCParagraphIsEmpty = false;
|
} else if (parentTree.getText() == null) {
|
||||||
} else if (myLastTOCParagraphIsEmpty) {
|
parentTree.setText("...");
|
||||||
contentsModel.addText(PERIOD);
|
}
|
||||||
|
} else {
|
||||||
|
myContentsBuffer.clear();
|
||||||
}
|
}
|
||||||
ZLTextTreeParagraph para = contentsModel.createParagraph(peek);
|
ZLTextTree tree = parentTree.createSubTree();
|
||||||
contentsModel.addControl(FBTextKind.CONTENTS_TABLE_ENTRY, true);
|
Model.ContentsTree.setReference(tree, myCurrentTextModel, referenceNumber);
|
||||||
contentsModel.setReference(para, myCurrentTextModel, referenceNumber);
|
myCurrentContentsTree = tree;
|
||||||
tocStack.add(para);
|
|
||||||
myLastTOCParagraphIsEmpty = true;
|
|
||||||
myContentsParagraphExists = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void endContentsParagraph() {
|
public final void endContentsParagraph() {
|
||||||
final ArrayList tocStack = myTOCStack;
|
final ZLTextTree tree = myCurrentContentsTree;
|
||||||
if (!tocStack.isEmpty()) {
|
final ZLTextBuffer contentsBuffer = myContentsBuffer;
|
||||||
final ContentsModel contentsModel = Model.ContentsModel;
|
if (tree.getLevel() == 0) {
|
||||||
final ZLTextBuffer contentsBuffer = myContentsBuffer;
|
contentsBuffer.clear();
|
||||||
if (!contentsBuffer.isEmpty()) {
|
return;
|
||||||
contentsModel.addText(contentsBuffer);
|
|
||||||
contentsBuffer.clear();
|
|
||||||
myLastTOCParagraphIsEmpty = false;
|
|
||||||
} else if (myLastTOCParagraphIsEmpty) {
|
|
||||||
contentsModel.addText(PERIOD);
|
|
||||||
myLastTOCParagraphIsEmpty = false;
|
|
||||||
}
|
|
||||||
tocStack.remove(tocStack.size() - 1);
|
|
||||||
}
|
}
|
||||||
myContentsParagraphExists = false;
|
if (!contentsBuffer.isEmpty()) {
|
||||||
|
tree.setText(contentsBuffer.toString());
|
||||||
|
contentsBuffer.clear();
|
||||||
|
} else if (tree.getText() == null) {
|
||||||
|
tree.setText("...");
|
||||||
|
}
|
||||||
|
myCurrentContentsTree = tree.getParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setReference(int contentsParagraphNumber, int referenceNumber) {
|
public final void setReference(int contentsParagraphNumber, int referenceNumber) {
|
||||||
|
@ -288,10 +281,10 @@ public class BookReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setReference(int contentsParagraphNumber, ZLTextModel textModel, int referenceNumber) {
|
public final void setReference(int contentsParagraphNumber, ZLTextModel textModel, int referenceNumber) {
|
||||||
final ContentsModel contentsModel = Model.ContentsModel;
|
final ContentsTree contentsTree = Model.ContentsTree;
|
||||||
if (contentsParagraphNumber < contentsModel.getParagraphsNumber()) {
|
if (contentsParagraphNumber < contentsTree.getSize()) {
|
||||||
contentsModel.setReference(
|
contentsTree.setReference(
|
||||||
contentsModel.getTreeParagraph(contentsParagraphNumber), textModel, referenceNumber
|
contentsTree.getTree(contentsParagraphNumber), textModel, referenceNumber
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -301,7 +294,7 @@ public class BookReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean contentsParagraphIsOpen() {
|
public final boolean contentsParagraphIsOpen() {
|
||||||
return myContentsParagraphExists;
|
return myCurrentContentsTree.getLevel() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void beginContentsParagraph() {
|
public final void beginContentsParagraph() {
|
||||||
|
|
|
@ -22,18 +22,18 @@ package org.geometerplus.fbreader.bookmodel;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import org.geometerplus.zlibrary.core.util.*;
|
import org.geometerplus.zlibrary.core.util.*;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.text.model.*;
|
import org.geometerplus.zlibrary.text.model.ZLTextModel;
|
||||||
|
import org.geometerplus.zlibrary.core.tree.ZLTextTree;
|
||||||
|
|
||||||
public class ContentsModel extends ZLTextTreeModel {
|
public class ContentsTree extends ZLTextTree {
|
||||||
private final HashMap myReferenceByParagraph = new HashMap();
|
private final HashMap<ZLTextTree,Reference> myReferenceByTree = new HashMap<ZLTextTree,Reference>();
|
||||||
|
|
||||||
public Reference getReference(ZLTextTreeParagraph paragraph) {
|
public Reference getReference(ZLTextTree tree) {
|
||||||
return (Reference) myReferenceByParagraph.get(paragraph);
|
return myReferenceByTree.get(tree);
|
||||||
// return (num != null) ? num.intValue() : -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setReference(ZLTextTreeParagraph paragraph, ZLTextModel model, int reference) {
|
public void setReference(ZLTextTree tree, ZLTextModel model, int reference) {
|
||||||
myReferenceByParagraph.put(paragraph, new Reference(reference, model));
|
myReferenceByTree.put(tree, new Reference(reference, model));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Reference {
|
public static class Reference {
|
||||||
|
@ -45,5 +45,4 @@ public class ContentsModel extends ZLTextTreeModel {
|
||||||
Model = model;
|
Model = model;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -22,7 +22,7 @@ package org.geometerplus.fbreader.collection;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import org.geometerplus.zlibrary.core.util.*;
|
import org.geometerplus.zlibrary.core.util.*;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.options.*;
|
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.description.*;
|
import org.geometerplus.fbreader.description.*;
|
||||||
import org.geometerplus.fbreader.formats.PluginCollection;
|
import org.geometerplus.fbreader.formats.PluginCollection;
|
||||||
|
@ -42,9 +42,11 @@ public final class RecentBooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
private final ArrayList<String> myFileNames = new ArrayList<String>();
|
private final ArrayList<String> myFileNames = new ArrayList<String>();
|
||||||
|
private final ArrayList<BookDescription> myBooks = new ArrayList<BookDescription>();
|
||||||
|
private boolean myIsFullySynchronized;
|
||||||
|
|
||||||
private RecentBooks() {
|
private RecentBooks() {
|
||||||
final ZLStringOption option = new ZLStringOption(ZLOption.STATE_CATEGORY, GROUP, "", "");
|
final ZLStringOption option = new ZLStringOption(GROUP, "", "");
|
||||||
for (int count = 0; ; ++count) {
|
for (int count = 0; ; ++count) {
|
||||||
option.changeName(BOOK + count);
|
option.changeName(BOOK + count);
|
||||||
String name = option.getValue();
|
String name = option.getValue();
|
||||||
|
@ -55,29 +57,45 @@ public final class RecentBooks {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addBook(String fileName) {
|
public void addBook(String fileName) {
|
||||||
myFileNames.remove(fileName);
|
myFileNames.remove(fileName);
|
||||||
myFileNames.add(0, fileName);
|
myFileNames.add(0, fileName);
|
||||||
|
myBooks.clear();
|
||||||
save();
|
save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<BookDescription> books() {
|
public void rebuild() {
|
||||||
final ArrayList<BookDescription> bookList = new ArrayList<BookDescription>();
|
if (!myIsFullySynchronized) {
|
||||||
|
myBooks.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void synchronize() {
|
||||||
|
if (!myBooks.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
myIsFullySynchronized = true;
|
||||||
for (String fileName : myFileNames) {
|
for (String fileName : myFileNames) {
|
||||||
BookDescription description = BookDescription.getDescription(fileName);
|
BookDescription description = BookDescription.getDescription(fileName);
|
||||||
if (description != null) {
|
if (description != null) {
|
||||||
bookList.add(description);
|
myBooks.add(description);
|
||||||
|
} else {
|
||||||
|
myIsFullySynchronized = false;
|
||||||
}
|
}
|
||||||
if (++count >= LIST_SIZE) {
|
if (++count >= LIST_SIZE) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bookList;
|
}
|
||||||
|
|
||||||
|
public ArrayList<BookDescription> books() {
|
||||||
|
synchronize();
|
||||||
|
return myBooks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save() {
|
public void save() {
|
||||||
final ZLStringOption option = new ZLStringOption(ZLOption.STATE_CATEGORY, GROUP, "", "");
|
final ZLStringOption option = new ZLStringOption(GROUP, "", "");
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (String fileName : myFileNames) {
|
for (String fileName : myFileNames) {
|
||||||
option.changeName(BOOK + count);
|
option.changeName(BOOK + count);
|
||||||
|
|
|
@ -26,7 +26,6 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||||
import org.geometerplus.zlibrary.core.options.*;
|
import org.geometerplus.zlibrary.core.options.*;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.formats.*;
|
import org.geometerplus.fbreader.formats.*;
|
||||||
import org.geometerplus.fbreader.option.FBOptions;
|
|
||||||
|
|
||||||
public class BookDescription implements Comparable {
|
public class BookDescription implements Comparable {
|
||||||
private static final String EMPTY = "";
|
private static final String EMPTY = "";
|
||||||
|
@ -169,7 +168,7 @@ public class BookDescription implements Comparable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveTags() {
|
private void saveTags() {
|
||||||
saveTags(new ZLStringOption(FBOptions.BOOKS_CATEGORY, FileName, "TagList", EMPTY));
|
saveTags(new ZLStringOption(FileName, "TagList", EMPTY));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveTags(ZLStringOption tagsOption) {
|
private void saveTags(ZLStringOption tagsOption) {
|
||||||
|
@ -199,15 +198,14 @@ public class BookDescription implements Comparable {
|
||||||
public final ZLStringOption TagsOption;
|
public final ZLStringOption TagsOption;
|
||||||
|
|
||||||
public BookInfo(String fileName) {
|
public BookInfo(String fileName) {
|
||||||
final String category = FBOptions.BOOKS_CATEGORY;
|
AuthorDisplayNameOption = new ZLStringOption(fileName, "AuthorDisplayName", EMPTY);
|
||||||
AuthorDisplayNameOption = new ZLStringOption(category, fileName, "AuthorDisplayName", EMPTY);
|
AuthorSortKeyOption = new ZLStringOption(fileName, "AuthorSortKey", EMPTY);
|
||||||
AuthorSortKeyOption = new ZLStringOption(category, fileName, "AuthorSortKey", EMPTY);
|
TitleOption = new ZLStringOption(fileName, "Title", EMPTY);
|
||||||
TitleOption = new ZLStringOption(category, fileName, "Title", EMPTY);
|
SeriesNameOption = new ZLStringOption(fileName, "Sequence", EMPTY);
|
||||||
SeriesNameOption = new ZLStringOption(category, fileName, "Sequence", EMPTY);
|
NumberInSeriesOption = new ZLIntegerRangeOption(fileName, "Number in seq", 0, 100, 0);
|
||||||
NumberInSeriesOption = new ZLIntegerRangeOption(category, fileName, "Number in seq", 0, 100, 0);
|
LanguageOption = new ZLStringOption(fileName, "Language", UNKNOWN);
|
||||||
LanguageOption = new ZLStringOption(category, fileName, "Language", UNKNOWN);
|
EncodingOption = new ZLStringOption(fileName, "Encoding", EMPTY);
|
||||||
EncodingOption = new ZLStringOption(category, fileName, "Encoding", EMPTY);
|
TagsOption = new ZLStringOption(fileName, "TagList", EMPTY);
|
||||||
TagsOption = new ZLStringOption(category, fileName, "TagList", EMPTY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFull() {
|
public boolean isFull() {
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.geometerplus.zlibrary.core.util.*;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.description.BookDescription.BookInfo;
|
import org.geometerplus.fbreader.description.BookDescription.BookInfo;
|
||||||
import org.geometerplus.fbreader.formats.PluginCollection;
|
import org.geometerplus.fbreader.formats.PluginCollection;
|
||||||
import org.geometerplus.fbreader.option.FBOptions;
|
|
||||||
import org.geometerplus.zlibrary.core.filesystem.ZLDir;
|
import org.geometerplus.zlibrary.core.filesystem.ZLDir;
|
||||||
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
||||||
|
@ -36,24 +35,24 @@ public class BookDescriptionUtil {
|
||||||
private static final String ENTRIES_NUMBER = "EntriesNumber";
|
private static final String ENTRIES_NUMBER = "EntriesNumber";
|
||||||
|
|
||||||
public static boolean checkInfo(ZLFile file) {
|
public static boolean checkInfo(ZLFile file) {
|
||||||
ZLIntegerOption op = new ZLIntegerOption(FBOptions.BOOKS_CATEGORY, file.getPath(), SIZE, -1);
|
ZLIntegerOption op = new ZLIntegerOption(file.getPath(), SIZE, -1);
|
||||||
return op.getValue() == (int)file.size();
|
return op.getValue() == (int)file.size();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveInfo(ZLFile file) {
|
public static void saveInfo(ZLFile file) {
|
||||||
new ZLIntegerOption(FBOptions.BOOKS_CATEGORY, file.getPath(), SIZE, -1).setValue((int)file.size());
|
new ZLIntegerOption(file.getPath(), SIZE, -1).setValue((int)file.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void listZipEntries(ZLFile zipFile, ArrayList entries) {
|
public static void listZipEntries(ZLFile zipFile, ArrayList entries) {
|
||||||
int entriesNumber = new ZLIntegerOption(FBOptions.BOOKS_CATEGORY, zipFile.getPath(), ENTRIES_NUMBER, -1).getValue();
|
int entriesNumber = new ZLIntegerOption(zipFile.getPath(), ENTRIES_NUMBER, -1).getValue();
|
||||||
if (entriesNumber == -1) {
|
if (entriesNumber == -1) {
|
||||||
//??? why so??resetZipInfo(zipFile.path());
|
//??? why so??resetZipInfo(zipFile.path());
|
||||||
resetZipInfo(zipFile);
|
resetZipInfo(zipFile);
|
||||||
entriesNumber = new ZLIntegerOption(FBOptions.BOOKS_CATEGORY, zipFile.getPath(), ENTRIES_NUMBER, -1).getValue();
|
entriesNumber = new ZLIntegerOption(zipFile.getPath(), ENTRIES_NUMBER, -1).getValue();
|
||||||
}
|
}
|
||||||
final ZLStringOption entryOption =
|
final ZLStringOption entryOption =
|
||||||
new ZLStringOption(FBOptions.BOOKS_CATEGORY, zipFile.getPath(), "", "");
|
new ZLStringOption(zipFile.getPath(), "", "");
|
||||||
for (int i = 0; i < entriesNumber; ++i) {
|
for (int i = 0; i < entriesNumber; ++i) {
|
||||||
entryOption.changeName(ENTRY + i);
|
entryOption.changeName(ENTRY + i);
|
||||||
final String entry = entryOption.getValue();
|
final String entry = entryOption.getValue();
|
||||||
|
@ -76,7 +75,7 @@ public class BookDescriptionUtil {
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; ++i) {
|
||||||
String entry = (String)entries.get(i);
|
String entry = (String)entries.get(i);
|
||||||
final ZLStringOption entryOption =
|
final ZLStringOption entryOption =
|
||||||
new ZLStringOption(FBOptions.BOOKS_CATEGORY, zipFile.getPath(), "", "");
|
new ZLStringOption(zipFile.getPath(), "", "");
|
||||||
if (PluginCollection.instance().getPlugin(new ZLFile(entry), true) != null) {
|
if (PluginCollection.instance().getPlugin(new ZLFile(entry), true) != null) {
|
||||||
final String fullName = zipPrefix + entry;
|
final String fullName = zipPrefix + entry;
|
||||||
entryOption.changeName(ENTRY + counter);
|
entryOption.changeName(ENTRY + counter);
|
||||||
|
@ -85,7 +84,7 @@ public class BookDescriptionUtil {
|
||||||
++counter;
|
++counter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new ZLIntegerOption(FBOptions.BOOKS_CATEGORY, zipFile.getPath(), ENTRIES_NUMBER, -1).setValue(counter);
|
new ZLIntegerOption(zipFile.getPath(), ENTRIES_NUMBER, -1).setValue(counter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,13 +27,11 @@ import org.geometerplus.zlibrary.core.util.*;
|
||||||
import org.geometerplus.zlibrary.core.config.ZLConfig;
|
import org.geometerplus.zlibrary.core.config.ZLConfig;
|
||||||
import org.geometerplus.zlibrary.core.library.ZLibrary;
|
import org.geometerplus.zlibrary.core.library.ZLibrary;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLBooleanOption;
|
import org.geometerplus.zlibrary.core.options.ZLBooleanOption;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLOption;
|
|
||||||
import org.geometerplus.zlibrary.core.xml.ZLStringMap;
|
import org.geometerplus.zlibrary.core.xml.ZLStringMap;
|
||||||
import org.geometerplus.zlibrary.core.xml.ZLXMLReaderAdapter;
|
import org.geometerplus.zlibrary.core.xml.ZLXMLReaderAdapter;
|
||||||
|
|
||||||
public class ZLEncodingCollection {
|
public class ZLEncodingCollection {
|
||||||
private static ZLEncodingCollection ourInstance;
|
private static ZLEncodingCollection ourInstance;
|
||||||
private static ZLBooleanOption ourUseWindows1252HackOption;
|
|
||||||
|
|
||||||
private final ArrayList/*<ZLEncodingSet>*/ mySets = new ArrayList();
|
private final ArrayList/*<ZLEncodingSet>*/ mySets = new ArrayList();
|
||||||
private final HashMap/*<String,ZLEncodingConverterInfo>*/ myInfosByName = new HashMap();
|
private final HashMap/*<String,ZLEncodingConverterInfo>*/ myInfosByName = new HashMap();
|
||||||
|
@ -54,19 +52,6 @@ public class ZLEncodingCollection {
|
||||||
return ZLibrary.JAR_DATA_PREFIX + "data/encodings/Encodings.xml";
|
return ZLibrary.JAR_DATA_PREFIX + "data/encodings/Encodings.xml";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ZLBooleanOption useWindows1252HackOption() {
|
|
||||||
if (ourUseWindows1252HackOption == null) {
|
|
||||||
ourUseWindows1252HackOption =
|
|
||||||
new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, "Encoding", "UseWindows1252Hack", true);
|
|
||||||
}
|
|
||||||
return ourUseWindows1252HackOption;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean useWindows1252Hack() {
|
|
||||||
return ZLConfig.Instance() != null/*.isInitialised()*/ && useWindows1252HackOption().getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ArrayList<ZLEncodingSet> sets() {
|
public ArrayList<ZLEncodingSet> sets() {
|
||||||
init();
|
init();
|
||||||
return mySets;
|
return mySets;
|
||||||
|
@ -74,7 +59,7 @@ public class ZLEncodingCollection {
|
||||||
public ZLEncodingConverterInfo info(String name) {
|
public ZLEncodingConverterInfo info(String name) {
|
||||||
init();
|
init();
|
||||||
String lowerCaseName = name.toLowerCase();
|
String lowerCaseName = name.toLowerCase();
|
||||||
if (useWindows1252Hack() && (lowerCaseName == "iso-8859-1")) {
|
if (lowerCaseName == "iso-8859-1") {
|
||||||
lowerCaseName = "windows-1252";
|
lowerCaseName = "windows-1252";
|
||||||
}
|
}
|
||||||
return (ZLEncodingConverterInfo)myInfosByName.get(lowerCaseName);
|
return (ZLEncodingConverterInfo)myInfosByName.get(lowerCaseName);
|
||||||
|
|
|
@ -43,7 +43,6 @@ public class BookTextView extends FBView {
|
||||||
private ZLIntegerOption myParagraphIndexOption;
|
private ZLIntegerOption myParagraphIndexOption;
|
||||||
private ZLIntegerOption myWordIndexOption;
|
private ZLIntegerOption myWordIndexOption;
|
||||||
private ZLIntegerOption myCharIndexOption;
|
private ZLIntegerOption myCharIndexOption;
|
||||||
private ZLTextModel myContentsModel;
|
|
||||||
|
|
||||||
private ArrayList myPositionStack = new ArrayList();
|
private ArrayList myPositionStack = new ArrayList();
|
||||||
private int myCurrentPointInStack;
|
private int myCurrentPointInStack;
|
||||||
|
@ -53,27 +52,23 @@ public class BookTextView extends FBView {
|
||||||
public ZLBooleanOption ShowTOCMarksOption;
|
public ZLBooleanOption ShowTOCMarksOption;
|
||||||
|
|
||||||
public final ZLBooleanOption OpenInBrowserOption =
|
public final ZLBooleanOption OpenInBrowserOption =
|
||||||
new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, "Web Browser", "Enabled", true);
|
new ZLBooleanOption("Web Browser", "Enabled", true);
|
||||||
|
|
||||||
BookTextView(ZLPaintContext context) {
|
BookTextView(ZLPaintContext context) {
|
||||||
super(context);
|
super(context);
|
||||||
ShowTOCMarksOption = new ZLBooleanOption(ZLOption.LOOK_AND_FEEL_CATEGORY, "Indicator", "ShowTOCMarks", false);
|
ShowTOCMarksOption = new ZLBooleanOption("Indicator", "ShowTOCMarks", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setContentsModel(ZLTextModel contentsModel) {
|
|
||||||
myContentsModel = contentsModel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setModels(ArrayList/*<ZLTextModel>*/ models, String fileName) {
|
public void setModels(ArrayList/*<ZLTextModel>*/ models, String fileName) {
|
||||||
myFileName = fileName;
|
myFileName = fileName;
|
||||||
|
|
||||||
myPositionStack.clear();
|
myPositionStack.clear();
|
||||||
|
|
||||||
final int stackSize = new ZLIntegerRangeOption(ZLOption.STATE_CATEGORY, fileName, BUFFER_SIZE, 0, MAX_UNDO_STACK_SIZE, 0).getValue();
|
final int stackSize = new ZLIntegerRangeOption(fileName, BUFFER_SIZE, 0, MAX_UNDO_STACK_SIZE, 0).getValue();
|
||||||
myCurrentPointInStack = new ZLIntegerRangeOption(ZLOption.STATE_CATEGORY, fileName, POSITION_IN_BUFFER, 0, (stackSize == 0) ? 0 : (stackSize - 1), 0).getValue();
|
myCurrentPointInStack = new ZLIntegerRangeOption(fileName, POSITION_IN_BUFFER, 0, (stackSize == 0) ? 0 : (stackSize - 1), 0).getValue();
|
||||||
|
|
||||||
if (models != null) {
|
if (models != null) {
|
||||||
final ZLIntegerOption option = new ZLIntegerOption(ZLOption.STATE_CATEGORY, fileName, "", 0);
|
final ZLIntegerOption option = new ZLIntegerOption(fileName, "", 0);
|
||||||
final int size = models.size();
|
final int size = models.size();
|
||||||
for (int i = 0; i < stackSize; ++i) {
|
for (int i = 0; i < stackSize; ++i) {
|
||||||
// option.changeName(MODEL_PREFIX + i);
|
// option.changeName(MODEL_PREFIX + i);
|
||||||
|
@ -250,10 +245,10 @@ public class BookTextView extends FBView {
|
||||||
|
|
||||||
final String group = getFileName();
|
final String group = getFileName();
|
||||||
|
|
||||||
new ZLIntegerOption(ZLOption.STATE_CATEGORY, group, BUFFER_SIZE, 0).setValue(myPositionStack.size());
|
new ZLIntegerOption(group, BUFFER_SIZE, 0).setValue(myPositionStack.size());
|
||||||
new ZLIntegerOption(ZLOption.STATE_CATEGORY, group, POSITION_IN_BUFFER, 0).setValue(myCurrentPointInStack);
|
new ZLIntegerOption(group, POSITION_IN_BUFFER, 0).setValue(myCurrentPointInStack);
|
||||||
|
|
||||||
final ZLIntegerOption option = new ZLIntegerOption(ZLOption.STATE_CATEGORY, group, "", 0);
|
final ZLIntegerOption option = new ZLIntegerOption(group, "", 0);
|
||||||
for (int i = 0; i < myPositionStack.size(); ++i) {
|
for (int i = 0; i < myPositionStack.size(); ++i) {
|
||||||
Position position = (Position)myPositionStack.get(i);
|
Position position = (Position)myPositionStack.get(i);
|
||||||
option.changeName(PARAGRAPH_PREFIX + i);
|
option.changeName(PARAGRAPH_PREFIX + i);
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2007-2009 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.fbreader.fbreader;
|
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.options.*;
|
|
||||||
import org.geometerplus.zlibrary.core.application.ZLApplication;
|
|
||||||
import org.geometerplus.zlibrary.core.view.ZLPaintContext;
|
|
||||||
import org.geometerplus.zlibrary.text.model.*;
|
|
||||||
import org.geometerplus.zlibrary.text.view.impl.ZLTextWordCursor;
|
|
||||||
|
|
||||||
import org.geometerplus.fbreader.bookmodel.ContentsModel;
|
|
||||||
|
|
||||||
class ContentsView extends FBView {
|
|
||||||
ContentsView(ZLPaintContext context) {
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean onStylusRelease(int x, int y) {
|
|
||||||
if (super.onStylusRelease(x, y)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int index = getParagraphIndexByCoordinate(y);
|
|
||||||
if (index == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final ContentsModel contentsModel = (ContentsModel)getModel();
|
|
||||||
final ZLTextTreeParagraph paragraph = contentsModel.getTreeParagraph(index);
|
|
||||||
final ContentsModel.Reference reference = contentsModel.getReference(paragraph);
|
|
||||||
|
|
||||||
final FBReader fbreader = (FBReader)ZLApplication.Instance();
|
|
||||||
// fbreader.BookTextView.gotoPosition(reference, 0, 0);
|
|
||||||
fbreader.BookTextView.gotoParagraphSafe(reference.Model, reference.ParagraphIndex);
|
|
||||||
fbreader.setMode(FBReader.ViewMode.BOOK_TEXT);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isEmpty() {
|
|
||||||
final ContentsModel contentsModel = (ContentsModel)getModel();
|
|
||||||
return (contentsModel == null) || (contentsModel.getParagraphsNumber() == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int currentTextViewParagraph(boolean includeStart) {
|
|
||||||
final FBReader fbreader = (FBReader)ZLApplication.Instance();
|
|
||||||
final ZLTextWordCursor cursor = fbreader.BookTextView.StartCursor;
|
|
||||||
if (!cursor.isNull()) {
|
|
||||||
int reference = cursor.getParagraphCursor().Index;
|
|
||||||
boolean startOfParagraph = cursor.getWordIndex() == 0;
|
|
||||||
if (cursor.isEndOfParagraph()) {
|
|
||||||
++reference;
|
|
||||||
startOfParagraph = true;
|
|
||||||
}
|
|
||||||
final int length = getModel().getParagraphsNumber();
|
|
||||||
final ContentsModel contentsModel = (ContentsModel)getModel();
|
|
||||||
final ZLTextModel currentModel = (ZLTextModel) fbreader.BookTextView.getModel();
|
|
||||||
for (int i = 1; i < length; ++i) {
|
|
||||||
final ContentsModel.Reference contentsReference =
|
|
||||||
contentsModel.getReference(contentsModel.getTreeParagraph(i));
|
|
||||||
if ((contentsReference.Model == currentModel)
|
|
||||||
&& ((contentsReference.ParagraphIndex > reference) ||
|
|
||||||
(!includeStart && startOfParagraph
|
|
||||||
&& (contentsReference.ParagraphIndex == reference)))) {
|
|
||||||
return i - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return length - 1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void gotoReference() {
|
|
||||||
getModel().removeAllMarks();
|
|
||||||
final int selected = currentTextViewParagraph(true);
|
|
||||||
highlightParagraph(selected);
|
|
||||||
gotoParagraph(selected, false);
|
|
||||||
scrollPage(false, ScrollingMode.SCROLL_PERCENTAGE, 40);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -45,11 +45,10 @@ public final class FBReader extends ZLApplication {
|
||||||
int UNDEFINED = 0;
|
int UNDEFINED = 0;
|
||||||
int BOOK_TEXT = 1 << 0;
|
int BOOK_TEXT = 1 << 0;
|
||||||
int FOOTNOTE = 1 << 1;
|
int FOOTNOTE = 1 << 1;
|
||||||
int CONTENTS = 1 << 2;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public final ZLBooleanOption UseSeparateBindingsOption =
|
public final ZLBooleanOption UseSeparateBindingsOption =
|
||||||
new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, "KeysOptions", "UseSeparateBindings", false);
|
new ZLBooleanOption("KeysOptions", "UseSeparateBindings", false);
|
||||||
|
|
||||||
public final ScrollingOptions TouchScrollingOptions =
|
public final ScrollingOptions TouchScrollingOptions =
|
||||||
new ScrollingOptions("TouchScrolling", ZLTextView.ScrollingMode.NO_OVERLAPPING);
|
new ScrollingOptions("TouchScrolling", ZLTextView.ScrollingMode.NO_OVERLAPPING);
|
||||||
|
@ -75,7 +74,7 @@ public final class FBReader extends ZLApplication {
|
||||||
}
|
}
|
||||||
|
|
||||||
private final ZLStringOption myBookNameOption =
|
private final ZLStringOption myBookNameOption =
|
||||||
new ZLStringOption(ZLOption.STATE_CATEGORY, "State", "Book", "");
|
new ZLStringOption("State", "Book", "");
|
||||||
|
|
||||||
private final ZLKeyBindings myBindings0 = new ZLKeyBindings("Keys");
|
private final ZLKeyBindings myBindings0 = new ZLKeyBindings("Keys");
|
||||||
private final ZLKeyBindings myBindings90 = new ZLKeyBindings("Keys90");
|
private final ZLKeyBindings myBindings90 = new ZLKeyBindings("Keys90");
|
||||||
|
@ -86,10 +85,9 @@ public final class FBReader extends ZLApplication {
|
||||||
private int myPreviousMode = ViewMode.BOOK_TEXT;
|
private int myPreviousMode = ViewMode.BOOK_TEXT;
|
||||||
|
|
||||||
public final BookTextView BookTextView;
|
public final BookTextView BookTextView;
|
||||||
public final ContentsView ContentsView;
|
|
||||||
public final FootnoteView FootnoteView;
|
public final FootnoteView FootnoteView;
|
||||||
|
|
||||||
private BookModel myBookModel;
|
BookModel myBookModel;
|
||||||
private final String myArg0;
|
private final String myArg0;
|
||||||
|
|
||||||
public FBReader(String[] args) {
|
public FBReader(String[] args) {
|
||||||
|
@ -132,7 +130,6 @@ public final class FBReader extends ZLApplication {
|
||||||
|
|
||||||
ZLPaintContext context = ZLibrary.Instance().getPaintContext();
|
ZLPaintContext context = ZLibrary.Instance().getPaintContext();
|
||||||
BookTextView = new BookTextView(context);
|
BookTextView = new BookTextView(context);
|
||||||
ContentsView = new ContentsView(context);
|
|
||||||
FootnoteView = new FootnoteView(context);
|
FootnoteView = new FootnoteView(context);
|
||||||
|
|
||||||
setMode(ViewMode.BOOK_TEXT);
|
setMode(ViewMode.BOOK_TEXT);
|
||||||
|
@ -197,10 +194,6 @@ public final class FBReader extends ZLApplication {
|
||||||
case ViewMode.BOOK_TEXT:
|
case ViewMode.BOOK_TEXT:
|
||||||
setView(BookTextView);
|
setView(BookTextView);
|
||||||
break;
|
break;
|
||||||
case ViewMode.CONTENTS:
|
|
||||||
ContentsView.gotoReference();
|
|
||||||
setView(ContentsView);
|
|
||||||
break;
|
|
||||||
case ViewMode.FOOTNOTE:
|
case ViewMode.FOOTNOTE:
|
||||||
setView(FootnoteView);
|
setView(FootnoteView);
|
||||||
break;
|
break;
|
||||||
|
@ -234,7 +227,6 @@ public final class FBReader extends ZLApplication {
|
||||||
|
|
||||||
public void clearTextCaches() {
|
public void clearTextCaches() {
|
||||||
BookTextView.clearCaches();
|
BookTextView.clearCaches();
|
||||||
ContentsView.clearCaches();
|
|
||||||
FootnoteView.clearCaches();
|
FootnoteView.clearCaches();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,8 +236,6 @@ public final class FBReader extends ZLApplication {
|
||||||
if (description != null) {
|
if (description != null) {
|
||||||
BookTextView.saveState();
|
BookTextView.saveState();
|
||||||
BookTextView.setModels(null, "");
|
BookTextView.setModels(null, "");
|
||||||
BookTextView.setContentsModel(null);
|
|
||||||
ContentsView.setModel(null);
|
|
||||||
|
|
||||||
myBookModel = null;
|
myBookModel = null;
|
||||||
//android.os.Debug.startMethodTracing("/data/anr/loading");
|
//android.os.Debug.startMethodTracing("/data/anr/loading");
|
||||||
|
@ -257,11 +247,8 @@ public final class FBReader extends ZLApplication {
|
||||||
// BookTextView.setModel(myBookModel.BookTextModel, fileName);
|
// BookTextView.setModel(myBookModel.BookTextModel, fileName);
|
||||||
BookTextView.setModels(myBookModel.getBookTextModels(), fileName);
|
BookTextView.setModels(myBookModel.getBookTextModels(), fileName);
|
||||||
BookTextView.setCaption(description.getTitle());
|
BookTextView.setCaption(description.getTitle());
|
||||||
BookTextView.setContentsModel(myBookModel.ContentsModel);
|
|
||||||
FootnoteView.setModel(null);
|
FootnoteView.setModel(null);
|
||||||
FootnoteView.setCaption(description.getTitle());
|
FootnoteView.setCaption(description.getTitle());
|
||||||
ContentsView.setModel(myBookModel.ContentsModel);
|
|
||||||
ContentsView.setCaption(description.getTitle());
|
|
||||||
RecentBooks.Instance().addBook(fileName);
|
RecentBooks.Instance().addBook(fileName);
|
||||||
}
|
}
|
||||||
resetWindowCaption();
|
resetWindowCaption();
|
||||||
|
|
|
@ -37,7 +37,7 @@ public abstract class FBView extends ZLTextViewImpl {
|
||||||
|
|
||||||
private static ZLIntegerRangeOption createMarginOption(String name, int defaultValue) {
|
private static ZLIntegerRangeOption createMarginOption(String name, int defaultValue) {
|
||||||
return new ZLIntegerRangeOption(
|
return new ZLIntegerRangeOption(
|
||||||
ZLOption.LOOK_AND_FEEL_CATEGORY, "Options", name, 0, 1000, defaultValue
|
"Options", name, 0, 1000, defaultValue
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ public abstract class FBView extends ZLTextViewImpl {
|
||||||
|
|
||||||
public static ZLBooleanOption selectionOption() {
|
public static ZLBooleanOption selectionOption() {
|
||||||
if (ourSelectionOption == null) {
|
if (ourSelectionOption == null) {
|
||||||
ourSelectionOption = new ZLBooleanOption(ZLOption.LOOK_AND_FEEL_CATEGORY, "Options", "IsSelectionEnabled", true);
|
ourSelectionOption = new ZLBooleanOption("Options", "IsSelectionEnabled", true);
|
||||||
}
|
}
|
||||||
return ourSelectionOption;
|
return ourSelectionOption;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,10 +28,9 @@ public final class ScrollingOptions {
|
||||||
public final ZLIntegerRangeOption PercentToScrollOption;
|
public final ZLIntegerRangeOption PercentToScrollOption;
|
||||||
|
|
||||||
public ScrollingOptions(String group, int mode) {
|
public ScrollingOptions(String group, int mode) {
|
||||||
final String category = ZLOption.CONFIG_CATEGORY;
|
ModeOption = new ZLIntegerOption(group, "Mode", mode);
|
||||||
ModeOption = new ZLIntegerOption(category, group, "Mode", mode);
|
LinesToKeepOption = new ZLIntegerRangeOption(group, "LinesToKeep", 1, 100, 1);
|
||||||
LinesToKeepOption = new ZLIntegerRangeOption(category, group, "LinesToKeep", 1, 100, 1);
|
LinesToScrollOption = new ZLIntegerRangeOption(group, "LinesToScroll", 1, 100, 1);
|
||||||
LinesToScrollOption = new ZLIntegerRangeOption(category, group, "LinesToScroll", 1, 100, 1);
|
PercentToScrollOption = new ZLIntegerRangeOption(group, "PercentToScrollOption", 1, 100, 50);
|
||||||
PercentToScrollOption = new ZLIntegerRangeOption(category, group, "PercentToScrollOption", 1, 100, 50);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
package org.geometerplus.fbreader.fbreader;
|
package org.geometerplus.fbreader.fbreader;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.option.FBOptions;
|
|
||||||
import org.geometerplus.zlibrary.core.options.*;
|
import org.geometerplus.zlibrary.core.options.*;
|
||||||
import org.geometerplus.zlibrary.core.dialogs.*;
|
import org.geometerplus.zlibrary.core.dialogs.*;
|
||||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
|
@ -37,11 +36,11 @@ class SearchAction extends FBAction {
|
||||||
|
|
||||||
SearchAction(FBReader fbreader) {
|
SearchAction(FBReader fbreader) {
|
||||||
super(fbreader);
|
super(fbreader);
|
||||||
SearchBackwardOption = new ZLBooleanOption(FBOptions.SEARCH_CATEGORY, SEARCH, "Backward", false);
|
SearchBackwardOption = new ZLBooleanOption(SEARCH, "Backward", false);
|
||||||
SearchIgnoreCaseOption = new ZLBooleanOption(FBOptions.SEARCH_CATEGORY, SEARCH, "IgnoreCase", true);
|
SearchIgnoreCaseOption = new ZLBooleanOption(SEARCH, "IgnoreCase", true);
|
||||||
SearchInWholeTextOption = new ZLBooleanOption(FBOptions.SEARCH_CATEGORY, SEARCH, "WholeText", false);
|
SearchInWholeTextOption = new ZLBooleanOption(SEARCH, "WholeText", false);
|
||||||
SearchThisSectionOnlyOption = new ZLBooleanOption(FBOptions.SEARCH_CATEGORY, SEARCH, "ThisSectionOnly", false);
|
SearchThisSectionOnlyOption = new ZLBooleanOption(SEARCH, "ThisSectionOnly", false);
|
||||||
SearchPatternOption = new ZLStringOption(FBOptions.SEARCH_CATEGORY, SEARCH, PATTERN, "");
|
SearchPatternOption = new ZLStringOption(SEARCH, PATTERN, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVisible() {
|
public boolean isVisible() {
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.geometerplus.fbreader.fbreader;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.option.FBOptions;
|
|
||||||
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
||||||
import org.geometerplus.zlibrary.core.dialogs.ZLComboOptionEntry;
|
import org.geometerplus.zlibrary.core.dialogs.ZLComboOptionEntry;
|
||||||
|
|
||||||
|
@ -42,7 +41,7 @@ class SearchPatternEntry extends ZLComboOptionEntry {
|
||||||
int index = 1;
|
int index = 1;
|
||||||
for (int i = 0; (index < 6) && (i < myValues.size()); i++) {
|
for (int i = 0; (index < 6) && (i < myValues.size()); i++) {
|
||||||
if (!myValues.get(i).equals(v)) {
|
if (!myValues.get(i).equals(v)) {
|
||||||
(new ZLStringOption(FBOptions.SEARCH_CATEGORY, SearchAction.SEARCH, SearchAction.PATTERN + index, "")).
|
(new ZLStringOption(SearchAction.SEARCH, SearchAction.PATTERN + index, "")).
|
||||||
setValue((String) myValues.get(i));
|
setValue((String) myValues.get(i));
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
@ -54,8 +53,7 @@ class SearchPatternEntry extends ZLComboOptionEntry {
|
||||||
if (myValues.isEmpty()) {
|
if (myValues.isEmpty()) {
|
||||||
myValues.add(myAction.SearchPatternOption.getValue());
|
myValues.add(myAction.SearchPatternOption.getValue());
|
||||||
for (int i = 1; i < 6; i++) {
|
for (int i = 1; i < 6; i++) {
|
||||||
String value = (new ZLStringOption(FBOptions.SEARCH_CATEGORY,
|
String value = (new ZLStringOption(SearchAction.SEARCH, SearchAction.PATTERN + i, "")).getValue();
|
||||||
SearchAction.SEARCH, SearchAction.PATTERN + i, "")).getValue();
|
|
||||||
if (value != "") {
|
if (value != "") {
|
||||||
myValues.add(value);
|
myValues.add(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
package org.geometerplus.fbreader.fbreader;
|
package org.geometerplus.fbreader.fbreader;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.collection.BookCollection;
|
import org.geometerplus.fbreader.collection.BookCollection;
|
||||||
|
import org.geometerplus.fbreader.collection.RecentBooks;
|
||||||
|
|
||||||
import org.geometerplus.android.fbreader.LibraryTabActivity;
|
import org.geometerplus.android.fbreader.LibraryTabActivity;
|
||||||
|
|
||||||
|
@ -38,6 +39,9 @@ class ShowLibrary extends FBAction {
|
||||||
BookCollection collection = BookCollection.Instance();
|
BookCollection collection = BookCollection.Instance();
|
||||||
collection.rebuild();
|
collection.rebuild();
|
||||||
collection.synchronize();
|
collection.synchronize();
|
||||||
|
RecentBooks recentBooks = RecentBooks.Instance();
|
||||||
|
recentBooks.rebuild();
|
||||||
|
recentBooks.synchronize();
|
||||||
// TODO: select current book (author?)
|
// TODO: select current book (author?)
|
||||||
/*
|
/*
|
||||||
if (myBookModel != null) {
|
if (myBookModel != null) {
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
|
|
||||||
package org.geometerplus.fbreader.fbreader;
|
package org.geometerplus.fbreader.fbreader;
|
||||||
|
|
||||||
|
//import android.net.Uri;
|
||||||
|
//import android.content.Intent;
|
||||||
|
|
||||||
import org.geometerplus.android.fbreader.TOCActivity;
|
import org.geometerplus.android.fbreader.TOCActivity;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.ui.android.dialogs.ZLAndroidDialogManager;
|
import org.geometerplus.zlibrary.ui.android.dialogs.ZLAndroidDialogManager;
|
||||||
|
@ -29,19 +32,20 @@ class ShowTOCAction extends FBAction {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVisible() {
|
public boolean isVisible() {
|
||||||
switch (Reader.getMode()) {
|
// TODO: check if contents model is empty
|
||||||
case FBReader.ViewMode.BOOK_TEXT:
|
//return !Reader.ContentsView.isEmpty();
|
||||||
case FBReader.ViewMode.FOOTNOTE:
|
return Reader.myBookModel.ContentsTree.getSize() > 1;
|
||||||
return !Reader.ContentsView.isEmpty();
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
final ZLAndroidDialogManager dialogManager =
|
final ZLAndroidDialogManager dialogManager =
|
||||||
(ZLAndroidDialogManager)ZLAndroidDialogManager.getInstance();
|
(ZLAndroidDialogManager)ZLAndroidDialogManager.getInstance();
|
||||||
dialogManager.runActivity(TOCActivity.class);
|
/*
|
||||||
//Reader.setMode(FBReader.ViewMode.CONTENTS);
|
Intent intent = new Intent(Intent.ACTION_PICK);
|
||||||
|
intent.setDataAndType(Uri.EMPTY, "vnd.android.cursor.dir/album");
|
||||||
|
dialogManager.runActivity(intent);
|
||||||
|
*/
|
||||||
|
// TODO: open tree
|
||||||
|
dialogManager.runActivity(TOCActivity.class, TOCActivity.DATA_KEY, Reader.myBookModel.ContentsTree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,9 +64,9 @@ public class PluginCollection {
|
||||||
}
|
}
|
||||||
|
|
||||||
private PluginCollection() {
|
private PluginCollection() {
|
||||||
LanguageAutoDetectOption = new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, "Format", "AutoDetect", true);
|
LanguageAutoDetectOption = new ZLBooleanOption("Format", "AutoDetect", true);
|
||||||
DefaultLanguageOption = new ZLStringOption(ZLOption.CONFIG_CATEGORY, "Format", "DefaultLanguage", "en");
|
DefaultLanguageOption = new ZLStringOption("Format", "DefaultLanguage", "en");
|
||||||
DefaultEncodingOption = new ZLStringOption(ZLOption.CONFIG_CATEGORY, "Format", "DefaultEncoding", "windows-1252");
|
DefaultEncodingOption = new ZLStringOption("Format", "DefaultEncoding", "windows-1252");
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormatPlugin getPlugin(ZLFile file, boolean strong) {
|
public FormatPlugin getPlugin(ZLFile file, boolean strong) {
|
||||||
|
|
|
@ -25,7 +25,6 @@ import java.io.InputStream;
|
||||||
import org.geometerplus.fbreader.description.BookDescriptionUtil;
|
import org.geometerplus.fbreader.description.BookDescriptionUtil;
|
||||||
import org.geometerplus.fbreader.formats.FormatPlugin;
|
import org.geometerplus.fbreader.formats.FormatPlugin;
|
||||||
import org.geometerplus.fbreader.formats.plucker.PluckerTextStream;
|
import org.geometerplus.fbreader.formats.plucker.PluckerTextStream;
|
||||||
import org.geometerplus.fbreader.option.FBOptions;
|
|
||||||
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
||||||
|
|
||||||
|
@ -41,7 +40,7 @@ public abstract class PdbPlugin extends FormatPlugin {
|
||||||
ZLFile baseFile = (index == -1) ? file : new ZLFile(fileName.substring(0, index));
|
ZLFile baseFile = (index == -1) ? file : new ZLFile(fileName.substring(0, index));
|
||||||
boolean upToDate = BookDescriptionUtil.checkInfo(baseFile);
|
boolean upToDate = BookDescriptionUtil.checkInfo(baseFile);
|
||||||
|
|
||||||
ZLStringOption palmTypeOption = new ZLStringOption(FBOptions.BOOKS_CATEGORY, file.getPath(), "PalmType", "");
|
ZLStringOption palmTypeOption = new ZLStringOption(file.getPath(), "PalmType", "");
|
||||||
String palmType = palmTypeOption.getValue();
|
String palmType = palmTypeOption.getValue();
|
||||||
if ((palmType.length() != 8) || !upToDate) {
|
if ((palmType.length() != 8) || !upToDate) {
|
||||||
byte[] id = new byte[8];
|
byte[] id = new byte[8];
|
||||||
|
|
|
@ -33,7 +33,7 @@ import org.geometerplus.fbreader.fbreader.*;
|
||||||
public class KeyBindingsPage {
|
public class KeyBindingsPage {
|
||||||
|
|
||||||
public KeyBindingsPage(FBReader fbreader, ZLDialogContent dialogTab) {
|
public KeyBindingsPage(FBReader fbreader, ZLDialogContent dialogTab) {
|
||||||
if (new ZLBooleanOption(ZLOption.EMPTY, ZLOption.PLATFORM_GROUP, "FullKeyboardControlSupported", false).getValue()) {
|
if (new ZLBooleanOption(ZLOption.PLATFORM_GROUP, "FullKeyboardControlSupported", false).getValue()) {
|
||||||
dialogTab.addOption("grabSystemKeys", new KeyboardControlEntry(fbreader));
|
dialogTab.addOption("grabSystemKeys", new KeyboardControlEntry(fbreader));
|
||||||
}
|
}
|
||||||
MultiKeyOptionEntry keyEntry = new MultiKeyOptionEntry(dialogTab.getResource("action"), fbreader);
|
MultiKeyOptionEntry keyEntry = new MultiKeyOptionEntry(dialogTab.getResource("action"), fbreader);
|
||||||
|
|
|
@ -48,7 +48,6 @@ public class OptionsDialog {
|
||||||
// EncodingSetEntry encodingSetEntry = new EncodingSetEntry(encodingEntry);
|
// EncodingSetEntry encodingSetEntry = new EncodingSetEntry(encodingEntry);
|
||||||
// encodingTab.addOption("defaultEncodingSet", encodingSetEntry);
|
// encodingTab.addOption("defaultEncodingSet", encodingSetEntry);
|
||||||
// encodingTab.addOption("defaultEncoding", encodingEntry);
|
// encodingTab.addOption("defaultEncoding", encodingEntry);
|
||||||
encodingTab.addOption("useWindows1252Hack", new ZLSimpleBooleanOptionEntry(ZLEncodingCollection.useWindows1252HackOption()));
|
|
||||||
|
|
||||||
new ScrollingOptionsPage(myDialog.createTab("Scrolling"), fbreader);
|
new ScrollingOptionsPage(myDialog.createTab("Scrolling"), fbreader);
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@ import org.geometerplus.zlibrary.core.library.ZLibrary;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLBooleanOption;
|
import org.geometerplus.zlibrary.core.options.ZLBooleanOption;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption;
|
import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLOption;
|
|
||||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
import org.geometerplus.zlibrary.core.view.ZLView;
|
import org.geometerplus.zlibrary.core.view.ZLView;
|
||||||
import org.geometerplus.zlibrary.core.view.ZLViewWidget;
|
import org.geometerplus.zlibrary.core.view.ZLViewWidget;
|
||||||
|
@ -55,21 +54,21 @@ public abstract class ZLApplication {
|
||||||
|
|
||||||
public final ZLIntegerOption RotationAngleOption =
|
public final ZLIntegerOption RotationAngleOption =
|
||||||
// temporary commented while we have no options dialog
|
// temporary commented while we have no options dialog
|
||||||
//new ZLIntegerOption(ZLOption.CONFIG_CATEGORY, ROTATION, ANGLE, ZLViewWidget.Angle.DEGREES90);
|
//new ZLIntegerOption(ROTATION, ANGLE, ZLViewWidget.Angle.DEGREES90);
|
||||||
new ZLIntegerOption(ZLOption.CONFIG_CATEGORY, ROTATION, ANGLE, -1);
|
new ZLIntegerOption(ROTATION, ANGLE, -1);
|
||||||
public final ZLIntegerOption AngleStateOption =
|
public final ZLIntegerOption AngleStateOption =
|
||||||
new ZLIntegerOption(ZLOption.CONFIG_CATEGORY, STATE, ANGLE, ZLViewWidget.Angle.DEGREES0);
|
new ZLIntegerOption(STATE, ANGLE, ZLViewWidget.Angle.DEGREES0);
|
||||||
|
|
||||||
public final ZLBooleanOption KeyboardControlOption =
|
public final ZLBooleanOption KeyboardControlOption =
|
||||||
new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, KEYBOARD, FULL_CONTROL, false);
|
new ZLBooleanOption(KEYBOARD, FULL_CONTROL, false);
|
||||||
|
|
||||||
public final ZLBooleanOption ConfigAutoSavingOption =
|
public final ZLBooleanOption ConfigAutoSavingOption =
|
||||||
new ZLBooleanOption(ZLOption.CONFIG_CATEGORY, CONFIG, AUTO_SAVE, true);
|
new ZLBooleanOption(CONFIG, AUTO_SAVE, true);
|
||||||
public final ZLIntegerRangeOption ConfigAutoSaveTimeoutOption =
|
public final ZLIntegerRangeOption ConfigAutoSaveTimeoutOption =
|
||||||
new ZLIntegerRangeOption(ZLOption.CONFIG_CATEGORY, CONFIG, TIMEOUT, 1, 6000, 30);
|
new ZLIntegerRangeOption(CONFIG, TIMEOUT, 1, 6000, 30);
|
||||||
|
|
||||||
public final ZLIntegerRangeOption KeyDelayOption =
|
public final ZLIntegerRangeOption KeyDelayOption =
|
||||||
new ZLIntegerRangeOption(ZLOption.CONFIG_CATEGORY, "Options", "KeyDelay", 0, 5000, 250);
|
new ZLIntegerRangeOption("Options", "KeyDelay", 0, 5000, 250);
|
||||||
|
|
||||||
protected ZLViewWidget myViewWidget;
|
protected ZLViewWidget myViewWidget;
|
||||||
private ZLApplicationWindow myWindow;
|
private ZLApplicationWindow myWindow;
|
||||||
|
|
|
@ -26,7 +26,6 @@ import org.geometerplus.zlibrary.core.util.*;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption;
|
import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLOption;
|
|
||||||
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
||||||
|
|
||||||
public final class ZLKeyBindings {
|
public final class ZLKeyBindings {
|
||||||
|
@ -62,11 +61,11 @@ public final class ZLKeyBindings {
|
||||||
|
|
||||||
private void loadCustomBindings() {
|
private void loadCustomBindings() {
|
||||||
final int size =
|
final int size =
|
||||||
new ZLIntegerRangeOption(ZLOption.CONFIG_CATEGORY, myName, BINDINGS_NUMBER, 0, 256, 0).getValue();
|
new ZLIntegerRangeOption(myName, BINDINGS_NUMBER, 0, 256, 0).getValue();
|
||||||
final ZLStringOption keyOption =
|
final ZLStringOption keyOption =
|
||||||
new ZLStringOption(ZLOption.CONFIG_CATEGORY, myName, "", "");
|
new ZLStringOption(myName, "", "");
|
||||||
final ZLStringOption actionOption =
|
final ZLStringOption actionOption =
|
||||||
new ZLStringOption(ZLOption.CONFIG_CATEGORY, myName, "", "");
|
new ZLStringOption(myName, "", "");
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; ++i) {
|
||||||
keyOption.changeName(BINDED_KEY + i);
|
keyOption.changeName(BINDED_KEY + i);
|
||||||
final String keyValue = keyOption.getValue();
|
final String keyValue = keyOption.getValue();
|
||||||
|
@ -90,9 +89,9 @@ public final class ZLKeyBindings {
|
||||||
|
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
final ZLStringOption keyOption =
|
final ZLStringOption keyOption =
|
||||||
new ZLStringOption(ZLOption.CONFIG_CATEGORY, myName, "", "");
|
new ZLStringOption(myName, "", "");
|
||||||
final ZLStringOption actionOption =
|
final ZLStringOption actionOption =
|
||||||
new ZLStringOption(ZLOption.CONFIG_CATEGORY, myName, "", "");
|
new ZLStringOption(myName, "", "");
|
||||||
for (Iterator it = myBindingsMap.keySet().iterator(); it.hasNext(); ) {
|
for (Iterator it = myBindingsMap.keySet().iterator(); it.hasNext(); ) {
|
||||||
final String key = (String)it.next();
|
final String key = (String)it.next();
|
||||||
final String originalValue = (String)keymap.get(key);
|
final String originalValue = (String)keymap.get(key);
|
||||||
|
@ -105,6 +104,6 @@ public final class ZLKeyBindings {
|
||||||
++counter;
|
++counter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new ZLIntegerRangeOption(ZLOption.CONFIG_CATEGORY, myName, BINDINGS_NUMBER, 0, 256, 0).setValue(counter);
|
new ZLIntegerRangeOption(myName, BINDINGS_NUMBER, 0, 256, 0).setValue(counter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ public abstract class ZLConfig {
|
||||||
|
|
||||||
public abstract void shutdown();
|
public abstract void shutdown();
|
||||||
public abstract String getValue(String group, String name, String defaultValue);
|
public abstract String getValue(String group, String name, String defaultValue);
|
||||||
public abstract void setValue(String group, String name, String value, String category);
|
public abstract void setValue(String group, String name, String value);
|
||||||
public abstract void unsetValue(String group, String name);
|
public abstract void unsetValue(String group, String name);
|
||||||
public abstract void removeGroup(String name);
|
public abstract void removeGroup(String name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ public abstract class ZLOptionsDialog {
|
||||||
myResource = resource;
|
myResource = resource;
|
||||||
myExitAction = exitAction;
|
myExitAction = exitAction;
|
||||||
myApplyAction = applyAction;
|
myApplyAction = applyAction;
|
||||||
myTabOption = new ZLStringOption(ZLOption.LOOK_AND_FEEL_CATEGORY, resource.Name, "SelectedTab", "");
|
myTabOption = new ZLStringOption(resource.Name, "SelectedTab", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void acceptTab(ZLDialogContent tab) {
|
protected void acceptTab(ZLDialogContent tab) {
|
||||||
|
|
|
@ -25,8 +25,8 @@ public final class ZLBoolean3Option extends ZLOption implements ZLSimpleOption {
|
||||||
private int myValue;
|
private int myValue;
|
||||||
private final int myDefaultValue;
|
private final int myDefaultValue;
|
||||||
|
|
||||||
public ZLBoolean3Option(String category, String group, String optionName, int defaultValue) {
|
public ZLBoolean3Option(String group, String optionName, int defaultValue) {
|
||||||
super(category, group, optionName);
|
super(group, optionName);
|
||||||
myDefaultValue = defaultValue;
|
myDefaultValue = defaultValue;
|
||||||
myValue = myDefaultValue;
|
myValue = myDefaultValue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@ public final class ZLBooleanOption extends ZLOption implements ZLSimpleOption {
|
||||||
private final boolean myDefaultValue;
|
private final boolean myDefaultValue;
|
||||||
private boolean myValue;
|
private boolean myValue;
|
||||||
|
|
||||||
public ZLBooleanOption(String category, String group, String optionName, boolean defaultValue) {
|
public ZLBooleanOption(String group, String optionName, boolean defaultValue) {
|
||||||
super(category, group, optionName);
|
super(group, optionName);
|
||||||
myDefaultValue = defaultValue;
|
myDefaultValue = defaultValue;
|
||||||
myValue = defaultValue;
|
myValue = defaultValue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,8 +34,8 @@ public final class ZLColorOption extends ZLOption {
|
||||||
private final ZLColor myDefaultValue;
|
private final ZLColor myDefaultValue;
|
||||||
private ZLColor myValue;
|
private ZLColor myValue;
|
||||||
|
|
||||||
public ZLColorOption(String category, String group, String optionName, ZLColor defaultValue) {
|
public ZLColorOption(String group, String optionName, ZLColor defaultValue) {
|
||||||
super(category, group, optionName);
|
super(group, optionName);
|
||||||
myDefaultValue = (defaultValue != null) ? defaultValue : new ZLColor(0);
|
myDefaultValue = (defaultValue != null) ? defaultValue : new ZLColor(0);
|
||||||
myValue = myDefaultValue;
|
myValue = myDefaultValue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@ public final class ZLIntegerOption extends ZLOption {
|
||||||
private final int myDefaultValue;
|
private final int myDefaultValue;
|
||||||
private int myValue;
|
private int myValue;
|
||||||
|
|
||||||
public ZLIntegerOption(String category, String group, String optionName, int defaultValue) {
|
public ZLIntegerOption(String group, String optionName, int defaultValue) {
|
||||||
super(category, group, optionName);
|
super(group, optionName);
|
||||||
myDefaultValue = defaultValue;
|
myDefaultValue = defaultValue;
|
||||||
myValue = defaultValue;
|
myValue = defaultValue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ public final class ZLIntegerRangeOption extends ZLOption {
|
||||||
private final int myDefaultValue;
|
private final int myDefaultValue;
|
||||||
private int myValue;
|
private int myValue;
|
||||||
|
|
||||||
public ZLIntegerRangeOption(String category, String group, String optionName, int minValue, int maxValue, int defaultValue) {
|
public ZLIntegerRangeOption(String group, String optionName, int minValue, int maxValue, int defaultValue) {
|
||||||
super(category, group, optionName);
|
super(group, optionName);
|
||||||
MinValue = minValue;
|
MinValue = minValue;
|
||||||
MaxValue = maxValue;
|
MaxValue = maxValue;
|
||||||
if (defaultValue < MinValue) {
|
if (defaultValue < MinValue) {
|
||||||
|
|
|
@ -22,27 +22,13 @@ package org.geometerplus.zlibrary.core.options;
|
||||||
import org.geometerplus.zlibrary.core.config.ZLConfig;
|
import org.geometerplus.zlibrary.core.config.ZLConfig;
|
||||||
|
|
||||||
public abstract class ZLOption {
|
public abstract class ZLOption {
|
||||||
public static final String LOOK_AND_FEEL_CATEGORY = "ui";
|
|
||||||
public static final String CONFIG_CATEGORY = "options";
|
|
||||||
public static final String STATE_CATEGORY = "state";
|
|
||||||
public static final String EMPTY = "";
|
|
||||||
public static final String PLATFORM_GROUP = "PlatformOptions";
|
public static final String PLATFORM_GROUP = "PlatformOptions";
|
||||||
|
|
||||||
private final String myCategory;
|
|
||||||
private final String myGroup;
|
private final String myGroup;
|
||||||
private String myOptionName;
|
private String myOptionName;
|
||||||
protected boolean myIsSynchronized;
|
protected boolean myIsSynchronized;
|
||||||
|
|
||||||
/**
|
protected ZLOption(String group, String optionName) {
|
||||||
* êîíñòðóêòîð
|
|
||||||
*
|
|
||||||
* @param config
|
|
||||||
* @param category
|
|
||||||
* @param group
|
|
||||||
* @param optionName
|
|
||||||
*/
|
|
||||||
protected ZLOption(String category, String group, String optionName) {
|
|
||||||
myCategory = category.intern();
|
|
||||||
myGroup = group.intern();
|
myGroup = group.intern();
|
||||||
myOptionName = optionName.intern();
|
myOptionName = optionName.intern();
|
||||||
myIsSynchronized = false;
|
myIsSynchronized = false;
|
||||||
|
@ -62,7 +48,7 @@ public abstract class ZLOption {
|
||||||
protected final void setConfigValue(String value) {
|
protected final void setConfigValue(String value) {
|
||||||
ZLConfig config = ZLConfig.Instance();
|
ZLConfig config = ZLConfig.Instance();
|
||||||
if (config != null) {
|
if (config != null) {
|
||||||
config.setValue(myGroup, myOptionName, value, myCategory);
|
config.setValue(myGroup, myOptionName, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,8 @@ public final class ZLStringOption extends ZLOption implements ZLSimpleOption {
|
||||||
private final String myDefaultValue;
|
private final String myDefaultValue;
|
||||||
private String myValue;
|
private String myValue;
|
||||||
|
|
||||||
public ZLStringOption(String category, String group, String optionName, String defaultValue) {
|
public ZLStringOption(String group, String optionName, String defaultValue) {
|
||||||
super(category, group, optionName);
|
super(group, optionName);
|
||||||
myDefaultValue = (defaultValue != null) ? defaultValue.intern() : "";
|
myDefaultValue = (defaultValue != null) ? defaultValue.intern() : "";
|
||||||
myValue = myDefaultValue;
|
myValue = myDefaultValue;
|
||||||
}
|
}
|
||||||
|
|
97
src/org/geometerplus/zlibrary/core/tree/ZLTextTree.java
Normal file
97
src/org/geometerplus/zlibrary/core/tree/ZLTextTree.java
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009 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.core.tree;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class ZLTextTree {
|
||||||
|
private static final ArrayList<ZLTextTree> ourEmptyList = new ArrayList<ZLTextTree>();
|
||||||
|
|
||||||
|
private int mySize = 1;
|
||||||
|
private String myText;
|
||||||
|
private final ZLTextTree myParent;
|
||||||
|
private final int myLevel;
|
||||||
|
private ArrayList<ZLTextTree> mySubTrees;
|
||||||
|
|
||||||
|
protected ZLTextTree() {
|
||||||
|
myParent = null;
|
||||||
|
myLevel = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ZLTextTree(ZLTextTree parent) {
|
||||||
|
myParent = parent;
|
||||||
|
myLevel = parent.myLevel + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ZLTextTree getParent() {
|
||||||
|
return myParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getLevel() {
|
||||||
|
return myLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getSize() {
|
||||||
|
return mySize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final String getText() {
|
||||||
|
return myText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ArrayList<ZLTextTree> subTrees() {
|
||||||
|
return (mySubTrees != null) ? mySubTrees : ourEmptyList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ZLTextTree getTree(int index) {
|
||||||
|
if ((index < 0) || (index >= mySize)) {
|
||||||
|
// TODO: throw exception?
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (index == 0) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
--index;
|
||||||
|
for (ZLTextTree subtree : mySubTrees) {
|
||||||
|
if (subtree.mySize <= index) {
|
||||||
|
index -= subtree.mySize;
|
||||||
|
} else {
|
||||||
|
return subtree.getTree(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setText(String text) {
|
||||||
|
myText = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final ZLTextTree createSubTree() {
|
||||||
|
if (mySubTrees == null) {
|
||||||
|
mySubTrees = new ArrayList<ZLTextTree>();
|
||||||
|
}
|
||||||
|
ZLTextTree tree = new ZLTextTree(this);
|
||||||
|
mySubTrees.add(tree);
|
||||||
|
for (ZLTextTree parent = this; parent != null; parent = parent.myParent) {
|
||||||
|
++parent.mySize;
|
||||||
|
}
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
}
|
|
@ -74,4 +74,8 @@ public final class ZLTextBuffer {
|
||||||
public void clear() {
|
public void clear() {
|
||||||
myDataLength = 0;
|
myDataLength = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return new String(myData, 0, myDataLength);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,44 +26,43 @@ import org.geometerplus.zlibrary.text.view.ZLTextStyle;
|
||||||
import org.geometerplus.zlibrary.text.model.ZLTextAlignmentType;
|
import org.geometerplus.zlibrary.text.model.ZLTextAlignmentType;
|
||||||
|
|
||||||
public class ZLTextBaseStyle implements ZLTextStyle {
|
public class ZLTextBaseStyle implements ZLTextStyle {
|
||||||
private static final String CATEGORY = ZLOption.LOOK_AND_FEEL_CATEGORY;
|
|
||||||
private static final String COLORS = "Colors";
|
private static final String COLORS = "Colors";
|
||||||
private static final String GROUP = "Style";
|
private static final String GROUP = "Style";
|
||||||
private static final String OPTIONS = "Options";
|
private static final String OPTIONS = "Options";
|
||||||
|
|
||||||
public final ZLColorOption BackgroundColorOption =
|
public final ZLColorOption BackgroundColorOption =
|
||||||
new ZLColorOption(CATEGORY, COLORS, "Background", new ZLColor(255, 255, 255));
|
new ZLColorOption(COLORS, "Background", new ZLColor(255, 255, 255));
|
||||||
public final ZLColorOption SelectionBackgroundColorOption =
|
public final ZLColorOption SelectionBackgroundColorOption =
|
||||||
new ZLColorOption(CATEGORY, COLORS, "SelectionBackground", new ZLColor(82, 131, 194));
|
new ZLColorOption(COLORS, "SelectionBackground", new ZLColor(82, 131, 194));
|
||||||
public final ZLColorOption HighlightedTextColorOption =
|
public final ZLColorOption HighlightedTextColorOption =
|
||||||
new ZLColorOption(CATEGORY, COLORS, "SelectedText", new ZLColor(60, 139, 255));
|
new ZLColorOption(COLORS, "SelectedText", new ZLColor(60, 139, 255));
|
||||||
public final ZLColorOption RegularTextColorOption =
|
public final ZLColorOption RegularTextColorOption =
|
||||||
new ZLColorOption(CATEGORY, COLORS, "Text", new ZLColor(0, 0, 0));
|
new ZLColorOption(COLORS, "Text", new ZLColor(0, 0, 0));
|
||||||
public final ZLColorOption InternalHyperlinkTextColorOption =
|
public final ZLColorOption InternalHyperlinkTextColorOption =
|
||||||
new ZLColorOption(CATEGORY, COLORS, "Hyperlink", new ZLColor(33, 96, 180));
|
new ZLColorOption(COLORS, "Hyperlink", new ZLColor(33, 96, 180));
|
||||||
public final ZLColorOption ExternalHyperlinkTextColorOption =
|
public final ZLColorOption ExternalHyperlinkTextColorOption =
|
||||||
new ZLColorOption(CATEGORY, COLORS, "ExternalHyperlink", new ZLColor(98, 174, 26));
|
new ZLColorOption(COLORS, "ExternalHyperlink", new ZLColor(98, 174, 26));
|
||||||
public final ZLColorOption TreeLinesColorOption =
|
public final ZLColorOption TreeLinesColorOption =
|
||||||
new ZLColorOption(CATEGORY, COLORS, "TreeLines", new ZLColor(127, 127, 127));
|
new ZLColorOption(COLORS, "TreeLines", new ZLColor(127, 127, 127));
|
||||||
|
|
||||||
public final ZLBooleanOption AutoHyphenationOption =
|
public final ZLBooleanOption AutoHyphenationOption =
|
||||||
new ZLBooleanOption(CATEGORY, OPTIONS, "AutoHyphenation", true);
|
new ZLBooleanOption(OPTIONS, "AutoHyphenation", true);
|
||||||
|
|
||||||
public final ZLBooleanOption BoldOption =
|
public final ZLBooleanOption BoldOption =
|
||||||
new ZLBooleanOption(CATEGORY, GROUP, "Base:bold", false);
|
new ZLBooleanOption(GROUP, "Base:bold", false);
|
||||||
public final ZLBooleanOption ItalicOption =
|
public final ZLBooleanOption ItalicOption =
|
||||||
new ZLBooleanOption(CATEGORY, GROUP, "Base:italic", false);
|
new ZLBooleanOption(GROUP, "Base:italic", false);
|
||||||
public final ZLIntegerOption AlignmentOption =
|
public final ZLIntegerOption AlignmentOption =
|
||||||
new ZLIntegerOption(CATEGORY, GROUP, "Base:alignment", ZLTextAlignmentType.ALIGN_JUSTIFY);
|
new ZLIntegerOption(GROUP, "Base:alignment", ZLTextAlignmentType.ALIGN_JUSTIFY);
|
||||||
public final ZLIntegerOption LineSpacePercentOption =
|
public final ZLIntegerOption LineSpacePercentOption =
|
||||||
new ZLIntegerOption(CATEGORY, GROUP, "Base:lineSpacingPercent", 120);
|
new ZLIntegerOption(GROUP, "Base:lineSpacingPercent", 120);
|
||||||
|
|
||||||
public final ZLStringOption FontFamilyOption;
|
public final ZLStringOption FontFamilyOption;
|
||||||
public final ZLIntegerRangeOption FontSizeOption;
|
public final ZLIntegerRangeOption FontSizeOption;
|
||||||
|
|
||||||
public ZLTextBaseStyle(String fontFamily, int fontSize) {
|
public ZLTextBaseStyle(String fontFamily, int fontSize) {
|
||||||
FontFamilyOption = new ZLStringOption(CATEGORY, GROUP, "Base:fontFamily", fontFamily);
|
FontFamilyOption = new ZLStringOption(GROUP, "Base:fontFamily", fontFamily);
|
||||||
FontSizeOption = new ZLIntegerRangeOption(CATEGORY, GROUP, "Base:fontSize", 0, 72, fontSize);
|
FontSizeOption = new ZLIntegerRangeOption(GROUP, "Base:fontSize", 0, 72, fontSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFontFamily() {
|
public String getFontFamily() {
|
||||||
|
|
|
@ -39,14 +39,13 @@ public class ZLTextFullStyleDecoration extends ZLTextStyleDecoration {
|
||||||
|
|
||||||
public ZLTextFullStyleDecoration(String name, int fontSizeDelta, int bold, int italic, int spaceBefore, int spaceAfter, int leftIndent,int rightIndent, int firstLineIndentDelta, int verticalShift, byte alignment, int lineSpace, int allowHyphenations) {
|
public ZLTextFullStyleDecoration(String name, int fontSizeDelta, int bold, int italic, int spaceBefore, int spaceAfter, int leftIndent,int rightIndent, int firstLineIndentDelta, int verticalShift, byte alignment, int lineSpace, int allowHyphenations) {
|
||||||
super(name, fontSizeDelta, bold, italic, verticalShift, allowHyphenations);
|
super(name, fontSizeDelta, bold, italic, verticalShift, allowHyphenations);
|
||||||
final String category = ZLOption.LOOK_AND_FEEL_CATEGORY;
|
SpaceBeforeOption = new ZLIntegerRangeOption(STYLE, name + ":spaceBefore", -10, 100, spaceBefore);
|
||||||
SpaceBeforeOption = new ZLIntegerRangeOption(category, STYLE, name + ":spaceBefore", -10, 100, spaceBefore);
|
SpaceAfterOption = new ZLIntegerRangeOption(STYLE, name + ":spaceAfter", -10, 100, spaceAfter);
|
||||||
SpaceAfterOption = new ZLIntegerRangeOption(category, STYLE, name + ":spaceAfter", -10, 100, spaceAfter);
|
LeftIndentOption = new ZLIntegerRangeOption(STYLE, name + ":leftIndent", -300, 300, leftIndent);
|
||||||
LeftIndentOption = new ZLIntegerRangeOption(category, STYLE, name + ":leftIndent", -300, 300, leftIndent);
|
RightIndentOption = new ZLIntegerRangeOption(STYLE, name + ":rightIndent", -300, 300, rightIndent);
|
||||||
RightIndentOption = new ZLIntegerRangeOption(category, STYLE, name + ":rightIndent", -300, 300, rightIndent);
|
FirstLineIndentDeltaOption = new ZLIntegerRangeOption(STYLE, name + ":firstLineIndentDelta", -300, 300, firstLineIndentDelta);
|
||||||
FirstLineIndentDeltaOption = new ZLIntegerRangeOption(category, STYLE, name + ":firstLineIndentDelta", -300, 300, firstLineIndentDelta);
|
AlignmentOption = new ZLIntegerOption(STYLE, name + ":alignment", alignment);
|
||||||
AlignmentOption = new ZLIntegerOption(category, STYLE, name + ":alignment", alignment);
|
LineSpacePercentOption = new ZLIntegerOption(STYLE, name + ":lineSpacePercent", lineSpace);
|
||||||
LineSpacePercentOption = new ZLIntegerOption(category, STYLE, name + ":lineSpacePercent", lineSpace);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFullDecoration() {
|
public boolean isFullDecoration() {
|
||||||
|
|
|
@ -39,13 +39,12 @@ public class ZLTextStyleDecoration {
|
||||||
|
|
||||||
public ZLTextStyleDecoration(String name, int fontSizeDelta, int bold, int italic, int verticalShift, int allowHyphenations) {
|
public ZLTextStyleDecoration(String name, int fontSizeDelta, int bold, int italic, int verticalShift, int allowHyphenations) {
|
||||||
myName = name;
|
myName = name;
|
||||||
final String category = ZLOption.LOOK_AND_FEEL_CATEGORY;
|
FontFamilyOption = new ZLStringOption(STYLE, name + ":fontFamily", "");
|
||||||
FontFamilyOption = new ZLStringOption(category, STYLE, name + ":fontFamily", "");
|
FontSizeDeltaOption = new ZLIntegerRangeOption(STYLE, name + ":fontSize", -16, 16, fontSizeDelta);
|
||||||
FontSizeDeltaOption = new ZLIntegerRangeOption(category, STYLE, name + ":fontSize", -16, 16, fontSizeDelta);
|
BoldOption = new ZLBoolean3Option(STYLE, name + ":bold", bold);
|
||||||
BoldOption = new ZLBoolean3Option(category, STYLE, name + ":bold", bold);
|
ItalicOption = new ZLBoolean3Option(STYLE, name + ":italic", italic);
|
||||||
ItalicOption = new ZLBoolean3Option(category, STYLE, name + ":italic", italic);
|
VerticalShiftOption = new ZLIntegerOption(STYLE, name + ":vShift", verticalShift);
|
||||||
VerticalShiftOption = new ZLIntegerOption(category, STYLE, name + ":vShift", verticalShift);
|
AllowHyphenationsOption = new ZLBoolean3Option(STYLE, name + ":allowHyphenations", allowHyphenations);
|
||||||
AllowHyphenationsOption = new ZLBoolean3Option(category, STYLE, name + ":allowHyphenations", allowHyphenations);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZLTextStyle createDecoratedStyle(ZLTextStyle base) {
|
public ZLTextStyle createDecoratedStyle(ZLTextStyle base) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue