Ticket #3731: patch

File patch, 20.7 KB (added by stpere, 15 years ago)
  • src/preferences/fonts/FontView.cpp

     
    66 *      Mark Hogben
    77 *      DarkWyrm <bpmagic@columbus.rr.com>
    88 *      Axel Dörfler, axeld@pinc-software.de
     9 *      Philippe St-Pierre, stpere@gmail.com
    910 */
    1011
    1112
    1213#include "FontView.h"
     14#include <GridLayoutBuilder.h>
     15#include <GroupLayoutBuilder.h>
     16#include <SpaceLayoutItem.h>
    1317
    1418
    15 FontView::FontView(BRect _rect)
    16     : BView(_rect, "Fonts", B_FOLLOW_ALL, B_WILL_DRAW)
     19FontView::FontView()
     20    : BView("Fonts", B_WILL_DRAW )
    1721{
    1822    SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
    19     BRect rect(Bounds());
     23 
     24    fPlainView = new FontSelectionView("plain", "Plain Font:");
    2025
    21     float labelWidth = StringWidth("Fixed Font:") + 8;
     26    fBoldView = new FontSelectionView("bold", "Bold Font:");
    2227
    23     fPlainView = new FontSelectionView(rect, "plain", "Plain Font:");
    24     fPlainView->SetDivider(labelWidth);
    25     fPlainView->ResizeToPreferred();
    26     AddChild(fPlainView);
     28    fFixedView = new FontSelectionView("fixed", "Fixed Font:");
    2729
    28     rect.OffsetBy(0, fPlainView->Bounds().Height() + 10);
    29     fBoldView = new FontSelectionView(rect, "bold", "Bold Font:");
    30     fBoldView->SetDivider(labelWidth);
    31     fBoldView->ResizeToPreferred();
    32     AddChild(fBoldView);
     30    fMenuView = new FontSelectionView("menu", "Menu Font:");
    3331
    34     rect.OffsetBy(0, fPlainView->Bounds().Height() + 10);
    35     fFixedView = new FontSelectionView(rect, "fixed", "Fixed Font:");
    36     fFixedView->SetDivider(labelWidth);
    37     fFixedView->ResizeToPreferred();
    38     AddChild(fFixedView);
     32    SetLayout(new BGroupLayout(B_VERTICAL));
     33    AddChild(BGridLayoutBuilder(5, 5)
     34        .Add(fPlainView->CreateFontsLabelLayoutItem(), 0, 0)
     35        .Add(fPlainView->CreateFontsMenuBarLayoutItem(), 1, 0)
     36        .Add(BSpaceLayoutItem::CreateGlue(), 2, 0)
     37        .Add(fPlainView->CreateSizesLabelLayoutItem(), 3, 0)
     38        .Add(fPlainView->CreateSizesMenuBarLayoutItem(), 4, 0)
     39        .Add(BSpaceLayoutItem::CreateGlue(), 0, 1)
     40        .Add(fPlainView->GetPreviewBox(), 1, 1, 4)
    3941
    40     rect.OffsetBy(0, fFixedView->Bounds().Height() + 10);
    41     fMenuView = new FontSelectionView(rect, "menu", "Menu Font:");
    42     fMenuView->SetDivider(labelWidth);
    43     fMenuView->ResizeToPreferred();
    44     AddChild(fMenuView);
     42        .Add(fBoldView->CreateFontsLabelLayoutItem(), 0, 2)
     43        .Add(fBoldView->CreateFontsMenuBarLayoutItem(), 1, 2)
     44        .Add(BSpaceLayoutItem::CreateGlue(), 2, 2)
     45        .Add(fBoldView->CreateSizesLabelLayoutItem(), 3, 2)
     46        .Add(fBoldView->CreateSizesMenuBarLayoutItem(), 4, 2)
     47        .Add(BSpaceLayoutItem::CreateGlue(), 0, 3)
     48        .Add(fBoldView->GetPreviewBox(), 1, 3, 4)
     49
     50        .Add(fFixedView->CreateFontsLabelLayoutItem(), 0, 4)
     51        .Add(fFixedView->CreateFontsMenuBarLayoutItem(), 1, 4)
     52        .Add(BSpaceLayoutItem::CreateGlue(), 2, 4)
     53        .Add(fFixedView->CreateSizesLabelLayoutItem(), 3, 4)
     54        .Add(fFixedView->CreateSizesMenuBarLayoutItem(), 4, 4)
     55        .Add(BSpaceLayoutItem::CreateGlue(), 0, 5)
     56        .Add(fFixedView->GetPreviewBox(), 1, 5, 4)
     57
     58        .Add(fMenuView->CreateFontsLabelLayoutItem(), 0, 6)
     59        .Add(fMenuView->CreateFontsMenuBarLayoutItem(), 1, 6)
     60        .Add(BSpaceLayoutItem::CreateGlue(), 2, 6)
     61        .Add(fMenuView->CreateSizesLabelLayoutItem(), 3, 6)
     62        .Add(fMenuView->CreateSizesMenuBarLayoutItem(), 4, 6)
     63        .Add(BSpaceLayoutItem::CreateGlue(), 0, 7)
     64        .Add(fMenuView->GetPreviewBox(), 1, 7, 4)
     65        .SetInsets(10, 10, 10, 10)
     66    );
    4567}
    4668
    4769
    4870void
    49 FontView::GetPreferredSize(float *_width, float *_height)
     71FontView::SetDefaults()
    5072{
    51     if (_width)
    52         *_width = fPlainView->Bounds().Width();
    53 
    54     if (_height)
    55         *_height = fPlainView->Bounds().Height() * 4 + 40;
     73    fPlainView->SetDefaults();
     74    fBoldView->SetDefaults();
     75    fFixedView->SetDefaults();
     76    fMenuView->SetDefaults();
    5677}
    5778
    5879
    5980void
    60 FontView::SetDefaults()
     81FontView::MessageReceived(BMessage *msg)
    6182{
    62     for (int32 i = 0; i < CountChildren(); i++) {
    63         FontSelectionView* view = dynamic_cast<FontSelectionView *>(ChildAt(i));
    64         if (view == NULL)
    65             continue;
     83    switch (msg->what) {
     84        case kMsgSetSize:
     85        case kMsgSetFamily:
     86        case kMsgSetStyle:
     87        {
     88            const char* name;
     89            if (msg->FindString("name", &name) != B_OK)
     90                break;
    6691
    67         view->SetDefaults();
     92            if (!strcmp(name, "plain")) {
     93                fPlainView->MessageReceived(msg);
     94            } else if (!strcmp(name, "bold")) {
     95                fBoldView->MessageReceived(msg);
     96            } else if (!strcmp(name, "fixed")) {
     97                fFixedView->MessageReceived(msg);           
     98            } else if (!strcmp(name, "menu")) {
     99                fMenuView->MessageReceived(msg);
     100            } else {
     101                break;
     102            }
     103
     104            Window()->PostMessage(kMsgUpdate);
     105            break;
     106        }   
     107        default:
     108            BView::MessageReceived(msg);
    68109    }
    69110}
    70111
    71 
    72112void
    73113FontView::Revert()
    74114{
    75     for (int32 i = 0; i < CountChildren(); i++) {
    76         FontSelectionView* view = dynamic_cast<FontSelectionView *>(ChildAt(i));
    77         if (view == NULL)
    78             continue;
    79 
    80         view->Revert();
    81     }
     115    fPlainView->Revert();
     116    fBoldView->Revert();
     117    fFixedView->Revert();
     118    fMenuView->Revert();
    82119}
    83120
    84121
     
    92129}
    93130
    94131
    95 void
    96 FontView::RelayoutIfNeeded()
    97 {
    98     fPlainView->RelayoutIfNeeded();
    99     fBoldView->RelayoutIfNeeded();
    100     fFixedView->RelayoutIfNeeded();
    101     fMenuView->RelayoutIfNeeded();
    102 }
    103 
    104 
    105132bool
    106133FontView::IsDefaultable()
    107134{
  • src/preferences/fonts/MainWindow.h

     
    2727
    2828    virtual bool            QuitRequested();
    2929    virtual void            MessageReceived(BMessage *message);
     30    virtual     void            Show();
    3031
     32
    3133private:
    32             void            _Center();
    33 
     34        void        _Center();
     35        bool        fCentered;
    3436        BMessageRunner*     fRunner;
    3537        FontView*           fFontsView;
    3638        BButton*            fDefaultsButton;
  • src/preferences/fonts/FontView.h

     
    66 *      Mark Hogben
    77 *      DarkWyrm <bpmagic@columbus.rr.com>
    88 *      Axel Dörfler, axeld@pinc-software.de
     9 *      Philippe Saint-Pierre, stpere@gmail.com
    910 */
    1011#ifndef FONT_VIEW_H
    1112#define FONT_VIEW_H
    1213
    13 
    1414#include "FontSelectionView.h"
     15#include "MainWindow.h"
     16#include <Message.h>
    1517
    16 
    1718class FontView : public BView {
    1819public:
    19                                 FontView(BRect frame);
     20                                FontView();
    2021
    21     virtual void                GetPreferredSize(float *_width, float *_height);
     22    virtual void                MessageReceived(BMessage *msg);
    2223
    2324            void                SetDefaults();
    2425            void                Revert();
    2526            void                UpdateFonts();
    26             void                RelayoutIfNeeded();
    2727
    2828            bool                IsDefaultable();
    2929            bool                IsRevertable();
    3030
     31
     32
    3133private:
    3234            FontSelectionView*  fPlainView;
    3335            FontSelectionView*  fBoldView;
     
    3537            FontSelectionView*  fMenuView;
    3638};
    3739
     40
    3841#endif  /* FONT_VIEW_H */
  • src/preferences/fonts/FontSelectionView.cpp

     
    66 *      Mark Hogben
    77 *      DarkWyrm <bpmagic@columbus.rr.com>
    88 *      Axel Dörfler, axeld@pinc-software.de
     9 *      Philippe Saint-Pierre, stpere@gmail.com
    910 */
    1011
    1112
     
    1819#include <PopUpMenu.h>
    1920#include <String.h>
    2021#include <StringView.h>
     22#include <LayoutItem.h>
     23#include <GroupLayoutBuilder.h>
    2124
    2225#include <stdio.h>
    2326
     
    2629    // if defined, the system font will be updated immediately, and not
    2730    // only on exit
    2831
    29 static const int32 kMsgSetFamily = 'fmly';
    30 static const int32 kMsgSetStyle = 'styl';
    31 static const int32 kMsgSetSize = 'size';
    32 
    3332static const float kMinSize = 8.0;
    3433static const float kMaxSize = 18.0;
    3534
     
    6665//  #pragma mark -
    6766
    6867
    69 FontSelectionView::FontSelectionView(BRect _rect, const char* name,
     68FontSelectionView::FontSelectionView(const char* name,
    7069    const char* label, const BFont* currentFont)
    71     : BView(_rect, name, B_FOLLOW_LEFT_RIGHT, B_WILL_DRAW),
     70    : BView(name, B_WILL_DRAW),
    7271    fSavedFont(currentFont)
    7372{
    7473    if (currentFont == NULL) {
     
    8887    } else
    8988        fCurrentFont = *currentFont;
    9089
    91     fDivider = StringWidth(label) + 5;
    92 
    9390    fSizesMenu = new BPopUpMenu("size menu");
    9491    _BuildSizesMenu();
    9592
    9693    fFontsMenu = new BPopUpMenu("font menu");
    9794
    9895    // font menu
    99     BRect rect(Bounds());
    100     fFontsMenuField = new BMenuField(rect, "fonts", label, fFontsMenu, false);
    101     fFontsMenuField->SetDivider(fDivider);
     96    fFontsMenuField = new BMenuField("fonts", label, fFontsMenu, NULL);
    10297    fFontsMenuField->SetAlignment(B_ALIGN_RIGHT);
    103     fFontsMenuField->ResizeToPreferred();
    104     AddChild(fFontsMenuField);
    10598
    10699    // size menu
    107     rect.right = rect.left + StringWidth("Size: 99") + 30.0f;
    108     fSizesMenuField = new BMenuField(rect, "sizes", "Size:", fSizesMenu, true,
    109         B_FOLLOW_TOP | B_FOLLOW_RIGHT);
    110     fSizesMenuField->SetDivider(StringWidth(fSizesMenuField->Label()) + 5.0f);
     100    fSizesMenuField = new BMenuField("size", "Size:", fSizesMenu, NULL);
    111101    fSizesMenuField->SetAlignment(B_ALIGN_RIGHT);
    112     fSizesMenuField->ResizeToPreferred();
    113     rect = Bounds();
    114     fSizesMenuField->MoveBy(rect.right - fSizesMenuField->Bounds().Width(), 0);
    115     AddChild(fSizesMenuField);
    116102
    117     rect.top += fFontsMenuField->Bounds().Height() + 5;
    118     rect.left = fDivider;
    119     BFont font = be_plain_font;
    120     font.SetSize(kMaxSize);
    121     font_height height;
    122     font.GetHeight(&height);
    123     rect.bottom = rect.top + ceil(height.ascent + height.descent
    124         + height.leading) + 5;
     103    BView *fPreview = new BView("preview", B_WILL_DRAW);
    125104
    126     fPreviewBox = new BBox(rect, "preview", B_FOLLOW_LEFT_RIGHT,
    127         B_WILL_DRAW | B_FRAME_EVENTS);
    128     AddChild(fPreviewBox);
     105    fPreviewBox = new BBox("preview box", B_WILL_DRAW | B_FRAME_EVENTS);
     106    fPreviewText = new BStringView("preview text",
     107                            "The quick brown fox jumps over the lazy dog.");
    129108
    130     // Place the text slightly inside the entire box area, so
    131     // it doesn't overlap the box outline.
    132     rect = fPreviewBox->Bounds().InsetByCopy(3, 3);
    133     fPreviewText = new BStringView(rect, "preview text",
    134         "The quick brown fox jumps over the lazy dog.",
    135         B_FOLLOW_LEFT_RIGHT);
    136109    fPreviewText->SetFont(&fCurrentFont);
    137     fPreviewBox->AddChild(fPreviewText);
     110
     111    fPreviewText->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
     112    fPreview->SetLayout(new BGroupLayout(B_HORIZONTAL));
     113    fPreview->AddChild(BGroupLayoutBuilder(B_HORIZONTAL)
     114                    .Add(fPreviewText)
     115                    .SetInsets(3, 3, 3, 3)
     116    );
     117    fPreviewBox->AddChild(fPreview);
    138118}
    139119
    140120
     
    146126}
    147127
    148128
    149 void
    150 FontSelectionView::GetPreferredSize(float *_width, float *_height)
     129BView*
     130FontSelectionView::GetPreviewBox()
    151131{
    152     // don't change the width if it is large enough
    153     if (_width) {
    154         *_width = fMaxFontNameWidth + 40 + fDivider
    155             + fSizesMenuField->Bounds().Width();
    156 
    157         if (*_width < Bounds().Width())
    158             *_width = Bounds().Width();
    159     }
    160 
    161     if (_height) {
    162         BView* view = FindView("preview");
    163         if (view != NULL)
    164             *_height = view->Frame().bottom;
    165     }
     132    return fPreviewBox;
    166133}
    167134
    168135
    169136void
    170 FontSelectionView::SetDivider(float divider)
    171 {
    172     fFontsMenuField->SetDivider(divider);
    173 
    174     fPreviewBox->ResizeBy(fDivider - divider, 0);
    175     fPreviewBox->MoveBy(divider - fDivider, 0);
    176 
    177     // if the view is not yet attached to a window, the resizing mode is ignored
    178     if (Window() == NULL)
    179         fPreviewText->ResizeBy(fDivider - divider, 0);
    180 
    181     fDivider = divider;
    182 }
    183 
    184 
    185 void
    186 FontSelectionView::RelayoutIfNeeded()
    187 {
    188     float width, height;
    189     GetPreferredSize(&width, &height);
    190 
    191     if (width > Bounds().Width()) {
    192         fSizesMenuField->MoveTo(fMaxFontNameWidth + fDivider + 40.0f,
    193                 fFontsMenuField->Bounds().top);
    194         ResizeTo(width, height);
    195     }
    196 }
    197 
    198 
    199 void
    200 FontSelectionView::AttachedToWindow()
    201 {
    202     if (Parent() != NULL)
    203         SetViewColor(Parent()->ViewColor());
    204     else
    205         SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
    206 
    207     fSizesMenu->SetTargetForItems(this);
    208     UpdateFontsMenu();
    209 }
    210 
    211 
    212 void
    213137FontSelectionView::MessageReceived(BMessage *msg)
    214138{
    215139    switch (msg->what) {
     
    222146
    223147            fCurrentFont.SetSize(size);
    224148            _UpdateFontPreview();
    225 
    226             Window()->PostMessage(kMsgUpdate);
    227149            break;
    228150        }
    229151
     
    250172                    _UpdateFontPreview();
    251173                }
    252174            }
    253 
    254             Window()->PostMessage(kMsgUpdate);
    255175            break;
    256176        }
    257177
     
    272192
    273193            fCurrentFont.SetFamilyAndStyle(family, style);
    274194            _UpdateFontPreview();
    275 
    276             Window()->PostMessage(kMsgUpdate);
    277195            break;
    278196        }
    279197
     
    283201}
    284202
    285203
     204BLayoutItem*
     205FontSelectionView::CreateSizesLabelLayoutItem()
     206{
     207    return fSizesMenuField->CreateLabelLayoutItem();
     208}
     209
     210
     211BLayoutItem*
     212FontSelectionView::CreateSizesMenuBarLayoutItem()
     213{
     214    return fSizesMenuField->CreateMenuBarLayoutItem();
     215}
     216
     217
     218BLayoutItem*
     219FontSelectionView::CreateFontsLabelLayoutItem()
     220{
     221    return fFontsMenuField->CreateLabelLayoutItem();
     222}
     223
     224
     225BLayoutItem*
     226FontSelectionView::CreateFontsMenuBarLayoutItem()
     227{
     228    return fFontsMenuField->CreateMenuBarLayoutItem();
     229}
     230
     231
    286232void
    287233FontSelectionView::_BuildSizesMenu()
    288234{
     
    299245
    300246        BMessage* message = new BMessage(kMsgSetSize);
    301247        message->AddInt32("size", size);
     248        message->AddString("name", Name());
    302249
    303250        BMenuItem* item = new BMenuItem(label, message);
    304251        if (size == fCurrentFont.Size())
     
    495442
    496443        BMessage* message = new BMessage(kMsgSetFamily);
    497444        message->AddString("family", family);
     445        message->AddString("name", Name());
     446
    498447        BMenuItem* familyItem = new BMenuItem(stylesMenu, message);
    499448        fFontsMenu->AddItem(familyItem);
    500449
     
    508457            message = new BMessage(kMsgSetStyle);
    509458            message->AddString("family", (char*)family);
    510459            message->AddString("style", (char*)style);
     460            message->AddString("name", Name());
    511461
    512462            BMenuItem *item = new BMenuItem(style, message);
    513463
     
    518468            }
    519469            stylesMenu->AddItem(item);
    520470        }
    521 
    522         stylesMenu->SetTargetForItems(this);
    523471    }
    524 
    525     fFontsMenu->SetTargetForItems(this);
    526472}
  • src/preferences/fonts/FontSelectionView.h

     
    66 *      Mark Hogben
    77 *      DarkWyrm <bpmagic@columbus.rr.com>
    88 *      Axel Dörfler, axeld@pinc-software.de
     9 *      Philippe Saint-Pierre, stpere@gmail.com
    910 */
    1011#ifndef FONT_SELECTION_VIEW_H
    1112#define FONT_SELECTION_VIEW_H
     
    1314
    1415#include <View.h>
    1516
     17class BLayoutItem;
    1618class BBox;
    1719class BMenuField;
    1820class BPopUpMenu;
    1921class BStringView;
    2022
     23static const int32 kMsgSetFamily = 'fmly';
     24static const int32 kMsgSetStyle = 'styl';
     25static const int32 kMsgSetSize = 'size';
    2126
     27
    2228class FontSelectionView : public BView {
    2329public:
    24                             FontSelectionView(BRect rect, const char* name,
     30                            FontSelectionView(const char* name,
    2531                                const char* label, const BFont* font = NULL);
    2632    virtual                 ~FontSelectionView();
    2733
    28     virtual void            GetPreferredSize(float *_width, float *_height);
    29     virtual void            AttachedToWindow();
     34
    3035    virtual void            MessageReceived(BMessage *msg);
    3136
    32             void            SetDivider(float divider);
    33             void            RelayoutIfNeeded();
    34 
    3537            void            SetDefaults();
    3638            void            Revert();
    3739            bool            IsDefaultable();
     
    3941
    4042            void            UpdateFontsMenu();
    4143
     44            BLayoutItem*    CreateSizesLabelLayoutItem();
     45            BLayoutItem*    CreateSizesMenuBarLayoutItem();
     46
     47            BLayoutItem*    CreateFontsLabelLayoutItem();
     48            BLayoutItem*    CreateFontsMenuBarLayoutItem();
     49
     50            BView*  GetPreviewBox();
     51           
    4252private:
    4353            void            _SelectCurrentFont(bool select);
    4454            void            _SelectCurrentSize(bool select);
     
    4757            void            _BuildSizesMenu();
    4858
    4959protected:
    50             float           fDivider;
    51 
    5260            BMenuField*     fFontsMenuField;
    5361            BMenuField*     fSizesMenuField;
    5462            BPopUpMenu*     fFontsMenu;
  • src/preferences/fonts/MainWindow.cpp

     
    77 *      DarkWyrm <bpmagic@columbus.rr.com>
    88 *      Axel Dörfler, axeld@pinc-software.de
    99 *      Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk>
     10 *      Philippe Saint-Pierre, stpere@gmail.com
    1011 */
    1112
    1213
     
    1819#include <MessageRunner.h>
    1920#include <Screen.h>
    2021#include <TabView.h>
     22#include <GroupLayoutBuilder.h>
     23#include <GridLayoutBuilder.h>
     24#include <SpaceLayoutItem.h>
     25#include <Alert.h>
     26#include <TextView.h>
     27#include <stdio.h>
    2128
    22 
    2329static const uint32 kMsgSetDefaults = 'dflt';
    2430static const uint32 kMsgRevert = 'rvrt';
    2531static const uint32 kMsgCheckFonts = 'chkf';
    2632
    2733
    2834MainWindow::MainWindow()
    29     : BWindow(BRect(100, 100, 445, 410), "Fonts", B_TITLED_WINDOW,
    30         B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE)
     35    : BWindow(BRect(0, 0, 1, 1), "Fonts", B_TITLED_WINDOW,
     36        B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS),
     37    fCentered(false)
    3138{
    32     BRect rect = Bounds();
    33     BView* view = new BView(rect, "background", B_FOLLOW_ALL, B_WILL_DRAW);
    34     view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
    35     AddChild(view);
    36 
    37     rect.left = 10;
    38     rect.top = rect.bottom - 10;
    39     fDefaultsButton = new BButton(rect, "defaults", "Defaults",
    40         new BMessage(kMsgSetDefaults), B_FOLLOW_LEFT
    41             | B_FOLLOW_BOTTOM, B_WILL_DRAW);
    42     fDefaultsButton->ResizeToPreferred();
     39    fDefaultsButton = new BButton("defaults", "Defaults",
     40        new BMessage(kMsgSetDefaults), B_WILL_DRAW);
    4341    fDefaultsButton->SetEnabled(false);
    44     float buttonHeight = fDefaultsButton->Bounds().Height();
    45     fDefaultsButton->MoveBy(0, -buttonHeight);
    46     view->AddChild(fDefaultsButton);
    4742
    48     rect = fDefaultsButton->Frame();
    49     rect.OffsetBy(fDefaultsButton->Bounds().Width() + 10, 0);
     43    fRevertButton = new BButton("revert", "Revert",
     44        new BMessage(kMsgRevert), B_WILL_DRAW);
     45    fRevertButton->SetEnabled(false);   
    5046
    51     fRevertButton = new BButton(rect, "revert", "Revert",
    52         new BMessage(kMsgRevert), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW);
    53     fRevertButton->ResizeToPreferred();
    54     fRevertButton->SetEnabled(false);
    55     view->AddChild(fRevertButton);
     47    BTabView *tabView = new BTabView("tabview", B_WIDTH_FROM_LABEL);
    5648
    57     rect = Bounds();
    58     rect.top += 5;
    59     rect.bottom -= 20 + buttonHeight;
    60     rect.left += 5;
    61     BTabView *tabView = new BTabView(rect, "tabview", B_WIDTH_FROM_LABEL);
     49    fFontsView = new FontView();
    6250
    63     rect = tabView->ContainerView()->Bounds().InsetByCopy(5, 8);
    64     fFontsView = new FontView(rect);
    65 
    6651    tabView->AddTab(fFontsView);
    6752
    6853    fFontsView->UpdateFonts();
    69     fFontsView->RelayoutIfNeeded();
    70     float width, height;
    71     fFontsView->GetPreferredSize(&width, &height);
    7254
    73     // make sure the tab is large enough for the fonts view
    74     float widthDiff = width + 10
    75         - tabView->ContainerView()->Bounds().Width();
    76     if (widthDiff > 0) {
    77         tabView->ResizeBy(widthDiff, 0);
    78         tabView->ContainerView()->ResizeBy(widthDiff, 0);
    79     }
     55    SetLayout(new BGroupLayout(B_VERTICAL));
    8056
    81     float heightDiff = height + 16
    82         - tabView->ContainerView()->Bounds().Height();
    83     if (heightDiff > 0) {
    84         tabView->ResizeBy(0, heightDiff);
    85         tabView->ContainerView()->ResizeBy(0, heightDiff);
    86     }
     57    AddChild(BGroupLayoutBuilder(B_VERTICAL)
     58        .Add(tabView)
     59        .Add(BGroupLayoutBuilder(B_HORIZONTAL)
     60            .Add(fDefaultsButton)
     61            .Add(fRevertButton)
     62            .Add(BSpaceLayoutItem::CreateGlue())
     63            .SetInsets(5, 5, 5, 5)
     64        )
     65        .SetInsets(5, 5, 5, 5)
     66    );
    8767
    88     ResizeTo(tabView->Bounds().Width() + 10, tabView->Frame().bottom + 20
    89         + buttonHeight);
    90     view->AddChild(tabView);
    91     fFontsView->ResizeToPreferred();
    92    
    93     SetSizeLimits(Bounds().Width(), 16347,
    94         Bounds().Height(), Bounds().Height());
    95 
    9668    if (fSettings.WindowCorner() == BPoint(-1, -1)) {
    9769        // center window on screen
    98         _Center();
     70        fCentered = true;
    9971    } else {
    10072        MoveTo(fSettings.WindowCorner());
    10173
    10274        // make sure window is on screen
    10375        BScreen screen(this);
    104         if (!screen.Frame().InsetByCopy(10, 10).Intersects(Frame()))
    105             _Center();
     76        if (!screen.Frame().InsetByCopy(10, 10).Intersects(Frame())) {
     77            fCentered = true;
     78        }
    10679    }
    10780
     81    if (fCentered) {
     82        // draw offscreen to avoid flashing windows
     83        MoveTo(BPoint(-1000, -1000));
     84    }
     85
    10886    fRunner = new BMessageRunner(this, new BMessage(kMsgCheckFonts), 3000000);
    10987        // every 3 seconds
    11088
     
    11290}
    11391
    11492
     93void
     94MainWindow::Show()
     95{
     96    BWindow::Show();
     97    if (fCentered) {
     98        _Center();
     99    }
     100}
     101
     102
    115103MainWindow::~MainWindow()
    116104{
    117105    delete fRunner;
     
    132120MainWindow::MessageReceived(BMessage *message)
    133121{
    134122    switch (message->what) {
     123        case kMsgSetSize:
     124        case kMsgSetFamily:
     125        case kMsgSetStyle:
     126            fFontsView->MessageReceived(message);
     127            break;
     128
    135129        case kMsgUpdate:
    136130            fDefaultsButton->SetEnabled(fFontsView->IsDefaultable());
    137131            fRevertButton->SetEnabled(fFontsView->IsRevertable());
     
    164158void
    165159MainWindow::_Center()
    166160{
    167     BScreen screen;
    168     BRect screenFrame = screen.Frame();
     161    BRect screenFrame = BScreen(this).Frame();
     162    BRect windowRect = Frame();
    169163
    170     MoveTo(screenFrame.left + (screenFrame.Width() - Bounds().Width()) / 2,
    171         screenFrame.top + (screenFrame.Height() - Bounds().Height()) / 2);
     164    MoveTo(
     165        (screenFrame.Width() - windowRect.Width())  / 2,
     166        (screenFrame.Height() - windowRect.Height()) / 2);
    172167}