OSDN Git Service

Added more thumbnail logic & correct search bugs.
[neighbornote/NeighborNote.git] / src / cx / fbn / nevernote / gui / Thumbnailer.java
1 package cx.fbn.nevernote.gui;\r
2 \r
3 import com.trolltech.qt.core.QBuffer;\r
4 import com.trolltech.qt.core.QByteArray;\r
5 import com.trolltech.qt.core.QIODevice;\r
6 import com.trolltech.qt.core.QMutex;\r
7 import com.trolltech.qt.core.QObject;\r
8 import com.trolltech.qt.core.QSize;\r
9 import com.trolltech.qt.core.Qt.Orientation;\r
10 import com.trolltech.qt.core.Qt.ScrollBarPolicy;\r
11 import com.trolltech.qt.gui.QColor;\r
12 import com.trolltech.qt.gui.QImage;\r
13 import com.trolltech.qt.gui.QImage.Format;\r
14 import com.trolltech.qt.gui.QPainter;\r
15 import com.trolltech.qt.webkit.QWebPage;\r
16 \r
17 import cx.fbn.nevernote.sql.DatabaseConnection;\r
18 import cx.fbn.nevernote.threads.ThumbnailRunner;\r
19 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
20 import cx.fbn.nevernote.utilities.ListManager;\r
21 \r
22 public class Thumbnailer extends QObject {\r
23     public QWebPage page = new QWebPage();\r
24     public QImage image;\r
25     public QPainter painter = new QPainter();\r
26     public QMutex mutex;\r
27     public String guid;\r
28     private final QSize size;\r
29     private int zoom;\r
30     private QBuffer buffer;\r
31     private final ListManager listManager;\r
32     private final ThumbnailRunner runner;\r
33     private final ApplicationLogger logger;\r
34     private final DatabaseConnection conn;\r
35     \r
36     public Thumbnailer(ApplicationLogger logger, DatabaseConnection conn, ListManager l, ThumbnailRunner r)\r
37     {\r
38         mutex = new QMutex();\r
39         zoom = 1;\r
40 \r
41         this.runner = r;\r
42         this.logger = logger;\r
43         page = new QWebPage();\r
44         listManager = l;\r
45         this.conn = conn;\r
46         size = new QSize(1024,768);\r
47         image = new QImage(size, Format.Format_ARGB32_Premultiplied);\r
48         page.setViewportSize(size);\r
49         page.loadFinished.connect(this, "loadFinished(Boolean)");\r
50         buffer = new QBuffer();\r
51         mutex.unlock();\r
52     }\r
53     \r
54     public void loadContent(String guid, QByteArray html, int zoom) {\r
55         this.zoom = zoom;\r
56         this.guid = guid;\r
57         page.mainFrame().setScrollBarPolicy(Orientation.Horizontal, ScrollBarPolicy.ScrollBarAlwaysOff);\r
58         page.mainFrame().setScrollBarPolicy(Orientation.Vertical, ScrollBarPolicy.ScrollBarAlwaysOff);\r
59                 page.mainFrame().setContent(html);\r
60     }\r
61         \r
62         \r
63         public String loadFinished(Boolean ok) {\r
64                 if (!ok) { \r
65                         mutex.unlock();\r
66                         return null;\r
67                 }\r
68                 logger.log(logger.EXTREME, "Creating painter");\r
69                 painter = new QPainter();\r
70                 logger.log(logger.EXTREME, "Creating image");\r
71                 if (image == null) {\r
72                         System.out.println("Null image");\r
73                         image = new QImage(size, Format.Format_ARGB32_Premultiplied);\r
74                         if (image.isNull()) {\r
75                                 logger.log(logger.EXTREME, "Image is null.  Aborting");\r
76                                 mutex.unlock();\r
77                                 return null;\r
78                         }\r
79                 }\r
80                 logger.log(logger.EXTREME, "Filling image");\r
81                 image.fill(QColor.white.rgb());\r
82                 logger.log(logger.EXTREME, "Beginning painter");\r
83         painter.begin(image);\r
84         page.mainFrame().setZoomFactor(new Double(zoom));\r
85         if (painter.paintEngine() == null) {\r
86                 logger.log(logger.EXTREME, "Bad paint engine.  Aborting");\r
87                 painter.end();\r
88                         mutex.unlock();\r
89                         return null;\r
90         }\r
91                 logger.log(logger.EXTREME, "Rendering image");\r
92         page.mainFrame().render(painter); \r
93                 logger.log(logger.EXTREME, "Closing painter");\r
94         painter.end();\r
95         \r
96         if (image.isNull()) {\r
97                 logger.log(logger.EXTREME, "Error rendering thumbnail image.  Aborting");\r
98                 mutex.unlock();\r
99                 return null;\r
100         }\r
101                 logger.log(logger.EXTREME, "Adding to listManager");\r
102 //        listManager.getThumbnails().remove(guid);\r
103 //              listManager.getThumbnails().put(guid, image.clone());\r
104                 logger.log(logger.EXTREME, "Saving image isNull=" +image.isNull() +" Size=" +image.size());\r
105                 logger.log(logger.EXTREME, "Adding image to runner");\r
106                 saveImage();\r
107                 logger.log(logger.EXTREME, "Unlocking thumbnailer");\r
108         mutex.unlock();\r
109         return guid;\r
110     }\r
111         \r
112         \r
113         private void saveImage() {\r
114                 logger.log(logger.EXTREME, "Image found "+guid);\r
115                                 \r
116                 logger.log(logger.EXTREME, "Opening buffer");\r
117                 if (buffer == null)\r
118                         buffer = new QBuffer();\r
119         if (!buffer.open(QIODevice.OpenModeFlag.ReadWrite)) {\r
120                 logger.log(logger.EXTREME, "Failure to open buffer.  Aborting.");\r
121                 mutex.unlock();\r
122                 return;\r
123         }\r
124                 \r
125                 logger.log(logger.EXTREME, "Filling buffer");\r
126         if (!image.save(buffer, "PNG")) {\r
127                 logger.log(logger.EXTREME, "Failure to write to buffer.  Aborting.");     \r
128                 mutex.unlock();\r
129                 return;\r
130         }\r
131         buffer.close();\r
132                 \r
133                 logger.log(logger.EXTREME, "Updating database");\r
134                 QByteArray b = buffer.buffer();\r
135                 conn.getNoteTable().setThumbnail(guid, b);\r
136                 conn.getNoteTable().setThumbnailNeeded(guid, false);\r
137         }\r
138 }\r