xref: /haiku/src/apps/icon-o-matic/generic/gui/InputTextView.cpp (revision d9385a9d38cfb73714aa3939a928b7e952015dff)
1128277c9SStephan Aßmus /*
228051eb0SStephan Aßmus  * Copyright 2006-2009, Stephan Aßmus <superstippi@gmx.de>.
328051eb0SStephan Aßmus  * All rights reserved. Distributed under the terms of the MIT License.
4128277c9SStephan Aßmus  */
5128277c9SStephan Aßmus 
6128277c9SStephan Aßmus #include "InputTextView.h"
7128277c9SStephan Aßmus 
8128277c9SStephan Aßmus #include <stdio.h>
9128277c9SStephan Aßmus #include <stdlib.h>
10128277c9SStephan Aßmus 
11128277c9SStephan Aßmus #include <String.h>
12128277c9SStephan Aßmus 
13128277c9SStephan Aßmus // constructor
InputTextView(BRect frame,const char * name,BRect textRect,uint32 resizingMode,uint32 flags)14128277c9SStephan Aßmus InputTextView::InputTextView(BRect frame, const char* name,
15128277c9SStephan Aßmus 							 BRect textRect,
16128277c9SStephan Aßmus 							 uint32 resizingMode,
17128277c9SStephan Aßmus 							 uint32 flags)
18128277c9SStephan Aßmus 	: BTextView(frame, name, textRect, resizingMode, flags),
19*d9385a9dSJohn Scipione 	  fWasFocus(false),
20*d9385a9dSJohn Scipione 	  fTextBeforeFocus("")
21128277c9SStephan Aßmus {
22128277c9SStephan Aßmus 	SetWordWrap(false);
23128277c9SStephan Aßmus }
24128277c9SStephan Aßmus 
25128277c9SStephan Aßmus // destructor
~InputTextView()26128277c9SStephan Aßmus InputTextView::~InputTextView()
27128277c9SStephan Aßmus {
28128277c9SStephan Aßmus }
29128277c9SStephan Aßmus 
30128277c9SStephan Aßmus // MouseDown
31128277c9SStephan Aßmus void
MouseDown(BPoint where)32128277c9SStephan Aßmus InputTextView::MouseDown(BPoint where)
33128277c9SStephan Aßmus {
34128277c9SStephan Aßmus 	// enforce the behaviour of a typical BTextControl
35128277c9SStephan Aßmus 	// only let the BTextView handle mouse up/down when
36128277c9SStephan Aßmus 	// it already had focus
37128277c9SStephan Aßmus 	fWasFocus = IsFocus();
38128277c9SStephan Aßmus 	if (fWasFocus) {
39128277c9SStephan Aßmus 		BTextView::MouseDown(where);
40128277c9SStephan Aßmus 	} else {
41128277c9SStephan Aßmus 		// forward click
42128277c9SStephan Aßmus 		if (BView* view = Parent()) {
43128277c9SStephan Aßmus 			view->MouseDown(ConvertToParent(where));
44128277c9SStephan Aßmus 		}
45128277c9SStephan Aßmus 	}
46128277c9SStephan Aßmus }
47128277c9SStephan Aßmus 
48128277c9SStephan Aßmus // MouseUp
49128277c9SStephan Aßmus void
MouseUp(BPoint where)50128277c9SStephan Aßmus InputTextView::MouseUp(BPoint where)
51128277c9SStephan Aßmus {
52128277c9SStephan Aßmus 	// enforce the behaviour of a typical BTextControl
53128277c9SStephan Aßmus 	// only let the BTextView handle mouse up/down when
54128277c9SStephan Aßmus 	// it already had focus
55128277c9SStephan Aßmus 	if (fWasFocus)
56128277c9SStephan Aßmus 		BTextView::MouseUp(where);
57128277c9SStephan Aßmus }
58128277c9SStephan Aßmus 
59128277c9SStephan Aßmus // KeyDown
60128277c9SStephan Aßmus void
KeyDown(const char * bytes,int32 numBytes)61128277c9SStephan Aßmus InputTextView::KeyDown(const char* bytes, int32 numBytes)
62128277c9SStephan Aßmus {
63128277c9SStephan Aßmus 	bool handled = true;
64128277c9SStephan Aßmus 	if (numBytes > 0) {
65128277c9SStephan Aßmus 		switch (bytes[0]) {
66128277c9SStephan Aßmus 			case B_ESCAPE:
67128277c9SStephan Aßmus 				// revert any typing changes
68128277c9SStephan Aßmus 				RevertChanges();
69532a044cSStephan Aßmus 				fTextBeforeFocus = Text();
70128277c9SStephan Aßmus 				break;
71128277c9SStephan Aßmus 			case B_RETURN:
72128277c9SStephan Aßmus 				ApplyChanges();
73532a044cSStephan Aßmus 				fTextBeforeFocus = Text();
74128277c9SStephan Aßmus 				break;
75128277c9SStephan Aßmus 			default:
76128277c9SStephan Aßmus 				handled = false;
77128277c9SStephan Aßmus 				break;
78128277c9SStephan Aßmus 		}
79128277c9SStephan Aßmus 	}
80128277c9SStephan Aßmus 	if (!handled)
81128277c9SStephan Aßmus 		BTextView::KeyDown(bytes, numBytes);
82128277c9SStephan Aßmus }
83128277c9SStephan Aßmus 
84128277c9SStephan Aßmus // MakeFocus
85128277c9SStephan Aßmus void
MakeFocus(bool focus)86128277c9SStephan Aßmus InputTextView::MakeFocus(bool focus)
87128277c9SStephan Aßmus {
8828051eb0SStephan Aßmus 	if (focus == IsFocus())
8928051eb0SStephan Aßmus 		return;
9028051eb0SStephan Aßmus 
91128277c9SStephan Aßmus 	if (BView* view = Parent())
92128277c9SStephan Aßmus 		view->Invalidate();
93128277c9SStephan Aßmus 	BTextView::MakeFocus(focus);
9428051eb0SStephan Aßmus 	if (focus) {
95128277c9SStephan Aßmus 		SelectAll();
9628051eb0SStephan Aßmus 		fTextBeforeFocus = Text();
9728051eb0SStephan Aßmus 	} else {
9828051eb0SStephan Aßmus 		// Only pressing ESC is supposed to revert to the previous
9928051eb0SStephan Aßmus 		// value and not invoke, but in that case, the text will already
10028051eb0SStephan Aßmus 		// be the previous value when we lose focus here.
10128051eb0SStephan Aßmus 		if (fTextBeforeFocus != Text())
10228051eb0SStephan Aßmus 			Invoke();
103128277c9SStephan Aßmus 	}
104128277c9SStephan Aßmus }
105128277c9SStephan Aßmus 
106128277c9SStephan Aßmus // Invoke
107128277c9SStephan Aßmus status_t
Invoke(BMessage * message)108128277c9SStephan Aßmus InputTextView::Invoke(BMessage* message)
109128277c9SStephan Aßmus {
110128277c9SStephan Aßmus 	if (!message)
111128277c9SStephan Aßmus 		message = Message();
112128277c9SStephan Aßmus 
113128277c9SStephan Aßmus 	if (message) {
114128277c9SStephan Aßmus 		BMessage copy(*message);
115128277c9SStephan Aßmus 		copy.AddInt64("when", system_time());
116128277c9SStephan Aßmus 		copy.AddPointer("source", (BView*)this);
117128277c9SStephan Aßmus 		return BInvoker::Invoke(&copy);
118128277c9SStephan Aßmus 	}
119128277c9SStephan Aßmus 	return B_BAD_VALUE;
120128277c9SStephan Aßmus }
121