haiku/src/apps/webpositive/SettingsWindow.cpp

990 lines
32 KiB
C++

/*
* Copyright 2010 Stephan Aßmus <superstippi@gmx.de>
* Copyright 2019, Haiku, Inc.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include "SettingsWindow.h"
#include <Button.h>
#include <CheckBox.h>
#include <ControlLook.h>
#include <FilePanel.h>
#include <GridLayoutBuilder.h>
#include <GroupLayout.h>
#include <GroupLayoutBuilder.h>
#include <LayoutBuilder.h>
#include <Locale.h>
#include <MenuItem.h>
#include <MenuField.h>
#include <Message.h>
#include <PopUpMenu.h>
#include <ScrollView.h>
#include <SeparatorView.h>
#include <SpaceLayoutItem.h>
#include <Spinner.h>
#include <TabView.h>
#include <TextControl.h>
#include <debugger.h>
#include <SettingsMessage.h>
#include <stdio.h>
#include <stdlib.h>
#include "BrowserApp.h"
#include "BrowsingHistory.h"
#include "BrowserWindow.h"
#include "FontSelectionView.h"
#include "SettingsKeys.h"
#include "WebSettings.h"
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Settings Window"
enum {
MSG_APPLY = 'aply',
MSG_CANCEL = 'cncl',
MSG_REVERT = 'rvrt',
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',
MSG_START_UP_BEHAVIOR_CHANGED = 'subc',
MSG_HISTORY_MENU_DAYS_CHANGED = 'digm',
MSG_TAB_DISPLAY_BEHAVIOR_CHANGED = 'tdbc',
MSG_AUTO_HIDE_INTERFACE_BEHAVIOR_CHANGED = 'ahic',
MSG_AUTO_HIDE_POINTER_BEHAVIOR_CHANGED = 'ahpc',
MSG_SHOW_HOME_BUTTON_CHANGED = 'shbc',
MSG_STANDARD_FONT_CHANGED = 'stfc',
MSG_SERIF_FONT_CHANGED = 'sefc',
MSG_SANS_SERIF_FONT_CHANGED = 'ssfc',
MSG_FIXED_FONT_CHANGED = 'ffch',
MSG_STANDARD_FONT_SIZE_SELECTED = 'sfss',
MSG_FIXED_FONT_SIZE_SELECTED = 'ffss',
MSG_USE_PROXY_CHANGED = 'upsc',
MSG_PROXY_ADDRESS_CHANGED = 'psac',
MSG_PROXY_PORT_CHANGED = 'pspc',
MSG_USE_PROXY_AUTH_CHANGED = 'upsa',
MSG_PROXY_USERNAME_CHANGED = 'psuc',
MSG_PROXY_PASSWORD_CHANGED = 'pswc',
MSG_CHOOSE_DOWNLOAD_FOLDER = 'swop',
MSG_HANDLE_DOWNLOAD_FOLDER = 'oprs',
};
static const int32 kDefaultFontSize = 14;
SettingsWindow::SettingsWindow(BRect frame, SettingsMessage* settings)
:
BWindow(frame, B_TRANSLATE("Settings"), B_TITLED_WINDOW_LOOK,
B_NORMAL_WINDOW_FEEL, B_AUTO_UPDATE_SIZE_LIMITS
| B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE),
fSettings(settings)
{
fApplyButton = new BButton(B_TRANSLATE("Apply"), new BMessage(MSG_APPLY));
fCancelButton = new BButton(B_TRANSLATE("Cancel"),
new BMessage(MSG_CANCEL));
fRevertButton = new BButton(B_TRANSLATE("Revert"),
new BMessage(MSG_REVERT));
fOpenFilePanel = NULL;
float spacing = be_control_look->DefaultItemSpacing();
BTabView* tabView = new BTabView("settings pages", B_WIDTH_FROM_LABEL);
tabView->SetBorder(B_NO_BORDER);
BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
.SetInsets(0, B_USE_DEFAULT_SPACING, 0, B_USE_WINDOW_SPACING)
.Add(tabView)
.Add(new BSeparatorView(B_HORIZONTAL))
.AddGroup(B_HORIZONTAL)
.SetInsets(B_USE_WINDOW_SPACING, B_USE_DEFAULT_SPACING,
B_USE_WINDOW_SPACING, 0)
.Add(fRevertButton)
.AddGlue()
.Add(fCancelButton)
.Add(fApplyButton);
tabView->AddTab(_CreateGeneralPage(spacing));
tabView->AddTab(_CreateFontsPage(spacing));
tabView->AddTab(_CreateProxyPage(spacing));
_SetupFontSelectionView(fStandardFontView,
new BMessage(MSG_STANDARD_FONT_CHANGED));
_SetupFontSelectionView(fSerifFontView,
new BMessage(MSG_SERIF_FONT_CHANGED));
_SetupFontSelectionView(fSansSerifFontView,
new BMessage(MSG_SANS_SERIF_FONT_CHANGED));
_SetupFontSelectionView(fFixedFontView,
new BMessage(MSG_FIXED_FONT_CHANGED));
fApplyButton->MakeDefault(true);
if (!frame.IsValid())
CenterOnScreen();
// load settings from disk
_RevertSettings();
// apply to WebKit
_ApplySettings();
// Start hidden
Hide();
Show();
}
SettingsWindow::~SettingsWindow()
{
RemoveHandler(fStandardFontView);
delete fStandardFontView;
RemoveHandler(fSerifFontView);
delete fSerifFontView;
RemoveHandler(fSansSerifFontView);
delete fSansSerifFontView;
RemoveHandler(fFixedFontView);
delete fFixedFontView;
delete fOpenFilePanel;
}
void
SettingsWindow::MessageReceived(BMessage* message)
{
switch (message->what) {
case MSG_APPLY:
_ApplySettings();
break;
case MSG_CANCEL:
_RevertSettings();
PostMessage(B_QUIT_REQUESTED);
break;
case MSG_REVERT:
_RevertSettings();
break;
case MSG_CHOOSE_DOWNLOAD_FOLDER:
_ChooseDownloadFolder(message);
break;
case MSG_HANDLE_DOWNLOAD_FOLDER:
_HandleDownloadPanelResult(fOpenFilePanel, message);
break;
case MSG_STANDARD_FONT_SIZE_SELECTED:
{
int32 size = fStandardSizesSpinner->Value();
fStandardFontView->SetSize(size);
fSerifFontView->SetSize(size);
fSansSerifFontView->SetSize(size);
_ValidateControlsEnabledStatus();
break;
}
case MSG_FIXED_FONT_SIZE_SELECTED:
{
int32 size = fFixedSizesSpinner->Value();
fFixedFontView->SetSize(size);
_ValidateControlsEnabledStatus();
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:
case MSG_START_UP_BEHAVIOR_CHANGED:
case MSG_NEW_WINDOWS_BEHAVIOR_CHANGED:
case MSG_NEW_TABS_BEHAVIOR_CHANGED:
case MSG_HISTORY_MENU_DAYS_CHANGED:
case MSG_TAB_DISPLAY_BEHAVIOR_CHANGED:
case MSG_AUTO_HIDE_INTERFACE_BEHAVIOR_CHANGED:
case MSG_AUTO_HIDE_POINTER_BEHAVIOR_CHANGED:
case MSG_SHOW_HOME_BUTTON_CHANGED:
case MSG_STANDARD_FONT_CHANGED:
case MSG_SERIF_FONT_CHANGED:
case MSG_SANS_SERIF_FONT_CHANGED:
case MSG_FIXED_FONT_CHANGED:
case MSG_USE_PROXY_CHANGED:
case MSG_PROXY_ADDRESS_CHANGED:
case MSG_PROXY_PORT_CHANGED:
case MSG_USE_PROXY_AUTH_CHANGED:
case MSG_PROXY_USERNAME_CHANGED:
case MSG_PROXY_PASSWORD_CHANGED:
// TODO: Some settings could change live, some others not?
_ValidateControlsEnabledStatus();
break;
default:
BWindow::MessageReceived(message);
break;
}
}
bool
SettingsWindow::QuitRequested()
{
if (!IsHidden())
Hide();
return false;
}
void
SettingsWindow::Show()
{
// When showing the window, this is always the
// point to which we can revert the settings.
_RevertSettings();
BWindow::Show();
}
// #pragma mark - private
BView*
SettingsWindow::_CreateGeneralPage(float spacing)
{
fStartPageControl = new BTextControl("start page",
B_TRANSLATE("Start page:"), "", new BMessage(MSG_START_PAGE_CHANGED));
fStartPageControl->SetModificationMessage(
new BMessage(MSG_START_PAGE_CHANGED));
fStartPageControl->SetText(
fSettings->GetValue(kSettingsKeyStartPageURL, kDefaultStartPageURL));
fSearchPageControl = new BTextControl("search page", "", "",
new BMessage(MSG_SEARCH_PAGE_CHANGED));
fSearchPageControl->SetModificationMessage(
new BMessage(MSG_SEARCH_PAGE_CHANGED));
BString searchURL = fSettings->GetValue(kSettingsKeySearchPageURL,
kDefaultSearchPageURL);
fSearchPageControl->SetText(searchURL);
fDownloadFolderControl = new BTextControl("download folder",
B_TRANSLATE("Download folder:"), "",
new BMessage(MSG_DOWNLOAD_FOLDER_CHANGED));
fDownloadFolderControl->SetModificationMessage(
new BMessage(MSG_DOWNLOAD_FOLDER_CHANGED));
fDownloadFolderControl->SetText(
fSettings->GetValue(kSettingsKeyDownloadPath, kDefaultDownloadPath));
fStartUpBehaviorResumePriorSession = new BMenuItem(
B_TRANSLATE("Resume prior session"),
new BMessage(MSG_START_UP_BEHAVIOR_CHANGED));
fStartUpBehaviorStartNewSession = new BMenuItem(
B_TRANSLATE("Start new session"),
new BMessage(MSG_START_UP_BEHAVIOR_CHANGED));
fNewWindowBehaviorOpenHomeItem = new BMenuItem(
B_TRANSLATE("Open start page"),
new BMessage(MSG_NEW_WINDOWS_BEHAVIOR_CHANGED));
fNewWindowBehaviorOpenSearchItem = new BMenuItem(
B_TRANSLATE("Open search page"),
new BMessage(MSG_NEW_WINDOWS_BEHAVIOR_CHANGED));
fNewWindowBehaviorOpenBlankItem = new BMenuItem(
B_TRANSLATE("Open blank page"),
new BMessage(MSG_NEW_WINDOWS_BEHAVIOR_CHANGED));
fNewTabBehaviorCloneCurrentItem = new BMenuItem(
B_TRANSLATE("Clone current page"),
new BMessage(MSG_NEW_TABS_BEHAVIOR_CHANGED));
fNewTabBehaviorOpenHomeItem = new BMenuItem(
B_TRANSLATE("Open start page"),
new BMessage(MSG_NEW_TABS_BEHAVIOR_CHANGED));
fNewTabBehaviorOpenSearchItem = new BMenuItem(
B_TRANSLATE("Open search page"),
new BMessage(MSG_NEW_TABS_BEHAVIOR_CHANGED));
fNewTabBehaviorOpenBlankItem = new BMenuItem(
B_TRANSLATE("Open blank page"),
new BMessage(MSG_NEW_TABS_BEHAVIOR_CHANGED));
fChooseButton = new BButton(B_TRANSLATE("Browse" B_UTF8_ELLIPSIS),
new BMessage(MSG_CHOOSE_DOWNLOAD_FOLDER));
fNewWindowBehaviorOpenHomeItem->SetMarked(true);
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);
fStartUpBehaviorMenu = new BMenuField("start up behavior",
B_TRANSLATE("Start up:"), startUpBehaviorMenu);
BPopUpMenu* newWindowBehaviorMenu = new BPopUpMenu("New windows");
newWindowBehaviorMenu->AddItem(fNewWindowBehaviorOpenHomeItem);
newWindowBehaviorMenu->AddItem(fNewWindowBehaviorOpenSearchItem);
newWindowBehaviorMenu->AddItem(fNewWindowBehaviorOpenBlankItem);
fNewWindowBehaviorMenu = new BMenuField("new window behavior",
B_TRANSLATE("New windows:"), newWindowBehaviorMenu);
BPopUpMenu* newTabBehaviorMenu = new BPopUpMenu("New tabs");
newTabBehaviorMenu->AddItem(fNewTabBehaviorOpenBlankItem);
newTabBehaviorMenu->AddItem(fNewTabBehaviorOpenHomeItem);
newTabBehaviorMenu->AddItem(fNewTabBehaviorOpenSearchItem);
newTabBehaviorMenu->AddItem(fNewTabBehaviorCloneCurrentItem);
fNewTabBehaviorMenu = new BMenuField("new tab behavior",
B_TRANSLATE("New tabs:"), newTabBehaviorMenu);
fDaysInHistory = new BSpinner("days in history",
B_TRANSLATE("Number of days to keep links in History menu:"),
new BMessage(MSG_HISTORY_MENU_DAYS_CHANGED));
fDaysInHistory->SetRange(1, 35);
fDaysInHistory->SetValue(
BrowsingHistory::DefaultInstance()->MaxHistoryItemAge());
fShowTabsIfOnlyOnePage = new BCheckBox("show tabs if only one page",
B_TRANSLATE("Show tabs if only one page is open"),
new BMessage(MSG_TAB_DISPLAY_BEHAVIOR_CHANGED));
fShowTabsIfOnlyOnePage->SetValue(B_CONTROL_ON);
fAutoHideInterfaceInFullscreenMode = new BCheckBox("auto-hide interface",
B_TRANSLATE("Auto-hide interface in full screen mode"),
new BMessage(MSG_AUTO_HIDE_INTERFACE_BEHAVIOR_CHANGED));
fAutoHideInterfaceInFullscreenMode->SetValue(B_CONTROL_OFF);
fAutoHidePointer = new BCheckBox("auto-hide pointer",
B_TRANSLATE("Auto-hide mouse pointer"),
new BMessage(MSG_AUTO_HIDE_POINTER_BEHAVIOR_CHANGED));
fAutoHidePointer->SetValue(B_CONTROL_OFF);
fShowHomeButton = new BCheckBox("show home button",
B_TRANSLATE("Show home button"),
new BMessage(MSG_SHOW_HOME_BUTTON_CHANGED));
fShowHomeButton->SetValue(B_CONTROL_ON);
BView* view = BGroupLayoutBuilder(B_VERTICAL, 0)
.Add(BGridLayoutBuilder(spacing / 2, spacing / 2)
.Add(fStartPageControl->CreateLabelLayoutItem(), 0, 0)
.Add(fStartPageControl->CreateTextViewLayoutItem(), 1, 0, 4)
.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, 4)
.Add(fNewWindowBehaviorMenu->CreateLabelLayoutItem(), 0, 3)
.Add(fNewWindowBehaviorMenu->CreateMenuBarLayoutItem(), 1, 3, 4)
.Add(fNewTabBehaviorMenu->CreateLabelLayoutItem(), 0, 4)
.Add(fNewTabBehaviorMenu->CreateMenuBarLayoutItem(), 1, 4, 4)
.Add(fDownloadFolderControl->CreateLabelLayoutItem(), 0, 5)
.Add(fDownloadFolderControl->CreateTextViewLayoutItem(), 1, 5, 3)
.Add(fChooseButton, 4, 5)
)
.Add(BSpaceLayoutItem::CreateVerticalStrut(spacing))
.Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER))
.Add(BSpaceLayoutItem::CreateVerticalStrut(spacing))
.Add(fShowTabsIfOnlyOnePage)
.Add(fAutoHideInterfaceInFullscreenMode)
.Add(fAutoHidePointer)
.Add(fShowHomeButton)
.Add(BSpaceLayoutItem::CreateVerticalStrut(spacing))
.AddGroup(B_HORIZONTAL)
.Add(fDaysInHistory)
.AddGlue()
.End()
.AddGlue()
.SetInsets(B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING,
B_USE_WINDOW_SPACING, B_USE_DEFAULT_SPACING)
.TopView()
;
view->SetName(B_TRANSLATE("General"));
return view;
}
BView*
SettingsWindow::_CreateFontsPage(float spacing)
{
fStandardFontView = new FontSelectionView("standard",
B_TRANSLATE("Standard font:"), true, be_plain_font);
BFont defaultSerifFont = _FindDefaultSerifFont();
fSerifFontView = new FontSelectionView("serif",
B_TRANSLATE("Serif font:"), true, &defaultSerifFont);
fSansSerifFontView = new FontSelectionView("sans serif",
B_TRANSLATE("Sans serif font:"), true, be_plain_font);
fFixedFontView = new FontSelectionView("fixed",
B_TRANSLATE("Fixed font:"), true, be_fixed_font);
fStandardSizesSpinner = new BSpinner("standard font size",
B_TRANSLATE("Default standard font size:"),
new BMessage(MSG_STANDARD_FONT_SIZE_SELECTED));
fStandardSizesSpinner->SetAlignment(B_ALIGN_RIGHT);
fFixedSizesSpinner = new BSpinner("fixed font size",
B_TRANSLATE("Default fixed font size:"),
new BMessage(MSG_FIXED_FONT_SIZE_SELECTED));
fFixedSizesSpinner->SetAlignment(B_ALIGN_RIGHT);
BView* view = BGridLayoutBuilder(spacing / 2, spacing / 2)
.Add(fStandardFontView->CreateFontsLabelLayoutItem(), 0, 0)
.Add(fStandardFontView->CreateFontsMenuBarLayoutItem(), 1, 0)
.Add(fStandardSizesSpinner->CreateLabelLayoutItem(), 2, 0)
.Add(fStandardSizesSpinner->CreateTextViewLayoutItem(), 3, 0)
.Add(fStandardFontView->PreviewBox(), 1, 1, 3)
.Add(fSerifFontView->CreateFontsLabelLayoutItem(), 0, 2)
.Add(fSerifFontView->CreateFontsMenuBarLayoutItem(), 1, 2)
.Add(fSerifFontView->PreviewBox(), 1, 3, 3)
.Add(fSansSerifFontView->CreateFontsLabelLayoutItem(), 0, 4)
.Add(fSansSerifFontView->CreateFontsMenuBarLayoutItem(), 1, 4)
.Add(fSansSerifFontView->PreviewBox(), 1, 5, 3)
.Add(BSpaceLayoutItem::CreateVerticalStrut(spacing / 2), 0, 6, 2)
.Add(fFixedFontView->CreateFontsLabelLayoutItem(), 0, 7)
.Add(fFixedFontView->CreateFontsMenuBarLayoutItem(), 1, 7)
.Add(fFixedSizesSpinner->CreateLabelLayoutItem(), 2, 7)
.Add(fFixedSizesSpinner->CreateTextViewLayoutItem(), 3, 7)
.Add(fFixedFontView->PreviewBox(), 1, 8, 3)
.SetInsets(B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING,
B_USE_WINDOW_SPACING, B_USE_DEFAULT_SPACING)
.View();
view->SetName(B_TRANSLATE("Fonts"));
return view;
}
BView*
SettingsWindow::_CreateProxyPage(float spacing)
{
fUseProxyCheckBox = new BCheckBox("use proxy",
B_TRANSLATE("Use proxy server to connect to the internet"),
new BMessage(MSG_USE_PROXY_CHANGED));
fUseProxyCheckBox->SetValue(B_CONTROL_ON);
fProxyAddressControl = new BTextControl("proxy address",
B_TRANSLATE("Proxy server address:"), "",
new BMessage(MSG_PROXY_ADDRESS_CHANGED));
fProxyAddressControl->SetModificationMessage(
new BMessage(MSG_PROXY_ADDRESS_CHANGED));
fProxyAddressControl->SetText(
fSettings->GetValue(kSettingsKeyProxyAddress, ""));
fProxyPortControl = new BTextControl("proxy port",
B_TRANSLATE("Proxy server port:"), "",
new BMessage(MSG_PROXY_PORT_CHANGED));
fProxyPortControl->SetModificationMessage(
new BMessage(MSG_PROXY_PORT_CHANGED));
fProxyPortControl->SetText(
fSettings->GetValue(kSettingsKeyProxyPort, ""));
fUseProxyAuthCheckBox = new BCheckBox("use authentication",
B_TRANSLATE("Proxy server requires authentication"),
new BMessage(MSG_USE_PROXY_AUTH_CHANGED));
fUseProxyAuthCheckBox->SetValue(B_CONTROL_ON);
fProxyUsernameControl = new BTextControl("proxy username",
B_TRANSLATE("Proxy username:"), "",
new BMessage(MSG_PROXY_USERNAME_CHANGED));
fProxyUsernameControl->SetModificationMessage(
new BMessage(MSG_PROXY_USERNAME_CHANGED));
fProxyUsernameControl->SetText(
fSettings->GetValue(kSettingsKeyProxyUsername, ""));
fProxyPasswordControl = new BTextControl("proxy password",
B_TRANSLATE("Proxy password:"), "",
new BMessage(MSG_PROXY_PASSWORD_CHANGED));
fProxyPasswordControl->SetModificationMessage(
new BMessage(MSG_PROXY_PASSWORD_CHANGED));
fProxyPasswordControl->TextView()->HideTyping(true);
fProxyPasswordControl->SetText(
fSettings->GetValue(kSettingsKeyProxyPassword, ""));
BView* view = BGridLayoutBuilder(spacing / 2, spacing / 2)
.Add(fUseProxyCheckBox, 0, 0, 2)
.Add(fProxyAddressControl->CreateLabelLayoutItem(), 0, 1)
.Add(fProxyAddressControl->CreateTextViewLayoutItem(), 1, 1, 2)
.Add(fProxyPortControl->CreateLabelLayoutItem(), 0, 2)
.Add(fProxyPortControl->CreateTextViewLayoutItem(), 1, 2, 2)
.Add(BSpaceLayoutItem::CreateVerticalStrut(spacing), 0, 3)
.Add(fUseProxyAuthCheckBox, 0, 4, 2)
.Add(fProxyUsernameControl->CreateLabelLayoutItem(), 0, 5)
.Add(fProxyUsernameControl->CreateTextViewLayoutItem(), 1, 5, 2)
.Add(fProxyPasswordControl->CreateLabelLayoutItem(), 0, 6)
.Add(fProxyPasswordControl->CreateTextViewLayoutItem(), 1, 6, 2)
.Add(BSpaceLayoutItem::CreateGlue(), 0, 7)
.SetInsets(B_USE_WINDOW_SPACING, B_USE_WINDOW_SPACING,
B_USE_WINDOW_SPACING, B_USE_DEFAULT_SPACING)
.View();
view->SetName(B_TRANSLATE("Proxy server"));
return view;
}
void
SettingsWindow::_SetupFontSelectionView(FontSelectionView* view,
BMessage* message)
{
AddHandler(view);
view->AttachedToLooper();
view->SetMessage(message);
view->SetTarget(this);
}
// #pragma mark -
bool
SettingsWindow::_CanApplySettings() const
{
bool canApply = false;
// General settings
canApply = canApply || (strcmp(fStartPageControl->Text(),
fSettings->GetValue(kSettingsKeyStartPageURL,
kDefaultStartPageURL)) != 0);
canApply = canApply || (strcmp(fSearchPageControl->Text(),
fSettings->GetValue(kSettingsKeySearchPageURL,
kDefaultSearchPageURL)) != 0);
canApply = canApply || (strcmp(fDownloadFolderControl->Text(),
fSettings->GetValue(kSettingsKeyDownloadPath,
kDefaultDownloadPath)) != 0);
canApply = canApply || ((fShowTabsIfOnlyOnePage->Value() == B_CONTROL_ON)
!= fSettings->GetValue(kSettingsKeyShowTabsIfSinglePageOpen, true));
canApply = canApply || (
(fAutoHideInterfaceInFullscreenMode->Value() == B_CONTROL_ON)
!= fSettings->GetValue(kSettingsKeyAutoHideInterfaceInFullscreenMode,
false));
canApply = canApply || (
(fAutoHidePointer->Value() == B_CONTROL_ON)
!= fSettings->GetValue(kSettingsKeyAutoHidePointer, false));
canApply = canApply || ((fShowHomeButton->Value() == B_CONTROL_ON)
!= fSettings->GetValue(kSettingsKeyShowHomeButton, true));
canApply = canApply || (fDaysInHistory->Value()
!= BrowsingHistory::DefaultInstance()->MaxHistoryItemAge());
// Start up policy
canApply = canApply || (_StartUpPolicy()
!= fSettings->GetValue(kSettingsKeyStartUpPolicy,
(uint32)ResumePriorSession));
// New window policy
canApply = canApply || (_NewWindowPolicy()
!= fSettings->GetValue(kSettingsKeyNewWindowPolicy,
(uint32)OpenStartPage));
// New tab policy
canApply = canApply || (_NewTabPolicy()
!= fSettings->GetValue(kSettingsKeyNewTabPolicy,
(uint32)OpenBlankPage));
// Font settings
canApply = canApply || (fStandardFontView->Font()
!= fSettings->GetValue("standard font", *be_plain_font));
canApply = canApply || (fSerifFontView->Font()
!= fSettings->GetValue("serif font", _FindDefaultSerifFont()));
canApply = canApply || (fSansSerifFontView->Font()
!= fSettings->GetValue("sans serif font", *be_plain_font));
canApply = canApply || (fFixedFontView->Font()
!= fSettings->GetValue("fixed font", *be_fixed_font));
canApply = canApply || (fStandardSizesSpinner->Value()
!= fSettings->GetValue("standard font size", kDefaultFontSize));
canApply = canApply || (fFixedSizesSpinner->Value()
!= fSettings->GetValue("fixed font size", kDefaultFontSize));
// Proxy settings
canApply = canApply || ((fUseProxyCheckBox->Value() == B_CONTROL_ON)
!= fSettings->GetValue(kSettingsKeyUseProxy, false));
canApply = canApply || (strcmp(fProxyAddressControl->Text(),
fSettings->GetValue(kSettingsKeyProxyAddress, "")) != 0);
canApply = canApply || (_ProxyPort()
!= fSettings->GetValue(kSettingsKeyProxyPort, (uint32)0));
canApply = canApply || ((fUseProxyAuthCheckBox->Value() == B_CONTROL_ON)
!= fSettings->GetValue(kSettingsKeyUseProxyAuth, false));
canApply = canApply || (strcmp(fProxyUsernameControl->Text(),
fSettings->GetValue(kSettingsKeyProxyUsername, "")) != 0);
canApply = canApply || (strcmp(fProxyPasswordControl->Text(),
fSettings->GetValue(kSettingsKeyProxyPassword, "")) != 0);
return canApply;
}
void
SettingsWindow::_ApplySettings()
{
// Store general settings
BrowsingHistory::DefaultInstance()->SetMaxHistoryItemAge(
(uint32)fDaysInHistory->Value());
fSettings->SetValue(kSettingsKeyStartPageURL, fStartPageControl->Text());
fSettings->SetValue(kSettingsKeySearchPageURL, fSearchPageControl->Text());
fSettings->SetValue(kSettingsKeyDownloadPath, fDownloadFolderControl->Text());
fSettings->SetValue(kSettingsKeyShowTabsIfSinglePageOpen,
fShowTabsIfOnlyOnePage->Value() == B_CONTROL_ON);
fSettings->SetValue(kSettingsKeyAutoHideInterfaceInFullscreenMode,
fAutoHideInterfaceInFullscreenMode->Value() == B_CONTROL_ON);
fSettings->SetValue(kSettingsKeyAutoHidePointer,
fAutoHidePointer->Value() == B_CONTROL_ON);
fSettings->SetValue(kSettingsKeyShowHomeButton,
fShowHomeButton->Value() == B_CONTROL_ON);
// New page policies
fSettings->SetValue(kSettingsKeyStartUpPolicy, _StartUpPolicy());
fSettings->SetValue(kSettingsKeyNewWindowPolicy, _NewWindowPolicy());
fSettings->SetValue(kSettingsKeyNewTabPolicy, _NewTabPolicy());
// Store font settings
fSettings->SetValue("standard font", fStandardFontView->Font());
fSettings->SetValue("serif font", fSerifFontView->Font());
fSettings->SetValue("sans serif font", fSansSerifFontView->Font());
fSettings->SetValue("fixed font", fFixedFontView->Font());
int32 standardFontSize = fStandardSizesSpinner->Value();
int32 fixedFontSize = fFixedSizesSpinner->Value();
fSettings->SetValue("standard font size", standardFontSize);
fSettings->SetValue("fixed font size", fixedFontSize);
// Store proxy settings
fSettings->SetValue(kSettingsKeyUseProxy,
fUseProxyCheckBox->Value() == B_CONTROL_ON);
fSettings->SetValue(kSettingsKeyProxyAddress,
fProxyAddressControl->Text());
uint32 proxyPort = _ProxyPort();
fSettings->SetValue(kSettingsKeyProxyPort, proxyPort);
fSettings->SetValue(kSettingsKeyUseProxyAuth,
fUseProxyAuthCheckBox->Value() == B_CONTROL_ON);
fSettings->SetValue(kSettingsKeyProxyUsername,
fProxyUsernameControl->Text());
fSettings->SetValue(kSettingsKeyProxyPassword,
fProxyPasswordControl->Text());
fSettings->Save();
// Apply settings to default web page settings.
BWebSettings::Default()->SetStandardFont(fStandardFontView->Font());
BWebSettings::Default()->SetSerifFont(fSerifFontView->Font());
BWebSettings::Default()->SetSansSerifFont(fSansSerifFontView->Font());
BWebSettings::Default()->SetFixedFont(fFixedFontView->Font());
BWebSettings::Default()->SetDefaultStandardFontSize(standardFontSize);
BWebSettings::Default()->SetDefaultFixedFontSize(fixedFontSize);
if (fUseProxyCheckBox->Value() == B_CONTROL_ON) {
if (fUseProxyAuthCheckBox->Value() == B_CONTROL_ON) {
BWebSettings::Default()->SetProxyInfo(fProxyAddressControl->Text(),
proxyPort, B_PROXY_TYPE_HTTP, fProxyUsernameControl->Text(),
fProxyPasswordControl->Text());
} else {
BWebSettings::Default()->SetProxyInfo(fProxyAddressControl->Text(),
proxyPort, B_PROXY_TYPE_HTTP, "", "");
}
} else
BWebSettings::Default()->SetProxyInfo();
// This will find all currently instantiated page settings and apply
// the default values, unless the page settings have local overrides.
BWebSettings::Default()->Apply();
_ValidateControlsEnabledStatus();
}
void
SettingsWindow::_RevertSettings()
{
fStartPageControl->SetText(
fSettings->GetValue(kSettingsKeyStartPageURL, kDefaultStartPageURL));
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));
fShowTabsIfOnlyOnePage->SetValue(
fSettings->GetValue(kSettingsKeyShowTabsIfSinglePageOpen, true));
fAutoHideInterfaceInFullscreenMode->SetValue(
fSettings->GetValue(kSettingsKeyAutoHideInterfaceInFullscreenMode,
false));
fAutoHidePointer->SetValue(
fSettings->GetValue(kSettingsKeyAutoHidePointer, false));
fShowHomeButton->SetValue(
fSettings->GetValue(kSettingsKeyShowHomeButton, true));
fDaysInHistory->SetValue(
BrowsingHistory::DefaultInstance()->MaxHistoryItemAge());
// Start Up policy
uint32 startUpPolicy = fSettings->GetValue(kSettingsKeyStartUpPolicy,
(uint32)ResumePriorSession);
switch (startUpPolicy) {
default:
case ResumePriorSession:
fStartUpBehaviorResumePriorSession->SetMarked(true);
break;
case StartNewSession:
fStartUpBehaviorStartNewSession->SetMarked(true);
break;
}
// New window policy
uint32 newWindowPolicy = fSettings->GetValue(kSettingsKeyNewWindowPolicy,
(uint32)OpenStartPage);
switch (newWindowPolicy) {
default:
case OpenStartPage:
fNewWindowBehaviorOpenHomeItem->SetMarked(true);
break;
case OpenSearchPage:
fNewWindowBehaviorOpenSearchItem->SetMarked(true);
break;
case OpenBlankPage:
fNewWindowBehaviorOpenBlankItem->SetMarked(true);
break;
}
// New tab policy
uint32 newTabPolicy = fSettings->GetValue(kSettingsKeyNewTabPolicy,
(uint32)OpenBlankPage);
switch (newTabPolicy) {
default:
case OpenBlankPage:
fNewTabBehaviorOpenBlankItem->SetMarked(true);
break;
case OpenStartPage:
fNewTabBehaviorOpenHomeItem->SetMarked(true);
break;
case OpenSearchPage:
fNewTabBehaviorOpenSearchItem->SetMarked(true);
break;
case CloneCurrentPage:
fNewTabBehaviorCloneCurrentItem->SetMarked(true);
break;
}
// Font settings
int32 defaultFontSize = fSettings->GetValue("standard font size",
kDefaultFontSize);
int32 defaultFixedFontSize = fSettings->GetValue("fixed font size",
kDefaultFontSize);
fStandardSizesSpinner->SetValue(defaultFontSize);
fFixedSizesSpinner->SetValue(defaultFixedFontSize);
fStandardFontView->SetFont(fSettings->GetValue("standard font",
*be_plain_font), defaultFontSize);
fSerifFontView->SetFont(fSettings->GetValue("serif font",
_FindDefaultSerifFont()), defaultFontSize);
fSansSerifFontView->SetFont(fSettings->GetValue("sans serif font",
*be_plain_font), defaultFontSize);
fFixedFontView->SetFont(fSettings->GetValue("fixed font",
*be_fixed_font), defaultFixedFontSize);
// Proxy settings
fUseProxyCheckBox->SetValue(fSettings->GetValue(kSettingsKeyUseProxy,
false));
fProxyAddressControl->SetText(fSettings->GetValue(kSettingsKeyProxyAddress,
""));
BString keyProxyPort;
keyProxyPort << fSettings->GetValue(kSettingsKeyProxyPort, (uint32)0);
fProxyPortControl->SetText(keyProxyPort.String());
fUseProxyAuthCheckBox->SetValue(fSettings->GetValue(kSettingsKeyUseProxyAuth,
false));
fProxyUsernameControl->SetText(fSettings->GetValue(kSettingsKeyProxyUsername,
""));
fProxyPasswordControl->SetText(fSettings->GetValue(kSettingsKeyProxyPassword,
""));
_ValidateControlsEnabledStatus();
}
void
SettingsWindow::_ChooseDownloadFolder(const BMessage* message)
{
if (fOpenFilePanel == NULL) {
BMessenger target(this);
fOpenFilePanel = new (std::nothrow) BFilePanel(B_OPEN_PANEL,
&target, NULL, B_DIRECTORY_NODE);
}
BMessage panelMessage(MSG_HANDLE_DOWNLOAD_FOLDER);
fOpenFilePanel->SetMessage(&panelMessage);
fOpenFilePanel->Show();
}
void
SettingsWindow:: _HandleDownloadPanelResult(BFilePanel* panel,
const BMessage* message)
{
entry_ref ref;
if (message->FindRef("refs", 0, &ref) == B_OK)
{
BPath path(&ref);
fDownloadFolderControl->SetText(path.Path());
}
}
void
SettingsWindow::_ValidateControlsEnabledStatus()
{
bool canApply = _CanApplySettings();
fApplyButton->SetEnabled(canApply);
fRevertButton->SetEnabled(canApply);
// Let the Cancel button be enabled always, as another way to close the
// window...
fCancelButton->SetEnabled(true);
bool useProxy = fUseProxyCheckBox->Value() == B_CONTROL_ON;
fProxyAddressControl->SetEnabled(useProxy);
fProxyPortControl->SetEnabled(useProxy);
fUseProxyAuthCheckBox->SetEnabled(useProxy);
bool useProxyAuth = useProxy && fUseProxyAuthCheckBox->Value() == B_CONTROL_ON;
fProxyUsernameControl->SetEnabled(useProxyAuth);
fProxyPasswordControl->SetEnabled(useProxyAuth);
}
// #pragma mark -
uint32
SettingsWindow::_StartUpPolicy() const
{
uint32 startUpPolicy = ResumePriorSession;
BMenuItem* markedItem = fStartUpBehaviorMenu->Menu()->FindMarked();
if (markedItem == fStartUpBehaviorStartNewSession)
startUpPolicy = StartNewSession;
return startUpPolicy;
}
uint32
SettingsWindow::_NewWindowPolicy() const
{
uint32 newWindowPolicy = OpenStartPage;
BMenuItem* markedItem = fNewWindowBehaviorMenu->Menu()->FindMarked();
if (markedItem == fNewWindowBehaviorOpenSearchItem)
newWindowPolicy = OpenSearchPage;
else if (markedItem == fNewWindowBehaviorOpenBlankItem)
newWindowPolicy = OpenBlankPage;
return newWindowPolicy;
}
uint32
SettingsWindow::_NewTabPolicy() const
{
uint32 newTabPolicy = OpenBlankPage;
BMenuItem* markedItem = fNewTabBehaviorMenu->Menu()->FindMarked();
if (markedItem == fNewTabBehaviorCloneCurrentItem)
newTabPolicy = CloneCurrentPage;
else if (markedItem == fNewTabBehaviorOpenHomeItem)
newTabPolicy = OpenStartPage;
else if (markedItem == fNewTabBehaviorOpenSearchItem)
newTabPolicy = OpenSearchPage;
return newTabPolicy;
}
BFont
SettingsWindow::_FindDefaultSerifFont() const
{
// Default to the first "serif" font we find.
BFont serifFont(*be_plain_font);
font_family family;
int32 familyCount = count_font_families();
for (int32 i = 0; i < familyCount; i++) {
if (get_font_family(i, &family) == B_OK) {
BString familyString(family);
if (familyString.IFindFirst("sans") >= 0)
continue;
if (familyString.IFindFirst("serif") >= 0) {
serifFont.SetFamilyAndFace(family, B_REGULAR_FACE);
break;
}
}
}
return serifFont;
}
uint32
SettingsWindow::_ProxyPort() const
{
return atoul(fProxyPortControl->Text());
}