4 * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "bcfilebox.h"
24 #include "bclistboxitem.h"
25 #include "bcnewfolder.h"
28 #include "bcresources.h"
29 #include "bcsignals.h"
32 #include "condition.h"
33 #include "filesystem.h"
47 BC_FileBoxRecent::BC_FileBoxRecent(BC_FileBox *filebox, int x, int y)
48 : BC_ListBox(x, y, 250,
49 filebox->get_text_height(MEDIUMFONT) * FILEBOX_HISTORY_SIZE +
50 BC_ScrollBar::get_span(SCROLL_HORIZ) +
51 LISTBOX_MARGIN * 2, LISTBOX_TEXT, &filebox->recent_dirs,
54 this->filebox = filebox;
57 int BC_FileBoxRecent::handle_event()
59 BC_ListBoxItem *selection = get_selection(0, 0);
60 if( selection != 0 ) {
61 char *path = selection->get_text();
62 filebox->submit_dir(path);
77 BC_FileBoxListBox::BC_FileBoxListBox(int x, int y, BC_FileBox *filebox)
78 : BC_ListBox(x, y, filebox->get_listbox_w(), filebox->get_listbox_h(y),
79 filebox->get_display_mode(), filebox->list_column,
80 filebox->column_titles, filebox->column_width,
81 filebox->columns, 0, 0,
82 filebox->select_multiple ? LISTBOX_MULTIPLE : LISTBOX_SINGLE,
85 this->filebox = filebox;
86 set_sort_column(filebox->sort_column);
87 set_sort_order(filebox->sort_order);
88 set_allow_drag_column(1);
91 BC_FileBoxListBox::~BC_FileBoxListBox()
95 int BC_FileBoxListBox::handle_event()
97 filebox->submit_file(filebox->textbox->get_text());
101 int BC_FileBoxListBox::selection_changed()
103 BC_ListBoxItem *item = get_selection(
104 filebox->column_of_type(FILEBOX_NAME), 0);
107 char path[BCTEXTLEN];
108 strcpy(path, item->get_text());
109 filebox->textbox->update(path);
110 filebox->fs->extract_dir(filebox->directory, path);
111 filebox->fs->extract_name(filebox->filename, path);
112 filebox->fs->complete_path(path);
113 strcpy(filebox->current_path, path);
114 strcpy(filebox->submitted_path, path);
119 int BC_FileBoxListBox::column_resize_event()
121 for(int i = 0; i < filebox->columns; i++)
122 BC_WindowBase::get_resources()->filebox_columnwidth[i] =
123 filebox->column_width[i] =
128 int BC_FileBoxListBox::sort_order_event()
130 get_resources()->filebox_sortcolumn = filebox->sort_column = get_sort_column();
131 get_resources()->filebox_sortorder = filebox->sort_order = get_sort_order();
136 int BC_FileBoxListBox::move_column_event()
138 filebox->move_column(get_from_column(), get_to_column());
142 int BC_FileBoxListBox::evaluate_query(char *string)
144 // Search name column
145 ArrayList<BC_ListBoxItem*> *column =
146 &filebox->list_column[filebox->column_of_type(FILEBOX_NAME)];
147 // Get current selection
148 int current_selection = get_selection_number(0, 0);
150 // Get best score in remaining items
151 int lowest_score = 0x7fffffff;
153 if(current_selection < 0) current_selection = 0;
154 // for(int i = current_selection + 1; i < column->size(); i++)
155 for(int i = current_selection; i < column->size(); i++)
157 int len1 = strlen(string);
158 int len2 = strlen(column->get(i)->get_text());
159 int current_score = strncasecmp(string,
160 column->get(i)->get_text(),
162 //printf(" %d i=%d %d %s %s\n", __LINE__, i, current_score, string, column->get(i)->get_text());
164 if(abs(current_score) < lowest_score)
166 lowest_score = abs(current_score);
178 BC_FileBoxTextBox::BC_FileBoxTextBox(int x, int y, BC_FileBox *filebox)
179 : BC_TextBox(x, y, filebox->get_w() - 20, 1,
180 filebox->want_directory ? filebox->directory : filebox->filename)
182 this->filebox = filebox;
185 BC_FileBoxTextBox::~BC_FileBoxTextBox()
192 int BC_FileBoxTextBox::handle_event()
195 if(get_keypress() != RETURN)
197 result = calculate_suggestions(&filebox->list_column[0]);
205 BC_FileBoxDirectoryText::BC_FileBoxDirectoryText(int x, int y, BC_FileBox *filebox)
206 : BC_TextBox(x, y, filebox->get_w() - 40, 1, filebox->fs->get_current_dir())
208 this->filebox = filebox;
211 int BC_FileBoxDirectoryText::handle_event()
215 // is a directory, change directories
216 if(filebox->fs->is_dir(path))
218 const char *cp = path;
219 char dir_path[BCTEXTLEN], *dp = dir_path;
220 while( *cp ) *dp++ = *cp++;
221 while( dp >= dir_path && *--dp == '/' );
222 *++dp = '/'; *++dp = 0;
223 if( strcmp(filebox->fs->get_current_dir(), dir_path) ) {
224 filebox->fs->change_dir(dir_path);
237 BC_FileBoxFilterText::BC_FileBoxFilterText(int x, int y, BC_FileBox *filebox)
238 : BC_TextBox(x, y, filebox->get_w() - 50, 1, filebox->get_resources()->filebox_filter)
240 this->filebox = filebox;
243 int BC_FileBoxFilterText::handle_event()
245 filebox->update_filter(get_text());
252 BC_FileBoxFilterMenu::BC_FileBoxFilterMenu(int x, int y, BC_FileBox *filebox)
255 filebox->get_w() - 30,
258 &filebox->filter_list,
265 this->filebox = filebox;
266 set_tooltip(_("Change the filter"));
269 int BC_FileBoxFilterMenu::handle_event()
271 filebox->filter_text->update(
272 get_selection(filebox->column_of_type(FILEBOX_NAME), 0)->get_text());
273 filebox->update_filter(
274 get_selection(filebox->column_of_type(FILEBOX_NAME), 0)->get_text());
287 BC_FileBoxCancel::BC_FileBoxCancel(BC_FileBox *filebox)
288 : BC_CancelButton(filebox)
290 this->filebox = filebox;
291 set_tooltip(_("Cancel the operation"));
294 BC_FileBoxCancel::~BC_FileBoxCancel()
298 int BC_FileBoxCancel::handle_event()
300 // filebox->submit_file(filebox->textbox->get_text());
301 filebox->newfolder_thread->interrupt();
302 filebox->set_done(1);
312 BC_FileBoxUseThis::BC_FileBoxUseThis(BC_FileBox *filebox)
313 : BC_Button(filebox->get_w() / 2 -
314 BC_WindowBase::get_resources()->usethis_button_images[0]->get_w() / 2,
315 filebox->ok_button->get_y(),
316 BC_WindowBase::get_resources()->usethis_button_images)
318 this->filebox = filebox;
319 set_tooltip(_("Submit the directory"));
322 BC_FileBoxUseThis::~BC_FileBoxUseThis()
326 int BC_FileBoxUseThis::handle_event()
328 // printf("BC_FileBoxUseThis::handle_event %d '%s'\n",
330 // filebox->textbox->get_text());
331 filebox->submit_file(filebox->textbox->get_text(), 1);
339 BC_FileBoxOK::BC_FileBoxOK(BC_FileBox *filebox)
340 : BC_OKButton(filebox,
341 !filebox->want_directory ?
342 BC_WindowBase::get_resources()->ok_images :
343 BC_WindowBase::get_resources()->filebox_descend_images)
345 this->filebox = filebox;
346 if(filebox->want_directory)
347 set_tooltip(_("Descend directory"));
349 set_tooltip(_("Submit the file"));
352 BC_FileBoxOK::~BC_FileBoxOK()
356 int BC_FileBoxOK::handle_event()
358 //printf("BC_FileBoxOK::handle_event %d\n", __LINE__);
359 filebox->submit_file(filebox->textbox->get_text());
368 BC_FileBoxText::BC_FileBoxText(int x, int y, BC_FileBox *filebox)
369 : BC_Button(x, y, BC_WindowBase::get_resources()->filebox_text_images)
371 this->filebox = filebox;
372 set_tooltip(_("Display text"));
374 int BC_FileBoxText::handle_event()
376 filebox->create_listbox(filebox->listbox->get_x(), filebox->listbox->get_y(), LISTBOX_TEXT);
377 filebox->listbox->show_window(1);
382 BC_FileBoxIcons::BC_FileBoxIcons(int x, int y, BC_FileBox *filebox)
383 : BC_Button(x, y, BC_WindowBase::get_resources()->filebox_icons_images)
385 this->filebox = filebox;
386 set_tooltip(_("Display icons"));
388 int BC_FileBoxIcons::handle_event()
390 filebox->create_listbox(filebox->listbox->get_x(), filebox->listbox->get_y(), LISTBOX_ICONS);
391 filebox->listbox->show_window(1);
396 BC_FileBoxNewfolder::BC_FileBoxNewfolder(int x, int y, BC_FileBox *filebox)
397 : BC_Button(x, y, BC_WindowBase::get_resources()->filebox_newfolder_images)
399 this->filebox = filebox;
400 set_tooltip(_("Create new folder"));
402 int BC_FileBoxNewfolder::handle_event()
404 filebox->newfolder_thread->start_new_folder();
409 BC_FileBoxRename::BC_FileBoxRename(int x, int y, BC_FileBox *filebox)
410 : BC_Button(x, y, BC_WindowBase::get_resources()->filebox_rename_images)
412 this->filebox = filebox;
413 set_tooltip(_("Rename file"));
415 int BC_FileBoxRename::handle_event()
417 filebox->rename_thread->start_rename();
421 BC_FileBoxUpdir::BC_FileBoxUpdir(int x, int y, BC_FileBox *filebox)
422 : BC_Button(x, y, BC_WindowBase::get_resources()->filebox_updir_images)
424 this->filebox = filebox;
425 set_tooltip(_("Up a directory"));
427 int BC_FileBoxUpdir::handle_event()
429 // Need a temp so submit_file can expand it
430 sprintf(string, "..");
431 filebox->submit_file(string);
435 BC_FileBoxDelete::BC_FileBoxDelete(int x, int y, BC_FileBox *filebox)
436 : BC_Button(x, y, BC_WindowBase::get_resources()->filebox_delete_images)
438 this->filebox = filebox;
439 set_tooltip(_("Delete files"));
441 int BC_FileBoxDelete::handle_event()
443 filebox->unlock_window();
444 filebox->delete_thread->start();
445 filebox->lock_window("BC_FileBoxDelete::handle_event");
449 BC_FileBoxReload::BC_FileBoxReload(int x, int y, BC_FileBox *filebox)
450 : BC_Button(x, y, BC_WindowBase::get_resources()->filebox_reload_images)
452 this->filebox = filebox;
453 set_tooltip(_("Refresh"));
455 int BC_FileBoxReload::handle_event()
470 BC_FileBox::BC_FileBox(int x, int y, const char *init_path,
471 const char *title, const char *caption, int show_all_files,
472 int want_directory, int multiple_files, int h_padding)
473 : BC_Window(title, x, y,
474 BC_WindowBase::get_resources()->filebox_w,
475 BC_WindowBase::get_resources()->filebox_h,
479 // if(want_directory)
481 // fs->set_want_directory();
482 // columns = DIRBOX_COLUMNS;
483 // columns = FILEBOX_COLUMNS;
487 columns = FILEBOX_COLUMNS;
490 list_column = new ArrayList<BC_ListBoxItem*>[columns];
491 column_type = new int[columns];
492 column_width = new int[columns];
498 strcpy(this->caption, caption);
499 strcpy(this->current_path, init_path);
500 strcpy(this->submitted_path, init_path);
501 select_multiple = multiple_files;
502 this->want_directory = want_directory;
503 if(show_all_files) fs->set_show_all();
504 fs->complete_path(this->current_path);
505 fs->complete_path(this->submitted_path);
506 fs->extract_dir(directory, this->current_path);
507 fs->extract_name(filename, this->current_path);
509 // printf("BC_FileBox::BC_FileBox %d '%s' '%s' '%s'\n",
511 // this->submitted_path,
515 // if(want_directory)
517 // for(int i = 0; i < columns; i++)
519 // column_type[i] = get_resources()->dirbox_columntype[i];
520 // column_width[i] = get_resources()->dirbox_columnwidth[i];
521 // column_titles[i] = BC_FileBox::columntype_to_text(column_type[i]);
523 // sort_column = get_resources()->dirbox_sortcolumn;
524 // sort_order = get_resources()->dirbox_sortorder;
528 for(int i = 0; i < columns; i++)
530 column_type[i] = get_resources()->filebox_columntype[i];
531 column_width[i] = get_resources()->filebox_columnwidth[i];
532 column_titles[i] = (char*)BC_FileBox::columntype_to_text(column_type[i]);
534 sort_column = get_resources()->filebox_sortcolumn;
535 sort_order = get_resources()->filebox_sortorder;
540 // Test if current directory exists
541 if(!fs->is_dir(directory))
543 sprintf(this->current_path, "~");
544 fs->complete_path(this->current_path);
545 fs->set_current_dir(this->current_path);
546 // fs->update(this->current_path);
547 strcpy(directory, fs->get_current_dir());
554 h_padding = BC_WindowBase::get_resources()->ok_images[0]->get_h() -
557 this->h_padding = h_padding;
558 delete_thread = new BC_DeleteThread(this);
562 BC_FileBox::~BC_FileBox()
564 // this has to be destroyed before tables, because it can call for an update!
565 delete newfolder_thread;
568 for(int i = 0; i < TOTAL_ICONS; i++)
570 filter_list.remove_all_objects();
571 delete [] list_column;
572 delete [] column_type;
573 delete [] column_width;
574 delete delete_thread;
575 delete rename_thread;
576 recent_dirs.remove_all_objects();
579 void BC_FileBox::create_objects()
582 BC_Resources *resources = BC_WindowBase::get_resources();
583 int directory_title_margin = MAX(20,
584 resources->filebox_text_images[0]->get_h());
586 // Create recent dir list
589 // Directories aren't filtered in FileSystem so skip this
592 filter_list.append(new BC_ListBoxItem("*"));
593 filter_list.append(new BC_ListBoxItem("[*.ifo][*.vob]"));
594 filter_list.append(new BC_ListBoxItem("[*.mp2][*.mp3][*.wav]"));
595 filter_list.append(new BC_ListBoxItem("[*.avi][*.mpg][*.m2v][*.m1v][*.mov]"));
596 filter_list.append(new BC_ListBoxItem("heroine*"));
597 filter_list.append(new BC_ListBoxItem("*.xml"));
598 fs->set_filter(get_resources()->filebox_filter);
601 // fs->update(directory);
605 add_subwindow(ok_button = new BC_FileBoxOK(this));
607 add_subwindow(usethis_button = new BC_FileBoxUseThis(this));
608 add_subwindow(cancel_button = new BC_FileBoxCancel(this));
610 add_subwindow(new BC_Title(x, y, caption));
612 x = get_w() - resources->filebox_icons_images[0]->get_w() - 10;
614 add_subwindow(icon_button = new BC_FileBoxIcons(x, y, this));
615 x -= resources->filebox_text_images[0]->get_w() + 5;
617 add_subwindow(text_button = new BC_FileBoxText(x, y, this));
618 x -= resources->filebox_newfolder_images[0]->get_w() + 5;
620 add_subwindow(folder_button = new BC_FileBoxNewfolder(x, y, this));
621 x -= resources->filebox_delete_images[0]->get_w() + 5;
623 add_subwindow(rename_button = new BC_FileBoxRename(x, y, this));
624 x -= resources->filebox_delete_images[0]->get_w() + 5;
626 add_subwindow(delete_button = new BC_FileBoxDelete(x, y, this));
627 x -= resources->filebox_reload_images[0]->get_w() + 5;
629 add_subwindow(reload_button = new BC_FileBoxReload(x, y, this));
630 x -= resources->filebox_updir_images[0]->get_w() + 5;
632 add_subwindow(updir_button = new BC_FileBoxUpdir(x, y, this));
635 y += directory_title_margin + 3;
637 add_subwindow(recent_popup = new BC_FileBoxRecent(this, x, y));
638 add_subwindow(directory_title = new BC_FileBoxDirectoryText(x, y, this));
639 directory_title->reposition_window(x, y,
640 get_w() - recent_popup->get_w() - 20, 1);
641 recent_popup->reposition_window(
642 x + directory_title->get_w(), y,
643 directory_title->get_w(), 200);
646 y += directory_title->get_h() + 5;
648 int newest_id = 0, newest = -1;
649 for(int i = 0; i < FILEBOX_HISTORY_SIZE; i++) {
650 if( !resources->filebox_history[i].path[0] ) continue;
651 if( resources->filebox_history[i].id > newest_id ) {
652 newest_id = resources->filebox_history[i].id;
657 strcpy(directory, resources->filebox_history[newest].path);
658 fs->change_dir(directory, 0);
659 directory_title->update(fs->get_current_dir());
663 create_listbox(x, y, get_display_mode());
664 y += listbox->get_h() + 10;
665 add_subwindow(textbox = new BC_FileBoxTextBox(x, y, this));
666 y += textbox->get_h() + 10;
668 if(!want_directory) {
669 add_subwindow(filter_text = new BC_FileBoxFilterText(x, y, this));
670 add_subwindow(filter_popup =
671 new BC_FileBoxFilterMenu(x + filter_text->get_w(), y, this));;
674 // listbox has to be active because refresh might be called from newfolder_thread
676 newfolder_thread = new BC_NewFolderThread(this);
678 rename_thread = new BC_RenameThread(this);
684 int BC_FileBox::get_listbox_w()
689 int BC_FileBox::get_listbox_h(int y)
691 int result = get_h() -
695 result -= BC_WindowBase::get_resources()->dirbox_margin;
697 result -= BC_WindowBase::get_resources()->filebox_margin;
702 int BC_FileBox::create_icons()
704 for(int i = 0; i < TOTAL_ICONS; i++)
706 icons[i] = new BC_Pixmap(this,
707 BC_WindowBase::get_resources()->type_to_icon[i],
713 int BC_FileBox::resize_event(int w, int h)
715 draw_background(0, 0, w, h);
718 // OK button handles resize event itself
719 // ok_button->reposition_window(ok_button->get_x(),
720 // h - (get_h() - ok_button->get_y()));
721 // cancel_button->reposition_window(w - (get_w() - cancel_button->get_x()),
722 // h - (get_h() - cancel_button->get_y()));
724 usethis_button->reposition_window(w / 2 - 50,
725 h - (get_h() - usethis_button->get_y()));
728 if(filter_popup) filter_popup->reposition_window(w - (get_w() - filter_popup->get_x()),
729 h - (get_h() - filter_popup->get_y()),
734 if(filter_text) filter_text->reposition_window(filter_text->get_x(),
735 h - (get_h() - filter_text->get_y()),
736 w - (get_w() - filter_text->get_w()),
738 directory_title->reposition_window(
739 directory_title->get_x(),
740 directory_title->get_y(),
741 get_w() - recent_popup->get_w() - 20,
743 recent_popup->reposition_window(
744 directory_title->get_x() + directory_title->get_w(),
745 directory_title->get_y(),
746 directory_title->get_w() + recent_popup->get_w(),
747 recent_popup->get_h());
748 textbox->reposition_window(textbox->get_x(),
749 h - (get_h() - textbox->get_y()),
750 w - (get_w() - textbox->get_w()),
752 listbox->reposition_window(listbox->get_x(),
754 w - (get_w() - listbox->get_w()),
755 h - (get_h() - listbox->get_h()),
757 icon_button->reposition_window(w - (get_w() - icon_button->get_x()),
758 icon_button->get_y());
759 text_button->reposition_window(w - (get_w() - text_button->get_x()),
760 text_button->get_y());
761 folder_button->reposition_window(w - (get_w() - folder_button->get_x()),
762 folder_button->get_y());
763 rename_button->reposition_window(w - (get_w() - rename_button->get_x()),
764 rename_button->get_y());
765 reload_button->reposition_window(w - (get_w() - reload_button->get_x()),
766 reload_button->get_y());
767 delete_button->reposition_window(w - (get_w() - delete_button->get_x()),
768 delete_button->get_y());
769 updir_button->reposition_window(w - (get_w() - updir_button->get_x()),
770 updir_button->get_y());
773 get_resources()->filebox_w = get_w();
774 get_resources()->filebox_h = get_h();
779 int BC_FileBox::keypress_event()
781 switch(get_keypress())
784 if(ctrl_down()) set_done(1);
791 int BC_FileBox::close_event()
797 int BC_FileBox::handle_event()
802 int BC_FileBox::extract_extension(char *out, const char *in)
806 for(i = strlen(in)-1; i > 0 && in[i] != '.'; i--)
819 int BC_FileBox::create_tables()
822 char string[BCTEXTLEN];
823 BC_ListBoxItem *new_item;
825 fs->set_sort_order(sort_order);
826 fs->set_sort_field(column_type[sort_column]);
828 // Directory is entered before this from a random source
830 for(int i = 0; i < fs->total_files(); i++)
832 FileItem *file_item = fs->get_entry(i);
833 int is_dir = file_item->is_dir;
834 BC_Pixmap* icon = get_icon(file_item->name, is_dir);
837 new_item = new BC_ListBoxItem(file_item->name,
839 is_dir ? get_resources()->directory_color : get_resources()->file_color);
840 if(is_dir) new_item->set_searchable(0);
841 list_column[column_of_type(FILEBOX_NAME)].append(new_item);
844 // if(!want_directory)
848 sprintf(string, _LD, file_item->size);
849 new_item = new BC_ListBoxItem(string, get_resources()->file_color);
853 new_item = new BC_ListBoxItem("", get_resources()->directory_color);
856 list_column[column_of_type(FILEBOX_SIZE)].append(new_item);
862 static const char *month_text[13] = { "Nul",
863 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
864 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
868 month_text[file_item->month],
871 new_item = new BC_ListBoxItem(string, get_resources()->file_color);
875 new_item = new BC_ListBoxItem("", get_resources()->directory_color);
878 list_column[column_of_type(FILEBOX_DATE)].append(new_item);
881 // if(!want_directory)
885 extract_extension(string, file_item->name);
886 new_item = new BC_ListBoxItem(string, get_resources()->file_color);
890 new_item = new BC_ListBoxItem("", get_resources()->directory_color);
892 list_column[column_of_type(FILEBOX_EXTENSION)].append(new_item);
899 int BC_FileBox::delete_tables()
901 for(int j = 0; j < columns; j++)
903 list_column[j].remove_all_objects();
908 BC_Pixmap* BC_FileBox::get_icon(char *path, int is_dir)
910 char *suffix = strrchr(path, '.');
911 int icon_type = ICON_UNKNOWN;
913 if(is_dir) return icons[ICON_FOLDER];
920 for(int i = 0; i < TOTAL_SUFFIXES; i++)
922 if(!strcasecmp(suffix, BC_WindowBase::get_resources()->suffix_to_type[i].suffix))
924 icon_type = BC_WindowBase::get_resources()->suffix_to_type[i].icon_type;
931 return icons[icon_type];
934 const char* BC_FileBox::columntype_to_text(int type)
939 return FILEBOX_NAME_TEXT;
942 return FILEBOX_SIZE_TEXT;
945 return FILEBOX_DATE_TEXT;
947 case FILEBOX_EXTENSION:
948 return FILEBOX_EXTENSION_TEXT;
954 int BC_FileBox::column_of_type(int type)
956 for(int i = 0; i < columns; i++)
957 if(column_type[i] == type) return i;
963 int BC_FileBox::refresh(int zscroll)
966 listbox->set_master_column(column_of_type(FILEBOX_NAME), 0);
967 listbox->update(list_column, column_titles, column_width, columns,
968 !zscroll ? listbox->get_xposition() : 0,
969 !zscroll ? listbox->get_yposition() : 0,
974 int BC_FileBox::update_filter(const char *filter)
976 fs->set_filter(filter);
979 strcpy(get_resources()->filebox_filter, filter);
985 void BC_FileBox::move_column(int src, int dst)
990 ArrayList<BC_ListBoxItem*> *new_columns =
991 new ArrayList<BC_ListBoxItem*>[columns];
992 int *new_types = new int[columns];
993 int *new_widths = new int[columns];
995 // Fill in remaining columns with consecutive data
996 for(int out_column = 0, in_column = 0;
997 out_column < columns;
1001 // Copy destination column from src column
1002 if(out_column == dst)
1004 for(int i = 0; i < list_column[src].total; i++)
1006 new_columns[out_column].append(list_column[src].values[i]);
1008 new_types[out_column] = column_type[src];
1009 new_widths[out_column] = column_width[src];
1014 // Skip source column
1015 if(in_column == src) in_column++;
1016 for(int i = 0; i < list_column[src].total; i++)
1018 new_columns[out_column].append(list_column[in_column].values[i]);
1020 new_types[out_column] = column_type[in_column];
1021 new_widths[out_column] = column_width[in_column];
1026 delete [] list_column;
1027 delete [] column_type;
1028 delete [] column_width;
1029 list_column = new_columns;
1030 column_type = new_types;
1031 column_width = new_widths;
1033 for(int i = 0; i < columns; i++)
1035 get_resources()->filebox_columntype[i] = column_type[i];
1036 get_resources()->filebox_columnwidth[i] = column_width[i];
1037 column_titles[i] = (char*)BC_FileBox::columntype_to_text(column_type[i]);
1045 int BC_FileBox::submit_dir(char *dir)
1047 strcpy(directory, dir);
1048 fs->join_names(current_path, directory, filename);
1050 // printf("BC_FileBox::submit_dir %d '%s' '%s' '%s'\n",
1055 strcpy(submitted_path, current_path);
1056 fs->change_dir(dir, 0);
1058 directory_title->update(fs->get_current_dir());
1060 textbox->update(fs->get_current_dir());
1062 textbox->update(filename);
1063 listbox->reset_query();
1067 int BC_FileBox::submit_file(const char *path, int use_this)
1069 // Deactivate textbox to hide suggestions
1070 textbox->deactivate();
1072 // If file wanted, take the current directory as the desired file.
1073 // If directory wanted, ignore it.
1074 if(!path[0] && !want_directory)
1076 // save complete path
1077 strcpy(this->current_path, directory);
1078 // save complete path
1079 strcpy(this->submitted_path, directory);
1081 // Zero out filename
1087 // is a directory, change directories
1088 if(fs->is_dir(path) && !use_this)
1090 fs->change_dir(path, 0);
1092 directory_title->update(fs->get_current_dir());
1093 strcpy(this->current_path, fs->get_current_dir());
1094 strcpy(this->submitted_path, fs->get_current_dir());
1095 strcpy(this->directory, fs->get_current_dir());
1098 textbox->update(fs->get_current_dir());
1100 textbox->update("");
1101 listbox->reset_query();
1105 // Is a file or desired directory. Quit the operation.
1107 char path2[BCTEXTLEN];
1108 strcpy(path2, path);
1110 // save directory for defaults
1111 fs->extract_dir(directory, path2);
1113 // Just take the directory
1117 strcpy(path2, directory);
1120 // Take the complete path
1122 fs->extract_name(filename, path2); // save filename
1125 fs->complete_path(path2);
1126 strcpy(this->current_path, path2); // save complete path
1127 strcpy(this->submitted_path, path2); // save complete path
1129 newfolder_thread->interrupt();
1136 void BC_FileBox::update_history()
1138 // Look for path already in history
1139 BC_Resources *resources = get_resources();
1140 // int new_slot = FILEBOX_HISTORY_SIZE - 1;
1142 for(int i = FILEBOX_HISTORY_SIZE - 1; i >= 0; i--)
1144 if(resources->filebox_history[i].path[0] &&
1145 !strcmp(resources->filebox_history[i].path, directory))
1147 // Got matching path.
1149 resources->filebox_history[i].id = resources->get_filebox_id();
1152 // // Shift down from this point.
1155 // strcpy(resources->filebox_history[i],
1156 // resources->filebox_history[i - 1]);
1157 // if(resources->filebox_history[i][0]) new_slot--;
1163 // if(resources->filebox_history[i][0])
1169 // Remove oldest entry if full
1170 if(resources->filebox_history[FILEBOX_HISTORY_SIZE - 1].path[0])
1172 int oldest_id = 0x7fffffff;
1174 for(int i = 0; i < FILEBOX_HISTORY_SIZE; i++)
1176 if(resources->filebox_history[i].path[0] &&
1177 resources->filebox_history[i].id < oldest_id)
1179 oldest_id = resources->filebox_history[i].id;
1184 for(int i = oldest; i < FILEBOX_HISTORY_SIZE - 1; i++)
1186 strcpy(resources->filebox_history[i].path,
1187 resources->filebox_history[i + 1].path);
1188 resources->filebox_history[i].id =
1189 resources->filebox_history[i + 1].id;
1194 strcpy(resources->filebox_history[FILEBOX_HISTORY_SIZE - 1].path,
1196 resources->filebox_history[FILEBOX_HISTORY_SIZE - 1].id = resources->get_filebox_id();
1203 for(int i = 1; i < FILEBOX_HISTORY_SIZE; i++)
1205 if( (resources->filebox_history[i - 1].path[0] &&
1206 resources->filebox_history[i].path[0] &&
1207 strcasecmp(resources->filebox_history[i - 1].path,
1208 resources->filebox_history[i].path) > 0) ||
1209 (resources->filebox_history[i - 1].path[0] == 0 &&
1210 resources->filebox_history[i].path[0]) )
1213 char temp[BCTEXTLEN];
1215 strcpy(temp, resources->filebox_history[i - 1].path);
1216 id_temp = resources->filebox_history[i - 1].id;
1217 strcpy(resources->filebox_history[i - 1].path,
1218 resources->filebox_history[i].path);
1219 resources->filebox_history[i - 1].id =
1220 resources->filebox_history[i].id;
1221 strcpy(resources->filebox_history[i].path, temp);
1222 resources->filebox_history[i].id = id_temp;
1229 // for(int i = FILEBOX_HISTORY_SIZE - 1; i > 0; i--)
1231 // strcpy(resources->filebox_history[i],
1232 // resources->filebox_history[i - 1]);
1237 // strcpy(resources->filebox_history[new_slot], directory);
1240 recent_popup->update(&recent_dirs, 0, 0, 1);
1243 void BC_FileBox::create_history()
1245 BC_Resources *resources = get_resources();
1246 recent_dirs.remove_all_objects();
1247 for(int i = 0; i < FILEBOX_HISTORY_SIZE; i++) {
1248 if(resources->filebox_history[i].path[0]) {
1249 recent_dirs.append(new BC_ListBoxItem(resources->filebox_history[i].path));
1255 int BC_FileBox::get_display_mode()
1257 return top_level->get_resources()->filebox_mode;
1260 void BC_FileBox::create_listbox(int x, int y, int mode)
1262 if(listbox && listbox->get_display_mode() != mode)
1266 top_level->get_resources()->filebox_mode = mode;
1270 add_subwindow(listbox = new BC_FileBoxListBox(x, y, this));
1273 char* BC_FileBox::get_path(int selection)
1277 return get_submitted_path();
1281 BC_ListBoxItem *item = listbox->get_selection(
1282 column_of_type(FILEBOX_NAME), selection - 1);
1285 fs->join_names(string, directory, item->get_text());
1292 char* BC_FileBox::get_submitted_path()
1294 return submitted_path;
1297 char* BC_FileBox::get_current_path()
1299 //printf("BC_FileBox::get_current_path 1 %s\n", current_path);
1300 return current_path;
1303 char* BC_FileBox::get_newfolder_title()
1305 char *letter2 = strchr(title, ':');
1306 new_folder_title[0] = 0;
1309 memcpy(new_folder_title, title, letter2 - title);
1310 new_folder_title[letter2 - title] = 0;
1313 strcat(new_folder_title, _(": New folder"));
1315 return new_folder_title;
1318 char* BC_FileBox::get_rename_title()
1320 char *letter2 = strchr(title, ':');
1321 new_folder_title[0] = 0;
1324 memcpy(new_folder_title, title, letter2 - title);
1325 new_folder_title[letter2 - title] = 0;
1328 strcat(new_folder_title, _(": Rename"));
1330 return new_folder_title;
1333 char* BC_FileBox::get_delete_title()
1335 char *letter2 = strchr(title, ':');
1336 new_folder_title[0] = 0;
1339 memcpy(new_folder_title, title, letter2 - title);
1340 new_folder_title[letter2 - title] = 0;
1343 strcat(new_folder_title, _(": Delete"));
1345 return new_folder_title;
1348 void BC_FileBox::delete_files()
1350 // Starting at 1 causes it to ignore what's in the textbox.
1354 while((path = get_path(i)))
1356 // Not directory. Remove it.
1357 if(!fs.is_dir(path))
1359 //printf("BC_FileBox::delete_files: removing \"%s\"\n", path);
1367 BC_Button* BC_FileBox::get_ok_button()
1372 BC_Button* BC_FileBox::get_cancel_button()
1374 return cancel_button;