+LoadLayoutDialog::LoadLayoutDialog(LoadLayout *load_layout)
+{
+ this->load_layout = load_layout;
+ wx = 0; wy = 0;
+ idx = -1;
+ lgui = 0;
+}
+
+LoadLayoutDialog::~LoadLayoutDialog()
+{
+ close_window();
+}
+
+void LoadLayoutDialog::handle_done_event(int result)
+{
+ if( result ) return;
+ char layout_file[BCSTRLEN];
+ BC_SubMenu *layout_submenu = load_layout->get_submenu();
+ LoadLayoutItem* item =
+ (LoadLayoutItem *) layout_submenu->get_item(idx);
+ snprintf(layout_file, sizeof(layout_file), "%s", item->layout_file);
+ load_layout->mwindow->delete_layout(layout_file);
+ int k = sprintf(layout_file, LAYOUT_FILE, idx+1);
+ const char *text = lgui->name_text->get_text();
+ if( text[0] )
+ snprintf(layout_file + k-2, sizeof(layout_file)-k+2, "%s_rc", text);
+ load_layout->mwindow->save_layout(layout_file);
+}
+
+void LoadLayoutDialog::handle_close_event(int result)
+{
+ lgui = 0;
+}
+
+BC_Window *LoadLayoutDialog::new_gui()
+{
+ lgui = new LoadLayoutConfirm(this, wx, wy);
+ lgui->create_objects();
+ return lgui;
+}
+
+void LoadLayoutDialog::start_confirm_dialog(int wx, int wy, int idx)
+{
+ close_window();
+ this->wx = wx; this->wy = wy;
+ this->idx = idx;
+ start();
+}
+
+LoadLayoutNameText::LoadLayoutNameText(LoadLayoutConfirm *confirm,
+ int x, int y, int w, const char *text)
+ : BC_TextBox(x, y, w, 1, text)
+{
+ this->confirm = confirm;
+}
+
+LoadLayoutNameText::~LoadLayoutNameText()
+{
+}
+
+int LoadLayoutNameText::handle_event()
+{
+ const char *text = get_text();
+ int len = strlen(text), k = 0;
+ char new_text[BCTEXTLEN];
+ for( int i=0; i<len; ++i ) {
+ int ch = text[i];
+ if( (ch>='A' && ch<='Z') || (ch>='a' && ch<='z') ||
+ (ch>='0' && ch<='9') || ch=='_' )
+ new_text[k++] = ch;
+ }
+ new_text[k] = 0; len = k;
+ int i = len - LAYOUT_NAME_LEN;
+ if( i >= 0 ) {
+ k = 0;
+ while( i < len ) new_text[k++] = new_text[i++];
+ new_text[k] = 0;
+ }
+ update(new_text);
+ return 1;
+}
+
+LoadLayoutConfirm::LoadLayoutConfirm(LoadLayoutDialog *layout_dialog, int x, int y)
+ : BC_Window(_(PROGRAM_NAME ": Layout"), x, y, xS(300),yS(140), xS(300),yS(140), 0)
+{
+ this->layout_dialog = layout_dialog;
+}
+
+LoadLayoutConfirm::~LoadLayoutConfirm()
+{
+}
+
+void LoadLayoutConfirm::create_objects()
+{
+ int xs10 = xS(10), xs20 = xS(20);
+ int ys10 = yS(10);
+ lock_window("LoadLayoutConfirm::create_objects");
+ int x = xs10, y = ys10;
+ BC_SubMenu *layout_submenu = layout_dialog->load_layout->get_submenu();
+ LoadLayoutItem *item = (LoadLayoutItem *)
+ layout_submenu->get_item(layout_dialog->idx);
+ BC_Title *title;
+ add_subwindow(title = new BC_Title(x, y, _("Layout Name:")));
+ int x1 = x + title->get_w() + xs10;
+ add_subwindow(title = new BC_Title(x1, y, item->get_text()));
+ y += title->get_h() + ys10;
+ add_subwindow(name_text = new LoadLayoutNameText(this,
+ x, y, get_w()-x-xs20, item->layout_text));
+ y += name_text->get_h();
+ x1 = x + xS(80);
+ char legend[BCTEXTLEN];
+ sprintf(legend, _("a-z,A-Z,0-9_ only, %dch max"), LAYOUT_NAME_LEN);
+ add_subwindow(title = new BC_Title(x1, y, legend));
+ add_subwindow(new BC_OKButton(this));
+ add_subwindow(new BC_CancelButton(this));
+ unlock_window();
+}
+
+
+LoadRecentItem::LoadRecentItem(const char *path)
+{
+ this->path = cstrdup(path);
+}
+
+LoadRecentItem::~LoadRecentItem()
+{
+ delete [] path;
+}
+
+int LoadRecentItems::add_load(char *path)
+{
+// test for existing copy
+ FileSystem fs;
+ char name[BCTEXTLEN], text[BCTEXTLEN];
+ fs.extract_name(name, path);
+ int loads_total = size();
+ int ret = 0, k = loads_total;
+ LoadRecentItem *load_item = 0;
+
+ for( int i=0; !ret && i<loads_total; ++i ) {
+ load_item = get(i);
+ fs.extract_name(text, load_item->path);
+ if( strcmp(name, text) ) continue;
+ k = i; ret = 1; // already exists, move to top
+ }
+ if( !ret ) { // adding a new one
+ while( loads_total >= TOTAL_LOADS )
+ remove_object_number(--loads_total);
+ insert(new LoadRecentItem(path), 0);
+ }
+ else if( k > 0 ) { // cycle loads
+ while( --k >= 0 ) set(k+1, get(k));
+ set(0, load_item);
+ }
+ return ret;
+}
+
+LoadRecentItems::LoadRecentItems()
+{
+}
+
+LoadRecentItems::~LoadRecentItems()
+{
+ remove_all_objects();
+}
+
+LoadRecent::LoadRecent(MWindow *mwindow, MainMenu *main_menu)
+ : BC_MenuItem(_("Load Recent..."))
+{
+ this->mwindow = mwindow;
+ this->main_menu = main_menu;
+ total_items = 0;
+}
+LoadRecent::~LoadRecent()
+{
+}
+
+void LoadRecent::create_objects()
+{
+ add_submenu(submenu = new LoadRecentSubMenu(this));
+}
+
+LoadPrevious *LoadRecent::get_next_item()
+{
+ int k = total_items++;
+ if( k < submenu->total_items() )
+ return (LoadPrevious *)submenu->get_item(k);
+ LoadPrevious *load_prev = new LoadPrevious(mwindow, main_menu->load_file);
+ submenu->add_item(load_prev);
+ return load_prev;
+}
+
+int LoadRecent::activate_submenu()
+{
+ total_items = 0;
+ scan_items(1);
+ if( total_items > 0 ) {
+ LoadPrevious *load_prev = get_next_item();
+ load_prev->set_text("-");
+ load_prev->set_path("");
+ }
+ scan_items(0);
+ while( total_items < submenu->total_items() )
+ submenu->del_item(0);
+ return BC_MenuItem::activate_submenu();
+}
+
+void LoadRecent::scan_items(int use_xml)
+{
+ FileSystem fs;
+ int loads_total = main_menu->load.size();
+ for( int i=0; i<loads_total; ++i ) {
+ LoadRecentItem *recent = main_menu->load[i];
+ char name[BCTEXTLEN];
+ fs.extract_name(name, recent->path);
+ const char *cp = strrchr(name, '.');
+ if( !cp || strcasecmp(cp+1,"xml") ? use_xml : !use_xml ) continue;
+ LoadPrevious *load_prev = get_next_item();
+ load_prev->set_text(name);
+ load_prev->set_path(recent->path);
+ }
+}
+
+LoadRecentSubMenu::LoadRecentSubMenu(LoadRecent *load_recent)
+ : BC_SubMenu()
+{
+ this->load_recent = load_recent;
+}
+
+LoadRecentSubMenu::~LoadRecentSubMenu()
+{
+}
+