diff --git a/TODO.highlighting b/TODO.highlighting
index b7a96890c..c5ec297ac 100644
--- a/TODO.highlighting
+++ b/TODO.highlighting
@@ -8,6 +8,6 @@ DONE save bookmark style
DONE change style (color) for bookmarks: user interface
** edit styles
** add/remove styles
- ** menu on bookmark tap
+ DONE menu on bookmark tap
DONE watch bookmark changes
DONE fix selection bookmark range
diff --git a/assets/resources/application/be.xml b/assets/resources/application/be.xml
index 8b9cfdf4e..4509cc6ab 100644
--- a/assets/resources/application/be.xml
+++ b/assets/resources/application/be.xml
@@ -229,6 +229,7 @@
+
diff --git a/assets/resources/application/bg.xml b/assets/resources/application/bg.xml
index 465348ef8..b445e2577 100644
--- a/assets/resources/application/bg.xml
+++ b/assets/resources/application/bg.xml
@@ -228,6 +228,7 @@
+
diff --git a/assets/resources/application/ca.xml b/assets/resources/application/ca.xml
index 9cf88e30c..7bf8b2926 100644
--- a/assets/resources/application/ca.xml
+++ b/assets/resources/application/ca.xml
@@ -227,6 +227,7 @@
+
diff --git a/assets/resources/application/cs.xml b/assets/resources/application/cs.xml
index effa78960..96788263e 100644
--- a/assets/resources/application/cs.xml
+++ b/assets/resources/application/cs.xml
@@ -232,6 +232,7 @@
+
diff --git a/assets/resources/application/de.xml b/assets/resources/application/de.xml
index 1f6906e81..fbc203728 100644
--- a/assets/resources/application/de.xml
+++ b/assets/resources/application/de.xml
@@ -217,6 +217,7 @@
+
diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml
index e1d10dbbd..123c1b39e 100644
--- a/assets/resources/application/en.xml
+++ b/assets/resources/application/en.xml
@@ -223,6 +223,7 @@
+
diff --git a/assets/resources/application/es.xml b/assets/resources/application/es.xml
index 998d0db0e..fb7571895 100644
--- a/assets/resources/application/es.xml
+++ b/assets/resources/application/es.xml
@@ -227,6 +227,7 @@
+
diff --git a/assets/resources/application/fr.xml b/assets/resources/application/fr.xml
index 3ab267115..6f7e68de6 100644
--- a/assets/resources/application/fr.xml
+++ b/assets/resources/application/fr.xml
@@ -216,6 +216,7 @@
+
diff --git a/assets/resources/application/gl.xml b/assets/resources/application/gl.xml
index 76102a12c..9bec9bbc1 100644
--- a/assets/resources/application/gl.xml
+++ b/assets/resources/application/gl.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/hu.xml b/assets/resources/application/hu.xml
index af6f3ff48..85e1e4b3a 100644
--- a/assets/resources/application/hu.xml
+++ b/assets/resources/application/hu.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/it.xml b/assets/resources/application/it.xml
index e6c3f1f25..b9a66954f 100644
--- a/assets/resources/application/it.xml
+++ b/assets/resources/application/it.xml
@@ -214,6 +214,7 @@
+
diff --git a/assets/resources/application/ka.xml b/assets/resources/application/ka.xml
index 6fd8480bd..ed4008b6a 100644
--- a/assets/resources/application/ka.xml
+++ b/assets/resources/application/ka.xml
@@ -228,6 +228,7 @@
+
diff --git a/assets/resources/application/nb.xml b/assets/resources/application/nb.xml
index 3c543fd94..df8d0fa6d 100644
--- a/assets/resources/application/nb.xml
+++ b/assets/resources/application/nb.xml
@@ -223,6 +223,7 @@
+
diff --git a/assets/resources/application/nl.xml b/assets/resources/application/nl.xml
index e4aa67b2c..d9bf9536b 100644
--- a/assets/resources/application/nl.xml
+++ b/assets/resources/application/nl.xml
@@ -223,6 +223,7 @@
+
diff --git a/assets/resources/application/pl.xml b/assets/resources/application/pl.xml
index 148dd732e..1b543e863 100644
--- a/assets/resources/application/pl.xml
+++ b/assets/resources/application/pl.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/pt.xml b/assets/resources/application/pt.xml
index c6b7869f4..ce6a7776b 100644
--- a/assets/resources/application/pt.xml
+++ b/assets/resources/application/pt.xml
@@ -225,6 +225,7 @@
+
diff --git a/assets/resources/application/ro.xml b/assets/resources/application/ro.xml
index 15d27787e..bde930a4e 100644
--- a/assets/resources/application/ro.xml
+++ b/assets/resources/application/ro.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml
index 416f4d1e2..8934d59ea 100644
--- a/assets/resources/application/ru.xml
+++ b/assets/resources/application/ru.xml
@@ -228,6 +228,7 @@
+
diff --git a/assets/resources/application/sr.xml b/assets/resources/application/sr.xml
index 3da34a878..2d8115337 100644
--- a/assets/resources/application/sr.xml
+++ b/assets/resources/application/sr.xml
@@ -223,6 +223,7 @@
+
diff --git a/assets/resources/application/th.xml b/assets/resources/application/th.xml
index f2409944c..f3e187085 100644
--- a/assets/resources/application/th.xml
+++ b/assets/resources/application/th.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/tr.xml b/assets/resources/application/tr.xml
index 614452f18..ec8f8ec47 100644
--- a/assets/resources/application/tr.xml
+++ b/assets/resources/application/tr.xml
@@ -223,6 +223,7 @@
+
diff --git a/assets/resources/application/uk.xml b/assets/resources/application/uk.xml
index 8e15ee169..23df9680a 100644
--- a/assets/resources/application/uk.xml
+++ b/assets/resources/application/uk.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/vi.xml b/assets/resources/application/vi.xml
index 0e75a66e6..06d05d69a 100644
--- a/assets/resources/application/vi.xml
+++ b/assets/resources/application/vi.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/zh.xml b/assets/resources/application/zh.xml
index f1f06ba73..0415aaf1a 100644
--- a/assets/resources/application/zh.xml
+++ b/assets/resources/application/zh.xml
@@ -213,6 +213,7 @@
+
diff --git a/assets/resources/application/zh_TW.xml b/assets/resources/application/zh_TW.xml
index 99b55eae5..d7d8a5587 100644
--- a/assets/resources/application/zh_TW.xml
+++ b/assets/resources/application/zh_TW.xml
@@ -213,6 +213,7 @@
+
diff --git a/src/org/geometerplus/android/fbreader/SelectionBookmarkAction.java b/src/org/geometerplus/android/fbreader/SelectionBookmarkAction.java
index 23c9c7ab9..cefa6747c 100644
--- a/src/org/geometerplus/android/fbreader/SelectionBookmarkAction.java
+++ b/src/org/geometerplus/android/fbreader/SelectionBookmarkAction.java
@@ -36,15 +36,26 @@ public class SelectionBookmarkAction extends FBAndroidAction {
@Override
protected void run(Object ... params) {
- final Bookmark bookmark = Reader.addSelectionBookmark();
- UIUtil.showMessageText(
- BaseActivity,
- ZLResource.resource("selection").getResource("bookmarkCreated").getValue()
- .replace("%s", bookmark.getText())
- );
+ final boolean existingBookmark;
+ final Bookmark bookmark;
+
+ if (params.length != 0) {
+ existingBookmark = true;
+ bookmark = (Bookmark)params[0];
+ } else {
+ existingBookmark = false;
+ bookmark = Reader.addSelectionBookmark();
+ UIUtil.showMessageText(
+ BaseActivity,
+ ZLResource.resource("selection").getResource("bookmarkCreated").getValue()
+ .replace("%s", bookmark.getText())
+ );
+ }
+
final Intent intent =
new Intent(BaseActivity.getApplicationContext(), StyleListActivity.class);
intent.putExtra(FBReader.BOOKMARK_KEY, SerializerUtil.serialize(bookmark));
+ intent.putExtra(StyleListActivity.EXISTING_BOOKMARK_KEY, existingBookmark);
OrientationUtil.startActivity(BaseActivity, intent);
}
}
diff --git a/src/org/geometerplus/android/fbreader/StyleListActivity.java b/src/org/geometerplus/android/fbreader/StyleListActivity.java
index cce483a12..fb0db70a3 100644
--- a/src/org/geometerplus/android/fbreader/StyleListActivity.java
+++ b/src/org/geometerplus/android/fbreader/StyleListActivity.java
@@ -39,7 +39,10 @@ import org.geometerplus.fbreader.book.*;
import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
public class StyleListActivity extends ListActivity {
+ static final String EXISTING_BOOKMARK_KEY = "existing.bookmark";
+
private final BookCollectionShadow myCollection = new BookCollectionShadow();
+ private boolean myExistingBookmark;
private Bookmark myBookmark;
@Override
@@ -53,6 +56,7 @@ public class StyleListActivity extends ListActivity {
super.onStart();
myCollection.bindToService(this, new Runnable() {
public void run() {
+ myExistingBookmark = getIntent().getBooleanExtra(EXISTING_BOOKMARK_KEY, false);
myBookmark = SerializerUtil.deserializeBookmark(
getIntent().getStringExtra(FBReader.BOOKMARK_KEY)
);
@@ -86,11 +90,11 @@ public class StyleListActivity extends ListActivity {
}
public final int getCount() {
- return myStyles.size();
+ return myExistingBookmark ? myStyles.size() + 1 : myStyles.size();
}
public final HighlightingStyle getItem(int position) {
- return myStyles.get(position);
+ return position < myStyles.size() ? myStyles.get(position) : null;
}
public final long getItemId(int position) {
@@ -104,22 +108,37 @@ public class StyleListActivity extends ListActivity {
final HighlightingStyle style = getItem(position);
final ImageView colorView = (ImageView)view.findViewById(R.id.style_item_color);
- colorView.setImageDrawable(new ColorDrawable(ZLAndroidColorUtil.rgb(style.BackgroundColor)));
-
final TextView titleView = (TextView)view.findViewById(R.id.style_item_title);
- String title = ZLResource.resource("highlightingStyleMenu")
- .getResource("style").getValue();
- title = title.replace("%s", String.valueOf(style.Id));
- titleView.setText(title);
+
+ if (style != null) {
+ colorView.setVisibility(View.VISIBLE);
+ colorView.setImageDrawable(new ColorDrawable(ZLAndroidColorUtil.rgb(style.BackgroundColor)));
+ titleView.setText(
+ ZLResource.resource("highlightingStyleMenu")
+ .getResource("style").getValue()
+ .replace("%s", String.valueOf(style.Id))
+ );
+ } else {
+ colorView.setVisibility(View.GONE);
+ titleView.setText(
+ ZLResource.resource("highlightingStyleMenu")
+ .getResource("deleteBookmark").getValue()
+ );
+ }
return view;
}
- public final void onItemClick(AdapterView> parent, View view, final int position, long id) {
+ public final void onItemClick(AdapterView> parent, View view, int position, long id) {
+ final HighlightingStyle style = getItem(position);
myCollection.bindToService(StyleListActivity.this, new Runnable() {
public void run() {
- myBookmark.setStyleId(getItem(position).Id);
- myCollection.saveBookmark(myBookmark);
+ if (style != null) {
+ myBookmark.setStyleId(style.Id);
+ myCollection.saveBookmark(myBookmark);
+ } else {
+ myCollection.deleteBookmark(myBookmark);
+ }
finish();
}
});
diff --git a/src/org/geometerplus/fbreader/fbreader/BookmarkHighlighting.java b/src/org/geometerplus/fbreader/fbreader/BookmarkHighlighting.java
index 7ac1c31ea..c7da0541d 100644
--- a/src/org/geometerplus/fbreader/fbreader/BookmarkHighlighting.java
+++ b/src/org/geometerplus/fbreader/fbreader/BookmarkHighlighting.java
@@ -26,8 +26,8 @@ import org.geometerplus.zlibrary.text.view.*;
import org.geometerplus.fbreader.book.*;
public final class BookmarkHighlighting extends ZLTextSimpleHighlighting {
- final IBookCollection myCollection;
- final Bookmark myBookmark;
+ final IBookCollection Collection;
+ final Bookmark Bookmark;
private static ZLTextPosition startPosition(Bookmark bookmark) {
return new ZLTextFixedPosition(bookmark.getParagraphIndex(), bookmark.getElementIndex(), 0);
@@ -44,13 +44,13 @@ public final class BookmarkHighlighting extends ZLTextSimpleHighlighting {
BookmarkHighlighting(ZLTextView view, IBookCollection collection, Bookmark bookmark) {
super(view, startPosition(bookmark), endPosition(bookmark));
- myCollection = collection;
- myBookmark = bookmark;
+ Collection = collection;
+ Bookmark = bookmark;
}
@Override
public ZLColor getBackgroundColor() {
- final HighlightingStyle bmStyle = myCollection.getHighlightingStyle(myBookmark.getStyleId());
+ final HighlightingStyle bmStyle = Collection.getHighlightingStyle(Bookmark.getStyleId());
return bmStyle != null ? bmStyle.BackgroundColor : new ZLColor(255, 255, 255);
}
}
diff --git a/src/org/geometerplus/fbreader/fbreader/FBView.java b/src/org/geometerplus/fbreader/fbreader/FBView.java
index 9690eb6ca..ec1607439 100644
--- a/src/org/geometerplus/fbreader/fbreader/FBView.java
+++ b/src/org/geometerplus/fbreader/fbreader/FBView.java
@@ -81,6 +81,15 @@ public final class FBView extends ZLTextView {
return true;
}
+ final ZLTextHighlighting highlighting = findHighlighting(x, y, MAX_SELECTION_DISTANCE);
+ if (highlighting instanceof BookmarkHighlighting) {
+ myReader.runAction(
+ ActionCode.SELECTION_BOOKMARK,
+ ((BookmarkHighlighting)highlighting).Bookmark
+ );
+ return true;
+ }
+
myReader.runAction(getZoneMap().getActionByCoordinates(
x, y, getContextWidth(), getContextHeight(),
isDoubleTapSupported() ? TapZoneMap.Tap.singleNotDoubleTap : TapZoneMap.Tap.singleTap
diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java b/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java
index 9fdc08d44..ec8fa9ec1 100644
--- a/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java
+++ b/src/org/geometerplus/zlibrary/text/view/ZLTextHighlighting.java
@@ -39,6 +39,14 @@ public abstract class ZLTextHighlighting implements Comparable 0;
}
+ boolean intersects(ZLTextRegion region) {
+ final ZLTextRegion.Soul soul = region.getSoul();
+ return
+ !isEmpty() &&
+ soul.compareTo(getStartPosition()) >= 0 &&
+ soul.compareTo(getEndPosition()) <= 0;
+ }
+
public int compareTo(ZLTextHighlighting highlighting) {
final int cmp = getStartPosition().compareTo(highlighting.getStartPosition());
return cmp != 0 ? cmp : getEndPosition().compareTo(highlighting.getEndPosition());
diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextRegion.java b/src/org/geometerplus/zlibrary/text/view/ZLTextRegion.java
index cda07f4bd..6184b4f38 100644
--- a/src/org/geometerplus/zlibrary/text/view/ZLTextRegion.java
+++ b/src/org/geometerplus/zlibrary/text/view/ZLTextRegion.java
@@ -79,6 +79,21 @@ public final class ZLTextRegion {
}
return 0;
}
+
+ public final int compareTo(ZLTextPosition position) {
+ final int ppi = position.getParagraphIndex();
+ if (ParagraphIndex != ppi) {
+ return ParagraphIndex < ppi ? -1 : 1;
+ }
+ final int pei = position.getElementIndex();
+ if (EndElementIndex < pei) {
+ return -1;
+ }
+ if (StartElementIndex > pei) {
+ return 1;
+ }
+ return 0;
+ }
}
public static interface Filter {
diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java
index 5b16eb95c..97acf49e0 100644
--- a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java
+++ b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java
@@ -1543,6 +1543,19 @@ public abstract class ZLTextView extends ZLTextViewBase {
return getSelectedRegion(myCurrentPage);
}
+ protected ZLTextHighlighting findHighlighting(int x, int y, int maxDistance) {
+ final ZLTextRegion region = findRegion(x, y, maxDistance, ZLTextRegion.AnyRegionFilter);
+ if (region == null) {
+ return null;
+ }
+ for (ZLTextHighlighting h : myHighlightings) {
+ if (h.intersects(region)) {
+ return h;
+ }
+ }
+ return null;
+ }
+
protected ZLTextRegion findRegion(int x, int y, ZLTextRegion.Filter filter) {
return findRegion(x, y, Integer.MAX_VALUE - 1, filter);
}