xref: /haiku/src/kits/interface/TextControl.cpp (revision 058691d40979c8638e25331cbbce20547fc590fd)
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