+void BrowserWindow::newWindow() const
+{
+ // Create a new browser window.
+ BrowserWindow *browserWindowPointer = new BrowserWindow();
+
+ // Show the new browser window.
+ browserWindowPointer->show();
+}
+
+void BrowserWindow::populateBookmarks()
+{
+ // Remove all the current menu bookmarks.
+ for (QPair<QMenu *, QAction *> *bookmarkPairPointer : bookmarksMenuActionList)
+ {
+ // Remove the bookmark.
+ bookmarkPairPointer->first->removeAction(bookmarkPairPointer->second);
+ }
+
+ // Remove all the current menu subfolders.
+ for (QPair<QMenu *, QMenu *> *submenuPairPointer : bookmarksMenuSubmenuList)
+ {
+ // Remove the submenu from the parent menu.
+ submenuPairPointer->first->removeAction(submenuPairPointer->second->menuAction());
+ }
+
+ // Remove all the current toolbar subfolders.
+ for (QPair<QMenu *, QAction *> *subfolderPairPointer : bookmarksToolBarSubfolderActionList)
+ {
+ // Remove the action from the subfolder.
+ subfolderPairPointer->first->removeAction(subfolderPairPointer->second);
+ }
+
+ // Remove all the current toolbar bookmarks.
+ for (QAction *bookmarkAction : bookmarksToolBarActionList)
+ {
+ // Remove the bookmark.
+ bookmarksToolBarPointer->removeAction(bookmarkAction);
+ }
+
+ // Clear the current bookmark lists.
+ bookmarksMenuActionList.clear();
+ bookmarksMenuSubmenuList.clear();
+ bookmarksToolBarActionList.clear();
+ bookmarksToolBarSubfolderActionList.clear();
+
+ // Populate the bookmarks subfolders, beginning with the root folder (`0`);
+ populateBookmarksMenuSubfolders(0, bookmarksMenuPointer);
+
+ // Populate the bookmarks toolbar.
+ populateBookmarksToolBar();
+
+ // Get a handle for the bookmark toolbar layout.
+ QLayout *bookmarksToolBarLayoutPointer = bookmarksToolBarPointer->layout();
+
+ // Get the count of the bookmarks.
+ int bookmarkCount = bookmarksToolBarLayoutPointer->count();
+
+ // Set the layout of each bookmark to be left aligned.
+ for(int i = 0; i < bookmarkCount; ++i)
+ bookmarksToolBarLayoutPointer->itemAt(i)->setAlignment(Qt::AlignLeft);
+}
+
+void BrowserWindow::populateBookmarksMenuSubfolders(const double folderId, QMenu *menuPointer)
+{
+ // Get the folder contents.
+ QList<BookmarkStruct> *folderContentsListPointer = BookmarksDatabase::getFolderContents(folderId);
+
+ // Populate the bookmarks menu and toolbar.
+ for (BookmarkStruct bookmarkStruct : *folderContentsListPointer)
+ {
+ // Process the item according to the type.
+ if (bookmarkStruct.isFolder) // This item is a folder.
+ {
+ // Add a submenu to the menu.
+ QMenu *submenuPointer = menuPointer->addMenu(bookmarkStruct.favoriteIcon, bookmarkStruct.name);
+
+ // Add the submenu to the beginning of the list of menus to be deleted on repopulate.
+ bookmarksMenuSubmenuList.prepend(new QPair<QMenu *, QMenu *>(menuPointer, submenuPointer));
+
+ // Populate any subfolders.
+ populateBookmarksMenuSubfolders(bookmarkStruct.folderId, submenuPointer);
+ }
+ else // This item is a bookmark.
+ {
+ // Add the bookmark to the menu.
+ QAction *menuBookmarkActionPointer = menuPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name, [=]
+ {
+ // Remove the focus from the URL line edit.
+ urlLineEditPointer->clearFocus();
+
+ // Load the URL.
+ tabWidgetPointer->loadUrlFromLineEdit(bookmarkStruct.url);
+ }
+ );
+
+ // Add the actions to the beginning of the list of bookmarks to be deleted on repopulate.
+ bookmarksMenuActionList.prepend(new QPair<QMenu *, QAction *>(menuPointer, menuBookmarkActionPointer));
+ }
+ }
+}
+
+void BrowserWindow::populateBookmarksToolBar()
+{
+ // Get the root folder contents (which has a folder ID of `0`).
+ QList<BookmarkStruct> *folderContentsListPointer = BookmarksDatabase::getFolderContents(0);
+
+ // Populate the bookmarks toolbar.
+ for (BookmarkStruct bookmarkStruct : *folderContentsListPointer)
+ {
+ // Process the item according to the type.
+ if (bookmarkStruct.isFolder) // This item is a folder.
+ {
+ // Add the subfolder action.
+ QAction *toolBarSubfolderActionPointer = bookmarksToolBarPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name);
+
+ // Add the bookmark database ID to the toolbar action.
+ toolBarSubfolderActionPointer->setData(bookmarkStruct.databaseId);
+
+ // Add the action to the beginning of the list of actions to be deleted on repopulate.
+ bookmarksToolBarActionList.prepend(toolBarSubfolderActionPointer);
+
+ // Create a subfolder menu.
+ QMenu *subfolderMenuPointer = new QMenu();
+
+ // Add the menu to the action.
+ toolBarSubfolderActionPointer->setMenu(subfolderMenuPointer);
+
+ // Add the submenu to the toolbar menu list.
+ bookmarksToolBarMenuList.append(new QPair<QMenu *, const double>(subfolderMenuPointer, bookmarkStruct.folderId));
+
+ // Set the popup mode for the menu.
+ dynamic_cast<QToolButton *>(bookmarksToolBarPointer->widgetForAction(toolBarSubfolderActionPointer))->setPopupMode(QToolButton::InstantPopup);
+
+ // Populate the subfolder.
+ populateBookmarksToolBarSubfolders(bookmarkStruct.folderId, subfolderMenuPointer);
+ }
+ else // This item is a bookmark.
+ {
+ // Add the bookmark to the toolbar.
+ QAction *toolBarBookmarkActionPointer = bookmarksToolBarPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name, [=]
+ {
+ // Remove the focus from the URL line edit.
+ urlLineEditPointer->clearFocus();
+
+ // Load the URL.
+ tabWidgetPointer->loadUrlFromLineEdit(bookmarkStruct.url);
+ }
+ );
+
+ // Add the bookmark database ID to the toolbar action.
+ toolBarBookmarkActionPointer->setData(bookmarkStruct.databaseId);
+
+ // Add the actions to the beginning of the current bookmarks lists.
+ bookmarksToolBarActionList.prepend(toolBarBookmarkActionPointer);
+ }
+ }
+
+ // Add the extra items to the toolbar folder menus. The first item in the pair is the menu pointer. The second is the folder ID.
+ for (QPair<QMenu *, const double> *menuAndFolderIdPairPointer : bookmarksToolBarMenuList)
+ {
+ // Add a separator.
+ menuAndFolderIdPairPointer->first->addSeparator();
+
+ // Add the open folder in new tabs action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("tab-new")), i18nc("The open folder in new tabs action", "Open Folder in New Tabs"), [=]
+ {
+ // Get all the folder URLs.
+ QList<QString> *folderUrlsListPointer = BookmarksDatabase::getAllFolderUrls(menuAndFolderIdPairPointer->second);
+
+ // Open the URLs in new tabs. `true` removes the URL line edit focus, `false` does not load a background tab.
+ for (QString url : *folderUrlsListPointer)
+ tabWidgetPointer->addTab(true, false, url);
+ }
+ );
+
+ // Add the open folder in background tabs action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("tab-new")), i18nc("The open folder in background tabs action", "Open Folder in Background Tabs"), [=]
+ {
+ // Get all the folder URLs.
+ QList<QString> *folderUrlsListPointer = BookmarksDatabase::getAllFolderUrls(menuAndFolderIdPairPointer->second);
+
+ // Open the URLs in new tabs. `true` removes the URL line edit focus, `true` loads a background tab.
+ for (QString url : *folderUrlsListPointer)
+ tabWidgetPointer->addTab(true, true, url);
+ }
+ );
+
+ // Add the open folder in new window action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("window-new")), i18nc("The open folder in new window action", "Open Folder in New Window"), [=]
+ {
+ // Get all the folder URLs.
+ QList<QString> *folderUrlsListPointer = BookmarksDatabase::getAllFolderUrls(menuAndFolderIdPairPointer->second);
+
+ // Create a new browser window.
+ BrowserWindow *browserWindowPointer = new BrowserWindow(false, &folderUrlsListPointer->first());
+
+ // Get a count of the folder URLs.
+ const int folderUrls = folderUrlsListPointer->count();
+
+ // Load all the other URLs. `true` removes the URL line edit focus, `true` loads a background tab.
+ for (int i = 1; i < folderUrls; ++i)
+ browserWindowPointer->tabWidgetPointer->addTab(true, true, folderUrlsListPointer->value(i));
+
+ // Show the new browser window.
+ browserWindowPointer->show();
+ }
+ );
+
+ // Add a separator.
+ menuAndFolderIdPairPointer->first->addSeparator();
+
+ // Add the add bookmark action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("bookmark-new")), i18nc("The add bookmark action", "Add Bookmark"), [=]
+ {
+ // Instantiate an add bookmark dialog.
+ AddBookmarkDialog *addBookmarkDialogPointer = new AddBookmarkDialog(tabWidgetPointer->getCurrentTabTitle(), tabWidgetPointer->getCurrentTabUrl(),
+ tabWidgetPointer->getCurrentTabFavoritIcon(), menuAndFolderIdPairPointer->second);
+
+ // Update the displayed bookmarks when a new one is added.
+ connect(addBookmarkDialogPointer, SIGNAL(bookmarkAdded()), this, SLOT(populateBookmarks()));
+
+ // Show the dialog.
+ addBookmarkDialogPointer->show();
+ }
+ );
+
+ // Add the add folder action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("folder-add")), i18nc("The add folder action", "Add Folder"), [=]
+ {
+ // Instantiate an add folder dialog.
+ AddFolderDialog *addFolderDialogPointer = new AddFolderDialog(tabWidgetPointer->getCurrentTabFavoritIcon(), menuAndFolderIdPairPointer->second);
+
+ // Update the displayed bookmarks when a folder is added.
+ connect(addFolderDialogPointer, SIGNAL(folderAdded()), this, SLOT(populateBookmarks()));
+
+ // Show the dialog.
+ addFolderDialogPointer->show();
+ }
+ );
+
+ // Add a separator.
+ menuAndFolderIdPairPointer->first->addSeparator();
+
+ // Add the edit folder action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("edit-entry")), i18nc("The edit folder action", "Edit Folder"), [=]
+ {
+ // Get the current tab favorite icon.
+ QIcon currentTabFavoriteIcon = tabWidgetPointer->getCurrentTabFavoritIcon();
+
+ // Instantiate an edit folder dialog.
+ QDialog *editFolderDialogPointer = new EditFolderDialog(BookmarksDatabase::getFolderDatabaseId(menuAndFolderIdPairPointer->second), currentTabFavoriteIcon);
+
+ // Show the dialog.
+ editFolderDialogPointer->show();
+
+ // Process bookmark events.
+ connect(editFolderDialogPointer, SIGNAL(folderSaved()), this, SLOT(populateBookmarks()));
+ }
+ );
+
+ // Add the delete folder action to the menu.
+ menuAndFolderIdPairPointer->first->addAction(QIcon::fromTheme(QLatin1String("delete")), i18nc("Delete folder context menu entry", "Delete Folder"), [=]
+ {
+ // Get the folder database ID.
+ int folderDatabaseId = BookmarksDatabase::getFolderDatabaseId(menuAndFolderIdPairPointer->second);
+
+ // Create an items to delete list.
+ QList<int>* itemsToDeleteListPointer = new QList<int>;
+
+ // Add the folder to the list of items to delete.
+ itemsToDeleteListPointer->append(folderDatabaseId);
+
+ // Add the folder contents to the list of items to delete.
+ itemsToDeleteListPointer->append(*BookmarksDatabase::getFolderContentsDatabaseIdsRecursively(menuAndFolderIdPairPointer->second));
+
+ // Instantiate a delete dialog message box.
+ QMessageBox deleteDialogMessageBox;
+
+ // Set the icon.
+ deleteDialogMessageBox.setIcon(QMessageBox::Warning);
+
+ // Set the window title.
+ deleteDialogMessageBox.setWindowTitle(i18nc("Delete bookmarks dialog title", "Delete Bookmarks"));
+
+ // Set the text.
+ deleteDialogMessageBox.setText(i18ncp("Delete bookmarks dialog main message", "Delete %1 bookmark item?", "Delete %1 bookmark items?", itemsToDeleteListPointer->count()));
+
+ // Set the informative text.
+ deleteDialogMessageBox.setInformativeText(i18nc("Delete bookmarks dialog secondary message", "This cannot be undone."));
+
+ // Set the standard buttons.
+ deleteDialogMessageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+
+ // Set the default button.
+ deleteDialogMessageBox.setDefaultButton(QMessageBox::No);
+
+ // Display the dialog and capture the return value.
+ int returnValue = deleteDialogMessageBox.exec();
+
+ // Delete the domain if instructed.
+ if (returnValue == QMessageBox::Yes)
+ {
+ // Get the parent folder ID.
+ double parentFolderId = BookmarksDatabase::getParentFolderId(folderDatabaseId);
+
+ // Delete the folder and its contents.
+ for (const int databaseId : *itemsToDeleteListPointer)
+ BookmarksDatabase::deleteBookmark(databaseId);
+
+ // Update the display order of the bookmarks in the parent folder.
+ BookmarksDatabase::updateFolderContentsDisplayOrder(parentFolderId);
+
+ // Repopulate the bookmarks.
+ populateBookmarks();
+ }
+ }
+ );
+ }
+}
+
+void BrowserWindow::populateBookmarksToolBarSubfolders(const double folderId, QMenu *menuPointer)
+{
+ // Get the folder contents.
+ QList<BookmarkStruct> *folderContentsListPointer = BookmarksDatabase::getFolderContents(folderId);
+
+ // Populate the bookmarks folder.
+ for (BookmarkStruct bookmarkStruct : *folderContentsListPointer)
+ {
+ // Get the bookmark URL.
+ QString bookmarkUrl = bookmarkStruct.url;
+
+ // Process the item according to the type.
+ if (bookmarkStruct.isFolder) // This item is a folder.
+ {
+ // Add the subfolder action.
+ QAction *toolBarSubfolderActionPointer = menuPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name);
+
+ // Add the action to the beginning of the list of actions to be deleted on repopulate.
+ bookmarksToolBarSubfolderActionList.prepend(new QPair<QMenu *, QAction *>(menuPointer, toolBarSubfolderActionPointer));
+
+ // Create a subfolder menu.
+ QMenu *subfolderMenuPointer = new QMenu();
+
+ // Add the submenu to the action.
+ toolBarSubfolderActionPointer->setMenu(subfolderMenuPointer);
+
+ // Add the submenu to the toolbar menu list.
+ bookmarksToolBarMenuList.append(new QPair<QMenu *, const double>(subfolderMenuPointer, bookmarkStruct.folderId));
+
+ // Populate the subfolder menu.
+ populateBookmarksToolBarSubfolders(bookmarkStruct.folderId, subfolderMenuPointer);
+ }
+ else // This item is a bookmark.
+ {
+ // Add the bookmark to the folder.
+ QAction *toolBarBookmarkActionPointer = menuPointer->addAction(bookmarkStruct.favoriteIcon, bookmarkStruct.name, [=]
+ {
+ // Remove the focus from the URL line edit.
+ urlLineEditPointer->clearFocus();
+
+ // Load the URL.
+ tabWidgetPointer->loadUrlFromLineEdit(bookmarkUrl);
+ }
+ );
+
+ // Add the bookmark database ID to the toolbar action.
+ toolBarBookmarkActionPointer->setData(bookmarkStruct.databaseId);
+
+ // Add the action to the beginning of the list of actions to be deleted on repopulate.
+ bookmarksToolBarSubfolderActionList.prepend(new QPair<QMenu *, QAction *>(menuPointer, toolBarBookmarkActionPointer));
+ }
+ }
+}
+