152a38012Sejakowatz //------------------------------------------------------------------------------ 2*058691d4SStefano Ceccherini // Copyright (c) 2001-2004, Haiku, Inc. 352a38012Sejakowatz // 452a38012Sejakowatz // Permission is hereby granted, free of charge, to any person obtaining a 552a38012Sejakowatz // copy of this software and associated documentation files (the "Software"), 652a38012Sejakowatz // to deal in the Software without restriction, including without limitation 752a38012Sejakowatz // the rights to use, copy, modify, merge, publish, distribute, sublicense, 852a38012Sejakowatz // and/or sell copies of the Software, and to permit persons to whom the 952a38012Sejakowatz // Software is furnished to do so, subject to the following conditions: 1052a38012Sejakowatz // 1152a38012Sejakowatz // The above copyright notice and this permission notice shall be included in 1252a38012Sejakowatz // all copies or substantial portions of the Software. 1352a38012Sejakowatz // 1452a38012Sejakowatz // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1552a38012Sejakowatz // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1652a38012Sejakowatz // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1752a38012Sejakowatz // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1852a38012Sejakowatz // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 1952a38012Sejakowatz // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2052a38012Sejakowatz // DEALINGS IN THE SOFTWARE. 2152a38012Sejakowatz // 2252a38012Sejakowatz // File Name: TextControl.cpp 2352a38012Sejakowatz // Author: Frans van Nispen (xlr8@tref.nl) 2452a38012Sejakowatz // Description: BTextControl displays text that can act like a control. 2552a38012Sejakowatz //------------------------------------------------------------------------------ 2652a38012Sejakowatz #include <stdio.h> 2752a38012Sejakowatz 28*058691d4SStefano Ceccherini #include <Message.h> 2952a38012Sejakowatz #include <TextControl.h> 3052a38012Sejakowatz #include <Window.h> 3152a38012Sejakowatz 3252a38012Sejakowatz #include "TextInput.h" 3352a38012Sejakowatz 3452a38012Sejakowatz 3552a38012Sejakowatz BTextControl::BTextControl(BRect frame, const char *name, const char *label, 3652a38012Sejakowatz const char *text, BMessage *message, uint32 mask, 3752a38012Sejakowatz uint32 flags) 389cb2dbe2SMarc Flerackers : BControl(frame, name, label, message, mask, flags | B_FRAME_EVENTS) 3952a38012Sejakowatz { 409cb2dbe2SMarc Flerackers InitData(label, text); 4152a38012Sejakowatz 429cb2dbe2SMarc Flerackers BRect bounds(Bounds()); 4352a38012Sejakowatz 449cb2dbe2SMarc Flerackers font_height fh; 459cb2dbe2SMarc Flerackers GetFontHeight(&fh); 4652a38012Sejakowatz 479cb2dbe2SMarc Flerackers float height = (float)ceil(fh.ascent + fh.descent + fh.leading); 489cb2dbe2SMarc Flerackers float lineHeight = fText->LineHeight(0); 4952a38012Sejakowatz 509cb2dbe2SMarc Flerackers ResizeTo(bounds.Width(), height + 8); 5152a38012Sejakowatz 529cb2dbe2SMarc Flerackers BRect textBounds(fText->Bounds()); 539cb2dbe2SMarc Flerackers 549cb2dbe2SMarc Flerackers fText->ResizeTo(textBounds.Width(), lineHeight + 4); 559cb2dbe2SMarc Flerackers fText->MoveBy(0, (bounds.Height() - height) / 2.0f); 5652a38012Sejakowatz } 57*058691d4SStefano Ceccherini 58*058691d4SStefano Ceccherini 5952a38012Sejakowatz BTextControl::~BTextControl() 6052a38012Sejakowatz { 619cb2dbe2SMarc Flerackers SetModificationMessage(NULL); 6252a38012Sejakowatz } 63*058691d4SStefano Ceccherini 64*058691d4SStefano Ceccherini 6552a38012Sejakowatz BTextControl::BTextControl(BMessage *data) 6652a38012Sejakowatz : BControl(data) 6752a38012Sejakowatz { 689cb2dbe2SMarc Flerackers InitData(Label(), NULL, data); 6952a38012Sejakowatz 709cb2dbe2SMarc Flerackers int32 _a_label = B_ALIGN_LEFT; 719cb2dbe2SMarc Flerackers int32 _a_text = B_ALIGN_LEFT; 7252a38012Sejakowatz 739cb2dbe2SMarc Flerackers if (data->HasInt32("_a_label")) 749cb2dbe2SMarc Flerackers data->FindInt32("_a_label", &_a_label); 7552a38012Sejakowatz 769cb2dbe2SMarc Flerackers if (data->HasInt32("_a_text")) 779cb2dbe2SMarc Flerackers data->FindInt32("_a_text", &_a_text); 7852a38012Sejakowatz 799cb2dbe2SMarc Flerackers SetAlignment((alignment)_a_label, (alignment)_a_text); 809cb2dbe2SMarc Flerackers 819cb2dbe2SMarc Flerackers if (data->HasFloat("_divide")) 829cb2dbe2SMarc Flerackers data->FindFloat("_a_text", &fDivider); 839cb2dbe2SMarc Flerackers 84*058691d4SStefano Ceccherini if (data->HasMessage("_mod_msg")) { 859cb2dbe2SMarc Flerackers BMessage *_mod_msg = new BMessage; 869cb2dbe2SMarc Flerackers data->FindMessage("_mod_msg", _mod_msg); 879cb2dbe2SMarc Flerackers SetModificationMessage(_mod_msg); 889cb2dbe2SMarc Flerackers } 8952a38012Sejakowatz } 90*058691d4SStefano Ceccherini 91*058691d4SStefano Ceccherini 92*058691d4SStefano Ceccherini BArchivable * 93*058691d4SStefano Ceccherini BTextControl::Instantiate(BMessage *archive) 9452a38012Sejakowatz { 959cb2dbe2SMarc Flerackers if (validate_instantiation(archive, "BTextControl")) 969cb2dbe2SMarc Flerackers return new BTextControl(archive); 979cb2dbe2SMarc Flerackers else 9852a38012Sejakowatz return NULL; 9952a38012Sejakowatz } 100*058691d4SStefano Ceccherini 101*058691d4SStefano Ceccherini 102*058691d4SStefano Ceccherini status_t 103*058691d4SStefano Ceccherini BTextControl::Archive(BMessage *data, bool deep) const 10452a38012Sejakowatz { 1059cb2dbe2SMarc Flerackers BView::Archive(data, deep); 10652a38012Sejakowatz 107*058691d4SStefano Ceccherini alignment labelAlignment, textAlignment; 10852a38012Sejakowatz 109*058691d4SStefano Ceccherini GetAlignment(&labelAlignment, &textAlignment); 1109cb2dbe2SMarc Flerackers 111*058691d4SStefano Ceccherini data->AddInt32("_a_label", labelAlignment); 112*058691d4SStefano Ceccherini data->AddInt32("_a_text", textAlignment); 1139cb2dbe2SMarc Flerackers data->AddFloat("_divide", Divider()); 1149cb2dbe2SMarc Flerackers 1159cb2dbe2SMarc Flerackers if (ModificationMessage()) 1169cb2dbe2SMarc Flerackers data->AddMessage("_mod_msg", ModificationMessage()); 1179cb2dbe2SMarc Flerackers 1189cb2dbe2SMarc Flerackers return B_OK; 11952a38012Sejakowatz } 120*058691d4SStefano Ceccherini 121*058691d4SStefano Ceccherini 122*058691d4SStefano Ceccherini void 123*058691d4SStefano Ceccherini BTextControl::SetText(const char *text) 12452a38012Sejakowatz { 1259cb2dbe2SMarc Flerackers if (InvokeKind() != B_CONTROL_INVOKED) 1269cb2dbe2SMarc Flerackers return; 1279cb2dbe2SMarc Flerackers 12852a38012Sejakowatz fText->SetText(text); 1299cb2dbe2SMarc Flerackers 1309cb2dbe2SMarc Flerackers if (IsFocus()) 1319cb2dbe2SMarc Flerackers fText->SetInitialText(); 1329cb2dbe2SMarc Flerackers 1339cb2dbe2SMarc Flerackers fText->Invalidate(); 13452a38012Sejakowatz } 135*058691d4SStefano Ceccherini 136*058691d4SStefano Ceccherini 137*058691d4SStefano Ceccherini const char * 138*058691d4SStefano Ceccherini BTextControl::Text() const 13952a38012Sejakowatz { 14052a38012Sejakowatz return fText->Text(); 14152a38012Sejakowatz } 142*058691d4SStefano Ceccherini 143*058691d4SStefano Ceccherini 144*058691d4SStefano Ceccherini void 145*058691d4SStefano Ceccherini BTextControl::SetValue(int32 value) 14652a38012Sejakowatz { 1479cb2dbe2SMarc Flerackers BControl::SetValue(value); 14852a38012Sejakowatz } 149*058691d4SStefano Ceccherini 150*058691d4SStefano Ceccherini 151*058691d4SStefano Ceccherini status_t 152*058691d4SStefano Ceccherini BTextControl::Invoke(BMessage *message) 15352a38012Sejakowatz { 154*058691d4SStefano Ceccherini return BControl::Invoke(message); 15552a38012Sejakowatz } 156*058691d4SStefano Ceccherini 157*058691d4SStefano Ceccherini 158*058691d4SStefano Ceccherini BTextView * 159*058691d4SStefano Ceccherini BTextControl::TextView() const 16052a38012Sejakowatz { 1619cb2dbe2SMarc Flerackers return fText; 16252a38012Sejakowatz } 163*058691d4SStefano Ceccherini 164*058691d4SStefano Ceccherini 165*058691d4SStefano Ceccherini void 166*058691d4SStefano Ceccherini BTextControl::SetModificationMessage(BMessage *message) 16752a38012Sejakowatz { 1689cb2dbe2SMarc Flerackers if (fModificationMessage) 1699cb2dbe2SMarc Flerackers delete fModificationMessage; 1709cb2dbe2SMarc Flerackers 17152a38012Sejakowatz fModificationMessage = message; 17252a38012Sejakowatz } 173*058691d4SStefano Ceccherini 174*058691d4SStefano Ceccherini 175*058691d4SStefano Ceccherini BMessage * 176*058691d4SStefano Ceccherini BTextControl::ModificationMessage() const 17752a38012Sejakowatz { 17852a38012Sejakowatz return fModificationMessage; 17952a38012Sejakowatz } 180*058691d4SStefano Ceccherini 181*058691d4SStefano Ceccherini 182*058691d4SStefano Ceccherini void 183*058691d4SStefano Ceccherini BTextControl::SetAlignment(alignment labelAlignment, alignment textAlignment) 18452a38012Sejakowatz { 185*058691d4SStefano Ceccherini fText->SetAlignment(textAlignment); 1869cb2dbe2SMarc Flerackers fText->AlignTextRect(); 1879cb2dbe2SMarc Flerackers 188*058691d4SStefano Ceccherini if (fLabelAlign != labelAlignment) { 189*058691d4SStefano Ceccherini fLabelAlign = labelAlignment; 1909cb2dbe2SMarc Flerackers Invalidate(); 1919cb2dbe2SMarc Flerackers } 19252a38012Sejakowatz } 193*058691d4SStefano Ceccherini 194*058691d4SStefano Ceccherini 195*058691d4SStefano Ceccherini void 196*058691d4SStefano Ceccherini BTextControl::GetAlignment(alignment *label, alignment *text) const 19752a38012Sejakowatz { 198*058691d4SStefano Ceccherini if (label) 19952a38012Sejakowatz *label = fLabelAlign; 200*058691d4SStefano Ceccherini if (text) 20152a38012Sejakowatz *text = fText->Alignment(); 20252a38012Sejakowatz } 2039cb2dbe2SMarc Flerackers 204*058691d4SStefano Ceccherini 205*058691d4SStefano Ceccherini void 206*058691d4SStefano Ceccherini BTextControl::SetDivider(float dividingLine) 207*058691d4SStefano Ceccherini { 208*058691d4SStefano Ceccherini float dx = fDivider - dividingLine; 209*058691d4SStefano Ceccherini 210*058691d4SStefano Ceccherini fDivider = dividingLine; 21152a38012Sejakowatz 2129cb2dbe2SMarc Flerackers fText->MoveBy(-dx, 0.0f); 2139cb2dbe2SMarc Flerackers fText->ResizeBy(dx, 0.0f); 21452a38012Sejakowatz 215*058691d4SStefano Ceccherini if (Window()) { 21652a38012Sejakowatz fText->Invalidate(); 21752a38012Sejakowatz Invalidate(); 21852a38012Sejakowatz } 2199cb2dbe2SMarc Flerackers } 220*058691d4SStefano Ceccherini 221*058691d4SStefano Ceccherini 222*058691d4SStefano Ceccherini float 223*058691d4SStefano Ceccherini BTextControl::Divider() const 22452a38012Sejakowatz { 22552a38012Sejakowatz return fDivider; 22652a38012Sejakowatz } 227*058691d4SStefano Ceccherini 228*058691d4SStefano Ceccherini 229*058691d4SStefano Ceccherini void 230*058691d4SStefano Ceccherini BTextControl::Draw(BRect updateRect) 23152a38012Sejakowatz { 2329cb2dbe2SMarc Flerackers rgb_color no_tint = ui_color(B_PANEL_BACKGROUND_COLOR), 2339cb2dbe2SMarc Flerackers lighten1 = tint_color(no_tint, B_LIGHTEN_1_TINT), 2349cb2dbe2SMarc Flerackers lighten2 = tint_color(no_tint, B_LIGHTEN_2_TINT), 2359cb2dbe2SMarc Flerackers lightenmax = tint_color(no_tint, B_LIGHTEN_MAX_TINT), 2369cb2dbe2SMarc Flerackers darken1 = tint_color(no_tint, B_DARKEN_1_TINT), 2379cb2dbe2SMarc Flerackers darken2 = tint_color(no_tint, B_DARKEN_2_TINT), 2389cb2dbe2SMarc Flerackers darken4 = tint_color(no_tint, B_DARKEN_4_TINT), 2399cb2dbe2SMarc Flerackers darkenmax = tint_color(no_tint, B_DARKEN_MAX_TINT), 2409cb2dbe2SMarc Flerackers nav = ui_color(B_KEYBOARD_NAVIGATION_COLOR); 2419cb2dbe2SMarc Flerackers 2429cb2dbe2SMarc Flerackers bool enabled = IsEnabled(); 2439cb2dbe2SMarc Flerackers bool active = false; 2449cb2dbe2SMarc Flerackers 2459cb2dbe2SMarc Flerackers if (fText->IsFocus() && Window()->IsActive()) 2469cb2dbe2SMarc Flerackers active = true; 2479cb2dbe2SMarc Flerackers 2489cb2dbe2SMarc Flerackers BRect rect(fText->Frame()); 2499cb2dbe2SMarc Flerackers rect.InsetBy(-1.0f, -1.0f); 2509cb2dbe2SMarc Flerackers 251*058691d4SStefano Ceccherini if (active) { 2529cb2dbe2SMarc Flerackers SetHighColor(nav); 2539cb2dbe2SMarc Flerackers StrokeRect(rect); 254*058691d4SStefano Ceccherini 255*058691d4SStefano Ceccherini } else { 2569cb2dbe2SMarc Flerackers if (enabled) 2579cb2dbe2SMarc Flerackers SetHighColor(darken4); 2589cb2dbe2SMarc Flerackers else 2599cb2dbe2SMarc Flerackers SetHighColor(darken2); 2609cb2dbe2SMarc Flerackers 2619cb2dbe2SMarc Flerackers StrokeLine(rect.LeftTop(), rect.LeftBottom()); 2629cb2dbe2SMarc Flerackers StrokeLine(rect.LeftTop(), rect.RightTop()); 2639cb2dbe2SMarc Flerackers 2649cb2dbe2SMarc Flerackers SetHighColor(no_tint); 2659cb2dbe2SMarc Flerackers StrokeLine(BPoint(rect.left + 1.0f, rect.bottom), rect.RightBottom()); 2669cb2dbe2SMarc Flerackers StrokeLine(BPoint(rect.right, rect.top + 1.0f)); 2679cb2dbe2SMarc Flerackers } 2689cb2dbe2SMarc Flerackers 2699cb2dbe2SMarc Flerackers rect.InsetBy(-1.0f, -1.0f); 2709cb2dbe2SMarc Flerackers 2719cb2dbe2SMarc Flerackers if (enabled) 2729cb2dbe2SMarc Flerackers SetHighColor(darken1); 2739cb2dbe2SMarc Flerackers else 2749cb2dbe2SMarc Flerackers SetHighColor(no_tint); 2759cb2dbe2SMarc Flerackers 2769cb2dbe2SMarc Flerackers StrokeLine(rect.LeftBottom(), rect.LeftTop()); 2779cb2dbe2SMarc Flerackers StrokeLine(rect.RightTop()); 2789cb2dbe2SMarc Flerackers 2799cb2dbe2SMarc Flerackers if (enabled) 2809cb2dbe2SMarc Flerackers SetHighColor(lighten2); 2819cb2dbe2SMarc Flerackers else 2829cb2dbe2SMarc Flerackers SetHighColor(lighten1); 2839cb2dbe2SMarc Flerackers 2849cb2dbe2SMarc Flerackers StrokeLine(BPoint(rect.left + 1.0f, rect.bottom), rect.RightBottom()); 2859cb2dbe2SMarc Flerackers StrokeLine(BPoint(rect.right, rect.top + 1.0f), rect.RightBottom()); 28652a38012Sejakowatz 287*058691d4SStefano Ceccherini if (Label()) { 2889cb2dbe2SMarc Flerackers font_height fh; 2899cb2dbe2SMarc Flerackers GetFontHeight(&fh); 2909cb2dbe2SMarc Flerackers 2919cb2dbe2SMarc Flerackers float y = (float)ceil(fh.ascent + fh.descent + fh.leading) + 2.0f; 29252a38012Sejakowatz float x; 2939cb2dbe2SMarc Flerackers 294*058691d4SStefano Ceccherini switch (fLabelAlign) { 29552a38012Sejakowatz case B_ALIGN_RIGHT: 2969cb2dbe2SMarc Flerackers x = fDivider - StringWidth(Label()) - 3.0f; 29752a38012Sejakowatz break; 29852a38012Sejakowatz 29952a38012Sejakowatz case B_ALIGN_CENTER: 3009cb2dbe2SMarc Flerackers x = fDivider - StringWidth(Label()) / 2.0f; 30152a38012Sejakowatz break; 30252a38012Sejakowatz 30352a38012Sejakowatz default: 30452a38012Sejakowatz x = 3.0f; 30552a38012Sejakowatz break; 30652a38012Sejakowatz } 30752a38012Sejakowatz 30852a38012Sejakowatz SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 30952a38012Sejakowatz IsEnabled() ? B_DARKEN_MAX_TINT : B_DISABLED_LABEL_TINT)); 31052a38012Sejakowatz DrawString(Label(), BPoint(x, y)); 31152a38012Sejakowatz } 31252a38012Sejakowatz } 313*058691d4SStefano Ceccherini 314*058691d4SStefano Ceccherini 315*058691d4SStefano Ceccherini void 316*058691d4SStefano Ceccherini BTextControl::MouseDown(BPoint where) 31752a38012Sejakowatz { 318*058691d4SStefano Ceccherini if (!fText->IsFocus()) { 3199cb2dbe2SMarc Flerackers fText->MakeFocus(true); 3209cb2dbe2SMarc Flerackers fText->SelectAll(); 32152a38012Sejakowatz } 32252a38012Sejakowatz } 323*058691d4SStefano Ceccherini 324*058691d4SStefano Ceccherini 325*058691d4SStefano Ceccherini void 326*058691d4SStefano Ceccherini BTextControl::AttachedToWindow() 32752a38012Sejakowatz { 32852a38012Sejakowatz BControl::AttachedToWindow(); 32952a38012Sejakowatz 3309cb2dbe2SMarc Flerackers bool enabled = IsEnabled(); 3319cb2dbe2SMarc Flerackers rgb_color textColor; 3329cb2dbe2SMarc Flerackers rgb_color color = HighColor(); 3339cb2dbe2SMarc Flerackers BFont font; 3349cb2dbe2SMarc Flerackers 3359cb2dbe2SMarc Flerackers fText->GetFontAndColor(0, &font, &color); 3369cb2dbe2SMarc Flerackers 3379cb2dbe2SMarc Flerackers if (enabled) 3389cb2dbe2SMarc Flerackers textColor = color; 3399cb2dbe2SMarc Flerackers else 3409cb2dbe2SMarc Flerackers textColor = tint_color(color, B_LIGHTEN_2_TINT); 3419cb2dbe2SMarc Flerackers 3429cb2dbe2SMarc Flerackers fText->SetFontAndColor(&font, B_FONT_ALL, &textColor); 3439cb2dbe2SMarc Flerackers 344*058691d4SStefano Ceccherini if (enabled) { 3459cb2dbe2SMarc Flerackers color.red = 255; 3469cb2dbe2SMarc Flerackers color.green = 255; 3479cb2dbe2SMarc Flerackers color.blue = 255; 348*058691d4SStefano Ceccherini } else 3499cb2dbe2SMarc Flerackers color = tint_color(color, B_LIGHTEN_2_TINT); 3509cb2dbe2SMarc Flerackers 3519cb2dbe2SMarc Flerackers fText->SetViewColor(color); 3529cb2dbe2SMarc Flerackers fText->SetLowColor(color); 3539cb2dbe2SMarc Flerackers 3549cb2dbe2SMarc Flerackers fText->MakeEditable(enabled); 35552a38012Sejakowatz } 356*058691d4SStefano Ceccherini 357*058691d4SStefano Ceccherini 358*058691d4SStefano Ceccherini void 359*058691d4SStefano Ceccherini BTextControl::MakeFocus(bool state) 36052a38012Sejakowatz { 36152a38012Sejakowatz fText->MakeFocus(state); 3629cb2dbe2SMarc Flerackers 3639cb2dbe2SMarc Flerackers if (state) 3649cb2dbe2SMarc Flerackers fText->SelectAll(); 36552a38012Sejakowatz } 366*058691d4SStefano Ceccherini 367*058691d4SStefano Ceccherini 368*058691d4SStefano Ceccherini void 369*058691d4SStefano Ceccherini BTextControl::SetEnabled(bool state) 37052a38012Sejakowatz { 3719cb2dbe2SMarc Flerackers if (IsEnabled() == state) 3729cb2dbe2SMarc Flerackers return; 3739cb2dbe2SMarc Flerackers 374*058691d4SStefano Ceccherini if (Window()) { 3759cb2dbe2SMarc Flerackers fText->MakeEditable(state); 3769cb2dbe2SMarc Flerackers 3779cb2dbe2SMarc Flerackers rgb_color textColor; 3789cb2dbe2SMarc Flerackers rgb_color color = {0, 0, 0, 255}; 3799cb2dbe2SMarc Flerackers BFont font; 3809cb2dbe2SMarc Flerackers 3819cb2dbe2SMarc Flerackers fText->GetFontAndColor(0, &font, &color); 3829cb2dbe2SMarc Flerackers 3839cb2dbe2SMarc Flerackers if (state) 3849cb2dbe2SMarc Flerackers textColor = color; 3859cb2dbe2SMarc Flerackers else 3869cb2dbe2SMarc Flerackers textColor = tint_color(color, B_DISABLED_LABEL_TINT); 3879cb2dbe2SMarc Flerackers 3889cb2dbe2SMarc Flerackers fText->SetFontAndColor(&font, B_FONT_ALL, &textColor); 3899cb2dbe2SMarc Flerackers 390*058691d4SStefano Ceccherini if (state) { 3919cb2dbe2SMarc Flerackers color.red = 255; 3929cb2dbe2SMarc Flerackers color.green = 255; 3939cb2dbe2SMarc Flerackers color.blue = 255; 394*058691d4SStefano Ceccherini } else 3959cb2dbe2SMarc Flerackers color = tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), 3969cb2dbe2SMarc Flerackers B_LIGHTEN_2_TINT); 3979cb2dbe2SMarc Flerackers 3989cb2dbe2SMarc Flerackers fText->SetViewColor(color); 3999cb2dbe2SMarc Flerackers fText->SetLowColor(color); 4009cb2dbe2SMarc Flerackers 4019cb2dbe2SMarc Flerackers fText->Invalidate(); 4029cb2dbe2SMarc Flerackers Window()->UpdateIfNeeded(); 4039cb2dbe2SMarc Flerackers } 4049cb2dbe2SMarc Flerackers 40552a38012Sejakowatz BControl::SetEnabled(state); 40652a38012Sejakowatz } 407*058691d4SStefano Ceccherini 408*058691d4SStefano Ceccherini 409*058691d4SStefano Ceccherini void 410*058691d4SStefano Ceccherini BTextControl::GetPreferredSize(float *width, float *height) 41152a38012Sejakowatz { 41252a38012Sejakowatz BFont font; 41352a38012Sejakowatz GetFont(&font); 41452a38012Sejakowatz font_height fh; 41552a38012Sejakowatz font.GetHeight(&fh); 41652a38012Sejakowatz 417*058691d4SStefano Ceccherini if (height) 4189cb2dbe2SMarc Flerackers *height = (float)ceil(fh.ascent + fh.descent + fh.leading) + 7.0f; 41952a38012Sejakowatz 42052a38012Sejakowatz // TODO: this one I need to find out 421*058691d4SStefano Ceccherini if (width) 4229cb2dbe2SMarc Flerackers *width = 4.0f + (float)ceil(font.StringWidth(Label()))*2.0f; 42352a38012Sejakowatz } 424*058691d4SStefano Ceccherini 425*058691d4SStefano Ceccherini 426*058691d4SStefano Ceccherini void 427*058691d4SStefano Ceccherini BTextControl::ResizeToPreferred() 42852a38012Sejakowatz { 429*058691d4SStefano Ceccherini float width, height; 430*058691d4SStefano Ceccherini GetPreferredSize(&width, &height); 431*058691d4SStefano Ceccherini BView::ResizeTo(width, height); 43252a38012Sejakowatz } 433*058691d4SStefano Ceccherini 434*058691d4SStefano Ceccherini 435*058691d4SStefano Ceccherini void 436*058691d4SStefano Ceccherini BTextControl::SetFlags(uint32 flags) 43752a38012Sejakowatz { 438*058691d4SStefano Ceccherini if (!fSkipSetFlags) { 4399cb2dbe2SMarc Flerackers // If the textview is navigable, set it to not navigable if needed 4409cb2dbe2SMarc Flerackers // Else if it is not navigable, set it to navigable if needed 441*058691d4SStefano Ceccherini if (fText->Flags() & B_NAVIGABLE) { 4429cb2dbe2SMarc Flerackers if (!(flags & B_NAVIGABLE)) 4439cb2dbe2SMarc Flerackers fText->SetFlags(fText->Flags() & ~B_NAVIGABLE); 444*058691d4SStefano Ceccherini 445*058691d4SStefano Ceccherini } else { 4469cb2dbe2SMarc Flerackers if (flags & B_NAVIGABLE) 4479cb2dbe2SMarc Flerackers fText->SetFlags(fText->Flags() | B_NAVIGABLE); 4489cb2dbe2SMarc Flerackers } 4499cb2dbe2SMarc Flerackers 4509cb2dbe2SMarc Flerackers // Don't make this one navigable 4519cb2dbe2SMarc Flerackers flags &= ~B_NAVIGABLE; 4529cb2dbe2SMarc Flerackers } 4539cb2dbe2SMarc Flerackers 45452a38012Sejakowatz BView::SetFlags(flags); 45552a38012Sejakowatz } 456*058691d4SStefano Ceccherini 457*058691d4SStefano Ceccherini 458*058691d4SStefano Ceccherini void 459*058691d4SStefano Ceccherini BTextControl::MessageReceived(BMessage *msg) 46052a38012Sejakowatz { 461*058691d4SStefano Ceccherini switch(msg->what) { 4629cb2dbe2SMarc Flerackers case B_SET_PROPERTY: 4639cb2dbe2SMarc Flerackers case B_GET_PROPERTY: 4649cb2dbe2SMarc Flerackers // TODO 46552a38012Sejakowatz break; 46652a38012Sejakowatz default: 46752a38012Sejakowatz BControl::MessageReceived(msg); 46852a38012Sejakowatz break; 46952a38012Sejakowatz } 47052a38012Sejakowatz } 471*058691d4SStefano Ceccherini 472*058691d4SStefano Ceccherini 473*058691d4SStefano Ceccherini BHandler * 474*058691d4SStefano Ceccherini BTextControl::ResolveSpecifier(BMessage *msg, int32 index, 47552a38012Sejakowatz BMessage *specifier, int32 form, 47652a38012Sejakowatz const char *property) 47752a38012Sejakowatz { 4789cb2dbe2SMarc Flerackers /* 4799cb2dbe2SMarc Flerackers BPropertyInfo propInfo(prop_list); 4809cb2dbe2SMarc Flerackers BHandler *target = NULL; 4819cb2dbe2SMarc Flerackers 4829cb2dbe2SMarc Flerackers if (propInfo.FindMatch(message, 0, specifier, what, property) < B_OK) 4839cb2dbe2SMarc Flerackers return BControl::ResolveSpecifier(message, index, specifier, what, 4849cb2dbe2SMarc Flerackers property); 4859cb2dbe2SMarc Flerackers else 4869cb2dbe2SMarc Flerackers return this; 4879cb2dbe2SMarc Flerackers */ 4889cb2dbe2SMarc Flerackers return BControl::ResolveSpecifier(msg, index, specifier, form, property); 48952a38012Sejakowatz } 490*058691d4SStefano Ceccherini 491*058691d4SStefano Ceccherini 492*058691d4SStefano Ceccherini status_t 493*058691d4SStefano Ceccherini BTextControl::GetSupportedSuites(BMessage *data) 49452a38012Sejakowatz { 4959cb2dbe2SMarc Flerackers return BControl::GetSupportedSuites(data); 49652a38012Sejakowatz } 497*058691d4SStefano Ceccherini 498*058691d4SStefano Ceccherini 499*058691d4SStefano Ceccherini void 500*058691d4SStefano Ceccherini BTextControl::MouseUp(BPoint pt) 50152a38012Sejakowatz { 50252a38012Sejakowatz BControl::MouseUp(pt); 50352a38012Sejakowatz } 504*058691d4SStefano Ceccherini 505*058691d4SStefano Ceccherini 506*058691d4SStefano Ceccherini void 507*058691d4SStefano Ceccherini BTextControl::MouseMoved(BPoint pt, uint32 code, const BMessage *msg) 50852a38012Sejakowatz { 50952a38012Sejakowatz BControl::MouseMoved(pt, code, msg); 51052a38012Sejakowatz } 511*058691d4SStefano Ceccherini 512*058691d4SStefano Ceccherini 513*058691d4SStefano Ceccherini void 514*058691d4SStefano Ceccherini BTextControl::DetachedFromWindow() 51552a38012Sejakowatz { 51652a38012Sejakowatz BControl::DetachedFromWindow(); 51752a38012Sejakowatz } 518*058691d4SStefano Ceccherini 519*058691d4SStefano Ceccherini 520*058691d4SStefano Ceccherini void 521*058691d4SStefano Ceccherini BTextControl::AllAttached() 52252a38012Sejakowatz { 52352a38012Sejakowatz BControl::AllAttached(); 52452a38012Sejakowatz } 525*058691d4SStefano Ceccherini 526*058691d4SStefano Ceccherini 527*058691d4SStefano Ceccherini void 528*058691d4SStefano Ceccherini BTextControl::AllDetached() 52952a38012Sejakowatz { 53052a38012Sejakowatz BControl::AllDetached(); 53152a38012Sejakowatz } 532*058691d4SStefano Ceccherini 533*058691d4SStefano Ceccherini 534*058691d4SStefano Ceccherini void 535*058691d4SStefano Ceccherini BTextControl::FrameMoved(BPoint newPosition) 53652a38012Sejakowatz { 53752a38012Sejakowatz BControl::FrameMoved(newPosition); 53852a38012Sejakowatz } 539*058691d4SStefano Ceccherini 540*058691d4SStefano Ceccherini 541*058691d4SStefano Ceccherini void 542*058691d4SStefano Ceccherini BTextControl::FrameResized(float newWidth, float newHeight) 54352a38012Sejakowatz { 54452a38012Sejakowatz BControl::FrameResized(newWidth, newHeight); 54552a38012Sejakowatz } 546*058691d4SStefano Ceccherini 547*058691d4SStefano Ceccherini 548*058691d4SStefano Ceccherini void 549*058691d4SStefano Ceccherini BTextControl::WindowActivated(bool active) 55052a38012Sejakowatz { 5519cb2dbe2SMarc Flerackers if (fText->IsFocus()) 5529cb2dbe2SMarc Flerackers Draw(Bounds()); 55352a38012Sejakowatz } 554*058691d4SStefano Ceccherini 555*058691d4SStefano Ceccherini 556*058691d4SStefano Ceccherini status_t 557*058691d4SStefano Ceccherini BTextControl::Perform(perform_code d, void *arg) 55852a38012Sejakowatz { 55952a38012Sejakowatz return BControl::Perform(d, arg); 56052a38012Sejakowatz } 561*058691d4SStefano Ceccherini 562*058691d4SStefano Ceccherini 5639cb2dbe2SMarc Flerackers void BTextControl::_ReservedTextControl1() {} 5649cb2dbe2SMarc Flerackers void BTextControl::_ReservedTextControl2() {} 5659cb2dbe2SMarc Flerackers void BTextControl::_ReservedTextControl3() {} 5669cb2dbe2SMarc Flerackers void BTextControl::_ReservedTextControl4() {} 567*058691d4SStefano Ceccherini 568*058691d4SStefano Ceccherini 569*058691d4SStefano Ceccherini BTextControl & 570*058691d4SStefano Ceccherini BTextControl::operator=(const BTextControl&) 57152a38012Sejakowatz { 57252a38012Sejakowatz return *this; 57352a38012Sejakowatz } 574*058691d4SStefano Ceccherini 575*058691d4SStefano Ceccherini 576*058691d4SStefano Ceccherini void 577*058691d4SStefano Ceccherini BTextControl::CommitValue() 5789cb2dbe2SMarc Flerackers { 5799cb2dbe2SMarc Flerackers } 580*058691d4SStefano Ceccherini 581*058691d4SStefano Ceccherini 582*058691d4SStefano Ceccherini void 583*058691d4SStefano Ceccherini BTextControl::InitData(const char *label, const char *initial_text, 5849cb2dbe2SMarc Flerackers BMessage *data) 5859cb2dbe2SMarc Flerackers { 5869cb2dbe2SMarc Flerackers BRect bounds(Bounds()); 5879cb2dbe2SMarc Flerackers 5889cb2dbe2SMarc Flerackers fText = NULL; 5899cb2dbe2SMarc Flerackers //fLabel = NULL; 5909cb2dbe2SMarc Flerackers fModificationMessage = NULL; 5919cb2dbe2SMarc Flerackers fLabelAlign = B_ALIGN_LEFT; 5929cb2dbe2SMarc Flerackers fDivider = 0.0f; 5939cb2dbe2SMarc Flerackers fPrevWidth = 0; 5949cb2dbe2SMarc Flerackers fPrevHeight = 0; 5959cb2dbe2SMarc Flerackers //fClean = true; 5969cb2dbe2SMarc Flerackers fSkipSetFlags = false; 5979cb2dbe2SMarc Flerackers 5989cb2dbe2SMarc Flerackers int32 flags = 0; 5999cb2dbe2SMarc Flerackers 6009cb2dbe2SMarc Flerackers BFont font(be_bold_font); 6019cb2dbe2SMarc Flerackers 6029cb2dbe2SMarc Flerackers if (!data || !data->HasString("_fname")) 603*058691d4SStefano Ceccherini flags |= B_FONT_FAMILY_AND_STYLE; 6049cb2dbe2SMarc Flerackers 6059cb2dbe2SMarc Flerackers if (!data || !data->HasFloat("_fflt")) 606*058691d4SStefano Ceccherini flags |= B_FONT_SIZE; 6079cb2dbe2SMarc Flerackers 6089cb2dbe2SMarc Flerackers if (flags != 0) 6099cb2dbe2SMarc Flerackers SetFont(&font, flags); 6109cb2dbe2SMarc Flerackers 6119cb2dbe2SMarc Flerackers if (label) 6129cb2dbe2SMarc Flerackers fDivider = bounds.Width() / 2.0f; 6139cb2dbe2SMarc Flerackers 614*058691d4SStefano Ceccherini if (Flags() & B_NAVIGABLE) { 6159cb2dbe2SMarc Flerackers fSkipSetFlags = true; 6169cb2dbe2SMarc Flerackers SetFlags(Flags() & ~B_NAVIGABLE); 6179cb2dbe2SMarc Flerackers fSkipSetFlags = false; 6189cb2dbe2SMarc Flerackers } 6199cb2dbe2SMarc Flerackers 6209cb2dbe2SMarc Flerackers if (data) 621*058691d4SStefano Ceccherini fText = static_cast<_BTextInput_ *>(FindView("_input_")); 622*058691d4SStefano Ceccherini else { 6239cb2dbe2SMarc Flerackers BRect frame(fDivider, bounds.top + 2.0f, bounds.right - 2.0f, 6249cb2dbe2SMarc Flerackers bounds.bottom - 2.0f); 6259cb2dbe2SMarc Flerackers BRect textRect(frame.OffsetToCopy(0.0f, 0.0f)); 6269cb2dbe2SMarc Flerackers 6279cb2dbe2SMarc Flerackers fText = new _BTextInput_(frame, textRect, 6289cb2dbe2SMarc Flerackers B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW | B_FRAME_EVENTS | 6299cb2dbe2SMarc Flerackers B_NAVIGABLE); 6309cb2dbe2SMarc Flerackers 6319cb2dbe2SMarc Flerackers AddChild(fText); 6329cb2dbe2SMarc Flerackers 6339cb2dbe2SMarc Flerackers SetText(initial_text); 6349cb2dbe2SMarc Flerackers fText->SetAlignment(B_ALIGN_LEFT); 6359cb2dbe2SMarc Flerackers fText->AlignTextRect(); 6369cb2dbe2SMarc Flerackers } 6379cb2dbe2SMarc Flerackers } 638