+
+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()
+{
+}
+