[haiku-webkit-commits] r284 - in webkit/trunk/WebKit: . haiku/API haiku/WebPositive haiku/WebPositive/support

  • From: webkit@xxxxxxxxxxxxxxx
  • To: haiku-webkit-commits@xxxxxxxxxxxxx
  • Date: Thu, 04 Mar 2010 18:17:24 +0000

Author: stippi
Date: Thu Mar  4 18:17:24 2010
New Revision: 284
URL: http://mmlr.dyndns.org/changeset/284

Log:
* Link against liblocale.so and load app catalog.
* Took FontSelectionView from Haiku Fonts preflet, but almost rewrote it to
  adapt for WebPositive needs. It's now a BHandler, so that it can actually
  receive messages itself. The Fonts version is a BView which is never attached,
  and only receives messages, because the window forwards them. Implemented
  option to use separate style menu.
* Provide font settings in the Settings window.
* Wired everything to make it work, although I am not sure standard font is
  applied. It does work for the serif font, though. Maybe I ought to install
  more fonts and check with simpler HTML.

Added:
   webkit/trunk/WebKit/haiku/WebPositive/support/FontSelectionView.cpp
   webkit/trunk/WebKit/haiku/WebPositive/support/FontSelectionView.h
Modified:
   webkit/trunk/WebKit/Jamfile
   webkit/trunk/WebKit/haiku/API/WebSettings.cpp
   webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.cpp
   webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.h
   webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.cpp
   webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.h
   webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.cpp
   webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.h

Modified: webkit/trunk/WebKit/Jamfile
==============================================================================
--- webkit/trunk/WebKit/Jamfile Thu Mar  4 15:27:31 2010        (r283)
+++ webkit/trunk/WebKit/Jamfile Thu Mar  4 18:17:24 2010        (r284)
@@ -123,6 +123,7 @@
        TextControlCompleter.cpp
        # support
     DateTime.cpp
+    FontSelectionView.cpp
     IconButton.cpp
     SettingsMessage.cpp
        # WebPositive
@@ -139,7 +140,7 @@
        # Other required libraries
        curl icu-common icu-data png sqlite3 xml2 z
        # Haiku libraries
-       be bsd network root stdc++ translation
+       be bsd locale network root stdc++ translation
        :
        WebPositive.rdef
 ;

Modified: webkit/trunk/WebKit/haiku/API/WebSettings.cpp
==============================================================================
--- webkit/trunk/WebKit/haiku/API/WebSettings.cpp       Thu Mar  4 15:27:31 
2010        (r283)
+++ webkit/trunk/WebKit/haiku/API/WebSettings.cpp       Thu Mar  4 18:17:24 
2010        (r284)
@@ -215,7 +215,7 @@
        font_style style;
        font.GetFamilyAndStyle(&family, &style);
        BString string(family);
-       string << ' ' << style;
+//     string << ' ' << style;
        message.AddString("font", string.String());
 
        _PostMessage(this, &message);

Modified: webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.cpp
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.cpp        Thu Mar  4 
15:27:31 2010        (r283)
+++ webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.cpp        Thu Mar  4 
18:17:24 2010        (r284)
@@ -42,6 +42,7 @@
 #include <Directory.h>
 #include <Entry.h>
 #include <FindDirectory.h>
+#include <Locale.h>
 #include <Path.h>
 #include <Screen.h>
 #include <debugger.h>
@@ -63,6 +64,7 @@
        fDownloadWindow(NULL),
        fSettingsWindow(NULL)
 {
+       be_locale->GetAppCatalog(&fAppCatalog);
 }
 
 

Modified: webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.h
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.h  Thu Mar  4 15:27:31 
2010        (r283)
+++ webkit/trunk/WebKit/haiku/WebPositive/BrowserApp.h  Thu Mar  4 18:17:24 
2010        (r284)
@@ -30,6 +30,7 @@
 
 
 #include <Application.h>
+#include <Catalog.h>
 #include <Rect.h>
 
 class DownloadWindow;
@@ -68,6 +69,8 @@
 
                        DownloadWindow*         fDownloadWindow;
                        SettingsWindow*         fSettingsWindow;
+
+                       BCatalog                        fAppCatalog;
 };
 
 

Modified: webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.cpp
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.cpp    Thu Mar  4 
15:27:31 2010        (r283)
+++ webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.cpp    Thu Mar  4 
18:17:24 2010        (r284)
@@ -26,62 +26,133 @@
  */
 #include "SettingsWindow.h"
 
-#include "BrowserApp.h"
-#include "WebSettings.h"
-
 #include <Button.h>
 #include <ControlLook.h>
 #include <GridLayoutBuilder.h>
 #include <GroupLayout.h>
 #include <GroupLayoutBuilder.h>
 #include <MenuItem.h>
+#include <MenuField.h>
+#include <Message.h>
+#include <PopUpMenu.h>
 #include <ScrollView.h>
 #include <SeparatorView.h>
 #include <SpaceLayoutItem.h>
+#include <debugger.h>
 #include <stdio.h>
 
+#include "BrowserApp.h"
+#include "FontSelectionView.h"
 #include "SettingsMessage.h"
+#include "WebSettings.h"
+
 
+#undef TR_CONTEXT
+#define TR_CONTEXT "Settings Window"
 
 enum {
-       MSG_OK                  = 'aply',
-       MSG_CANCEL              = 'cncl',
-       MSG_REVERT              = 'rvrt',
+       MSG_APPLY                                                       = 
'aply',
+       MSG_CANCEL                                                      = 
'cncl',
+       MSG_REVERT                                                      = 
'rvrt',
+       MSG_STANDARD_FONT_SIZE_SELECTED         = 'sfss',
+       MSG_FIXED_FONT_SIZE_SELECTED            = 'ffss',
 };
 
+static const int32 kDefaultFontSize = 14;
+
 
 SettingsWindow::SettingsWindow(BRect frame, SettingsMessage* settings)
        :
-       BWindow(frame, "Settings", B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
+       BWindow(frame, TR("Settings"), B_TITLED_WINDOW_LOOK, 
B_NORMAL_WINDOW_FEEL,
                B_AUTO_UPDATE_SIZE_LIMITS | B_ASYNCHRONOUS_CONTROLS | 
B_NOT_ZOOMABLE),
        fSettings(settings)
 {
        SetLayout(new BGroupLayout(B_VERTICAL));
 
-       fOkButton = new BButton("OK", new BMessage(MSG_OK));
+       fStandardFontView = new FontSelectionView("standard", "Standard font:",
+               true, be_plain_font);
+       BFont defaultSerifFont = _FindDefaultSerifFont();
+       fSerifFontView = new FontSelectionView("serif", "Serif font:", true,
+               &defaultSerifFont);
+       fSansSerifFontView = new FontSelectionView("sans serif", "Sans serif 
font:",
+               true, be_plain_font);
+       fFixedFontView = new FontSelectionView("fixed", "Fixed font:", true,
+               be_fixed_font);
+
+       fStandardSizesMenu =  new BMenuField("standard font size",
+               TR("Default standard font size:"), new BPopUpMenu("sizes"), 
NULL);
+       _BuildSizesMenu(fStandardSizesMenu->Menu(), 
MSG_STANDARD_FONT_SIZE_SELECTED);
+
+       fFixedSizesMenu =  new BMenuField("fixed font size",
+               TR("Default fixed font size:"), new BPopUpMenu("sizes"), NULL);
+       _BuildSizesMenu(fFixedSizesMenu->Menu(), MSG_FIXED_FONT_SIZE_SELECTED);
+
+       fApplyButton = new BButton("Apply", new BMessage(MSG_APPLY));
        fCancelButton = new BButton("Cancel", new BMessage(MSG_CANCEL));
        fRevertButton = new BButton("Revert", new BMessage(MSG_REVERT));
 
        float spacing = be_control_look->DefaultItemSpacing();
 
        AddChild(BGroupLayoutBuilder(B_VERTICAL)
-               .Add(BGridLayoutBuilder(spacing, spacing)
+               .Add(BGridLayoutBuilder(spacing / 2, spacing / 2)
+                       .Add(fStandardFontView->CreateFontsLabelLayoutItem(), 
0, 0)
+                       .Add(fStandardFontView->CreateFontsMenuBarLayoutItem(), 
1, 0)
+                       .Add(fStandardFontView->PreviewBox(), 0, 1, 2)
+                       .Add(BSpaceLayoutItem::CreateHorizontalStrut(spacing), 
0, 2, 2)
+
+                       .Add(fSerifFontView->CreateFontsLabelLayoutItem(), 0, 3)
+                       .Add(fSerifFontView->CreateFontsMenuBarLayoutItem(), 1, 
3)
+                       .Add(fSerifFontView->PreviewBox(), 0, 4, 2)
+                       .Add(BSpaceLayoutItem::CreateHorizontalStrut(spacing), 
0, 5, 2)
+
+                       .Add(fSansSerifFontView->CreateFontsLabelLayoutItem(), 
0, 6)
+                       
.Add(fSansSerifFontView->CreateFontsMenuBarLayoutItem(), 1, 6)
+                       .Add(fSansSerifFontView->PreviewBox(), 0, 7, 2)
+                       .Add(BSpaceLayoutItem::CreateHorizontalStrut(spacing), 
0, 8, 2)
+
+                       .Add(fFixedFontView->CreateFontsLabelLayoutItem(), 0, 9)
+                       .Add(fFixedFontView->CreateFontsMenuBarLayoutItem(), 1, 
9)
+                       .Add(fFixedFontView->PreviewBox(), 0, 10, 2)
+                       .Add(BSpaceLayoutItem::CreateHorizontalStrut(spacing), 
0, 11, 2)
+
+                       .Add(fStandardSizesMenu->CreateLabelLayoutItem(), 0, 12)
+                       .Add(fStandardSizesMenu->CreateMenuBarLayoutItem(), 1, 
12)
+                       .Add(fFixedSizesMenu->CreateLabelLayoutItem(), 0, 13)
+                       .Add(fFixedSizesMenu->CreateMenuBarLayoutItem(), 1, 13)
+                       .SetInsets(spacing, spacing, spacing, spacing)
                )
                .Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER))
                .Add(BGroupLayoutBuilder(B_HORIZONTAL, spacing)
                        .Add(fRevertButton)
                        .AddGlue()
                        .Add(fCancelButton)
-                       .Add(fOkButton)
+                       .Add(fApplyButton)
                        .SetInsets(spacing, spacing, spacing, spacing)
                )
        );
 
-       fOkButton->MakeDefault(true);
+       AddHandler(fStandardFontView);
+       fStandardFontView->AttachedToLooper();
+
+       AddHandler(fSerifFontView);
+       fSerifFontView->AttachedToLooper();
+
+       AddHandler(fSansSerifFontView);
+       fSansSerifFontView->AttachedToLooper();
+
+       AddHandler(fFixedFontView);
+       fFixedFontView->AttachedToLooper();
+
+       fApplyButton->MakeDefault(true);
 
        if (!frame.IsValid())
                CenterOnScreen();
 
+       // load settings from disk
+       _RevertSettings();
+       // apply to WebKit
+       _ApplySettings();
+
        // Start hidden
        Hide();
        Show();
@@ -90,6 +161,14 @@
 
 SettingsWindow::~SettingsWindow()
 {
+       RemoveHandler(fStandardFontView);
+       delete fStandardFontView;
+       RemoveHandler(fSerifFontView);
+       delete fSerifFontView;
+       RemoveHandler(fSansSerifFontView);
+       delete fSansSerifFontView;
+       RemoveHandler(fFixedFontView);
+       delete fFixedFontView;
 }
 
 
@@ -97,9 +176,8 @@
 SettingsWindow::MessageReceived(BMessage* message)
 {
        switch (message->what) {
-       case MSG_OK:
+       case MSG_APPLY:
                _ApplySettings();
-               PostMessage(B_QUIT_REQUESTED);
                break;
        case MSG_CANCEL:
                _RevertSettings();
@@ -108,6 +186,20 @@
        case MSG_REVERT:
                _RevertSettings();
                break;
+
+       case MSG_STANDARD_FONT_SIZE_SELECTED: {
+               int32 size = _SizesMenuValue(fStandardSizesMenu->Menu());
+               fStandardFontView->SetSize(size);
+               fSerifFontView->SetSize(size);
+               fSansSerifFontView->SetSize(size);
+               break;
+       }
+       case MSG_FIXED_FONT_SIZE_SELECTED: {
+               int32 size = _SizesMenuValue(fFixedSizesMenu->Menu());
+               fFixedFontView->SetSize(size);
+               break;
+       }
+
        default:
                BWindow::MessageReceived(message);
                break;
@@ -124,18 +216,143 @@
 }
 
 
+void
+SettingsWindow::Show()
+{
+       // When showing the window, the this is always the
+       // point to which we can revert the settings.
+       _RevertSettings();
+       BWindow::Show();
+}
+
+
 // #pragma mark - private
 
 
 void
 SettingsWindow::_ApplySettings()
 {
+       // Store 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 = _SizesMenuValue(fStandardSizesMenu->Menu());
+       int32 fixedFontSize = _SizesMenuValue(fFixedSizesMenu->Menu());
+       fSettings->SetValue("standard font size", standardFontSize);
+       fSettings->SetValue("fixed font size", fixedFontSize);
+
+       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);
+
+       // This will find all currently instantiated page settings and apply
+       // the default values, unless the page settings have local overrides.
+       BWebSettings::Default()->Apply();
 }
 
 
 void
 SettingsWindow::_RevertSettings()
 {
+       int32 defaultFontSize = fSettings->GetValue("standard font size",
+               kDefaultFontSize);
+       int32 defaultFixedFontSize = fSettings->GetValue("fixed font size",
+               kDefaultFontSize);
+
+       _SetSizesMenuValue(fStandardSizesMenu->Menu(), defaultFontSize);
+       _SetSizesMenuValue(fFixedSizesMenu->Menu(), 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);
 }
 
 
+void
+SettingsWindow::_BuildSizesMenu(BMenu* menu, uint32 messageWhat)
+{
+       const float kMinSize = 8.0;
+       const float kMaxSize = 18.0;
+
+       const int32 kSizes[] = {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 21, 
24, 0};
+
+       for (int32 i = 0; kSizes[i]; i++) {
+               int32 size = kSizes[i];
+               if (size < kMinSize || size > kMaxSize)
+                       continue;
+
+               char label[32];
+               snprintf(label, sizeof(label), "%ld", size);
+
+               BMessage* message = new BMessage(messageWhat);
+               message->AddInt32("size", size);
+
+               BMenuItem* item = new BMenuItem(label, message);
+
+               menu->AddItem(item);
+               item->SetTarget(this);
+       }
+}
+
+
+void
+SettingsWindow::_SetSizesMenuValue(BMenu* menu, int32 value)
+{
+       for (int32 i = 0; BMenuItem* item = menu->ItemAt(i); i++) {
+               bool marked = false;
+               if (BMessage* message = item->Message()) {
+                       int32 size;
+                       if (message->FindInt32("size", &size) == B_OK && size 
== value)
+                               marked = true;
+               }
+               item->SetMarked(marked);
+       }
+}
+
+
+int32
+SettingsWindow::_SizesMenuValue(BMenu* menu)
+{
+       if (BMenuItem* item = menu->FindMarked()) {
+               if (BMessage* message = item->Message()) {
+                       int32 size;
+                       if (message->FindInt32("size", &size) == B_OK)
+                               return size;
+               }
+       }
+       return kDefaultFontSize;
+}
+
+
+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;
+}

Modified: webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.h
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.h      Thu Mar  4 
15:27:31 2010        (r283)
+++ webkit/trunk/WebKit/haiku/WebPositive/SettingsWindow.h      Thu Mar  4 
18:17:24 2010        (r284)
@@ -30,6 +30,9 @@
 #include <Window.h>
 
 class BButton;
+class BMenu;
+class BMenuField;
+class FontSelectionView;
 class SettingsMessage;
 
 
@@ -42,16 +45,33 @@
        virtual void                            MessageReceived(BMessage* 
message);
        virtual bool                            QuitRequested();
 
+       virtual void                            Show();
+
 private:
                        void                            _ApplySettings();
                        void                            _RevertSettings();
 
+                       void                            _BuildSizesMenu(BMenu* 
menu,
+                                                                       uint32 
messageWhat);
+                       void                            
_SetSizesMenuValue(BMenu* menu, int32 value);
+                       int32                           _SizesMenuValue(BMenu* 
menu);
+
+                       BFont                           _FindDefaultSerifFont() 
const;
+
 private:
                        SettingsMessage*        fSettings;
 
-                       BButton*                        fOkButton;
+                       FontSelectionView*      fStandardFontView;
+                       FontSelectionView*      fSerifFontView;
+                       FontSelectionView*      fSansSerifFontView;
+                       FontSelectionView*      fFixedFontView;
+
+                       BButton*                        fApplyButton;
                        BButton*                        fCancelButton;
                        BButton*                        fRevertButton;
+
+                       BMenuField*                     fStandardSizesMenu;
+                       BMenuField*                     fFixedSizesMenu;
 };
 
 

Added: webkit/trunk/WebKit/haiku/WebPositive/support/FontSelectionView.cpp
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ webkit/trunk/WebKit/haiku/WebPositive/support/FontSelectionView.cpp Thu Mar 
 4 18:17:24 2010        (r284)
@@ -0,0 +1,489 @@
+/*
+ * Copyright 2001-2010, Haiku.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Mark Hogben
+ *             DarkWyrm <bpmagic@xxxxxxxxxxxxxxx>
+ *             Axel Dörfler, axeld@xxxxxxxxxxxxxxxx
+ *             Philippe Saint-Pierre, stpere@xxxxxxxxx 
+ *             Stephan Aßmus <superstippi@xxxxxx>
+ */
+
+#include "FontSelectionView.h"
+
+#include <Box.h>
+#include <Catalog.h>
+#include <Locale.h>
+#include <MenuField.h>
+#include <MenuItem.h>
+#include <PopUpMenu.h>
+#include <String.h>
+#include <StringView.h>
+#include <LayoutItem.h>
+#include <GroupLayoutBuilder.h>
+
+#include <stdio.h>
+
+#undef TR_CONTEXT
+#define TR_CONTEXT "Font Selection view"
+
+
+static const float kMinSize = 8.0;
+static const float kMaxSize = 18.0;
+
+static const int32 kMsgSetFamily = 'fmly';
+static const int32 kMsgSetStyle = 'styl';
+static const int32 kMsgSetSize = 'size';
+
+
+//     #pragma mark -
+
+
+FontSelectionView::FontSelectionView(const char* name, const char* label,
+               bool separateStyles, const BFont* currentFont)
+       :
+       BHandler(name)
+{
+       if (currentFont == NULL)
+               fCurrentFont = _DefaultFont();
+       else
+               fCurrentFont = *currentFont;
+
+       fSavedFont = fCurrentFont;
+
+       fSizesMenu = new BPopUpMenu("size menu");
+       fFontsMenu = new BPopUpMenu("font menu");
+
+       // font menu
+       fFontsMenuField = new BMenuField("fonts", label, fFontsMenu, NULL);
+       fFontsMenuField->SetFont(be_bold_font);
+
+       // styles menu, if desired
+       if (separateStyles) {
+               fStylesMenu = new BPopUpMenu("styles menu");
+               fStylesMenuField = new BMenuField("styles", TR("Style:"), 
fStylesMenu,
+                       NULL);
+       } else {
+               fStylesMenu = NULL;
+               fStylesMenuField = NULL;
+       }
+
+       // size menu
+       fSizesMenuField = new BMenuField("size", TR("Size:"), fSizesMenu, NULL);
+       fSizesMenuField->SetAlignment(B_ALIGN_RIGHT);
+
+       // preview
+       fPreviewText = new BStringView("preview text",
+               TR_CMT("The quick brown fox jumps over the lazy dog.","Don't 
translate this literally ! Use a phrase showing all chars from A to Z.")); 
+
+       fPreviewText->SetFont(&fCurrentFont);
+       fPreviewText->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 
B_SIZE_UNLIMITED)); 
+       
fPreviewText->SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR),
+               1.65));
+       fPreviewText->SetAlignment(B_ALIGN_RIGHT);
+}
+
+
+FontSelectionView::~FontSelectionView()
+{
+       // Some controls may not have been attached...
+       if (!fPreviewText->Window())
+               delete fPreviewText;
+       if (!fSizesMenuField->Window())
+               delete fSizesMenuField;
+       if (fStylesMenuField && !fStylesMenuField->Window())
+               delete fStylesMenuField;
+       if (!fFontsMenuField->Window())
+               delete fFontsMenuField;
+}
+
+
+void
+FontSelectionView::AttachedToLooper()
+{
+       _BuildSizesMenu();
+       UpdateFontsMenu();
+}
+
+
+void
+FontSelectionView::MessageReceived(BMessage* message)
+{
+       switch (message->what) {
+               case kMsgSetSize:
+               {
+                       int32 size;
+                       if (message->FindInt32("size", &size) != B_OK
+                               || size == fCurrentFont.Size())
+                               break;
+
+                       fCurrentFont.SetSize(size);
+                       _UpdateFontPreview();
+                       break;
+               }
+
+               case kMsgSetFamily:
+               {
+                       const char* family;
+                       if (message->FindString("family", &family) != B_OK)
+                               break;
+
+                       font_style style;
+                       fCurrentFont.GetFamilyAndStyle(NULL, &style);
+
+                       BMenuItem* familyItem = fFontsMenu->FindItem(family);
+                       if (familyItem != NULL) {
+                               _SelectCurrentFont(false);
+
+                               BMenuItem* styleItem;
+                               if (fStylesMenuField != NULL)
+                                       styleItem = 
fStylesMenuField->Menu()->FindMarked();
+                               else {
+                                       styleItem = 
familyItem->Submenu()->FindItem(style);
+                                       if (styleItem == NULL)
+                                               styleItem = 
familyItem->Submenu()->ItemAt(0);
+                               }
+
+                               if (styleItem != NULL) {
+                                       styleItem->SetMarked(true);
+                                       fCurrentFont.SetFamilyAndStyle(family, 
styleItem->Label());
+                                       _UpdateFontPreview();
+                               }
+                               if (fStylesMenuField != NULL)
+                                       _AddStylesToMenu(fCurrentFont, 
fStylesMenuField->Menu());
+                       }
+                       break;
+               }
+
+               case kMsgSetStyle:
+               {
+                       const char* family;
+                       const char* style;
+                       if (message->FindString("family", &family) != B_OK
+                               || message->FindString("style", &style) != B_OK)
+                               break;
+
+                       BMenuItem *familyItem = fFontsMenu->FindItem(family);
+                       if (!familyItem)
+                               break;
+
+                       _SelectCurrentFont(false);
+                       familyItem->SetMarked(true);
+
+                       fCurrentFont.SetFamilyAndStyle(family, style);
+                       _UpdateFontPreview();
+                       break;
+               }
+
+               default:
+                       BHandler::MessageReceived(message);
+       }
+}
+
+
+// #pragma mark -
+
+
+void
+FontSelectionView::SetFont(const BFont& font, float size)
+{
+       BFont resizedFont(font);
+       resizedFont.SetSize(size);
+       SetFont(resizedFont);
+}
+
+
+void
+FontSelectionView::SetFont(const BFont& font)
+{
+       if (font == fCurrentFont && font == fSavedFont)
+               return;
+
+       _SelectCurrentFont(false);
+       fSavedFont = fCurrentFont = font;
+       _UpdateFontPreview();
+
+       _SelectCurrentFont(true);
+       _SelectCurrentSize(true);
+}
+
+
+void
+FontSelectionView::SetSize(float size)
+{
+       SetFont(fCurrentFont, size);
+}
+
+
+const BFont&
+FontSelectionView::Font() const
+{
+       return fCurrentFont;
+}
+
+
+void
+FontSelectionView::SetDefaults()
+{
+       BFont defaultFont = _DefaultFont();
+       if (defaultFont == fCurrentFont)
+               return;
+
+       _SelectCurrentFont(false);
+
+       fCurrentFont = defaultFont;
+       _UpdateFontPreview();
+
+       _SelectCurrentFont(true);
+       _SelectCurrentSize(true);
+}
+
+
+void
+FontSelectionView::Revert()
+{
+       if (!IsRevertable())
+               return;
+
+       _SelectCurrentFont(false);
+
+       fCurrentFont = fSavedFont;
+       _UpdateFontPreview();
+
+       _SelectCurrentFont(true);
+       _SelectCurrentSize(true);
+}
+
+
+bool
+FontSelectionView::IsDefaultable()
+{
+       return fCurrentFont != _DefaultFont();
+}
+
+
+bool
+FontSelectionView::IsRevertable()
+{
+       return fCurrentFont != fSavedFont;
+}
+
+
+void
+FontSelectionView::UpdateFontsMenu()
+{
+       int32 numFamilies = count_font_families();
+
+       fFontsMenu->RemoveItems(0, fFontsMenu->CountItems(), true);
+
+       BFont font = fCurrentFont;
+
+       font_family currentFamily;
+       font_style currentStyle;
+       font.GetFamilyAndStyle(&currentFamily, &currentStyle);
+
+       for (int32 i = 0; i < numFamilies; i++) {
+               font_family family;
+               uint32 flags;
+               if (get_font_family(i, &family, &flags) != B_OK)
+                       continue;
+
+               // if we're setting the fixed font, we only want to show fixed 
fonts
+               if (!strcmp(Name(), "fixed") && (flags & B_IS_FIXED) == 0)
+                       continue;
+
+               font.SetFamilyAndFace(family, B_REGULAR_FACE);
+
+               BMessage* message = new BMessage(kMsgSetFamily);
+               message->AddString("family", family);
+               message->AddString("name", Name());
+
+               BMenuItem* familyItem;
+               if (fStylesMenuField != NULL) {
+                       familyItem = new BMenuItem(family, message);
+               } else {
+                       // Each family item has a submenu with all styles for 
that font.
+                       BMenu* stylesMenu = new BMenu(family);
+                       _AddStylesToMenu(font, stylesMenu);
+                       familyItem = new BMenuItem(stylesMenu, message);
+               }
+
+               familyItem->SetMarked(strcmp(family, currentFamily) == 0);
+               fFontsMenu->AddItem(familyItem);
+               familyItem->SetTarget(this);
+       }
+
+       // Separate styles menu for only the current font.
+       if (fStylesMenuField != NULL)
+               _AddStylesToMenu(fCurrentFont, fStylesMenuField->Menu());
+}
+
+
+// #pragma mark - private
+
+
+BLayoutItem* 
+FontSelectionView::CreateSizesLabelLayoutItem()
+{
+       return fSizesMenuField->CreateLabelLayoutItem();
+}
+
+
+BLayoutItem* 
+FontSelectionView::CreateSizesMenuBarLayoutItem()
+{
+       return fSizesMenuField->CreateMenuBarLayoutItem();
+}
+
+
+BLayoutItem* 
+FontSelectionView::CreateFontsLabelLayoutItem()
+{
+       return fFontsMenuField->CreateLabelLayoutItem();
+}
+
+
+BLayoutItem* 
+FontSelectionView::CreateFontsMenuBarLayoutItem()
+{
+       return fFontsMenuField->CreateMenuBarLayoutItem();
+}
+
+
+BLayoutItem* 
+FontSelectionView::CreateStylesLabelLayoutItem()
+{
+       if (fStylesMenuField)
+               return fStylesMenuField->CreateLabelLayoutItem();
+       return NULL;
+}
+
+
+BLayoutItem* 
+FontSelectionView::CreateStylesMenuBarLayoutItem()
+{
+       if (fStylesMenuField)
+               return fStylesMenuField->CreateMenuBarLayoutItem();
+       return NULL;
+}
+
+
+BView*
+FontSelectionView::PreviewBox() const
+{
+       return fPreviewText;
+}
+
+
+// #pragma mark - private
+
+
+BFont
+FontSelectionView::_DefaultFont() const
+{
+       if (strcmp(Name(), "bold") == 0)
+               return *be_bold_font;
+       if (strcmp(Name(), "fixed") == 0)
+               return *be_fixed_font;
+       else
+               return *be_plain_font;
+}
+
+
+void
+FontSelectionView::_SelectCurrentFont(bool select)
+{
+       font_family family;
+       font_style style;
+       fCurrentFont.GetFamilyAndStyle(&family, &style);
+
+       BMenuItem *item = fFontsMenu->FindItem(family);
+       if (item != NULL) {
+               item->SetMarked(select);
+
+               if (item->Submenu() != NULL) {
+                       item = item->Submenu()->FindItem(style);
+                       if (item != NULL)
+                               item->SetMarked(select);
+               }
+       }
+}
+
+
+void
+FontSelectionView::_SelectCurrentSize(bool select)
+{
+       char label[16];
+       snprintf(label, sizeof(label), "%ld", (int32)fCurrentFont.Size());
+
+       BMenuItem* item = fSizesMenu->FindItem(label);
+       if (item != NULL)
+               item->SetMarked(select);
+}
+
+
+void
+FontSelectionView::_UpdateFontPreview()
+{
+       fPreviewText->SetFont(&fCurrentFont);
+}
+
+
+void
+FontSelectionView::_BuildSizesMenu()
+{
+       const int32 sizes[] = {7, 8, 9, 10, 11, 12, 13, 14, 18, 21, 24, 0};
+
+       // build size menu
+       for (int32 i = 0; sizes[i]; i++) {
+               int32 size = sizes[i];
+               if (size < kMinSize || size > kMaxSize)
+                       continue;
+
+               char label[32];
+               snprintf(label, sizeof(label), "%ld", size);
+
+               BMessage* message = new BMessage(kMsgSetSize);
+               message->AddInt32("size", size);
+               message->AddString("name", Name()); 
+
+               BMenuItem* item = new BMenuItem(label, message);
+               if (size == fCurrentFont.Size())
+                       item->SetMarked(true);
+
+               fSizesMenu->AddItem(item);
+               item->SetTarget(this);
+       }
+}
+
+
+void
+FontSelectionView::_AddStylesToMenu(const BFont& font, BMenu* stylesMenu) const
+{
+       stylesMenu->RemoveItems(0, stylesMenu->CountItems(), true);
+       stylesMenu->SetRadioMode(true);
+
+       font_family family;
+       font_style style;
+       font.GetFamilyAndStyle(&family, &style);
+       BString currentStyle(style);
+
+       int32 numStyles = count_font_styles(family);
+
+       for (int32 j = 0; j < numStyles; j++) {
+               if (get_font_style(family, j, &style) != B_OK)
+                       continue;
+
+               BMessage* message = new BMessage(kMsgSetStyle);
+               message->AddString("family", (char*)family);
+               message->AddString("style", (char*)style);
+
+               BMenuItem* item = new BMenuItem(style, message);
+               item->SetMarked(currentStyle == style);
+
+               stylesMenu->AddItem(item);
+               item->SetTarget(this);
+       }
+}
+

Added: webkit/trunk/WebKit/haiku/WebPositive/support/FontSelectionView.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ webkit/trunk/WebKit/haiku/WebPositive/support/FontSelectionView.h   Thu Mar 
 4 18:17:24 2010        (r284)
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2001-2010, Haiku.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             Mark Hogben
+ *             DarkWyrm <bpmagic@xxxxxxxxxxxxxxx>
+ *             Axel Dörfler, axeld@xxxxxxxxxxxxxxxx
+ *             Philippe Saint-Pierre, stpere@xxxxxxxxx
+ *             Stephan Aßmus <superstippi@xxxxxx>
+ */
+#ifndef FONT_SELECTION_VIEW_H
+#define FONT_SELECTION_VIEW_H
+
+
+#include <Font.h>
+#include <Handler.h>
+
+class BLayoutItem;
+class BBox;
+class BMenu;
+class BMenuField;
+class BPopUpMenu;
+class BStringView;
+class BView;
+
+
+class FontSelectionView : public BHandler {
+public:
+                                                               
FontSelectionView(const char* name,
+                                                                       const 
char* label, bool separateStyles,
+                                                                       const 
BFont* font = NULL);
+       virtual                                         ~FontSelectionView();
+
+                       void                            AttachedToLooper();
+       virtual void                            MessageReceived(BMessage* 
message);
+
+                       void                            SetFont(const BFont& 
font, float size);
+                       void                            SetFont(const BFont& 
font);
+                       void                            SetSize(float size);
+                       const BFont&            Font() const;
+
+                       void                            SetDefaults();
+                       void                            Revert();
+                       bool                            IsDefaultable();
+                       bool                            IsRevertable();
+
+                       void                            UpdateFontsMenu();
+
+                       BLayoutItem*            CreateSizesLabelLayoutItem();
+                       BLayoutItem*            CreateSizesMenuBarLayoutItem();
+
+                       BLayoutItem*            CreateFontsLabelLayoutItem();
+                       BLayoutItem*            CreateFontsMenuBarLayoutItem();
+
+                       BLayoutItem*            CreateStylesLabelLayoutItem();
+                       BLayoutItem*            CreateStylesMenuBarLayoutItem();
+
+                       BView*                          PreviewBox() const;
+                       
+private:
+                       BFont                           _DefaultFont() const;
+                       void                            _SelectCurrentFont(bool 
select);
+                       void                            _SelectCurrentSize(bool 
select);
+                       void                            _UpdateFontPreview();
+                       void                            _BuildSizesMenu();
+                       void                            _AddStylesToMenu(const 
BFont& font,
+                                                                       BMenu* 
menu) const;
+
+protected:
+                       BMenuField*                     fFontsMenuField;
+                       BMenuField*                     fStylesMenuField;
+                       BMenuField*                     fSizesMenuField;
+                       BPopUpMenu*                     fFontsMenu;
+                       BPopUpMenu*                     fStylesMenu;
+                       BPopUpMenu*                     fSizesMenu;
+                       BStringView*            fPreviewText;
+
+                       BFont                           fSavedFont;
+                       BFont                           fCurrentFont;
+};
+
+#endif // FONT_SELECTION_VIEW_H

Modified: webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.cpp
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.cpp   Thu Mar 
 4 15:27:31 2010        (r283)
+++ webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.cpp   Thu Mar 
 4 18:17:24 2010        (r284)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008, Stephan Aßmus <superstippi@xxxxxx>.
+ * Copyright 2008-2010, Stephan Aßmus <superstippi@xxxxxx>.
  * Copyright 1998, Eric Shepherd.
  * All rights reserved. Distributed under the terms of the Be Sample Code
  * license.
@@ -203,8 +203,31 @@
 }
 
 
+status_t
+SettingsMessage::SetValue(const char* name, const BFont& value)
+{
+       font_family family;
+       font_style style;
+       value.GetFamilyAndStyle(&family, &style);
+
+       BMessage fontMessage;
+       status_t ret = fontMessage.AddString("family", family);
+       if (ret == B_OK)
+               ret = fontMessage.AddString("style", style);
+       if (ret == B_OK)
+               ret = fontMessage.AddFloat("size", value.Size());
+
+       if (ret == B_OK) {
+               if (ReplaceMessage(name, &fontMessage) != B_OK)
+                       ret = AddMessage(name, &fontMessage);
+       }
+       return ret;
+}
+
+
 // #pragma mark -
 
+
 bool
 SettingsMessage::GetValue(const char* name, bool defaultValue) const
 {
@@ -334,3 +357,29 @@
        return value;
 }
 
+
+BFont
+SettingsMessage::GetValue(const char* name, const BFont& defaultValue) const
+{
+       BMessage fontMessage;
+       if (FindMessage(name, &fontMessage) != B_OK)
+               return defaultValue;
+
+       const char* family;
+       const char* style;
+       float size;
+       if (fontMessage.FindString("family", &family) != B_OK
+               || fontMessage.FindString("style", &style) != B_OK
+               || fontMessage.FindFloat("size", &size) != B_OK) {
+               return defaultValue;
+       }
+
+       BFont value;
+       if (value.SetFamilyAndStyle(family, style) != B_OK)
+               return defaultValue;
+
+       value.SetSize(size);
+
+       return value;
+}
+

Modified: webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.h
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.h     Thu Mar 
 4 15:27:31 2010        (r283)
+++ webkit/trunk/WebKit/haiku/WebPositive/support/SettingsMessage.h     Thu Mar 
 4 18:17:24 2010        (r284)
@@ -8,6 +8,7 @@
 #define SETTINGS_MESSAGE_H
 
 #include <FindDirectory.h>
+#include <Font.h>
 #include <Message.h>
 #include <Path.h>
 
@@ -43,6 +44,8 @@
                                                                        const 
BMessage* value);
                        status_t                        SetValue(const char* 
name,
                                                                        const 
BFlattenable* value);
+                       status_t                        SetValue(const char* 
name,
+                                                                       const 
BFont& value);
 
                        bool                            GetValue(const char* 
name,
                                                                        bool 
defaultValue) const;
@@ -70,6 +73,8 @@
                                                                        const 
entry_ref& defaultValue) const;
                        BMessage                        GetValue(const char* 
name,
                                                                        const 
BMessage& defaultValue) const;
+                       BFont                           GetValue(const char* 
name,
+                                                                       const 
BFont& defaultValue) const;
 
 private:
                        BPath                           fPath;

Other related posts:

  • » [haiku-webkit-commits] r284 - in webkit/trunk/WebKit: . haiku/API haiku/WebPositive haiku/WebPositive/support - webkit