1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-04 10:19:33 +02:00

manual merging with steffen branch: visited hyperlinks engine

This commit is contained in:
Nikolay Pultsin 2011-03-25 22:17:02 +00:00
parent 343f0818a2
commit f9a3335ce5
7 changed files with 94 additions and 10 deletions

View file

@ -63,6 +63,7 @@ class ProcessHyperlinkAction extends FBAction {
}
break;
case FBHyperlinkType.INTERNAL:
Reader.Model.Book.markHyperlinkAsVisited(hyperlink.Id);
Reader.tryOpenFootnote(hyperlink.Id);
break;
}

View file

@ -61,7 +61,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
private void migrate(Context context) {
final int version = myDatabase.getVersion();
final int currentVersion = 15;
final int currentVersion = 16;
if (version >= currentVersion) {
return;
}
@ -100,6 +100,8 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
updateTables13();
case 14:
updateTables14();
case 15:
updateTables15();
}
myDatabase.setTransactionSuccessful();
myDatabase.endTransaction();
@ -838,6 +840,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
}
myDeleteFromBookListStatement.bindLong(1, bookId);
myDeleteFromBookListStatement.execute();
deleteVisitedHyperlinks(bookId);
return true;
}
@ -852,6 +855,41 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
return myCheckBookListStatement.simpleQueryForLong() > 0;
}
private SQLiteStatement myDeleteVisitedHyperlinksStatement;
private void deleteVisitedHyperlinks(long bookId) {
if (myDeleteVisitedHyperlinksStatement == null) {
myDeleteVisitedHyperlinksStatement = myDatabase.compileStatement(
"DELETE FROM VisitedHyperlinks WHERE book_id = ?"
);
}
myDeleteVisitedHyperlinksStatement.bindLong(1, bookId);
myDeleteVisitedHyperlinksStatement.execute();
}
private SQLiteStatement myStoreVisitedHyperlinksStatement;
protected void addVisitedHyperlink(long bookId, String hyperlinkId) {
if (myStoreVisitedHyperlinksStatement == null) {
myStoreVisitedHyperlinksStatement = myDatabase.compileStatement(
"INSERT OR IGNORE INTO VisitedHyperlinks(book_id,hyperlink_id) VALUES (?,?)"
);
}
myStoreVisitedHyperlinksStatement.bindLong(1, bookId);
myStoreVisitedHyperlinksStatement.bindString(2, hyperlinkId);
myStoreVisitedHyperlinksStatement.execute();
}
protected Collection<String> loadVisitedHyperlinks(long bookId) {
final TreeSet<String> links = new TreeSet<String>();
final Cursor cursor = myDatabase.rawQuery("SELECT hyperlink_id FROM VisitedHyperlinks WHERE book_id = ?", new String[] { "" + bookId });
while (cursor.moveToNext()) {
links.add(cursor.getString(0));
}
cursor.close();
return links;
}
private void createTables() {
myDatabase.execSQL(
@ -1140,4 +1178,12 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
myDatabase.execSQL("INSERT INTO BookSeries (series_id,book_id,book_index) SELECT series_id,book_id,book_index FROM BookSeries_Obsolete");
myDatabase.execSQL("DROP TABLE BookSeries_Obsolete");
}
private void updateTables15() {
myDatabase.execSQL(
"CREATE TABLE IF NOT EXISTS VisitedHyperlinks(" +
"book_id INTEGER NOT NULL REFERENCES Books(book_id)," +
"hyperlink_id TEXT NOT NULL," +
"CONSTRAINT VisitedHyperlinks_Unique UNIQUE (book_id, hyperlink_id))");
}
}

View file

@ -23,5 +23,4 @@ public interface FBHyperlinkType {
byte NONE = 0;
byte INTERNAL = 1;
byte EXTERNAL = 2;
byte INTERNAL_VISITED = 3;
}

View file

@ -386,17 +386,18 @@ public final class FBView extends ZLTextView {
}
@Override
public ZLColor getTextColor(byte hyperlinkType) {
public ZLColor getTextColor(ZLTextHyperlink hyperlink) {
final ColorProfile profile = myReader.getColorProfile();
switch (hyperlinkType) {
switch (hyperlink.Type) {
default:
case FBHyperlinkType.NONE:
return profile.RegularTextOption.getValue();
case FBHyperlinkType.INTERNAL:
return myReader.Model.Book.isHyperlinkVisited(hyperlink.Id)
? profile.VisitedHyperlinkTextOption.getValue()
: profile.HyperlinkTextOption.getValue();
case FBHyperlinkType.EXTERNAL:
return profile.HyperlinkTextOption.getValue();
case FBHyperlinkType.INTERNAL_VISITED:
return profile.VisitedHyperlinkTextOption.getValue();
}
}
@ -463,7 +464,7 @@ public final class FBView extends ZLTextView {
final ZLColor bgColor = getBackgroundColor();
// TODO: separate color option for footer color
final ZLColor fgColor = getTextColor(FBHyperlinkType.NONE);
final ZLColor fgColor = getTextColor(ZLTextHyperlink.NO_LINK);
final ZLColor fillColor = reader.getColorProfile().FooterFillOption.getValue();
final int left = getLeftMargin();

View file

@ -335,6 +335,7 @@ public class Book {
database.updateBookInfo(myId, fileInfos.getId(File), myEncoding, myLanguage, myTitle);
} else {
myId = database.insertBookInfo(File, myEncoding, myLanguage, myTitle);
storeAllVisitedHyperinks();
}
long index = 0;
@ -364,6 +365,39 @@ public class Book {
}
}
private Set<String> myVisitedHyperlinks;
private void initHyperlinkSet() {
if (myVisitedHyperlinks == null) {
myVisitedHyperlinks = new TreeSet<String>();
if (myId != -1) {
myVisitedHyperlinks.addAll(BooksDatabase.Instance().loadVisitedHyperlinks(myId));
}
}
}
public boolean isHyperlinkVisited(String linkId) {
initHyperlinkSet();
return myVisitedHyperlinks.contains(linkId);
}
public void markHyperlinkAsVisited(String linkId) {
initHyperlinkSet();
if (!myVisitedHyperlinks.contains(linkId)) {
myVisitedHyperlinks.add(linkId);
if (myId != -1) {
BooksDatabase.Instance().addVisitedHyperlink(myId, linkId);
}
}
}
private void storeAllVisitedHyperinks() {
if (myId != -1 && myVisitedHyperlinks != null) {
for (String linkId : myVisitedHyperlinks) {
BooksDatabase.Instance().addVisitedHyperlink(myId, linkId);
}
}
}
public void insertIntoBookList() {
if (myId != -1) {
BooksDatabase.Instance().insertIntoBookList(myId);

View file

@ -104,4 +104,7 @@ public abstract class BooksDatabase {
protected abstract boolean insertIntoBookList(long bookId);
protected abstract boolean deleteFromBookList(long bookId);
protected abstract boolean checkBookList(long bookId);
protected abstract Collection<String> loadVisitedHyperlinks(long bookId);
protected abstract void addVisitedHyperlink(long bookId, String hyperlinkId);
}

View file

@ -51,7 +51,7 @@ abstract class ZLTextViewBase extends ZLView {
public abstract ZLFile getWallpaperFile();
public abstract ZLColor getBackgroundColor();
public abstract ZLColor getSelectedBackgroundColor();
public abstract ZLColor getTextColor(byte hyperlinkType);
public abstract ZLColor getTextColor(ZLTextHyperlink hyperlink);
public abstract ZLColor getHighlightingColor();
int getTextAreaHeight() {
@ -185,7 +185,7 @@ abstract class ZLTextViewBase extends ZLView {
final void drawWord(int x, int y, ZLTextWord word, int start, int length, boolean addHyphenationSign) {
final ZLPaintContext context = myContext;
context.setTextColor(getTextColor(myTextStyle.Hyperlink.Type));
context.setTextColor(getTextColor(myTextStyle.Hyperlink));
if ((start == 0) && (length == -1)) {
drawString(x, y, word.Data, word.Offset, word.Length, word.getMark(), 0);
} else {