xref: /haiku/src/apps/resedit/MiscEditors.cpp (revision 22440f4105cafc95cc1d49f9bc65bb395c527d86)
1 /*
2  * Copyright (c) 2005-2010, Haiku, Inc.
3  * Distributed under the terms of the MIT license.
4  *
5  * Author:
6  *		DarkWyrm <darkwyrm@gmail.com>
7  */
8 #include "InternalEditors.h"
9 #include "ResourceData.h"
10 
11 #include <Message.h>
12 #include <Messenger.h>
13 #include <ScrollView.h>
14 #include <String.h>
15 
16 #include <stdlib.h>
17 
18 StringEditor::StringEditor(const BRect &frame, ResourceData *data,
19 							BHandler *owner)
20   :	Editor(frame, data, owner)
21 {
22 	if (data->GetName())
23 		SetTitle(data->GetName());
24 
25 	fView = new StringEditView(Bounds());
26 	AddChild(fView);
27 
28 	if (data->IsAttribute())
29 		fView->EnableID(false);
30 	else
31 		fView->SetID(data->GetIDString());
32 	fView->SetName(data->GetName());
33 	fView->SetValue(data->GetData());
34 }
35 
36 
37 void
38 StringEditor::MessageReceived(BMessage *msg)
39 {
40 	if (msg->what == M_UPDATE_RESOURCE) {
41 		// We have to have an ID, so if the squirrely developer didn't give us
42 		// one, don't do anything
43 		if (fView->GetID()) {
44 			int32 newid = atol(fView->GetID());
45 			GetData()->SetID(newid);
46 		}
47 		GetData()->SetName(fView->GetName());
48 		GetData()->SetData(fView->GetValue(), strlen(fView->GetValue()));
49 
50 		BMessage updatemsg(M_UPDATE_RESOURCE);
51 		updatemsg.AddPointer("item", GetData());
52 		BMessenger msgr(GetOwner());
53 		msgr.SendMessage(&updatemsg);
54 		PostMessage(B_QUIT_REQUESTED);
55 
56 	} else {
57 		Editor::MessageReceived(msg);
58 	}
59 }
60 
61 
62 Editor::Editor(const BRect &frame, ResourceData *data, BHandler *owner)
63   :	BWindow(frame, "Untitled", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS),
64   	fResData(data),
65   	fOwner(owner)
66 {
67 }
68 
69 
70 Editor::~Editor(void)
71 {
72 }
73 
74 
75 StringEditView::StringEditView(const BRect &frame)
76   :	BView(frame, "edit", B_FOLLOW_ALL, B_WILL_DRAW)
77 {
78 	SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
79 
80 	BRect r;
81 
82 	float labelwidth = be_plain_font->StringWidth("ID: ");
83 	float strwidth = be_plain_font->StringWidth("(attr) ");
84 
85 	font_height fh;
86 	be_plain_font->GetHeight(&fh);
87 	float strheight = fh.ascent + fh.descent + fh.leading + 5;
88 
89 	fIDBox = new BTextControl(BRect(10, 10, 10 + (strwidth + labelwidth) + 15,
90 									10 + strheight),
91 							  "id", "ID: ", "", NULL);
92 	fIDBox->SetDivider(labelwidth + 5);
93 	AddChild(fIDBox);
94 
95 	r = fIDBox->Frame();
96 	r.OffsetBy(r.Width() + 10, 0);
97 	r.right = Bounds().right - 10;
98 	fNameBox = new BTextControl(r, "name", "Name: ", "", NULL,
99 								B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
100 	fNameBox->SetDivider(be_plain_font->StringWidth("Name: ") + 5);
101 	AddChild(fNameBox);
102 
103 	r.OffsetBy(0, r.Height() + 10);
104 	r.left = 10;
105 	r.right -= B_V_SCROLL_BAR_WIDTH;
106 	BRect textRect(r.OffsetToCopy(0.0, 0.0));
107 	textRect.InsetBy(5.0, 5.0);
108 	fValueView = new BTextView(r, "value", textRect, B_FOLLOW_ALL);
109 
110 	BScrollView *scrollView = new BScrollView("scrollView", fValueView,
111 												B_FOLLOW_ALL, 0, false, true);
112 	AddChild(scrollView);
113 
114 	fOK = new BButton(BRect(10, 10, 11, 11), "ok", "Cancel", new BMessage(M_UPDATE_RESOURCE),
115 					  B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
116 	fOK->ResizeToPreferred();
117 	fOK->SetLabel("OK");
118 	AddChild(fOK);
119 
120 	fOK->MoveTo(r.right - fOK->Bounds().Width(), r.bottom + 10);
121 	r = fOK->Frame();
122 	r.OffsetBy(-r.Width() - 10, 0);
123 	fCancel = new BButton(r, "cancel", "Cancel", new BMessage(B_QUIT_REQUESTED),
124 					  B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
125 	AddChild(fCancel);
126 }
127 
128 
129 StringEditView::~StringEditView(void)
130 {
131 }
132 
133 
134 void
135 StringEditView::AttachedToWindow(void)
136 {
137 	if (Bounds().Height() < fCancel->Frame().bottom + 10) {
138 		BView *view = FindView("scrollView");
139 		view->SetResizingMode(B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
140 		fOK->SetResizingMode(B_FOLLOW_RIGHT);
141 		fCancel->SetResizingMode(B_FOLLOW_RIGHT);
142 		Window()->ResizeTo(Window()->Bounds().Width(), fCancel->Frame().bottom + 10);
143 		view->SetResizingMode(B_FOLLOW_ALL);
144 		fOK->SetResizingMode(B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
145 		fCancel->SetResizingMode(B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
146 	}
147 
148 	Window()->SetSizeLimits(Window()->Bounds().Width(), 30000,
149 							Window()->Bounds().Height(), 30000);
150 }
151 
152 
153 float
154 StringEditView::GetPreferredWidth(void) const
155 {
156 	float idwidth = be_plain_font->StringWidth("ID: ") +
157 					be_plain_font->StringWidth("(attr) ") + 15.0;
158 	float namewidth = be_plain_font->StringWidth("Name: ") +
159 					be_plain_font->StringWidth(fNameBox->Text()) + 15.0;
160 	return idwidth + namewidth + 100;
161 }
162 
163 
164 float
165 StringEditView::GetPreferredHeight(void) const
166 {
167 	font_height fh;
168 	be_plain_font->GetHeight(&fh);
169 	float strheight = fh.ascent + fh.descent + fh.leading + 5;
170 	float lineCount = fValueView->CountLines() < 5.0 ? fValueView->CountLines() : 5.0;
171 	return fOK->Frame().Height() + (strheight * lineCount) + 40.0;
172 }
173 
174