9 |
9 |
10 from __future__ import unicode_literals # __IGNORE_WARNING__ |
10 from __future__ import unicode_literals # __IGNORE_WARNING__ |
11 |
11 |
12 import os |
12 import os |
13 |
13 |
14 from PyQt4.QtCore import pyqtSignal, Qt, QT_TRANSLATE_NOOP, QObject, QFile, QByteArray, \ |
14 from PyQt4.QtCore import pyqtSignal, Qt, QT_TRANSLATE_NOOP, QObject, QFile, \ |
15 QBuffer, QIODevice, QXmlStreamReader, QDate, QDateTime, QFileInfo, QUrl |
15 QByteArray, QBuffer, QIODevice, QXmlStreamReader, QDate, QDateTime, \ |
|
16 QFileInfo, QUrl |
16 from PyQt4.QtGui import QUndoStack, QUndoCommand, QApplication, QDialog |
17 from PyQt4.QtGui import QUndoStack, QUndoCommand, QApplication, QDialog |
17 |
18 |
18 from E5Gui import E5MessageBox, E5FileDialog |
19 from E5Gui import E5MessageBox, E5FileDialog |
19 |
20 |
20 from .BookmarkNode import BookmarkNode |
21 from .BookmarkNode import BookmarkNode |
33 |
34 |
34 class BookmarksManager(QObject): |
35 class BookmarksManager(QObject): |
35 """ |
36 """ |
36 Class implementing the bookmarks manager. |
37 Class implementing the bookmarks manager. |
37 |
38 |
38 @signal entryAdded(BookmarkNode) emitted after a bookmark node has been added |
39 @signal entryAdded(BookmarkNode) emitted after a bookmark node has been |
39 @signal entryRemoved(BookmarkNode, int, BookmarkNode) emitted after a bookmark |
40 added |
40 node has been removed |
41 @signal entryRemoved(BookmarkNode, int, BookmarkNode) emitted after a |
41 @signal entryChanged(BookmarkNode) emitted after a bookmark node has been changed |
42 bookmark node has been removed |
|
43 @signal entryChanged(BookmarkNode) emitted after a bookmark node has been |
|
44 changed |
42 @signal bookmarksSaved() emitted after the bookmarks were saved |
45 @signal bookmarksSaved() emitted after the bookmarks were saved |
43 @signal bookmarksReloaded() emitted after the bookmarks were reloaded |
46 @signal bookmarksReloaded() emitted after the bookmarks were reloaded |
44 """ |
47 """ |
45 entryAdded = pyqtSignal(BookmarkNode) |
48 entryAdded = pyqtSignal(BookmarkNode) |
46 entryRemoved = pyqtSignal(BookmarkNode, int, BookmarkNode) |
49 entryRemoved = pyqtSignal(BookmarkNode, int, BookmarkNode) |
79 """ |
82 """ |
80 Public method to get the file name of the bookmark file. |
83 Public method to get the file name of the bookmark file. |
81 |
84 |
82 @return name of the bookmark file (string) |
85 @return name of the bookmark file (string) |
83 """ |
86 """ |
84 return os.path.join(Utilities.getConfigDir(), "browser", "bookmarks.xbel") |
87 return os.path.join(Utilities.getConfigDir(), "browser", |
|
88 "bookmarks.xbel") |
85 |
89 |
86 def close(self): |
90 def close(self): |
87 """ |
91 """ |
88 Public method to close the bookmark manager. |
92 Public method to close the bookmark manager. |
89 """ |
93 """ |
131 reader = XbelReader() |
138 reader = XbelReader() |
132 self.__bookmarkRootNode = reader.read(bookmarkFile) |
139 self.__bookmarkRootNode = reader.read(bookmarkFile) |
133 if reader.error() != QXmlStreamReader.NoError: |
140 if reader.error() != QXmlStreamReader.NoError: |
134 E5MessageBox.warning(None, |
141 E5MessageBox.warning(None, |
135 self.trUtf8("Loading Bookmarks"), |
142 self.trUtf8("Loading Bookmarks"), |
136 self.trUtf8("""Error when loading bookmarks on line {0}, column {1}:\n""" |
143 self.trUtf8( |
137 """{2}""")\ |
144 """Error when loading bookmarks on line {0},""" |
|
145 """ column {1}:\n {2}""")\ |
138 .format(reader.lineNumber(), |
146 .format(reader.lineNumber(), |
139 reader.columnNumber(), |
147 reader.columnNumber(), |
140 reader.errorString())) |
148 reader.errorString())) |
141 |
149 |
142 others = [] |
150 others = [] |
143 for index in range(len(self.__bookmarkRootNode.children()) - 1, -1, -1): |
151 for index in range( |
|
152 len(self.__bookmarkRootNode.children()) - 1, -1, -1): |
144 node = self.__bookmarkRootNode.children()[index] |
153 node = self.__bookmarkRootNode.children()[index] |
145 if node.type() == BookmarkNode.Folder: |
154 if node.type() == BookmarkNode.Folder: |
146 if (node.title == self.trUtf8("Toolbar Bookmarks") or \ |
155 if (node.title == self.trUtf8("Toolbar Bookmarks") or \ |
147 node.title == BOOKMARKBAR) and \ |
156 node.title == BOOKMARKBAR) and \ |
148 self.__toolbar is None: |
157 self.__toolbar is None: |
160 |
169 |
161 if len(self.__bookmarkRootNode.children()) > 0: |
170 if len(self.__bookmarkRootNode.children()) > 0: |
162 raise RuntimeError("Error loading bookmarks.") |
171 raise RuntimeError("Error loading bookmarks.") |
163 |
172 |
164 if self.__toolbar is None: |
173 if self.__toolbar is None: |
165 self.__toolbar = BookmarkNode(BookmarkNode.Folder, self.__bookmarkRootNode) |
174 self.__toolbar = BookmarkNode(BookmarkNode.Folder, |
|
175 self.__bookmarkRootNode) |
166 self.__toolbar.title = self.trUtf8(BOOKMARKBAR) |
176 self.__toolbar.title = self.trUtf8(BOOKMARKBAR) |
167 else: |
177 else: |
168 self.__bookmarkRootNode.add(self.__toolbar) |
178 self.__bookmarkRootNode.add(self.__toolbar) |
169 |
179 |
170 if self.__menu is None: |
180 if self.__menu is None: |
171 self.__menu = BookmarkNode(BookmarkNode.Folder, self.__bookmarkRootNode) |
181 self.__menu = BookmarkNode(BookmarkNode.Folder, |
|
182 self.__bookmarkRootNode) |
172 self.__menu.title = self.trUtf8(BOOKMARKMENU) |
183 self.__menu.title = self.trUtf8(BOOKMARKMENU) |
173 else: |
184 else: |
174 self.__bookmarkRootNode.add(self.__menu) |
185 self.__bookmarkRootNode.add(self.__menu) |
175 |
186 |
176 for node in others: |
187 for node in others: |
213 @param row row number (integer) |
224 @param row row number (integer) |
214 """ |
225 """ |
215 if not self.__loaded: |
226 if not self.__loaded: |
216 return |
227 return |
217 |
228 |
218 self.setTimestamp(node, BookmarkNode.TsAdded, QDateTime.currentDateTime()) |
229 self.setTimestamp(node, BookmarkNode.TsAdded, |
|
230 QDateTime.currentDateTime()) |
219 |
231 |
220 command = InsertBookmarksCommand(self, parent, node, row) |
232 command = InsertBookmarksCommand(self, parent, node, row) |
221 self.__commands.push(command) |
233 self.__commands.push(command) |
222 |
234 |
223 def removeBookmark(self, node): |
235 def removeBookmark(self, node): |
260 command = ChangeBookmarkCommand(self, node, newUrl, False) |
272 command = ChangeBookmarkCommand(self, node, newUrl, False) |
261 self.__commands.push(command) |
273 self.__commands.push(command) |
262 |
274 |
263 def setNodeChanged(self, node): |
275 def setNodeChanged(self, node): |
264 """ |
276 """ |
265 Public method to signal changes of bookmarks other than title, URL or timestamp. |
277 Public method to signal changes of bookmarks other than title, URL |
|
278 or timestamp. |
|
279 |
|
280 @param node reference to the bookmark (BookmarkNode) |
266 """ |
281 """ |
267 self.__saveTimer.changeOccurred() |
282 self.__saveTimer.changeOccurred() |
268 |
283 |
269 def setTimestamp(self, node, timestampType, timestamp): |
284 def setTimestamp(self, node, timestampType, timestamp): |
270 """ |
285 """ |
271 Public method to set the URL of a bookmark. |
286 Public method to set the URL of a bookmark. |
272 |
287 |
273 @param node reference to the node to be changed (BookmarkNode) |
288 @param node reference to the node to be changed (BookmarkNode) |
274 @param timestampType type of the timestamp to set (BookmarkNode.TsAdded, |
289 @param timestampType type of the timestamp to set |
275 BookmarkNode.TsModified, BookmarkNode.TsVisited) |
290 (BookmarkNode.TsAdded, BookmarkNode.TsModified, |
|
291 BookmarkNode.TsVisited) |
276 @param timestamp timestamp to set (QDateTime) |
292 @param timestamp timestamp to set (QDateTime) |
277 """ |
293 """ |
278 if not self.__loaded: |
294 if not self.__loaded: |
279 return |
295 return |
280 |
296 |
387 |
403 |
388 if bmNames is not None and bmFiles is not None: |
404 if bmNames is not None and bmFiles is not None: |
389 if len(bmNames) == len(bmFiles): |
405 if len(bmNames) == len(bmFiles): |
390 convertedRootNode = BookmarkNode(BookmarkNode.Folder) |
406 convertedRootNode = BookmarkNode(BookmarkNode.Folder) |
391 convertedRootNode.title = self.trUtf8("Converted {0}")\ |
407 convertedRootNode.title = self.trUtf8("Converted {0}")\ |
392 .format(QDate.currentDate().toString(Qt.SystemLocaleShortDate)) |
408 .format(QDate.currentDate().toString( |
|
409 Qt.SystemLocaleShortDate)) |
393 for i in range(len(bmNames)): |
410 for i in range(len(bmNames)): |
394 node = BookmarkNode(BookmarkNode.Bookmark, convertedRootNode) |
411 node = BookmarkNode(BookmarkNode.Bookmark, |
|
412 convertedRootNode) |
395 node.title = bmNames[i] |
413 node.title = bmNames[i] |
396 url = QUrl(bmFiles[i]) |
414 url = QUrl(bmFiles[i]) |
397 if not url.scheme(): |
415 if not url.scheme(): |
398 url.setScheme("file") |
416 url.setScheme("file") |
399 node.url = url.toString() |
417 node.url = url.toString() |
439 def __searchBookmark(self, url, startNode): |
457 def __searchBookmark(self, url, startNode): |
440 """ |
458 """ |
441 Private method get a bookmark node for a given URL. |
459 Private method get a bookmark node for a given URL. |
442 |
460 |
443 @param url URL of the bookmark to search for (string) |
461 @param url URL of the bookmark to search for (string) |
444 @param startNode reference to the node to start searching (BookmarkNode) |
462 @param startNode reference to the node to start searching |
|
463 (BookmarkNode) |
445 @return bookmark node for the given url (BookmarkNode) |
464 @return bookmark node for the given url (BookmarkNode) |
446 """ |
465 """ |
447 bm = None |
466 bm = None |
448 for node in startNode.children(): |
467 for node in startNode.children(): |
449 if node.type() == BookmarkNode.Folder: |
468 if node.type() == BookmarkNode.Folder: |
481 def __searchBookmarks(self, url, startNode): |
500 def __searchBookmarks(self, url, startNode): |
482 """ |
501 """ |
483 Private method get a list of bookmark nodes for a given URL. |
502 Private method get a list of bookmark nodes for a given URL. |
484 |
503 |
485 @param url URL of the bookmarks to search for (string) |
504 @param url URL of the bookmarks to search for (string) |
486 @param startNode reference to the node to start searching (BookmarkNode) |
505 @param startNode reference to the node to start searching |
|
506 (BookmarkNode) |
487 @return list of bookmark nodes for the given url (list of BookmarkNode) |
507 @return list of bookmark nodes for the given url (list of BookmarkNode) |
488 """ |
508 """ |
489 bm = [] |
509 bm = [] |
490 for node in startNode.children(): |
510 for node in startNode.children(): |
491 if node.type() == BookmarkNode.Folder: |
511 if node.type() == BookmarkNode.Folder: |
502 """ |
522 """ |
503 def __init__(self, bookmarksManager, parent, row): |
523 def __init__(self, bookmarksManager, parent, row): |
504 """ |
524 """ |
505 Constructor |
525 Constructor |
506 |
526 |
507 @param bookmarksManager reference to the bookmarks manager (BookmarksManager) |
527 @param bookmarksManager reference to the bookmarks manager |
|
528 (BookmarksManager) |
508 @param parent reference to the parent node (BookmarkNode) |
529 @param parent reference to the parent node (BookmarkNode) |
509 @param row row number of bookmark (integer) |
530 @param row row number of bookmark (integer) |
510 """ |
531 """ |
511 super(RemoveBookmarksCommand, self).__init__( |
532 super(RemoveBookmarksCommand, self).__init__( |
512 QApplication.translate("BookmarksManager", "Remove Bookmark")) |
533 QApplication.translate("BookmarksManager", "Remove Bookmark")) |
529 def redo(self): |
550 def redo(self): |
530 """ |
551 """ |
531 Public slot to perform the redo action. |
552 Public slot to perform the redo action. |
532 """ |
553 """ |
533 self._parent.remove(self._node) |
554 self._parent.remove(self._node) |
534 self._bookmarksManager.entryRemoved.emit(self._parent, self._row, self._node) |
555 self._bookmarksManager.entryRemoved.emit( |
|
556 self._parent, self._row, self._node) |
535 |
557 |
536 |
558 |
537 class InsertBookmarksCommand(RemoveBookmarksCommand): |
559 class InsertBookmarksCommand(RemoveBookmarksCommand): |
538 """ |
560 """ |
539 Class implementing the Insert undo command. |
561 Class implementing the Insert undo command. |
540 """ |
562 """ |
541 def __init__(self, bookmarksManager, parent, node, row): |
563 def __init__(self, bookmarksManager, parent, node, row): |
542 """ |
564 """ |
543 Constructor |
565 Constructor |
544 |
566 |
545 @param bookmarksManager reference to the bookmarks manager (BookmarksManager) |
567 @param bookmarksManager reference to the bookmarks manager |
|
568 (BookmarksManager) |
546 @param parent reference to the parent node (BookmarkNode) |
569 @param parent reference to the parent node (BookmarkNode) |
547 @param node reference to the node to be inserted (BookmarkNode) |
570 @param node reference to the node to be inserted (BookmarkNode) |
548 @param row row number of bookmark (integer) |
571 @param row row number of bookmark (integer) |
549 """ |
572 """ |
550 RemoveBookmarksCommand.__init__(self, bookmarksManager, parent, row) |
573 RemoveBookmarksCommand.__init__(self, bookmarksManager, parent, row) |
551 self.setText(QApplication.translate("BookmarksManager", "Insert Bookmark")) |
574 self.setText(QApplication.translate( |
|
575 "BookmarksManager", "Insert Bookmark")) |
552 self._node = node |
576 self._node = node |
553 |
577 |
554 def undo(self): |
578 def undo(self): |
555 """ |
579 """ |
556 Public slot to perform the undo action. |
580 Public slot to perform the undo action. |
570 """ |
594 """ |
571 def __init__(self, bookmarksManager, node, newValue, title): |
595 def __init__(self, bookmarksManager, node, newValue, title): |
572 """ |
596 """ |
573 Constructor |
597 Constructor |
574 |
598 |
575 @param bookmarksManager reference to the bookmarks manager (BookmarksManager) |
599 @param bookmarksManager reference to the bookmarks manager |
|
600 (BookmarksManager) |
576 @param node reference to the node to be changed (BookmarkNode) |
601 @param node reference to the node to be changed (BookmarkNode) |
577 @param newValue new value to be set (string) |
602 @param newValue new value to be set (string) |
578 @param title flag indicating a change of the title (True) or |
603 @param title flag indicating a change of the title (True) or |
579 the URL (False) (boolean) |
604 the URL (False) (boolean) |
580 """ |
605 """ |
585 self._newValue = newValue |
610 self._newValue = newValue |
586 self._node = node |
611 self._node = node |
587 |
612 |
588 if self._title: |
613 if self._title: |
589 self._oldValue = self._node.title |
614 self._oldValue = self._node.title |
590 self.setText(QApplication.translate("BookmarksManager", "Name Change")) |
615 self.setText(QApplication.translate( |
|
616 "BookmarksManager", "Name Change")) |
591 else: |
617 else: |
592 self._oldValue = self._node.url |
618 self._oldValue = self._node.url |
593 self.setText(QApplication.translate("BookmarksManager", "Address Change")) |
619 self.setText(QApplication.translate( |
|
620 "BookmarksManager", "Address Change")) |
594 |
621 |
595 def undo(self): |
622 def undo(self): |
596 """ |
623 """ |
597 Public slot to perform the undo action. |
624 Public slot to perform the undo action. |
598 """ |
625 """ |