From 90f1be2dd8585e1b8acc343f08bbd1be2476d6ad Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Wed, 13 Apr 2011 11:35:09 +0100 Subject: [PATCH] ZLViewWidget introduced; ZLView kwons about the application --- .../fbreader/NavigationButtonPanel.java | 2 +- .../fbreader/fbreader/FBView.java | 17 +++++----- .../fbreader/SwitchProfileAction.java | 2 +- .../core/application/ZLApplication.java | 12 ++++--- .../core/application/ZLApplicationWindow.java | 4 ++- .../zlibrary/core/view/ZLView.java | 7 +++++ .../zlibrary/core/view/ZLViewWidget.java | 24 ++++++++++++++ .../zlibrary/text/view/ZLTextView.java | 31 ++++++++++--------- .../zlibrary/text/view/ZLTextViewBase.java | 4 ++- .../ZLAndroidApplicationWindow.java | 9 ++---- .../ui/android/view/ZLAndroidWidget.java | 5 +-- 11 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 src/org/geometerplus/zlibrary/core/view/ZLViewWidget.java diff --git a/src/org/geometerplus/android/fbreader/NavigationButtonPanel.java b/src/org/geometerplus/android/fbreader/NavigationButtonPanel.java index 148a8c6ae..1baea381d 100644 --- a/src/org/geometerplus/android/fbreader/NavigationButtonPanel.java +++ b/src/org/geometerplus/android/fbreader/NavigationButtonPanel.java @@ -81,7 +81,7 @@ final class NavigationButtonPanel extends ControlButtonPanel { } else { view.gotoPage(page); } - Reader.resetView(); + Reader.getViewWidget().reset(); Reader.repaintView(); } diff --git a/src/org/geometerplus/fbreader/fbreader/FBView.java b/src/org/geometerplus/fbreader/fbreader/FBView.java index df1636318..1e586cffe 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBView.java +++ b/src/org/geometerplus/fbreader/fbreader/FBView.java @@ -39,6 +39,7 @@ public final class FBView extends ZLTextView { private FBReaderApp myReader; FBView(FBReaderApp reader) { + super(reader); myReader = reader; } @@ -87,7 +88,7 @@ public final class FBView extends ZLTextView { final ZLTextElementRegion region = findRegion(x, y, 10, ZLTextElementRegion.HyperlinkFilter); if (region != null) { selectRegion(region); - myReader.resetView(); + myReader.getViewWidget().reset(); myReader.repaintView(); myReader.doAction(ActionCode.PROCESS_HYPERLINK); return true; @@ -227,7 +228,7 @@ public final class FBView extends ZLTextView { final ZLTextElementRegion region = findRegion(x, y, 10, ZLTextElementRegion.AnyRegionFilter); if (region != null) { selectRegion(region); - myReader.resetView(); + myReader.getViewWidget().reset(); myReader.repaintView(); return true; } @@ -246,7 +247,7 @@ public final class FBView extends ZLTextView { final ZLTextElementRegion region = findRegion(x, y, 10, ZLTextElementRegion.AnyRegionFilter); if (region != null) { selectRegion(region); - myReader.resetView(); + myReader.getViewWidget().reset(); myReader.repaintView(); } } @@ -291,7 +292,7 @@ public final class FBView extends ZLTextView { } } - myReader.resetView(); + myReader.getViewWidget().reset(); myReader.repaintView(); return true; @@ -365,7 +366,7 @@ public final class FBView extends ZLTextView { private class Footer implements FooterArea { private Runnable UpdateTask = new Runnable() { public void run() { - ZLApplication.Instance().repaintView(); + myReader.repaintView(); } }; @@ -524,7 +525,7 @@ public final class FBView extends ZLTextView { } else { gotoPage(page); } - myReader.resetView(); + myReader.getViewWidget().reset(); myReader.repaintView(); } } @@ -536,11 +537,11 @@ public final class FBView extends ZLTextView { if (myReader.ScrollbarTypeOption.getValue() == SCROLLBAR_SHOW_AS_FOOTER) { if (myFooter == null) { myFooter = new Footer(); - ZLApplication.Instance().addTimerTask(myFooter.UpdateTask, 15000); + myReader.addTimerTask(myFooter.UpdateTask, 15000); } } else { if (myFooter != null) { - ZLApplication.Instance().removeTimerTask(myFooter.UpdateTask); + myReader.removeTimerTask(myFooter.UpdateTask); myFooter = null; } } diff --git a/src/org/geometerplus/fbreader/fbreader/SwitchProfileAction.java b/src/org/geometerplus/fbreader/fbreader/SwitchProfileAction.java index accc4fcdc..f9d8f54ef 100644 --- a/src/org/geometerplus/fbreader/fbreader/SwitchProfileAction.java +++ b/src/org/geometerplus/fbreader/fbreader/SwitchProfileAction.java @@ -33,7 +33,7 @@ class SwitchProfileAction extends FBAction { public void run() { Reader.setColorProfileName(myProfileName); - Reader.resetView(); + Reader.getViewWidget().reset(); Reader.repaintView(); } } diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java index 70d8bb0cb..e77a7eb7e 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java @@ -23,6 +23,7 @@ import java.util.*; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.view.ZLView; +import org.geometerplus.zlibrary.core.view.ZLViewWidget; public abstract class ZLApplication { public static ZLApplication Instance() { @@ -45,7 +46,10 @@ public abstract class ZLApplication { protected final void setView(ZLView view) { if (view != null) { myView = view; - resetView(); + final ZLViewWidget widget = getViewWidget(); + if (widget != null) { + widget.reset(); + } repaintView(); onViewChanged(); } @@ -63,10 +67,8 @@ public abstract class ZLApplication { setView(myView); } - public final void resetView() { - if (myWindow != null) { - myWindow.resetView(); - } + public final ZLViewWidget getViewWidget() { + return myWindow != null ? myWindow.getViewWidget() : null; } public final void repaintView() { diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java index 4422cf529..27b2e3af9 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java @@ -20,6 +20,7 @@ package org.geometerplus.zlibrary.core.application; import org.geometerplus.zlibrary.core.view.ZLView; +import org.geometerplus.zlibrary.core.view.ZLViewWidget; abstract public class ZLApplicationWindow { private ZLApplication myApplication; @@ -35,7 +36,8 @@ abstract public class ZLApplicationWindow { abstract protected void refreshMenu(); - abstract protected void resetView(); + abstract protected ZLViewWidget getViewWidget(); + abstract protected void repaintView(); abstract protected void scrollViewManually(int startX, int startY, int endX, int endY, ZLView.Direction direction); abstract protected void startViewAutoScrolling(ZLView.PageIndex pageIndex, ZLView.Direction direction, int speed); diff --git a/src/org/geometerplus/zlibrary/core/view/ZLView.java b/src/org/geometerplus/zlibrary/core/view/ZLView.java index 7dd3906f9..a7f1ef297 100644 --- a/src/org/geometerplus/zlibrary/core/view/ZLView.java +++ b/src/org/geometerplus/zlibrary/core/view/ZLView.java @@ -19,9 +19,16 @@ package org.geometerplus.zlibrary.core.view; +import org.geometerplus.zlibrary.core.application.ZLApplication; + abstract public class ZLView { + public final ZLApplication Application; protected ZLPaintContext myContext = new DummyPaintContext(); + protected ZLView(ZLApplication application) { + Application = application; + } + public final ZLPaintContext getContext() { return myContext; } diff --git a/src/org/geometerplus/zlibrary/core/view/ZLViewWidget.java b/src/org/geometerplus/zlibrary/core/view/ZLViewWidget.java new file mode 100644 index 000000000..14082b7c4 --- /dev/null +++ b/src/org/geometerplus/zlibrary/core/view/ZLViewWidget.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2007-2011 Geometer Plus + * + * 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.view; + +public interface ZLViewWidget { + void reset(); +} diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java index 37a29de8d..3b3d2302d 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java @@ -55,7 +55,8 @@ public abstract class ZLTextView extends ZLTextViewBase { private final HashMap myLineInfoCache = new HashMap(); - public ZLTextView() { + public ZLTextView(ZLApplication application) { + super(application); mySelectionModel = new ZLTextSelectionModel(this); } @@ -73,7 +74,7 @@ public abstract class ZLTextView extends ZLTextViewBase { myCurrentPage.moveStartCursor(ZLTextParagraphCursor.cursor(myModel, 0)); } } - ZLApplication.Instance().resetView(); + Application.getViewWidget().reset(); } public ZLTextModel getModel() { @@ -126,8 +127,8 @@ public abstract class ZLTextView extends ZLTextViewBase { if (myCurrentPage.StartCursor.isNull()) { preparePaintInfo(myCurrentPage); } - ZLApplication.Instance().resetView(); - ZLApplication.Instance().repaintView(); + Application.getViewWidget().reset(); + Application.repaintView(); } } @@ -151,8 +152,8 @@ public abstract class ZLTextView extends ZLTextViewBase { (backward ? myModel.getLastMark() : myModel.getFirstMark()) : (backward ? myModel.getPreviousMark(mark) : myModel.getNextMark(mark))); } - ZLApplication.Instance().resetView(); - ZLApplication.Instance().repaintView(); + Application.getViewWidget().reset(); + Application.repaintView(); } return count; } @@ -185,8 +186,8 @@ public abstract class ZLTextView extends ZLTextViewBase { if (!findResultsAreEmpty()) { myModel.removeAllMarks(); rebuildPaintInfo(); - ZLApplication.Instance().resetView(); - ZLApplication.Instance().repaintView(); + Application.getViewWidget().reset(); + Application.repaintView(); } } @@ -960,7 +961,7 @@ public abstract class ZLTextView extends ZLTextViewBase { public final synchronized void gotoPosition(int paragraphIndex, int wordIndex, int charIndex) { if (myModel != null && myModel.getParagraphsNumber() > 0) { - ZLApplication.Instance().resetView(); + Application.getViewWidget().reset(); myCurrentPage.moveStartCursor(paragraphIndex, wordIndex, charIndex); myPreviousPage.reset(); myNextPage.reset(); @@ -1126,7 +1127,7 @@ public abstract class ZLTextView extends ZLTextViewBase { public void clearCaches() { rebuildPaintInfo(); - ZLApplication.Instance().resetView(); + Application.getViewWidget().reset(); } protected void rebuildPaintInfo() { @@ -1259,8 +1260,8 @@ public abstract class ZLTextView extends ZLTextViewBase { @Override public boolean onFingerMove(int x, int y) { if (mySelectionModel.extendTo(x, y)) { - ZLApplication.Instance().resetView(); - ZLApplication.Instance().repaintView(); + Application.getViewWidget().reset(); + Application.repaintView(); return true; } return false; @@ -1278,8 +1279,8 @@ public abstract class ZLTextView extends ZLTextViewBase { protected void activateSelection(int x, int y) { if (isSelectionEnabled()) { mySelectionModel.activate(x, y); - ZLApplication.Instance().resetView(); - ZLApplication.Instance().repaintView(); + Application.getViewWidget().reset(); + Application.repaintView(); } } */ @@ -1289,7 +1290,7 @@ public abstract class ZLTextView extends ZLTextViewBase { public void hideSelectedRegionBorder() { myHighlightSelectedRegion = false; - ZLApplication.Instance().resetView(); + Application.getViewWidget().reset(); } private ZLTextElementRegion getCurrentElementRegion(ZLTextPage page) { diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java b/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java index bad1353d1..1179fef00 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextViewBase.java @@ -19,6 +19,7 @@ package org.geometerplus.zlibrary.text.view; +import org.geometerplus.zlibrary.core.application.ZLApplication; import org.geometerplus.zlibrary.core.util.ZLColor; import org.geometerplus.zlibrary.core.view.ZLView; import org.geometerplus.zlibrary.core.view.ZLPaintContext; @@ -31,7 +32,8 @@ abstract class ZLTextViewBase extends ZLView { private ZLTextStyle myTextStyle; private int myWordHeight = -1; - ZLTextViewBase() { + ZLTextViewBase(ZLApplication application) { + super(application); resetTextStyle(); } diff --git a/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java b/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java index b14174c76..1b073510c 100644 --- a/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java +++ b/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java @@ -28,6 +28,7 @@ import org.geometerplus.zlibrary.core.application.ZLApplication; import org.geometerplus.zlibrary.core.application.ZLApplicationWindow; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.view.ZLView; +import org.geometerplus.zlibrary.core.view.ZLViewWidget; import org.geometerplus.zlibrary.ui.android.view.ZLAndroidWidget; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidLibrary; @@ -67,17 +68,13 @@ public final class ZLAndroidApplicationWindow extends ZLApplicationWindow { } } - protected void resetView() { - final ZLAndroidWidget widget = - ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).getWidget(); - // I'm not sure about threads, so postInvalidate() is used instead of invalidate() - widget.resetBitmaps(); + protected ZLViewWidget getViewWidget() { + return ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).getWidget(); } protected void repaintView() { final ZLAndroidWidget widget = ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).getWidget(); - // I'm not sure about threads, so postInvalidate() is used instead of invalidate() widget.postInvalidate(); } diff --git a/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java b/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java index dead3deb6..e03102ec0 100644 --- a/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java +++ b/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java @@ -25,12 +25,13 @@ import android.view.*; import android.util.AttributeSet; import org.geometerplus.zlibrary.core.view.ZLView; +import org.geometerplus.zlibrary.core.view.ZLViewWidget; import org.geometerplus.zlibrary.core.application.ZLApplication; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidActivity; import org.geometerplus.zlibrary.ui.android.util.ZLAndroidKeyUtil; -public class ZLAndroidWidget extends View implements View.OnLongClickListener { +public class ZLAndroidWidget extends View implements ZLViewWidget, View.OnLongClickListener { private final Paint myPaint = new Paint(); private final BitmapManager myBitmapManager = new BitmapManager(this); private Bitmap myFooterBitmap; @@ -148,7 +149,7 @@ public class ZLAndroidWidget extends View implements View.OnLongClickListener { } } - public void resetBitmaps() { + public void reset() { myBitmapManager.reset(); }