1 /*-
2  * Copyright (c) 2014-2018 Carsten Sonne Larsen <cs@innolan.net>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  * Project homepage:
26  * https://amath.innolan.net
27  *
28  */
29 
30 #include "amath.h"
31 #include "amathc.h"
32 #include "window_haiku.h"
33 #include "lib/charbuf.h"
34 #include "lib/aengine.h"
35 #include "main/evaluator.h"
36 #include "loc/text.h"
37 
38 //http://git.netsurf-browser.org/netsurf.git/plain/frontends/beos/about.cpp
39 //https://notabug.org/Tsyesika/Runyu/src/master/RunyuWindow.cpp
40 
41 #if defined(HAIKU)
42 
43 #if __GNUC__ == 2
44 #pragma GCC diagnostic ignored "-Wno-multichar"
45 #endif
46 
47 #include <Application.h>
48 #include <ScrollView.h>
49 #include <LayoutBuilder.h>
50 #include <MenuBar.h>
51 #include <Window.h>
52 #include <private/interface/AboutWindow.h>
53 
HaikuWindow(const char * prompt,CharValidator * validator)54 HaikuWindow::HaikuWindow(const char *prompt, CharValidator *validator) :
55     ConsoleBase(prompt),
56     BWindow(
57         BRect(150, 150, 800, 600),
58         TXTTITLE,
59         B_TITLED_WINDOW,
60         B_ASYNCHRONOUS_CONTROLS
61     )
62 {
63     BRect textRect = Bounds();
64     textRect.OffsetTo(0, 0);
65     textRect.InsetBy(5, 5);
66 
67     BFont font(be_fixed_font);
68     textView = new HaikuTextView(
69         this,
70         Bounds(),
71         "TextView",
72         textRect,
73         &font, 0);
74     textView->SetStylable(true);
75     DetachMemSafe(textView);
76 
77     BScrollView *scrollView = new BScrollView(
78         TXTTITLE "ScrollView",
79         textView,
80         B_FOLLOW_ALL,
81         0,
82         false,
83         true);
84     DetachMemSafe(scrollView);
85     AddChild(scrollView);
86 
87     /*
88     BMenuBar* menuBar = new BMenuBar("MenuBar");
89     BLayoutBuilder::Menu<>(menuBar)
90         .AddMenu("File")
91             .AddItem("About", B_ABOUT_REQUESTED)
92             .AddItem("Quit", B_QUIT_REQUESTED, 'Q')
93     .End();
94     DetachMemSafe(menuBar);
95 
96     BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
97             .SetInsets(0)
98             .Add(menuBar)
99             .Add(scrollView)
100     .End();
101     */
102 }
103 
~HaikuWindow(void)104 HaikuWindow::~HaikuWindow(void)
105 {
106 }
107 
Exit(void)108 void HaikuWindow::Exit(void)
109 {
110     be_app->PostMessage(B_QUIT_REQUESTED);
111 }
112 
Start(void)113 void HaikuWindow::Start(void)
114 {
115     textView->MakeFocus(true);
116     StartMessage();
117     Prompt();
118     Show();
119 }
120 
StartMessage(void)121 void HaikuWindow::StartMessage(void)
122 {
123     text_run run;
124     run.font = be_bold_font;
125     run.offset = 0;
126     run.color.red = 0;
127     run.color.green = 0;
128     run.color.blue = 0;
129     run.color.alpha = 255;
130 
131     text_run_array runArray;
132     runArray.count = 1;
133     runArray.runs[0] = run;
134 
135     textView->Insert(INTROMSG, &runArray);
136 }
137 
ShowAbout(void)138 void HaikuWindow::ShowAbout(void)
139 {
140     BAboutWindow* about = new BAboutWindow("About amath", "application/x-vnd.amath");
141     DetachMemSafe(about);
142 
143     CharBuffer *buf = new CharBuffer();
144     static const char* version = TXTTITLE SPACE RELDATESTAMP;
145     static const char* compiler = TXTCOMPMSG;
146     static const char* footer = "Details specified in license.";
147     int len = StrLen(version) + StrLen(compiler) + StrLen(footer) + 10;
148 
149     buf->EnsureSize(len);
150     buf->Append(version);
151     buf->Append(NEWLINE);
152     buf->Append(compiler);
153     buf->Append(NEWLINE);
154     buf->Append(NEWLINE);
155     buf->Append(footer);
156 
157     about->AddCopyright(2014, "Carsten Sonne Larsen");
158     about->AddExtraInfo(buf->GetString());
159     about->Show();
160 
161     delete buf;
162 }
163 
ShowLicense(void)164 void HaikuWindow::ShowLicense(void)
165 {
166     // TODO: Show license in colors
167     ConsoleBase::ShowLicense();
168 }
169 
ShowVersion(void)170 void HaikuWindow::ShowVersion(void)
171 {
172 	text_run run;
173 	run.font = be_bold_font;
174 	run.offset = 0;
175 	run.color.red = 34;
176 	run.color.green = 139;
177 	run.color.blue = 34;
178 	run.color.alpha = 255;
179 
180 	text_run_array runArray;
181 	runArray.count = 1;
182 	runArray.runs[0] = run;
183 
184 	textView->Insert(GetVersionText(), &runArray);
185     textView->Insert(NEWLINE);
186 
187     runArray.runs[0].font = be_plain_font;
188     runArray.runs[0].font.SetFace(B_REGULAR_FACE);
189 	runArray.runs[0].color.red = 0;
190 	runArray.runs[0].color.green = 0;
191 	runArray.runs[0].color.blue = 0;
192 
193     textView->Insert(GetCompilerText(), &runArray);
194     textView->Insert(NEWLINE);
195 }
196 
Clear(void)197 void HaikuWindow::Clear(void)
198 {
199     textView->SetText(EMPTYSTRING);
200 }
201 
WriteString(const char * string)202 void HaikuWindow::WriteString(const char *string)
203 {
204     text_run run;
205     run.font = be_fixed_font;
206     run.offset = 0;
207     run.color.red = 0;
208     run.color.green = 0;
209     run.color.blue = 0;
210     run.color.alpha = 255;
211 
212     text_run_array runArray;
213     runArray.count = 1;
214     runArray.runs[0] = run;
215 
216     textView->Insert(string, &runArray);
217 }
218 
Execute(void)219 void HaikuWindow::Execute(void)
220 {
221     int lineIndex = textView->CurrentLine();
222     int lineStart = textView->OffsetAt(lineIndex);
223     int lineCount = textView->CountLines();
224 
225     if (lineCount != lineIndex + 1)
226     {
227         return;
228     }
229 
230     int len = textView->TextLength() - lineStart;
231     char *line = new char[len + 1];
232     textView->GetText(lineStart, lineStart + len, line);
233     *(line + len) = '\0';
234 
235     char *input = line;
236     char *p = prompt;
237     while (*input == *p && *input != '\0')
238     {
239         input++;
240         p++;
241     }
242 
243     WriteString(NEWLINE);
244     Evaluator *evaluator = new Evaluator(input);
245     evaluator->Evaluate();
246     const char *out = evaluator->GetResult();
247     WriteString(out);
248 
249     delete evaluator;
250     delete line;
251 
252     Prompt();
253     textView->ScrollToOffset(textView->TextLength() - 1);
254 }
255 
MessageReceived(BMessage * msg)256 void HaikuWindow::MessageReceived(BMessage* msg)
257 {
258     switch (msg->what)
259     {
260             case B_ABOUT_REQUESTED:
261             ShowAbout();
262             break;
263         default:
264             BWindow::MessageReceived(msg);
265             break;
266     }
267 }
268 
FrameResized(float w,float h)269 void HaikuWindow::FrameResized(float w, float h)
270 {
271     UpdateTextRect();
272 }
273 
UpdateTextRect(void)274 void HaikuWindow::UpdateTextRect(void)
275 {
276     BRect rect(textView->Bounds());
277     rect.InsetBy(5, 5);
278     textView->SetTextRect(rect);
279 }
280 
QuitRequested()281 bool HaikuWindow::QuitRequested()
282 {
283     Exit();
284     return true;
285 }
286 
HaikuTextView(HaikuWindow * window,BRect frame,const char * name,BRect textRect,const BFont * initialFont,const rgb_color * initialColor)287 HaikuTextView::HaikuTextView(
288     HaikuWindow *window,
289     BRect frame,
290     const char *name,
291     BRect textRect,
292     const BFont *initialFont,
293     const rgb_color *initialColor) :
294     BTextView(
295         frame,
296         name,
297         textRect,
298         initialFont,
299         initialColor,
300         B_FOLLOW_ALL, B_WILL_DRAW | B_PULSE_NEEDED
301     ), window(window)
302 {
303 }
304 
~HaikuTextView(void)305 HaikuTextView::~HaikuTextView(void)
306 {
307 }
308 
KeyDown(const char * bytes,int32 numBytes)309 void HaikuTextView::KeyDown(const char *bytes, int32 numBytes)
310 {
311     switch (*bytes)
312     {
313         case B_ENTER:
314             window->Execute();
315             break;
316         default:
317             BTextView::KeyDown(bytes, numBytes);
318             break;
319     }
320 }
321 
322 #endif
323