summaryrefslogtreecommitdiffstats
path: root/reader/src/tree/FBTree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'reader/src/tree/FBTree.cpp')
-rw-r--r--reader/src/tree/FBTree.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/reader/src/tree/FBTree.cpp b/reader/src/tree/FBTree.cpp
new file mode 100644
index 0000000..25e0bb3
--- /dev/null
+++ b/reader/src/tree/FBTree.cpp
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2004-2012 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.
+ */
+
+#include <ZLibrary.h>
+#include <ZLFileImage.h>
+#include <ZLResource.h>
+#include <ZLTreeListener.h>
+
+#include "FBTree.h"
+
+const ZLTypeId FBTree::TYPE_ID(ZLTreeTitledNode::TYPE_ID);
+
+const ZLTypeId &FBTree::typeId() const {
+ return TYPE_ID;
+}
+
+std::map<std::string,shared_ptr<const ZLImage> > FBTree::ourDefaultCovers;
+std::map<std::string,std::string> FBTree::ourDefaultUrls;
+
+// is there already any implementation of this stuff anywhere?
+//TODO move it to some Utils class
+static char hex_helper(int c) {
+ static char tmp[] = "0123456789ABCDEF";
+ return tmp[c];
+}
+
+static std::string percent_encoding(const std::string &str) {
+ std::string result;
+ for (std::size_t i = 0; i < str.size(); ++i) {
+ const char c = str[i];
+ if (str[i] == '\\' || str[i] == '/') {
+ result += '/';
+ } else if (std::isalpha(c) || std::isdigit(c) || c == '.' || c == '-' || c == '_' || c == '~') {
+ result += str[i];
+ } else {
+ result += "%";
+ result += hex_helper((c & 0xf0) >> 4);
+ result += hex_helper(c & 0x0f);
+ }
+ }
+ return result;
+}
+
+//TODO maybe use just one expand action?
+class FBTree::ExpandTreeAction : public ZLTreeAction {
+
+public:
+ ExpandTreeAction(FBTree &node);
+ void run();
+ ZLResourceKey key() const;
+
+private:
+ FBTree &myNode;
+};
+
+FBTree::ExpandTreeAction::ExpandTreeAction(FBTree &node) : myNode(node) {
+}
+
+void FBTree::ExpandTreeAction::run() {
+ myNode.expand();
+}
+
+ZLResourceKey FBTree::ExpandTreeAction::key() const {
+ return ZLResourceKey("expandTree");
+}
+
+shared_ptr<const ZLImage> FBTree::defaultCoverImage(const std::string &id) {
+ shared_ptr<const ZLImage> cover = ourDefaultCovers[id];
+ if (cover.isNull()) {
+ cover = new ZLFileImage(
+ ZLFile(ZLibrary::ApplicationImageDirectory() + ZLibrary::FileNameDelimiter + id), 0
+ );
+ ourDefaultCovers[id] = cover;
+ }
+ return cover;
+}
+
+//std::string FBTree::defaultImageUrl(const std::string &id) {
+// std::string &url = ourDefaultUrls[id];
+// if (url.empty()) {
+// url = ZLibrary::ApplicationImageDirectory();
+// url += "/";
+// url += id;
+// url = LOCALFILE_SCHEME + SCHEME_POSTFIX + percent_encoding(url);
+// }
+// return url;
+//}
+
+void FBTree::expand() {
+ if (ZLTreeListener *handler = listener()) {
+ handler->onExpandRequest(this);
+ }
+}
+
+FBTree::FBTree(ZLTreeNode *parent, std::size_t position) : ZLTreeTitledNode(parent, position)/*, myCoverImageIsStored(false)*/ { }
+
+std::string FBTree::subtitle() const {
+ std::string result;
+ int count = 0;
+ const ZLTreeNode::List &subNodes = children();
+ ZLTreeNode::List::const_iterator it = subNodes.begin();
+ for (; it != subNodes.end() && count < 3; ++it, ++count) {
+ if (count > 0) {
+ result += ", ";
+ }
+ result += ((const FBTree*)*it)->title();
+ }
+ if (it != subNodes.end()) {
+ result += ", ...";
+ }
+ return result;
+}
+
+void FBTree::registerExpandTreeAction() {
+ registerAction(new ExpandTreeAction(*this));
+}
+
+//shared_ptr<const ZLImage> FBTree::coverImage() const {
+// if (!myCoverImageIsStored) {
+// myCoverImageIsStored = true;
+// myStoredCoverImage = image();
+// }
+// return myStoredCoverImage;
+//}
+
+