7 Module implementing the bookmarks manager. |
7 Module implementing the bookmarks manager. |
8 """ |
8 """ |
9 |
9 |
10 import os |
10 import os |
11 |
11 |
12 from PyQt4.QtCore import pyqtSignal, Qt, QT_TRANSLATE_NOOP, QObject, QFile, QByteArray, \ |
12 from PyQt4.QtCore import pyqtSignal, Qt, QT_TRANSLATE_NOOP, QObject, QFile, \ |
13 QBuffer, QIODevice, QXmlStreamReader, QDate, QDateTime, QFileInfo, QUrl |
13 QByteArray, QBuffer, QIODevice, QXmlStreamReader, QDate, QDateTime, \ |
|
14 QFileInfo, QUrl |
14 from PyQt4.QtGui import QUndoStack, QUndoCommand, QApplication, QDialog |
15 from PyQt4.QtGui import QUndoStack, QUndoCommand, QApplication, QDialog |
15 |
16 |
16 from E5Gui import E5MessageBox, E5FileDialog |
17 from E5Gui import E5MessageBox, E5FileDialog |
17 |
18 |
18 from .BookmarkNode import BookmarkNode |
19 from .BookmarkNode import BookmarkNode |
31 |
32 |
32 class BookmarksManager(QObject): |
33 class BookmarksManager(QObject): |
33 """ |
34 """ |
34 Class implementing the bookmarks manager. |
35 Class implementing the bookmarks manager. |
35 |
36 |
36 @signal entryAdded(BookmarkNode) emitted after a bookmark node has been added |
37 @signal entryAdded(BookmarkNode) emitted after a bookmark node has been |
37 @signal entryRemoved(BookmarkNode, int, BookmarkNode) emitted after a bookmark |
38 added |
38 node has been removed |
39 @signal entryRemoved(BookmarkNode, int, BookmarkNode) emitted after a |
39 @signal entryChanged(BookmarkNode) emitted after a bookmark node has been changed |
40 bookmark node has been removed |
|
41 @signal entryChanged(BookmarkNode) emitted after a bookmark node has been |
|
42 changed |
40 @signal bookmarksSaved() emitted after the bookmarks were saved |
43 @signal bookmarksSaved() emitted after the bookmarks were saved |
41 @signal bookmarksReloaded() emitted after the bookmarks were reloaded |
44 @signal bookmarksReloaded() emitted after the bookmarks were reloaded |
42 """ |
45 """ |
43 entryAdded = pyqtSignal(BookmarkNode) |
46 entryAdded = pyqtSignal(BookmarkNode) |
44 entryRemoved = pyqtSignal(BookmarkNode, int, BookmarkNode) |
47 entryRemoved = pyqtSignal(BookmarkNode, int, BookmarkNode) |
77 """ |
80 """ |
78 Public method to get the file name of the bookmark file. |
81 Public method to get the file name of the bookmark file. |
79 |
82 |
80 @return name of the bookmark file (string) |
83 @return name of the bookmark file (string) |
81 """ |
84 """ |
82 return os.path.join(Utilities.getConfigDir(), "browser", "bookmarks.xbel") |
85 return os.path.join(Utilities.getConfigDir(), "browser", |
|
86 "bookmarks.xbel") |
83 |
87 |
84 def close(self): |
88 def close(self): |
85 """ |
89 """ |
86 Public method to close the bookmark manager. |
90 Public method to close the bookmark manager. |
87 """ |
91 """ |
132 reader = XbelReader() |
136 reader = XbelReader() |
133 self.__bookmarkRootNode = reader.read(bookmarkFile) |
137 self.__bookmarkRootNode = reader.read(bookmarkFile) |
134 if reader.error() != QXmlStreamReader.NoError: |
138 if reader.error() != QXmlStreamReader.NoError: |
135 E5MessageBox.warning(None, |
139 E5MessageBox.warning(None, |
136 self.trUtf8("Loading Bookmarks"), |
140 self.trUtf8("Loading Bookmarks"), |
137 self.trUtf8("""Error when loading bookmarks on line {0}, column {1}:\n""" |
141 self.trUtf8( |
138 """{2}""")\ |
142 """Error when loading bookmarks on line {0},""" |
|
143 """ column {1}:\n {2}""")\ |
139 .format(reader.lineNumber(), |
144 .format(reader.lineNumber(), |
140 reader.columnNumber(), |
145 reader.columnNumber(), |
141 reader.errorString())) |
146 reader.errorString())) |
142 |
147 |
143 others = [] |
148 others = [] |
144 for index in range(len(self.__bookmarkRootNode.children()) - 1, -1, -1): |
149 for index in range( |
|
150 len(self.__bookmarkRootNode.children()) - 1, -1, -1): |
145 node = self.__bookmarkRootNode.children()[index] |
151 node = self.__bookmarkRootNode.children()[index] |
146 if node.type() == BookmarkNode.Folder: |
152 if node.type() == BookmarkNode.Folder: |
147 if (node.title == self.trUtf8("Toolbar Bookmarks") or \ |
153 if (node.title == self.trUtf8("Toolbar Bookmarks") or \ |
148 node.title == BOOKMARKBAR) and \ |
154 node.title == BOOKMARKBAR) and \ |
149 self.__toolbar is None: |
155 self.__toolbar is None: |
161 |
167 |
162 if len(self.__bookmarkRootNode.children()) > 0: |
168 if len(self.__bookmarkRootNode.children()) > 0: |
163 raise RuntimeError("Error loading bookmarks.") |
169 raise RuntimeError("Error loading bookmarks.") |
164 |
170 |
165 if self.__toolbar is None: |
171 if self.__toolbar is None: |
166 self.__toolbar = BookmarkNode(BookmarkNode.Folder, self.__bookmarkRootNode) |
172 self.__toolbar = BookmarkNode(BookmarkNode.Folder, |
|
173 self.__bookmarkRootNode) |
167 self.__toolbar.title = self.trUtf8(BOOKMARKBAR) |
174 self.__toolbar.title = self.trUtf8(BOOKMARKBAR) |
168 else: |
175 else: |
169 self.__bookmarkRootNode.add(self.__toolbar) |
176 self.__bookmarkRootNode.add(self.__toolbar) |
170 |
177 |
171 if self.__menu is None: |
178 if self.__menu is None: |
172 self.__menu = BookmarkNode(BookmarkNode.Folder, self.__bookmarkRootNode) |
179 self.__menu = BookmarkNode(BookmarkNode.Folder, |
|
180 self.__bookmarkRootNode) |
173 self.__menu.title = self.trUtf8(BOOKMARKMENU) |
181 self.__menu.title = self.trUtf8(BOOKMARKMENU) |
174 else: |
182 else: |
175 self.__bookmarkRootNode.add(self.__menu) |
183 self.__bookmarkRootNode.add(self.__menu) |
176 |
184 |
177 for node in others: |
185 for node in others: |
214 @param row row number (integer) |
222 @param row row number (integer) |
215 """ |
223 """ |
216 if not self.__loaded: |
224 if not self.__loaded: |
217 return |
225 return |
218 |
226 |
219 self.setTimestamp(node, BookmarkNode.TsAdded, QDateTime.currentDateTime()) |
227 self.setTimestamp(node, BookmarkNode.TsAdded, |
|
228 QDateTime.currentDateTime()) |
220 |
229 |
221 command = InsertBookmarksCommand(self, parent, node, row) |
230 command = InsertBookmarksCommand(self, parent, node, row) |
222 self.__commands.push(command) |
231 self.__commands.push(command) |
223 |
232 |
224 def removeBookmark(self, node): |
233 def removeBookmark(self, node): |
392 |
401 |
393 if bmNames is not None and bmFiles is not None: |
402 if bmNames is not None and bmFiles is not None: |
394 if len(bmNames) == len(bmFiles): |
403 if len(bmNames) == len(bmFiles): |
395 convertedRootNode = BookmarkNode(BookmarkNode.Folder) |
404 convertedRootNode = BookmarkNode(BookmarkNode.Folder) |
396 convertedRootNode.title = self.trUtf8("Converted {0}")\ |
405 convertedRootNode.title = self.trUtf8("Converted {0}")\ |
397 .format(QDate.currentDate().toString(Qt.SystemLocaleShortDate)) |
406 .format(QDate.currentDate().toString( |
|
407 Qt.SystemLocaleShortDate)) |
398 for i in range(len(bmNames)): |
408 for i in range(len(bmNames)): |
399 node = BookmarkNode(BookmarkNode.Bookmark, convertedRootNode) |
409 node = BookmarkNode(BookmarkNode.Bookmark, |
|
410 convertedRootNode) |
400 node.title = bmNames[i] |
411 node.title = bmNames[i] |
401 url = QUrl(bmFiles[i]) |
412 url = QUrl(bmFiles[i]) |
402 if not url.scheme(): |
413 if not url.scheme(): |
403 url.setScheme("file") |
414 url.setScheme("file") |
404 node.url = url.toString() |
415 node.url = url.toString() |
444 def __searchBookmark(self, url, startNode): |
455 def __searchBookmark(self, url, startNode): |
445 """ |
456 """ |
446 Private method get a bookmark node for a given URL. |
457 Private method get a bookmark node for a given URL. |
447 |
458 |
448 @param url URL of the bookmark to search for (string) |
459 @param url URL of the bookmark to search for (string) |
449 @param startNode reference to the node to start searching (BookmarkNode) |
460 @param startNode reference to the node to start searching |
|
461 (BookmarkNode) |
450 @return bookmark node for the given url (BookmarkNode) |
462 @return bookmark node for the given url (BookmarkNode) |
451 """ |
463 """ |
452 bm = None |
464 bm = None |
453 for node in startNode.children(): |
465 for node in startNode.children(): |
454 if node.type() == BookmarkNode.Folder: |
466 if node.type() == BookmarkNode.Folder: |
486 def __searchBookmarks(self, url, startNode): |
498 def __searchBookmarks(self, url, startNode): |
487 """ |
499 """ |
488 Private method get a list of bookmark nodes for a given URL. |
500 Private method get a list of bookmark nodes for a given URL. |
489 |
501 |
490 @param url URL of the bookmarks to search for (string) |
502 @param url URL of the bookmarks to search for (string) |
491 @param startNode reference to the node to start searching (BookmarkNode) |
503 @param startNode reference to the node to start searching |
|
504 (BookmarkNode) |
492 @return list of bookmark nodes for the given url (list of BookmarkNode) |
505 @return list of bookmark nodes for the given url (list of BookmarkNode) |
493 """ |
506 """ |
494 bm = [] |
507 bm = [] |
495 for node in startNode.children(): |
508 for node in startNode.children(): |
496 if node.type() == BookmarkNode.Folder: |
509 if node.type() == BookmarkNode.Folder: |
507 """ |
520 """ |
508 def __init__(self, bookmarksManager, parent, row): |
521 def __init__(self, bookmarksManager, parent, row): |
509 """ |
522 """ |
510 Constructor |
523 Constructor |
511 |
524 |
512 @param bookmarksManager reference to the bookmarks manager (BookmarksManager) |
525 @param bookmarksManager reference to the bookmarks manager |
|
526 (BookmarksManager) |
513 @param parent reference to the parent node (BookmarkNode) |
527 @param parent reference to the parent node (BookmarkNode) |
514 @param row row number of bookmark (integer) |
528 @param row row number of bookmark (integer) |
515 """ |
529 """ |
516 super().__init__( |
530 super().__init__( |
517 QApplication.translate("BookmarksManager", "Remove Bookmark")) |
531 QApplication.translate("BookmarksManager", "Remove Bookmark")) |
534 def redo(self): |
548 def redo(self): |
535 """ |
549 """ |
536 Public slot to perform the redo action. |
550 Public slot to perform the redo action. |
537 """ |
551 """ |
538 self._parent.remove(self._node) |
552 self._parent.remove(self._node) |
539 self._bookmarksManager.entryRemoved.emit(self._parent, self._row, self._node) |
553 self._bookmarksManager.entryRemoved.emit( |
|
554 self._parent, self._row, self._node) |
540 |
555 |
541 |
556 |
542 class InsertBookmarksCommand(RemoveBookmarksCommand): |
557 class InsertBookmarksCommand(RemoveBookmarksCommand): |
543 """ |
558 """ |
544 Class implementing the Insert undo command. |
559 Class implementing the Insert undo command. |
545 """ |
560 """ |
546 def __init__(self, bookmarksManager, parent, node, row): |
561 def __init__(self, bookmarksManager, parent, node, row): |
547 """ |
562 """ |
548 Constructor |
563 Constructor |
549 |
564 |
550 @param bookmarksManager reference to the bookmarks manager (BookmarksManager) |
565 @param bookmarksManager reference to the bookmarks manager |
|
566 (BookmarksManager) |
551 @param parent reference to the parent node (BookmarkNode) |
567 @param parent reference to the parent node (BookmarkNode) |
552 @param node reference to the node to be inserted (BookmarkNode) |
568 @param node reference to the node to be inserted (BookmarkNode) |
553 @param row row number of bookmark (integer) |
569 @param row row number of bookmark (integer) |
554 """ |
570 """ |
555 RemoveBookmarksCommand.__init__(self, bookmarksManager, parent, row) |
571 RemoveBookmarksCommand.__init__(self, bookmarksManager, parent, row) |
556 self.setText(QApplication.translate("BookmarksManager", "Insert Bookmark")) |
572 self.setText(QApplication.translate( |
|
573 "BookmarksManager", "Insert Bookmark")) |
557 self._node = node |
574 self._node = node |
558 |
575 |
559 def undo(self): |
576 def undo(self): |
560 """ |
577 """ |
561 Public slot to perform the undo action. |
578 Public slot to perform the undo action. |
575 """ |
592 """ |
576 def __init__(self, bookmarksManager, node, newValue, title): |
593 def __init__(self, bookmarksManager, node, newValue, title): |
577 """ |
594 """ |
578 Constructor |
595 Constructor |
579 |
596 |
580 @param bookmarksManager reference to the bookmarks manager (BookmarksManager) |
597 @param bookmarksManager reference to the bookmarks manager |
|
598 (BookmarksManager) |
581 @param node reference to the node to be changed (BookmarkNode) |
599 @param node reference to the node to be changed (BookmarkNode) |
582 @param newValue new value to be set (string) |
600 @param newValue new value to be set (string) |
583 @param title flag indicating a change of the title (True) or |
601 @param title flag indicating a change of the title (True) or |
584 the URL (False) (boolean) |
602 the URL (False) (boolean) |
585 """ |
603 """ |
590 self._newValue = newValue |
608 self._newValue = newValue |
591 self._node = node |
609 self._node = node |
592 |
610 |
593 if self._title: |
611 if self._title: |
594 self._oldValue = self._node.title |
612 self._oldValue = self._node.title |
595 self.setText(QApplication.translate("BookmarksManager", "Name Change")) |
613 self.setText(QApplication.translate( |
|
614 "BookmarksManager", "Name Change")) |
596 else: |
615 else: |
597 self._oldValue = self._node.url |
616 self._oldValue = self._node.url |
598 self.setText(QApplication.translate("BookmarksManager", "Address Change")) |
617 self.setText(QApplication.translate( |
|
618 "BookmarksManager", "Address Change")) |
599 |
619 |
600 def undo(self): |
620 def undo(self): |
601 """ |
621 """ |
602 Public slot to perform the undo action. |
622 Public slot to perform the undo action. |
603 """ |
623 """ |