xref: /haiku/src/apps/terminal/FindWindow.cpp (revision 204dee708a999d5a71d0cb9497650ee7cef85d0a)
1 /*
2  * Copyright 2007-2010, Haiku, Inc. All rights reserved.
3  * Copyright 2003-2004 Kian Duffy, myob@users.sourceforge.net
4  * Parts Copyright 1998-1999 Kazuho Okui and Takashi Murai.
5  * All rights reserved. Distributed under the terms of the MIT license.
6  */
7 
8 #include "FindWindow.h"
9 
10 
11 #include <Box.h>
12 #include <Button.h>
13 #include <Catalog.h>
14 #include <CheckBox.h>
15 #include <ControlLook.h>
16 #include <GridLayoutBuilder.h>
17 #include <GroupLayout.h>
18 #include <GroupLayoutBuilder.h>
19 #include <Locale.h>
20 #include <RadioButton.h>
21 #include <String.h>
22 #include <TextControl.h>
23 
24 
25 const uint32 MSG_FIND_HIDE = 'Fhid';
26 const uint32 TOGGLE_FIND_CONTROL = 'MTFG';
27 const BRect kWindowFrame(10, 30, 250, 200);
28 
29 #undef B_TRANSLATION_CONTEXT
30 #define B_TRANSLATION_CONTEXT "Terminal FindWindow"
31 
32 FindWindow::FindWindow(BMessenger messenger, const BString& str,
33 		bool findSelection, bool matchWord, bool matchCase, bool forwardSearch)
34 	:
35 	BWindow(kWindowFrame, B_TRANSLATE("Find"), B_FLOATING_WINDOW,
36 		B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_CLOSE_ON_ESCAPE
37 		| B_AUTO_UPDATE_SIZE_LIMITS),
38 	fFindDlgMessenger(messenger)
39 {
40 	SetLayout(new BGroupLayout(B_VERTICAL));
41 
42 	BBox *separator = new BBox("separator");
43 	separator->SetExplicitMinSize(BSize(250.0, B_SIZE_UNSET));
44 	separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1.0));
45 
46 	BRadioButton* useSelection = NULL;
47 	const float spacing = be_control_look->DefaultItemSpacing();
48 	AddChild(BGroupLayoutBuilder(B_VERTICAL, 5.0)
49 		.SetInsets(spacing, spacing, spacing, spacing)
50 		.Add(BGridLayoutBuilder()
51 			.Add(fTextRadio = new BRadioButton(B_TRANSLATE("Use text:"),
52 				new BMessage(TOGGLE_FIND_CONTROL)), 0, 0)
53 			.Add(fFindLabel = new BTextControl(NULL, NULL, NULL), 1, 0)
54 			.Add(useSelection = new BRadioButton(B_TRANSLATE("Use selection"),
55 				new BMessage(TOGGLE_FIND_CONTROL)), 0, 1))
56 		.Add(separator)
57 		.Add(fForwardSearchBox = new BCheckBox(B_TRANSLATE("Search forward")))
58 		.Add(fMatchCaseBox = new BCheckBox(B_TRANSLATE("Match case")))
59 		.Add(fMatchWordBox = new BCheckBox(B_TRANSLATE("Match word")))
60 		.Add(fFindButton = new BButton(B_TRANSLATE("Find"),
61 				new BMessage(MSG_FIND)))
62 		.TopView());
63 
64 	fFindLabel->SetDivider(0.0);
65 
66 	if (!findSelection) {
67 		fFindLabel->SetText(str.String());
68 		fFindLabel->MakeFocus(true);
69 	} else {
70 		fFindLabel->SetEnabled(false);
71 	}
72 
73 	if (findSelection)
74 		useSelection->SetValue(B_CONTROL_ON);
75 	else
76 		fTextRadio->SetValue(B_CONTROL_ON);
77 
78 	if (forwardSearch)
79 		fForwardSearchBox->SetValue(B_CONTROL_ON);
80 
81 	if (matchCase)
82 		fMatchCaseBox->SetValue(B_CONTROL_ON);
83 
84 	if (matchWord)
85 		fMatchWordBox->SetValue(B_CONTROL_ON);
86 
87 	fFindButton->MakeDefault(true);
88 
89 	AddShortcut((uint32)'W', B_COMMAND_KEY, new BMessage(MSG_FIND_HIDE));
90 
91 	Show();
92 }
93 
94 
95 FindWindow::~FindWindow()
96 {
97 }
98 
99 
100 void
101 FindWindow::MessageReceived(BMessage *msg)
102 {
103 	switch (msg->what) {
104 		case B_QUIT_REQUESTED:
105 			Quit();
106 			break;
107 
108 		case MSG_FIND:
109 			_SendFindMessage();
110 			break;
111 
112 		case MSG_FIND_HIDE:
113 			Quit();
114 			break;
115 
116 		case TOGGLE_FIND_CONTROL:
117 			fFindLabel->SetEnabled(fTextRadio->Value() == B_CONTROL_ON);
118 			break;
119 
120 		default:
121 			BWindow::MessageReceived(msg);
122 			break;
123 	}
124 }
125 
126 
127 void
128 FindWindow::Quit()
129 {
130 	fFindDlgMessenger.SendMessage(MSG_FIND_CLOSED);
131 	BWindow::Quit();
132 }
133 
134 
135 void
136 FindWindow::_SendFindMessage()
137 {
138 	BMessage message(MSG_FIND);
139 
140 	if (fTextRadio->Value() == B_CONTROL_ON) {
141 		message.AddString("findstring", fFindLabel->Text());
142 		message.AddBool("findselection", false);
143 	} else
144 		message.AddBool("findselection", true);
145 
146 	//Add the other parameters
147 	// TODO: "usetext" is never checked for elsewhere and seems
148 	// redundant with "findselection", why is it here?
149 	message.AddBool("usetext", fTextRadio->Value() == B_CONTROL_ON);
150 	message.AddBool("forwardsearch", fForwardSearchBox->Value() == B_CONTROL_ON);
151 	message.AddBool("matchcase", fMatchCaseBox->Value() == B_CONTROL_ON);
152 	message.AddBool("matchword", fMatchWordBox->Value() == B_CONTROL_ON);
153 
154 	fFindDlgMessenger.SendMessage(&message);
155 }
156