1b4d21c83SStephan Aßmus /*
2b4d21c83SStephan Aßmus * Copyright 2006 Haiku, Inc. All Rights Reserved.
3b4d21c83SStephan Aßmus * Distributed under the terms of the MIT License.
4b4d21c83SStephan Aßmus *
5b4d21c83SStephan Aßmus * Authors:
6*b98de092SJohn Scipione * Stephan Aßmus, superstippi@gmx.de
7b4d21c83SStephan Aßmus */
8b4d21c83SStephan Aßmus
99f5d4ecdSJohn Scipione
10b4d21c83SStephan Aßmus #include "InputTextView.h"
11b4d21c83SStephan Aßmus
12b4d21c83SStephan Aßmus #include <stdio.h>
13b4d21c83SStephan Aßmus #include <stdlib.h>
14b4d21c83SStephan Aßmus
15b4d21c83SStephan Aßmus #include <String.h>
16b4d21c83SStephan Aßmus
17accec9a7SAlexandre Deckner
InputTextView(BRect frame,const char * name,BRect textRect,uint32 resizingMode,uint32 flags)18accec9a7SAlexandre Deckner InputTextView::InputTextView(BRect frame, const char* name, BRect textRect,
19accec9a7SAlexandre Deckner uint32 resizingMode, uint32 flags)
20accec9a7SAlexandre Deckner :
21accec9a7SAlexandre Deckner BTextView(frame, name, textRect, resizingMode, flags),
22b4d21c83SStephan Aßmus fWasFocus(false)
23b4d21c83SStephan Aßmus {
24b4d21c83SStephan Aßmus SetWordWrap(false);
25b4d21c83SStephan Aßmus }
26b4d21c83SStephan Aßmus
27accec9a7SAlexandre Deckner
~InputTextView()28b4d21c83SStephan Aßmus InputTextView::~InputTextView()
29b4d21c83SStephan Aßmus {
30b4d21c83SStephan Aßmus }
31b4d21c83SStephan Aßmus
32accec9a7SAlexandre Deckner
33b4d21c83SStephan Aßmus void
MouseDown(BPoint where)34b4d21c83SStephan Aßmus InputTextView::MouseDown(BPoint where)
35b4d21c83SStephan Aßmus {
36b4d21c83SStephan Aßmus // enforce the behaviour of a typical BTextControl
37b4d21c83SStephan Aßmus // only let the BTextView handle mouse up/down when
38b4d21c83SStephan Aßmus // it already had focus
39b4d21c83SStephan Aßmus fWasFocus = IsFocus();
40b4d21c83SStephan Aßmus if (fWasFocus) {
41b4d21c83SStephan Aßmus BTextView::MouseDown(where);
42b4d21c83SStephan Aßmus } else {
43b4d21c83SStephan Aßmus // forward click
44b4d21c83SStephan Aßmus if (BView* view = Parent()) {
45b4d21c83SStephan Aßmus view->MouseDown(ConvertToParent(where));
46b4d21c83SStephan Aßmus }
47b4d21c83SStephan Aßmus }
48b4d21c83SStephan Aßmus }
49b4d21c83SStephan Aßmus
50accec9a7SAlexandre Deckner
51b4d21c83SStephan Aßmus void
MouseUp(BPoint where)52b4d21c83SStephan Aßmus InputTextView::MouseUp(BPoint where)
53b4d21c83SStephan Aßmus {
54b4d21c83SStephan Aßmus // enforce the behaviour of a typical BTextControl
55b4d21c83SStephan Aßmus // only let the BTextView handle mouse up/down when
56b4d21c83SStephan Aßmus // it already had focus
57b4d21c83SStephan Aßmus if (fWasFocus)
58b4d21c83SStephan Aßmus BTextView::MouseUp(where);
59b4d21c83SStephan Aßmus }
60b4d21c83SStephan Aßmus
61accec9a7SAlexandre Deckner
62b4d21c83SStephan Aßmus void
KeyDown(const char * bytes,int32 numBytes)63b4d21c83SStephan Aßmus InputTextView::KeyDown(const char* bytes, int32 numBytes)
64b4d21c83SStephan Aßmus {
65b4d21c83SStephan Aßmus bool handled = true;
66b4d21c83SStephan Aßmus if (numBytes > 0) {
67b4d21c83SStephan Aßmus switch (bytes[0]) {
68b4d21c83SStephan Aßmus case B_ESCAPE:
69b4d21c83SStephan Aßmus // revert any typing changes
70b4d21c83SStephan Aßmus RevertChanges();
71b4d21c83SStephan Aßmus break;
72b4d21c83SStephan Aßmus case B_TAB:
73b4d21c83SStephan Aßmus // skip BTextView implementation
74b4d21c83SStephan Aßmus BView::KeyDown(bytes, numBytes);
75b4d21c83SStephan Aßmus // fall through
76b4d21c83SStephan Aßmus case B_RETURN:
77b4d21c83SStephan Aßmus ApplyChanges();
78b4d21c83SStephan Aßmus break;
79b4d21c83SStephan Aßmus default:
80b4d21c83SStephan Aßmus handled = false;
81b4d21c83SStephan Aßmus break;
82b4d21c83SStephan Aßmus }
83b4d21c83SStephan Aßmus }
84b4d21c83SStephan Aßmus if (!handled)
85b4d21c83SStephan Aßmus BTextView::KeyDown(bytes, numBytes);
86b4d21c83SStephan Aßmus }
87b4d21c83SStephan Aßmus
88accec9a7SAlexandre Deckner
89b4d21c83SStephan Aßmus void
MakeFocus(bool focus)90b4d21c83SStephan Aßmus InputTextView::MakeFocus(bool focus)
91b4d21c83SStephan Aßmus {
92b4d21c83SStephan Aßmus if (focus != IsFocus()) {
93b4d21c83SStephan Aßmus if (BView* view = Parent())
94b4d21c83SStephan Aßmus view->Invalidate();
95b4d21c83SStephan Aßmus BTextView::MakeFocus(focus);
96b4d21c83SStephan Aßmus if (focus)
97b4d21c83SStephan Aßmus SelectAll();
98b4d21c83SStephan Aßmus }
99b4d21c83SStephan Aßmus }
100b4d21c83SStephan Aßmus
101accec9a7SAlexandre Deckner
102b4d21c83SStephan Aßmus status_t
Invoke(BMessage * message)103b4d21c83SStephan Aßmus InputTextView::Invoke(BMessage* message)
104b4d21c83SStephan Aßmus {
105b4d21c83SStephan Aßmus if (!message)
106b4d21c83SStephan Aßmus message = Message();
107b4d21c83SStephan Aßmus
108b4d21c83SStephan Aßmus if (message) {
109b4d21c83SStephan Aßmus BMessage copy(*message);
110b4d21c83SStephan Aßmus copy.AddInt64("when", system_time());
111b4d21c83SStephan Aßmus copy.AddPointer("source", (BView*)this);
112b4d21c83SStephan Aßmus return BInvoker::Invoke(©);
113b4d21c83SStephan Aßmus }
114b4d21c83SStephan Aßmus return B_BAD_VALUE;
115b4d21c83SStephan Aßmus }
116