--- /dev/null
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "timeentry.h"
+#include <string.h>
+
+TimeEntry::TimeEntry(BC_WindowBase *gui, int x, int y,
+ int *output_day, double *output_time,
+ int time_format, int time_w)
+{
+ this->gui = gui;
+ this->x = x;
+ this->y = y;
+ this->output_day = output_day;
+ this->output_time = output_time;
+ this->time_format = time_format;
+ this->time_w = time_w;
+ enabled = 1;
+ day_text = 0;
+ day_tumbler = 0;
+ time_text = 0;
+}
+
+TimeEntry::~TimeEntry()
+{
+ delete day_text;
+ delete day_tumbler;
+ delete time_text;
+}
+const char* TimeEntry::day_table[] =
+{
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "*"
+};
+
+int TimeEntry::day_to_int(const char *day)
+{
+ for(int i = 0; i < TOTAL_DAYS; i++)
+ if(!strcasecmp(day, day_table[i])) return i;
+ return 0;
+}
+
+
+void TimeEntry::time_to_hours(char *result, double time)
+{
+ int hour = (int)(time / 3600);
+ sprintf(result, "%d", hour);
+}
+
+void TimeEntry::time_to_minutes(char *result, double time)
+{
+ int hour = (int)(time / 3600);
+ int minute = (int)(time / 60 - hour * 60);
+ sprintf(result, "%d", minute);
+}
+
+void TimeEntry::time_to_seconds(char *result, double time)
+{
+ int hour = (int)(time / 3600);
+ int minute = (int)(time / 60 - hour * 60);
+ float second = (float)time - (int64_t)hour * 3600 - (int64_t)minute * 60;
+ sprintf(result, "%.3f", second);
+}
+
+void TimeEntry::create_objects()
+{
+ int x = this->x;
+ int y = this->y;
+ int time_w = this->time_w;
+ char string[BCTEXTLEN];
+
+ if(output_day) {
+ day_text = new DayText(this, x, y, 50,
+ day_table, TOTAL_DAYS, day_table[*output_day]);
+ gui->add_subwindow(day_text);
+ x += day_text->get_w();
+ time_w -= day_text->get_w();
+ day_tumbler = new DayTumbler(this, day_text, x, y);
+ gui->add_subwindow(day_tumbler);
+ x += day_tumbler->get_w();
+ time_w -= day_tumbler->get_w();
+ }
+
+ time_text = new TimeTextBox(this, x, y, time_w,
+ Units::totext(string, *output_time, time_format));
+ gui->add_subwindow(time_text);
+
+ time_text->set_separators(Units::format_to_separators(time_format));
+}
+
+void TimeEntry::enable()
+{
+ enabled = 1;
+ if( day_text ) day_text->enable();
+ time_text->enable();
+}
+
+void TimeEntry::disable()
+{
+ enabled = 0;
+ if( day_text ) day_text->disable();
+ time_text->disable();
+}
+
+int TimeEntry::get_h()
+{
+ return time_text->get_h();
+}
+
+int TimeEntry::get_w()
+{
+ int w = 0;
+ if(day_text) w += day_text->get_w();
+ if(day_tumbler) w += day_tumbler->get_w();
+ w += time_text->get_w();
+ return w;
+}
+
+void TimeEntry::reposition_window(int x, int y)
+{
+ int time_w = this->time_w;
+ this->x = x;
+ this->y = y;
+
+ if(day_text) {
+ day_text->reposition_window(x, y);
+ x += day_text->get_w();
+ time_w -= day_text->get_w();
+ }
+ if(day_tumbler) {
+ day_tumbler->reposition_window(x, y);
+ x += day_tumbler->get_w();
+ time_w -= day_tumbler->get_w();
+ }
+
+ time_text->reposition_window(x, y, time_w);
+}
+
+void TimeEntry::update_day(int day)
+{
+ if( !output_day ) return;
+ *output_day = day;
+ day_text->update(day_table[day]);
+}
+
+void TimeEntry::update_time(double time)
+{
+ *output_time = time;
+ char text[BCTEXTLEN];
+ Units::totext(text, time, time_format);
+ time_text->update(text);
+}
+
+void TimeEntry::update(int *day, double *time)
+{
+ output_day = day;
+ output_time = time;
+
+ if( day != 0 )
+ day_text->update(day_table[*day]);
+
+ char text[BCTEXTLEN];
+ Units::totext(text, *time, time_format);
+ time_text->update(text);
+}
+
+int TimeEntry::handle_event()
+{
+ return 1;
+}
+
+
+
+DayText::DayText(TimeEntry *timeentry,
+ int x, int y, int w,
+ const char **table, int table_items,
+ const char *text)
+ : BC_TextBox(x, y, w, 1, text)
+{
+ this->timeentry = timeentry;
+ this->table = table;
+ this->table_items = table_items;
+}
+
+int DayText::handle_event()
+{
+ *timeentry->output_day = TimeEntry::day_to_int(get_text());
+ return timeentry->handle_event();
+}
+
+
+DayTumbler::DayTumbler(TimeEntry *timeentry, DayText *text, int x, int y)
+ : BC_Tumbler(x, y)
+{
+ this->timeentry = timeentry;
+ this->text = text;
+}
+
+
+int DayTumbler::handle_up_event()
+{
+ if( !timeentry->enabled ) return 1;
+ *timeentry->output_day += 1;
+ if(*timeentry->output_day >= text->table_items)
+ *timeentry->output_day = 0;
+ text->update(text->table[*timeentry->output_day]);
+ return timeentry->handle_event();
+}
+
+int DayTumbler::handle_down_event()
+{
+ if( !timeentry->enabled ) return 1;
+ *timeentry->output_day -= 1;
+ if(*timeentry->output_day < 0)
+ *timeentry->output_day = text->table_items - 1;
+ text->update(text->table[*timeentry->output_day]);
+ return timeentry->handle_event();
+}
+
+
+
+TimeEntryTumbler::TimeEntryTumbler(BC_WindowBase *gui, int x, int y,
+ int *output_day, double *output_time, int incr,
+ int time_format, int time_w)
+ : TimeEntry(gui, x, y, output_day, output_time,
+ time_format, time_w-BC_Tumbler::calculate_w())
+{
+ this->time_w = time_w;
+ this->incr = incr;
+ sec_tumbler = 0;
+}
+
+TimeEntryTumbler::~TimeEntryTumbler()
+{
+ delete sec_tumbler;
+}
+
+void TimeEntryTumbler::create_objects()
+{
+ TimeEntry::create_objects();
+ sec_tumbler = new SecTumbler(this, x+TimeEntry::time_w, y);
+ gui->add_subwindow(sec_tumbler);
+}
+
+void TimeEntryTumbler::reposition_window(int x, int y)
+{
+ TimeEntry::reposition_window(x, y);
+ sec_tumbler->reposition_window(x+TimeEntry::time_w, y);
+}
+
+int TimeEntryTumbler::get_h()
+{
+ return TimeEntry::get_h();
+}
+
+int TimeEntryTumbler::get_w()
+{
+ return TimeEntry::get_w() + BC_Tumbler::calculate_w();
+}
+
+int TimeEntryTumbler::handle_up_event()
+{
+ if( !enabled ) return 1;
+ if( output_time ) {
+ *output_time += incr;
+ char text[BCTEXTLEN];
+ Units::totext(text, *output_time, time_format);
+ time_text->update(text);
+ }
+ return handle_event();
+}
+
+int TimeEntryTumbler::handle_down_event()
+{
+ if( !enabled ) return 1;
+ if( output_time ) {
+ *output_time -= incr;
+ char text[BCTEXTLEN];
+ Units::totext(text, *output_time, time_format);
+ time_text->update(text);
+ }
+ return handle_event();
+}
+
+
+SecTumbler::SecTumbler(TimeEntryTumbler *timetumbler, int x, int y)
+ : BC_Tumbler(x, y)
+{
+ this->timetumbler = timetumbler;
+}
+
+int SecTumbler::handle_up_event()
+{
+ return timetumbler->handle_up_event();
+}
+
+int SecTumbler::handle_down_event()
+{
+ return timetumbler->handle_down_event();
+}
+
+
+
+TimeTextBox::TimeTextBox(TimeEntry *timeentry,
+ int x, int y, int w, char *default_text)
+ : BC_TextBox(x, y, w, 1, default_text)
+{
+ this->timeentry = timeentry;
+}
+
+int TimeTextBox::handle_event()
+{
+ *timeentry->output_time = Units::text_to_seconds(get_text(),
+ 48000, timeentry->time_format);
+ return timeentry->handle_event();
+}
+
+