1 /* 2 * Copyright 2001-2012, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Mark Hogben 7 * DarkWyrm <bpmagic@columbus.rr.com> 8 * Axel Dörfler, axeld@pinc-software.de 9 * Philippe St-Pierre, stpere@gmail.com 10 * Stephan Aßmus <superstippi@gmx.de> 11 */ 12 13 14 #include "FontView.h" 15 16 #include <string.h> 17 18 #include <Catalog.h> 19 #include <ControlLook.h> 20 #include <GridLayoutBuilder.h> 21 #include <GroupLayoutBuilder.h> 22 #include <Locale.h> 23 #include <MessageRunner.h> 24 #include <SpaceLayoutItem.h> 25 26 #include "APRWindow.h" 27 #include "FontSelectionView.h" 28 29 #undef B_TRANSLATION_CONTEXT 30 #define B_TRANSLATION_CONTEXT "Font view" 31 32 33 static const uint32 kMsgCheckFonts = 'chkf'; 34 35 36 static void 37 add_font_selection_view(BGridLayout* layout, FontSelectionView* view, 38 int32& row, bool withExtraSpace) 39 { 40 layout->AddItem(view->CreateFontsLabelLayoutItem(), 0, row); 41 layout->AddItem(view->CreateFontsMenuBarLayoutItem(), 1, row); 42 43 layout->AddItem(BSpaceLayoutItem::CreateGlue(), 2, row); 44 45 layout->AddView(view->GetFontSizeSpinner(), 4, row); 46 47 row++; 48 49 layout->AddItem(BSpaceLayoutItem::CreateGlue(), 0, row); 50 layout->AddView(view->GetPreviewBox(), 1, row, 4); 51 52 row++; 53 54 if (withExtraSpace) { 55 layout->AddItem(BSpaceLayoutItem::CreateVerticalStrut(5), 0, row, 5); 56 row++; 57 } 58 } 59 60 61 FontView::FontView(const char* name) 62 : 63 BView(name, B_WILL_DRAW ) 64 { 65 SetViewUIColor(B_PANEL_BACKGROUND_COLOR); 66 67 fPlainView = new FontSelectionView("plain", B_TRANSLATE("Plain font:")); 68 fBoldView = new FontSelectionView("bold", B_TRANSLATE("Bold font:")); 69 fFixedView = new FontSelectionView("fixed", B_TRANSLATE("Fixed font:")); 70 fMenuView = new FontSelectionView("menu", B_TRANSLATE("Menu font:")); 71 72 BGridLayout* layout = new BGridLayout(5, 5); 73 layout->SetInsets(B_USE_WINDOW_SPACING); 74 SetLayout(layout); 75 76 int32 row = 0; 77 add_font_selection_view(layout, fPlainView, row, true); 78 add_font_selection_view(layout, fBoldView, row, true); 79 add_font_selection_view(layout, fFixedView, row, true); 80 add_font_selection_view(layout, fMenuView, row, false); 81 } 82 83 84 void 85 FontView::AttachedToWindow() 86 { 87 fPlainView->SetTarget(this); 88 fBoldView->SetTarget(this); 89 fFixedView->SetTarget(this); 90 fMenuView->SetTarget(this); 91 92 UpdateFonts(); 93 fRunner = new BMessageRunner(this, new BMessage(kMsgCheckFonts), 3000000); 94 // every 3 seconds 95 } 96 97 98 void 99 FontView::DetachedFromWindow() 100 { 101 delete fRunner; 102 fRunner = NULL; 103 } 104 105 106 void 107 FontView::SetDefaults() 108 { 109 fPlainView->SetDefaults(); 110 fBoldView->SetDefaults(); 111 fFixedView->SetDefaults(); 112 fMenuView->SetDefaults(); 113 } 114 115 116 void 117 FontView::MessageReceived(BMessage* message) 118 { 119 switch (message->what) { 120 case kMsgSetSize: 121 case kMsgSetFamily: 122 case kMsgSetStyle: 123 { 124 const char* name; 125 if (message->FindString("name", &name) != B_OK) 126 break; 127 128 if (!strcmp(name, "plain")) 129 fPlainView->MessageReceived(message); 130 else if (!strcmp(name, "bold")) 131 fBoldView->MessageReceived(message); 132 else if (!strcmp(name, "fixed")) 133 fFixedView->MessageReceived(message); 134 else if (!strcmp(name, "menu")) 135 fMenuView->MessageReceived(message); 136 else 137 break; 138 139 Window()->PostMessage(kMsgUpdate); 140 break; 141 } 142 143 case kMsgCheckFonts: 144 if (update_font_families(true)) 145 UpdateFonts(); 146 break; 147 148 default: 149 BView::MessageReceived(message); 150 } 151 } 152 153 154 void 155 FontView::Revert() 156 { 157 fPlainView->Revert(); 158 fBoldView->Revert(); 159 fFixedView->Revert(); 160 fMenuView->Revert(); 161 } 162 163 164 void 165 FontView::UpdateFonts() 166 { 167 fPlainView->UpdateFontsMenu(); 168 fBoldView->UpdateFontsMenu(); 169 fFixedView->UpdateFontsMenu(); 170 fMenuView->UpdateFontsMenu(); 171 } 172 173 174 bool 175 FontView::IsDefaultable() 176 { 177 return fPlainView->IsDefaultable() 178 || fBoldView->IsDefaultable() 179 || fFixedView->IsDefaultable() 180 || fMenuView->IsDefaultable(); 181 } 182 183 184 bool 185 FontView::IsRevertable() 186 { 187 return fPlainView->IsRevertable() 188 || fBoldView->IsRevertable() 189 || fFixedView->IsRevertable() 190 || fMenuView->IsRevertable(); 191 } 192 193