xref: /haiku/src/apps/deskcalc/InputTextView.cpp (revision d9385a9d38cfb73714aa3939a928b7e952015dff)
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(&copy);
113b4d21c83SStephan Aßmus 	}
114b4d21c83SStephan Aßmus 	return B_BAD_VALUE;
115b4d21c83SStephan Aßmus }
116