From aa013a511ff4cb8e80e960b77ff4a4069a37d1ef Mon Sep 17 00:00:00 2001 From: jpdw Date: Sun, 29 Nov 2020 22:21:14 +0100 Subject: [PATCH] WebPositive: Dropdown menu for choosing search engine - Move the list of search engines used for search shortcuts to SettingsKeys.cpp/h and remove need for dynamic allocation. - Use it in the settings window to help filling the default search engine field. Fixes #15218. Change-Id: I3783f6a346ad0fef2cff97eb930cb98cee39f660 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3439 Reviewed-by: Adrien Destugues --- src/apps/webpositive/BrowserWindow.cpp | 32 +-------- src/apps/webpositive/BrowserWindow.h | 10 --- src/apps/webpositive/SettingsKeys.cpp | 17 ++++- src/apps/webpositive/SettingsKeys.h | 8 +++ src/apps/webpositive/SettingsWindow.cpp | 90 +++++++++++++++++++------ src/apps/webpositive/SettingsWindow.h | 4 +- 6 files changed, 99 insertions(+), 62 deletions(-) diff --git a/src/apps/webpositive/BrowserWindow.cpp b/src/apps/webpositive/BrowserWindow.cpp index 5b9ce47b46..833173871f 100644 --- a/src/apps/webpositive/BrowserWindow.cpp +++ b/src/apps/webpositive/BrowserWindow.cpp @@ -380,7 +380,6 @@ BrowserWindow::BrowserWindow(BRect frame, SettingsMessage* appSettings, kDefaultStartPageURL); fSearchPageURL = fAppSettings->GetValue(kSettingsKeySearchPageURL, kDefaultSearchPageURL); - _InitSearchEngines(); // Create the interface elements BMessage* newTabMessage = new BMessage(NEW_TAB); @@ -699,7 +698,6 @@ BrowserWindow::~BrowserWindow() delete fTabManager; delete fPulseRunner; delete fSavePanel; - delete[] fSearchEngines; } @@ -2480,30 +2478,6 @@ BrowserWindow::_EncodeURIComponent(const BString& search) } -void -BrowserWindow::_InitSearchEngines() -{ - // TODO make these configurable - fSearchEngines = new SearchEngine[kSearchEngineCount]; - fSearchEngines[0].url="https://google.com/search?q=%s"; - fSearchEngines[0].shortcut="g "; - fSearchEngines[1].url="https://bing.com/search?q=%s"; - fSearchEngines[1].shortcut="b "; - fSearchEngines[2].url="https://en.wikipedia.org/w/index.php?search=%s"; - fSearchEngines[2].shortcut="w "; - fSearchEngines[3].url="https://duckduckgo.com/?q=%s"; - fSearchEngines[3].shortcut="d "; - fSearchEngines[4].url="https://www.baidu.com/s?wd=%s"; - fSearchEngines[4].shortcut="a "; - fSearchEngines[5].url="https://yandex.com/search/?text=%s"; - fSearchEngines[5].shortcut="y "; - fSearchEngines[6].url="https://www.ecosia.org/search?q=%s"; - fSearchEngines[6].shortcut="e "; - fSearchEngines[7].url="https://www.qwant.com/?q=%s"; - fSearchEngines[7].shortcut="q "; -} - - void BrowserWindow::_VisitURL(const BString& url) { @@ -2524,9 +2498,9 @@ BrowserWindow::_VisitSearchEngine(const BString& search) BString engine(fSearchPageURL); // Check if the string starts with one of the search engine shortcuts - for (int i = 0; i < kSearchEngineCount; i++) { - if (fSearchEngines[i].shortcut == searchPrefix) { - engine = fSearchEngines[i].url; + for (int i = 0; kSearchEngines[i].url != NULL; i++) { + if (kSearchEngines[i].shortcut == searchPrefix) { + engine = kSearchEngines[i].url; searchQuery.Remove(0, 2); break; } diff --git a/src/apps/webpositive/BrowserWindow.h b/src/apps/webpositive/BrowserWindow.h index ba9869f689..007d33e01a 100644 --- a/src/apps/webpositive/BrowserWindow.h +++ b/src/apps/webpositive/BrowserWindow.h @@ -194,8 +194,6 @@ private: void _SetPageIcon(BWebView* view, const BBitmap* icon); - void _InitSearchEngines(); - void _UpdateHistoryMenu(); void _UpdateClipboardItems(); @@ -283,14 +281,6 @@ private: BMenuItem* fBookmarkBarMenuItem; BookmarkBar* fBookmarkBar; BFilePanel* fSavePanel; - int kSearchEngineCount = 8; - struct SearchEngine { - const char* shortcut; - const char* url; - }; - - // FIXME use a BObjectList - SearchEngine* fSearchEngines; }; diff --git a/src/apps/webpositive/SettingsKeys.cpp b/src/apps/webpositive/SettingsKeys.cpp index 36786e3efe..61a43fc047 100644 --- a/src/apps/webpositive/SettingsKeys.cpp +++ b/src/apps/webpositive/SettingsKeys.cpp @@ -30,7 +30,7 @@ const char* kSettingsKeySearchPageURL = "search page url"; const char* kDefaultDownloadPath = "/boot/home/Desktop/"; const char* kDefaultStartPageURL = "file:///boot/home/config/settings/WebPositive/LoaderPages/Welcome"; -const char* kDefaultSearchPageURL = "http://www.google.com/search?q=%s"; +const char* kDefaultSearchPageURL = "https://www.google.com/search?q=%s"; const char* kSettingsKeyUseProxy = "use http proxy"; const char* kSettingsKeyProxyAddress = "http proxy address"; @@ -39,4 +39,17 @@ const char* kSettingsKeyUseProxyAuth = "use http proxy authentication"; const char* kSettingsKeyProxyUsername = "http proxy username"; const char* kSettingsKeyProxyPassword = "http proxy password"; -const char* kSettingsShowBookmarkBar = "show bookmarks bar"; \ No newline at end of file +const char* kSettingsShowBookmarkBar = "show bookmarks bar"; + +const struct SearchEngine kSearchEngines[] = { + { "Baidu", "https://www.baidu.com/search?wd=%s", "a " }, + { "Bing", "https://bing.com/search?q=%s", "b " }, + { "DuckDuckGo", "https://duckduckgo.com/?q=%s", "d " }, + { "Ecosia", "https://www.ecosia.org/search?q=%s", "e " }, + { "Google", "https://google.com/search?q=%s", "g " }, + { "Qwant", "https://www.qwant.com/?q=%s", "q " }, + { "Wikipedia", "https://en.wikipedia.org/w/index.php?search=%s", "w " }, + { "Yandex", "https://yandex.com/search/?text=%s", "y " }, + { "Yahoo", "https://search.yahoo.com/search?p=%s", "z " }, + { NULL, NULL, NULL } +}; diff --git a/src/apps/webpositive/SettingsKeys.h b/src/apps/webpositive/SettingsKeys.h index 2d1a1f65f6..69dda3e0d5 100644 --- a/src/apps/webpositive/SettingsKeys.h +++ b/src/apps/webpositive/SettingsKeys.h @@ -40,4 +40,12 @@ extern const char* kSettingsKeyProxyPassword; extern const char* kSettingsShowBookmarkBar; +struct SearchEngine { + const char* name; + const char* url; + const char* shortcut; +}; + +extern const struct SearchEngine kSearchEngines[]; + #endif // SETTINGS_KEYS_H diff --git a/src/apps/webpositive/SettingsWindow.cpp b/src/apps/webpositive/SettingsWindow.cpp index f71b92564d..4c36c29841 100644 --- a/src/apps/webpositive/SettingsWindow.cpp +++ b/src/apps/webpositive/SettingsWindow.cpp @@ -48,6 +48,7 @@ enum { MSG_START_PAGE_CHANGED = 'hpch', MSG_SEARCH_PAGE_CHANGED = 'spch', + MSG_SEARCH_PAGE_CHANGED_MENU = 'spcm', MSG_DOWNLOAD_FOLDER_CHANGED = 'dnfc', MSG_NEW_WINDOWS_BEHAVIOR_CHANGED = 'nwbc', MSG_NEW_TABS_BEHAVIOR_CHANGED = 'ntbc', @@ -192,6 +193,23 @@ SettingsWindow::MessageReceived(BMessage* message) break; } + case MSG_SEARCH_PAGE_CHANGED_MENU: + { + BString searchString; + BMenuItem* source; + if (message->FindString("searchstring", &searchString) == B_OK) { + fSearchPageControl->SetText(searchString); + fSearchPageControl->SetEnabled(false); + } else + fSearchPageControl->SetEnabled(true); + + if (message->FindPointer("source", (void**)&source) == B_OK) + source->SetMarked(true); + + _ValidateControlsEnabledStatus(); + break; + } + case MSG_START_PAGE_CHANGED: case MSG_SEARCH_PAGE_CHANGED: case MSG_DOWNLOAD_FOLDER_CHANGED: @@ -256,19 +274,12 @@ SettingsWindow::_CreateGeneralPage(float spacing) fStartPageControl->SetText( fSettings->GetValue(kSettingsKeyStartPageURL, kDefaultStartPageURL)); - fSearchPageControl = new BTextControl("search page", - B_TRANSLATE("Search page:"), "", + fSearchPageControl = new BTextControl("search page", "", "", new BMessage(MSG_SEARCH_PAGE_CHANGED)); fSearchPageControl->SetModificationMessage( new BMessage(MSG_SEARCH_PAGE_CHANGED)); - fSearchPageControl->SetToolTip(B_TRANSLATE("%s - Search term")); BString searchURL = fSettings->GetValue(kSettingsKeySearchPageURL, kDefaultSearchPageURL); - if (searchURL == "http://www.google.com") { - // Migrate old settings files. - searchURL = kDefaultSearchPageURL; - fSettings->SetValue(kSettingsKeySearchPageURL, kDefaultSearchPageURL); - } fSearchPageControl->SetText(searchURL); fDownloadFolderControl = new BTextControl("download folder", @@ -315,6 +326,25 @@ SettingsWindow::_CreateGeneralPage(float spacing) fNewTabBehaviorOpenBlankItem->SetMarked(true); fStartUpBehaviorResumePriorSession->SetMarked(true); + BMenuItem* searchPageCustom = new BMenuItem(B_TRANSLATE("Custom"), + new BMessage(MSG_SEARCH_PAGE_CHANGED_MENU)); + searchPageCustom->SetMarked(true); + + BPopUpMenu* searchPageMenu = new BPopUpMenu("Search page:"); + searchPageMenu->SetRadioMode(true); + + for (int i = 0; kSearchEngines[i].url != NULL; i++) { + BMessage* message = new BMessage(MSG_SEARCH_PAGE_CHANGED_MENU); + message->AddString("searchstring", kSearchEngines[i].url); + searchPageMenu->AddItem(new BMenuItem(kSearchEngines[i].name, message)); + + } + searchPageMenu->AddItem(new BSeparatorItem()); + searchPageMenu->AddItem(searchPageCustom); + fSearchPageMenu = new BMenuField("search page", + B_TRANSLATE("Search page:"), searchPageMenu); + fSearchPageMenu->SetToolTip(B_TRANSLATE("%s - Search term")); + BPopUpMenu* startUpBehaviorMenu = new BPopUpMenu("Start up"); startUpBehaviorMenu->AddItem(fStartUpBehaviorResumePriorSession); startUpBehaviorMenu->AddItem(fStartUpBehaviorStartNewSession); @@ -367,23 +397,26 @@ SettingsWindow::_CreateGeneralPage(float spacing) BView* view = BGroupLayoutBuilder(B_VERTICAL, 0) .Add(BGridLayoutBuilder(spacing / 2, spacing / 2) .Add(fStartPageControl->CreateLabelLayoutItem(), 0, 0) - .Add(fStartPageControl->CreateTextViewLayoutItem(), 1, 0) + .Add(fStartPageControl->CreateTextViewLayoutItem(), 1, 0, 4) - .Add(fSearchPageControl->CreateLabelLayoutItem(), 0, 1) - .Add(fSearchPageControl->CreateTextViewLayoutItem(), 1, 1) + .Add(fSearchPageMenu->CreateLabelLayoutItem(), 0, 1) + .Add(fSearchPageMenu->CreateMenuBarLayoutItem(), 1, 1) + + .Add(fSearchPageControl->CreateLabelLayoutItem(), 2, 1) + .Add(fSearchPageControl->CreateTextViewLayoutItem(), 3, 1, 2) .Add(fStartUpBehaviorMenu->CreateLabelLayoutItem(), 0, 2) - .Add(fStartUpBehaviorMenu->CreateMenuBarLayoutItem(), 1, 2) + .Add(fStartUpBehaviorMenu->CreateMenuBarLayoutItem(), 1, 2, 4) .Add(fNewWindowBehaviorMenu->CreateLabelLayoutItem(), 0, 3) - .Add(fNewWindowBehaviorMenu->CreateMenuBarLayoutItem(), 1, 3) + .Add(fNewWindowBehaviorMenu->CreateMenuBarLayoutItem(), 1, 3, 4) .Add(fNewTabBehaviorMenu->CreateLabelLayoutItem(), 0, 4) - .Add(fNewTabBehaviorMenu->CreateMenuBarLayoutItem(), 1, 4) + .Add(fNewTabBehaviorMenu->CreateMenuBarLayoutItem(), 1, 4, 4) .Add(fDownloadFolderControl->CreateLabelLayoutItem(), 0, 5) - .Add(fDownloadFolderControl->CreateTextViewLayoutItem(), 1, 5) - .Add(fChooseButton, 2, 5) + .Add(fDownloadFolderControl->CreateTextViewLayoutItem(), 1, 5, 3) + .Add(fChooseButton, 4, 5) ) .Add(BSpaceLayoutItem::CreateVerticalStrut(spacing)) .Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER)) @@ -717,8 +750,27 @@ SettingsWindow::_RevertSettings() fStartPageControl->SetText( fSettings->GetValue(kSettingsKeyStartPageURL, kDefaultStartPageURL)); - fSearchPageControl->SetText( - fSettings->GetValue(kSettingsKeySearchPageURL, kDefaultSearchPageURL)); + BString searchPage = fSettings->GetValue(kSettingsKeySearchPageURL, + kDefaultSearchPageURL); + fSearchPageControl->SetText(searchPage); + + bool found = false; + BMenu* searchMenu = fSearchPageMenu->Menu(); + int32 itemCount = searchMenu->CountItems() - 2; + // Ignore the two last items: separator and "custom" + for (int i = 0; i < itemCount; i++) { + BMenuItem* item = searchMenu->ItemAt(i); + BMessage* message = item->Message(); + if (message->FindString("searchstring") == searchPage) { + item->SetMarked(true); + fSearchPageControl->SetEnabled(false); + found = true; + break; + } + } + + if (!found) + searchMenu->ItemAt(searchMenu->CountItems() - 1)->SetMarked(true); fDownloadFolderControl->SetText( fSettings->GetValue(kSettingsKeyDownloadPath, kDefaultDownloadPath)); @@ -935,5 +987,3 @@ SettingsWindow::_ProxyPort() const { return atoul(fProxyPortControl->Text()); } - - diff --git a/src/apps/webpositive/SettingsWindow.h b/src/apps/webpositive/SettingsWindow.h index f6de2c88f8..94e655b841 100644 --- a/src/apps/webpositive/SettingsWindow.h +++ b/src/apps/webpositive/SettingsWindow.h @@ -14,6 +14,7 @@ class BCheckBox; class BMenu; class BMenuField; class BMenuItem; +class BSeparatorItem; class BSpinner; class BTextControl; class FontSelectionView; @@ -64,6 +65,8 @@ private: BTextControl* fSearchPageControl; BTextControl* fDownloadFolderControl; + BMenuField* fSearchPageMenu; + BMenuField* fNewWindowBehaviorMenu; BMenuItem* fNewWindowBehaviorOpenHomeItem; BMenuItem* fNewWindowBehaviorOpenSearchItem; @@ -110,4 +113,3 @@ private: #endif // SETTINGS_WINDOW_H -