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); }