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(©);
118128277c9SStephan Aßmus }
119128277c9SStephan Aßmus return B_BAD_VALUE;
120128277c9SStephan Aßmus }
121