1 // ----------------------------------------------------------------------------
2 // Copyright (C) 2014
3 //              David Freese, W1HKJ
4 //
5 // This file is part of flmsg
6 //
7 // flrig is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // flrig is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 // ----------------------------------------------------------------------------
20 
21 #include <FL/Fl_Multi_Browser.H>
22 
23 #include "gettext.h"
24 #include "status.h"
25 #include "util.h"
26 
27 #include "flmsg_dialog.h"
28 #include "flmsg.h"
29 #include "fileselect.h"
30 
31 extern Fl_Double_Window* mars_army_list_dialog();
32 extern Fl_Double_Window	*mars_army_list_window;
33 extern Fl_Multi_Browser	*brws_mars_army_list;
34 extern string mars_army_list_text;
35 extern bool mars_army_list_ok;
36 
37 Fl_Group	*tab_mars_army = (Fl_Group *)0;
38 
39 Fl_Tabs		*tab_mars_army_type = (Fl_Tabs *)0;
40 
41 //----------------------------------------------------------------------
42 
43 Fl_Group	*tab_mars_army_1 = (Fl_Group *)0;
44 Fl_Group	*tab_mars_army_2 = (Fl_Group *)0;
45 
46 Fl_Input2	*txt_mars_army_dtg = (Fl_Input2 *)0;
47 Fl_Input2	*txt_mars_army_fm = (Fl_Input2 *)0;
48 Fl_Input2	*txt_mars_army_de = (Fl_Input2 *)0;
49 Fl_Input2	*txt_mars_army_nbr = (Fl_Input2 *)0;
50 Fl_Input2	*txt_mars_army_subj = (Fl_Input2 *)0;
51 
52 Fl_Button	*btn_mars_army_dtg = (Fl_Button *)0;
53 Fl_Button	*btn_mars_army_pick_fm = (Fl_Button *)0;
54 Fl_Button	*btn_mars_army_pick_to = (Fl_Button *)0;
55 Fl_Button	*btn_mars_army_pick_info = (Fl_Button *)0;
56 
57 FTextEdit	*txt_mars_army_to = (FTextEdit *)0;
58 FTextEdit	*txt_mars_army_info = (FTextEdit *)0;
59 FTextEdit	*txt_mars_army_text = (FTextEdit *)0;
60 
61 Fl_Button	*btn_mars_army_de_me = (Fl_Button *)0;
62 
63 Fl_ListBox	*sel_mars_army_prec = (Fl_ListBox *)0;
64 
65 //----------------------------------------------------------------------
66 
67 // widget callbacks & support
get_mars_army_list_text()68 bool get_mars_army_list_text()
69 {
70 	if (!mars_army_list_window) mars_army_list_window = mars_army_list_dialog();
71 	brws_mars_army_list->deselect();
72 	mars_army_list_window->show();
73 	while (mars_army_list_window->visible()) Fl::wait();
74 	return mars_army_list_ok;
75 }
76 
77 
cb_btn_mars_army_pick_fm(Fl_Widget * w,void * d)78 void cb_btn_mars_army_pick_fm(Fl_Widget *w, void *d)
79 {
80 	if (!get_mars_army_list_text()) return;
81 	string s = mars_army_list_text;
82 	size_t p;
83 	if ((p = s.find('\n')) != string::npos) s.erase(p);
84 	txt_mars_army_fm->value(s.c_str());
85 	estimate();
86 }
87 
cb_btn_mars_army_pick_to(Fl_Widget * w,void * d)88 void cb_btn_mars_army_pick_to(Fl_Widget *w, void *d)
89 {
90 	if (!get_mars_army_list_text()) return;
91 	string s = txt_mars_army_to->buffer()->text();
92 	if (s.length()) s += '\n';
93 	s.append(mars_army_list_text);
94 	txt_mars_army_to->clear();
95 	txt_mars_army_to->add(s.c_str());
96 	estimate();
97 }
98 
cb_btn_mars_army_pick_info(Fl_Widget * w,void * d)99 void cb_btn_mars_army_pick_info(Fl_Widget *w, void *d)
100 {
101 	if (!get_mars_army_list_text()) return;
102 	string s = txt_mars_army_info->buffer()->text();
103 	if (s.length()) s += '\n';
104 	s.append(mars_army_list_text);
105 	txt_mars_army_info->clear();
106 	txt_mars_army_info->add(s.c_str());
107 	estimate();
108 }
109 
cb_btn_mars_army_dtg(Fl_Widget * w,void * d)110 void cb_btn_mars_army_dtg(Fl_Widget *w, void *d)
111 {
112 	txt_mars_army_dtg->value(szMarsDateTime());
113 	estimate();
114 }
115 
cb_btn_mars_army_de_me(Fl_Widget * w,void * d)116 void cb_btn_mars_army_de_me(Fl_Widget *w, void *d)
117 {
118 	txt_mars_army_de->value(progStatus.my_call.c_str());
119 	estimate();
120 }
121 
create_mars_army()122 void create_mars_army()
123 {
124 	int Y = tab_top;
125 	tab_mars_army = new Fl_Group(0, Y, 570, 390);
126 	tab_mars_army->align(FL_ALIGN_TOP);
127 
128 	tab_mars_army_type = new Fl_Tabs(0, Y+2, 570, 387);
129 
130 	tab_mars_army_1 = new Fl_Group(0, Y+25, 570, 360, _("Header"));
131 
132 	Y += 35;
133 
134 	txt_mars_army_de = new Fl_Input2(50, Y, 200, 24, _("DE"));
135 	txt_mars_army_de->tooltip(_(""));
136 	txt_mars_army_de->callback((Fl_Callback*)cb_mars_fl_input2);
137 	txt_mars_army_de->when(FL_WHEN_CHANGED);
138 
139 	btn_mars_army_de_me = new Fl_Button(252, Y, 30, 24, _("ME"));
140 	btn_mars_army_de_me->callback((Fl_Callback*)cb_btn_mars_army_de_me);
141 	btn_mars_army_de_me->tooltip(_("insert operator callsign"));
142 
143 	txt_mars_army_nbr = new Fl_Input2(320, Y, 150, 24, _("NR"));
144 	txt_mars_army_nbr->tooltip(_(""));
145 	txt_mars_army_nbr->callback((Fl_Callback*)cb_mars_fl_input2);
146 	txt_mars_army_nbr->when(FL_WHEN_CHANGED);
147 
148 	Y += 35;
149 	sel_mars_army_prec = new Fl_ListBox(50, Y, 45, 24, _("PREC"));
150 	sel_mars_army_prec->tooltip(
151 		_("R - Routine\nP - Priority\nO - Immediate\nZ - Flash"));
152 	sel_mars_army_prec->add("R|P|O|Z");
153 	sel_mars_army_prec->align(FL_ALIGN_LEFT);
154 	sel_mars_army_prec->index(0);
155 
156 	txt_mars_army_dtg = new Fl_Input2(135, Y, 150, 24, _("DTG"));
157 	txt_mars_army_dtg->tooltip(_(""));
158 
159 	btn_mars_army_dtg = new Fl_Button(285, Y, 22, 24, _("..."));
160 	btn_mars_army_dtg->tooltip(_("Set Date/Time Group"));
161 	btn_mars_army_dtg->callback((Fl_Callback*)cb_btn_mars_army_dtg);
162 
163 	Y += 26;
164 	btn_mars_army_pick_fm = new Fl_Button(4, Y, 44, 24, _("FM"));
165 	btn_mars_army_pick_fm->tooltip(_("Select from list"));
166 	btn_mars_army_pick_fm->callback((Fl_Callback*)cb_btn_mars_army_pick_fm);
167 
168 	txt_mars_army_fm = new Fl_Input2(50, Y, 500, 24, _(""));
169 	txt_mars_army_fm->tooltip(_("use pick list button"));
170 	txt_mars_army_fm->callback((Fl_Callback*)cb_mars_fl_input2);
171 	txt_mars_army_fm->when(FL_WHEN_CHANGED);
172 
173 	Y += 26;
174 	btn_mars_army_pick_to = new Fl_Button(4, Y, 44, 24, _("TO"));
175 	btn_mars_army_pick_to->tooltip(_("Select from list"));
176 	btn_mars_army_pick_to->callback((Fl_Callback*)cb_btn_mars_army_pick_to);
177 
178 	txt_mars_army_to = new FTextEdit(50, Y, 500, 100, _(""));
179 	txt_mars_army_to->tooltip(_("use pick list button"));
180 	txt_mars_army_to->textfont(FL_HELVETICA);
181 	txt_mars_army_to->box(FL_DOWN_FRAME);
182 	txt_mars_army_to->color((Fl_Color)FL_BACKGROUND2_COLOR);
183 	txt_mars_army_to->selection_color((Fl_Color)FL_SELECTION_COLOR);
184 	txt_mars_army_to->labeltype(FL_NORMAL_LABEL);
185 	txt_mars_army_to->labelfont(0);
186 	txt_mars_army_to->labelsize(14);
187 	txt_mars_army_to->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
188 	txt_mars_army_to->align(FL_ALIGN_TOP_LEFT);
189 	txt_mars_army_to->callback((Fl_Callback*)cb_mars_text);
190 	txt_mars_army_to->when(FL_WHEN_CHANGED);
191 
192 	Y += 102;
193 	btn_mars_army_pick_info = new Fl_Button(4, Y, 44, 24, _("INFO"));
194 	btn_mars_army_pick_info->tooltip(_("Select from list"));
195 	btn_mars_army_pick_info->callback((Fl_Callback*)cb_btn_mars_army_pick_info);
196 
197 	txt_mars_army_info = new FTextEdit(50, Y, 500, 100, _(""));
198 	txt_mars_army_info->tooltip(_("use pick list button"));
199 	txt_mars_army_info->textfont(FL_HELVETICA);
200 	txt_mars_army_info->box(FL_DOWN_FRAME);
201 	txt_mars_army_info->color((Fl_Color)FL_BACKGROUND2_COLOR);
202 	txt_mars_army_info->selection_color((Fl_Color)FL_SELECTION_COLOR);
203 	txt_mars_army_info->labeltype(FL_NORMAL_LABEL);
204 	txt_mars_army_info->labelfont(0);
205 	txt_mars_army_info->labelsize(14);
206 	txt_mars_army_info->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
207 	txt_mars_army_info->align(FL_ALIGN_TOP_LEFT);
208 	txt_mars_army_info->callback((Fl_Callback*)cb_mars_text);
209 	txt_mars_army_info->when(FL_WHEN_CHANGED);
210 
211 	Y += 102;
212 	Fl_Box *label = new Fl_Box(0, Y, 50, 24, "SUBJ");
213 	label->align(FL_ALIGN_RIGHT | FL_ALIGN_INSIDE);
214 
215 	txt_mars_army_subj = new Fl_Input2(50, Y, 500, 24, _(""));
216 	txt_mars_army_subj->tooltip(_("message subject"));
217 	txt_mars_army_subj->callback((Fl_Callback*)cb_mars_fl_input2);
218 	txt_mars_army_subj->when(FL_WHEN_CHANGED);
219 
220 	tab_mars_army_1->end();
221 
222 	Y = tab_top;
223 
224 	tab_mars_army_2 = new Fl_Group(0, Y+25, 570, 355, _("Body"));
225 
226 	Y += 30;
227 	txt_mars_army_text = new FTextEdit(2, Y, 566, 350, "");
228 	txt_mars_army_text->tooltip("enter text of message");
229 	txt_mars_army_text->textfont(FL_HELVETICA);
230 	txt_mars_army_text->box(FL_DOWN_FRAME);
231 	txt_mars_army_text->color((Fl_Color)FL_BACKGROUND2_COLOR);
232 	txt_mars_army_text->selection_color((Fl_Color)FL_SELECTION_COLOR);
233 	txt_mars_army_text->labeltype(FL_NORMAL_LABEL);
234 	txt_mars_army_text->labelfont(0);
235 	txt_mars_army_text->labelsize(14);
236 	txt_mars_army_text->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
237 	txt_mars_army_text->align(FL_ALIGN_TOP_LEFT);
238 	txt_mars_army_text->callback((Fl_Callback*)cb_mars_text);
239 	txt_mars_army_text->when(FL_WHEN_CHANGED);
240 
241 	tab_mars_army_2->end();
242 
243 	tab_mars_army_type->end();
244 
245 	tab_mars_army->end();
246 
247 	tab_mars_army->hide();
248 };
249 
250 //======================================================================
251 //======================================================================
252 Fl_Double_Window	*mars_army_list_window = 0;
253 Fl_Multi_Browser	*brws_mars_army_list = (Fl_Multi_Browser *)0;
254 
255 const int mars_army_list_widths[] = {80, 170, 30, 0};
256 
257 string mars_army_list_text;
258 bool mars_army_list_ok = false;
259 
cb_army_list_ok(Fl_Widget * w,void * d)260 void cb_army_list_ok(Fl_Widget *w, void *d)
261 {
262 	string retstr;
263 	mars_army_list_text.clear();
264 	size_t p;
265 	for (int i = 1; i <= brws_mars_army_list->size(); i++) {
266 		if (brws_mars_army_list->selected(i)) {
267 			if (mars_army_list_text.length()) mars_army_list_text += '\n';
268 			retstr = brws_mars_army_list->text(i);
269 			p = retstr.find('\t');
270 			mars_army_list_text.append(retstr.substr(0, p));
271 			retstr.erase(0,p+1);
272 			p = retstr.find('\t');
273 			retstr.erase(0,p+1);
274 			mars_army_list_text.append(" ").append(retstr);
275 		}
276 	}
277 	mars_army_list_window->hide();
278 	mars_army_list_ok = true;
279 }
280 
cb_army_list_cancel(Fl_Widget * w,void * d)281 void cb_army_list_cancel(Fl_Widget *w, void *d)
282 {
283 	mars_army_list_window->hide();
284 	mars_army_list_ok = false;
285 }
286 
mars_army_list_dialog()287 Fl_Double_Window* mars_army_list_dialog() {
288 	Fl_Double_Window* w = new Fl_Double_Window(452, 280, _("Roster"));
289 	brws_mars_army_list = new Fl_Multi_Browser(1,1,450,250,"");
290 	brws_mars_army_list->column_widths(mars_army_list_widths);
291 	Fl_Button *cancel = new Fl_Button(280, 252, 80, 24, "cancel");
292 	cancel->callback((Fl_Callback*)cb_army_list_cancel);
293 	Fl_Button *ok = new Fl_Button(370, 252, 80, 24, "select");
294 	ok->callback((Fl_Callback*)cb_army_list_ok);
295 
296 	FILE	*flist = fopen(progStatus.mars_roster_file.c_str(), "r");
297 	char *retstr;
298 	if (flist) {
299 		char line[80];
300 		retstr = fgets(line, 80, flist); // header
301 		line[0] = 0;
302  		if (retstr) {
303  			while(fgets(line, 80, flist)) {
304  				while( line[strlen(line)-1] == '\n') line[strlen(line)-1] = 0;
305  				while( line[strlen(line)-1] == '\r') line[strlen(line)-1] = 0;
306  				for (size_t i = 0; i < strlen(line); i++)
307  					if (line[i] == ',') line[i] = '\t';
308  				if (strlen(line)) brws_mars_army_list->add(line);
309  				line[0] = 0;
310  			}
311 		}
312 		fclose(flist);
313 	} else
314 		printf("could not open %s\n", progStatus.mars_roster_file.c_str());
315 	w->set_modal();
316 	w->end();
317 	return w;
318 }
319 
320