| 
									
										
										
										
											2007-11-17 02:25:45 +08:00
										 |  |  | /* ASE - Allegro Sprite Editor
 | 
					
						
							| 
									
										
										
										
											2011-01-19 07:49:53 +08:00
										 |  |  |  * Copyright (C) 2001-2011  David Capello | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 "config.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | #include <algorithm>
 | 
					
						
							|  |  |  | #include <cctype>
 | 
					
						
							| 
									
										
										
										
											2010-07-17 03:56:45 +08:00
										 |  |  | #include <iterator>
 | 
					
						
							|  |  |  | #include <set>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | #include <allegro.h>
 | 
					
						
							|  |  |  | #include <allegro/internal/aintern.h>
 | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-11 22:53:05 +08:00
										 |  |  | #include "app.h"
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | #include "base/bind.h"
 | 
					
						
							|  |  |  | #include "base/path.h"
 | 
					
						
							|  |  |  | #include "base/split_string.h"
 | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | #include "file/file.h"
 | 
					
						
							| 
									
										
										
										
											2011-01-31 06:12:10 +08:00
										 |  |  | #include "gui/gui.h"
 | 
					
						
							| 
									
										
										
										
											2011-06-30 09:51:46 +08:00
										 |  |  | #include "ini_file.h"
 | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | #include "modules/gfx.h"
 | 
					
						
							|  |  |  | #include "modules/gui.h"
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  | #include "recent_files.h"
 | 
					
						
							| 
									
										
										
										
											2011-03-07 03:15:05 +08:00
										 |  |  | #include "skin/skin_parts.h"
 | 
					
						
							| 
									
										
										
										
											2010-07-17 03:56:45 +08:00
										 |  |  | #include "widgets/fileview.h"
 | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if (DEVICE_SEPARATOR != 0) && (DEVICE_SEPARATOR != '\0')
 | 
					
						
							|  |  |  | #  define HAVE_DRIVES
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-05 21:54:30 +08:00
										 |  |  | #ifndef MAX_PATH
 | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | #  define MAX_PATH 4096		/* TODO this is needed for Linux, is it correct? */
 | 
					
						
							| 
									
										
										
										
											2008-02-05 21:54:30 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | /* Variables used only to maintain the history of navigation. */ | 
					
						
							|  |  |  | static JLink navigation_position = NULL; /* current position in the navigation history */ | 
					
						
							|  |  |  | static JList navigation_history = NULL;	/* set of FileItems navigated */ | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  | static bool navigation_locked = false;	/* if true the navigation_history isn't
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 					   modified if the current folder | 
					
						
							|  |  |  | 					   changes (used when the back/forward | 
					
						
							|  |  |  | 					   buttons are pushed) */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void update_location(Widget* window); | 
					
						
							|  |  |  | static void update_navigation_buttons(Widget* window); | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | static void add_in_navigation_history(IFileItem* folder); | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void select_filetype_from_filename(Widget* window); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void goback_command(Widget* widget); | 
					
						
							|  |  |  | static void goforward_command(Widget* widget); | 
					
						
							|  |  |  | static void goup_command(Widget* widget); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-03 00:14:07 +08:00
										 |  |  | static bool fileview_msg_proc(Widget* widget, Message* msg); | 
					
						
							|  |  |  | static bool location_msg_proc(Widget* widget, Message* msg); | 
					
						
							|  |  |  | static bool filetype_msg_proc(Widget* widget, Message* msg); | 
					
						
							|  |  |  | static bool filename_msg_proc(Widget* widget, Message* msg); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 10:36:05 +08:00
										 |  |  | // Slot for App::Exit signal 
 | 
					
						
							|  |  |  | static void on_exit_delete_navigation_history() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   jlist_free(navigation_history); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-11 23:59:13 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Shows the dialog to select a file in ASE. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Mainly it uses: | 
					
						
							| 
									
										
										
										
											2011-06-30 09:51:46 +08:00
										 |  |  |  * - the 'file_system' routines. | 
					
						
							| 
									
										
										
										
											2008-10-11 23:59:13 +08:00
										 |  |  |  * - the 'widgets/fileview' widget. | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | base::string ase_file_selector(const base::string& message, | 
					
						
							|  |  |  | 			       const base::string& init_path, | 
					
						
							|  |  |  | 			       const base::string& exts) | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |   static Frame* window = NULL; | 
					
						
							|  |  |  |   Widget* fileview; | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |   Entry* filename_entry; | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |   ComboBox* filetype; | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |   base::string result; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |   FileSystemModule::instance()->refresh(); | 
					
						
							| 
									
										
										
										
											2008-03-01 03:29:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-06 23:22:57 +08:00
										 |  |  |   if (!navigation_history) { | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     navigation_history = jlist_new(); | 
					
						
							| 
									
										
										
										
											2010-03-01 10:36:05 +08:00
										 |  |  |     App::instance()->Exit.connect(&on_exit_delete_navigation_history); | 
					
						
							| 
									
										
										
										
											2008-05-06 23:22:57 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |   // we have to find where the user should begin to browse files (start_folder)
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |   base::string start_folder_path; | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |   IFileItem* start_folder = NULL; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |   // if init_path doesn't contain a path...
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |   if (base::get_file_path(init_path).empty()) { | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |     // get the saved `path' in the configuration file
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |     base::string path = get_config_string("FileSelect", "CurrentDirectory", ""); | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     start_folder = FileSystemModule::instance()->getFileItemFromPath(path); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |     // is the folder find?
 | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  |     if (!start_folder) { | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |       // if the `path' doesn't exist...
 | 
					
						
							| 
									
										
										
										
											2010-09-27 05:26:38 +08:00
										 |  |  |       if (path.empty() || (!FileSystemModule::instance()->dirExists(path))) { | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  | 	// we can get the current `path' from the system
 | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | #ifdef HAVE_DRIVES
 | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  | 	int drive = _al_getdrive(); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  | 	int drive = 0; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  | 	char tmp[1024]; | 
					
						
							|  |  |  | 	_al_getdcwd(drive, tmp, sizeof(tmp) - ucwidth(OTHER_PATH_SEPARATOR)); | 
					
						
							|  |  |  | 	path = tmp; | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |       start_folder_path = base::join_path(path, init_path); | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   else { | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |     // remove the filename
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |     start_folder_path = base::join_path(base::get_file_path(init_path), ""); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |   start_folder_path = base::fix_path_separators(start_folder_path); | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!start_folder) | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     start_folder = FileSystemModule::instance()->getFileItemFromPath(start_folder_path); | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 06:39:41 +08:00
										 |  |  |   PRINTF("start_folder_path = %s (%p)\n", start_folder_path.c_str(), start_folder); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   if (!window) { | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |     // load the window widget
 | 
					
						
							| 
									
										
										
										
											2010-04-07 09:14:33 +08:00
										 |  |  |     window = static_cast<Frame*>(load_widget("file_selector.xml", "file_selector")); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |     Widget* box = window->findChild("box"); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |     Button* goback = window->findChildT<Button>("goback"); | 
					
						
							|  |  |  |     Button* goforward = window->findChildT<Button>("goforward"); | 
					
						
							|  |  |  |     Button* goup = window->findChildT<Button>("goup"); | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |     Widget* location = window->findChild("location"); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |     filetype = window->findChildT<ComboBox>("filetype"); | 
					
						
							| 
									
										
										
										
											2010-08-04 10:33:44 +08:00
										 |  |  |     ASSERT(filetype != NULL); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |     filename_entry = window->findChildT<Entry>("filename"); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |     jwidget_focusrest(goback, false); | 
					
						
							|  |  |  |     jwidget_focusrest(goforward, false); | 
					
						
							|  |  |  |     jwidget_focusrest(goup, false); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-07 03:15:05 +08:00
										 |  |  |     set_gfxicon_to_button(goback, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_LEFT, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_LEFT_SELECTED, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_LEFT_DISABLED, | 
					
						
							|  |  |  | 			  JI_CENTER | JI_MIDDLE); | 
					
						
							|  |  |  |     set_gfxicon_to_button(goforward, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_RIGHT, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_RIGHT_SELECTED, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_RIGHT_DISABLED, | 
					
						
							|  |  |  | 			  JI_CENTER | JI_MIDDLE); | 
					
						
							|  |  |  |     set_gfxicon_to_button(goup, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_UP, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_UP_SELECTED, | 
					
						
							|  |  |  | 			  PART_COMBOBOX_ARROW_UP_DISABLED, | 
					
						
							|  |  |  | 			  JI_CENTER | JI_MIDDLE); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-22 10:19:05 +08:00
										 |  |  |     setup_mini_look(goback); | 
					
						
							|  |  |  |     setup_mini_look(goforward); | 
					
						
							|  |  |  |     setup_mini_look(goup); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-26 04:20:59 +08:00
										 |  |  |     goback->Click.connect(Bind<void>(&goback_command, goback)); | 
					
						
							|  |  |  |     goforward->Click.connect(Bind<void>(&goforward_command, goforward)); | 
					
						
							|  |  |  |     goup->Click.connect(Bind<void>(&goup_command, goup)); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 05:35:21 +08:00
										 |  |  |     View* view = new View(); | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |     fileview = fileview_new(start_folder, exts); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     jwidget_add_hook(fileview, -1, fileview_msg_proc, NULL); | 
					
						
							|  |  |  |     jwidget_add_hook(location, -1, location_msg_proc, NULL); | 
					
						
							|  |  |  |     jwidget_add_hook(filetype, -1, filetype_msg_proc, NULL); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |     jwidget_add_hook(filename_entry, -1, filename_msg_proc, NULL); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |     fileview->setName("fileview"); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-21 05:35:21 +08:00
										 |  |  |     view->attachToView(fileview); | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |     jwidget_expansive(view, true); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:35:17 +08:00
										 |  |  |     box->addChild(view); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     jwidget_set_min_size(window, JI_SCREEN_W*9/10, JI_SCREEN_H*9/10); | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |     window->remap_window(); | 
					
						
							|  |  |  |     window->center_window(); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |     fileview = window->findChild("fileview"); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |     filetype = window->findChildT<ComboBox>("filetype"); | 
					
						
							| 
									
										
										
										
											2010-08-04 10:33:44 +08:00
										 |  |  |     ASSERT(filetype != NULL); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |     filename_entry = window->findChildT<Entry>("filename"); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     jwidget_signal_off(fileview); | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  |     fileview_set_current_folder(fileview, start_folder); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     jwidget_signal_on(fileview); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // current location
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   navigation_position = NULL; | 
					
						
							|  |  |  |   add_in_navigation_history(fileview_get_current_folder(fileview)); | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // fill the location combo-box
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   update_location(window); | 
					
						
							|  |  |  |   update_navigation_buttons(window); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // fill file-type combo-box
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |   filetype->removeAllItems(); | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |   std::vector<base::string> tokens; | 
					
						
							|  |  |  |   std::vector<base::string>::iterator tok; | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |   base::split_string(exts, tokens, ","); | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |   for (tok=tokens.begin(); tok!=tokens.end(); ++tok) | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     filetype->addItem(tok->c_str()); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // file name entry field
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |   filename_entry->setText(base::get_file_name(init_path).c_str()); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   select_filetype_from_filename(window); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |   filename_entry->selectText(0, -1); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // setup the title of the window
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |   window->setText(message.c_str()); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // get the ok-button
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |   Widget* ok = window->findChild("ok"); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // update the view
 | 
					
						
							| 
									
										
										
										
											2011-02-21 05:35:21 +08:00
										 |  |  |   View::getView(fileview)->updateView(); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   // open the window and run... the user press ok?
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | again: | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |   window->open_window_fg(); | 
					
						
							|  |  |  |   if (window->get_killer() == ok || | 
					
						
							|  |  |  |       window->get_killer() == fileview) { | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |     // open the selected file
 | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     IFileItem *folder = fileview_get_current_folder(fileview); | 
					
						
							| 
									
										
										
										
											2010-08-04 10:33:44 +08:00
										 |  |  |     ASSERT(folder); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |     base::string fn = filename_entry->getText(); | 
					
						
							|  |  |  |     base::string buf; | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     IFileItem* enter_folder = NULL; | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // up a level?
 | 
					
						
							|  |  |  |     if (fn == "..") { | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |       enter_folder = folder->getParent(); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       if (!enter_folder) | 
					
						
							|  |  |  | 	enter_folder = folder; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-03-02 10:08:40 +08:00
										 |  |  |     else if (!fn.empty()) { | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       // check if the user specified in "fn" a item of "fileview"
 | 
					
						
							|  |  |  |       const FileItemList& children = fileview_get_filelist(fileview); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |       base::string fn2 = fn; | 
					
						
							|  |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  |       fn2 = base::string_to_lower(fn2); | 
					
						
							| 
									
										
										
										
											2009-03-02 10:08:40 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       for (FileItemList::const_iterator | 
					
						
							|  |  |  | 	     it=children.begin(); it!=children.end(); ++it) { | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	IFileItem* child = *it; | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	base::string child_name = child->getDisplayName(); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  | 	child_name = base::string_to_lower(child_name); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-08-10 05:24:32 +08:00
										 |  |  | 	if (child_name == fn2) { | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	  enter_folder = *it; | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	  buf = enter_folder->getFileName(); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	  break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (!enter_folder) { | 
					
						
							|  |  |  | 	// does the file-name entry have separators?
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	if (base::is_path_separator(*fn.begin())) { // absolute path (UNIX style)
 | 
					
						
							|  |  |  | #ifdef WIN32
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	  // get the drive of the current folder
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	  base::string drive = folder->getFileName(); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	  if (drive.size() >= 2 && drive[1] == ':') { | 
					
						
							|  |  |  | 	    buf += drive[0]; | 
					
						
							|  |  |  | 	    buf += ':'; | 
					
						
							|  |  |  | 	    buf += fn; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	  else | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	    buf = base::join_path("C:", fn); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 	  buf = fn; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | #ifdef WIN32
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	// does the file-name entry have colon?
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	else if (fn.find(':') != base::string::npos) { // absolute path on Windows
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	  if (fn.size() == 2 && fn[1] == ':') { | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	    buf = base::join_path(fn, ""); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	  } | 
					
						
							|  |  |  | 	  else { | 
					
						
							|  |  |  | 	    buf = fn; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	  buf = folder->getFileName(); | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	  buf = base::join_path(buf, fn); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	buf = base::fix_path_separators(buf); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// we can check if 'buf' is a folder, so we have to enter in it
 | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	enter_folder = FileSystemModule::instance()->getFileItemFromPath(buf); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-03-02 10:08:40 +08:00
										 |  |  |     else { | 
					
						
							|  |  |  |       // show the window again
 | 
					
						
							| 
									
										
										
										
											2010-07-04 23:03:14 +08:00
										 |  |  |       window->setVisible(true); | 
					
						
							| 
									
										
										
										
											2009-03-02 10:08:40 +08:00
										 |  |  |       goto again; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |     // did we find a folder to enter?
 | 
					
						
							|  |  |  |     if (enter_folder && | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	enter_folder->isFolder() && | 
					
						
							|  |  |  | 	enter_folder->isBrowsable()) { | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       // enter in the folder that was specified in the 'filename_entry'
 | 
					
						
							|  |  |  |       fileview_set_current_folder(fileview, enter_folder); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // clear the text of the entry widget
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |       filename_entry->setText(""); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // show the window again
 | 
					
						
							| 
									
										
										
										
											2010-07-04 23:03:14 +08:00
										 |  |  |       window->setVisible(true); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       goto again; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // else file-name specified in the entry is really a file to open...
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |     // does it not have extension? ...we should add the extension
 | 
					
						
							|  |  |  |     // selected in the filetype combo-box
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |     if (base::get_file_extension(buf).empty()) { | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |       buf += '.'; | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |       buf += filetype->getItemText(filetype->getSelectedItem()); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |     // duplicate the buffer to return a new string
 | 
					
						
							| 
									
										
										
										
											2008-10-12 04:41:27 +08:00
										 |  |  |     result = buf; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |     // save the path in the configuration file
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |     base::string lastpath = folder->getKeyName(); | 
					
						
							| 
									
										
										
										
											2008-02-19 07:36:34 +08:00
										 |  |  |     set_config_string("FileSelect", "CurrentDirectory", | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  | 		      lastpath.c_str()); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   jwidget_free(window); | 
					
						
							|  |  |  |   window = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return result; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |  * Updates the content of the combo-box that shows the current | 
					
						
							|  |  |  |  * location in the file-system. | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void update_location(Widget* window) | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |   Widget* fileview = window->findChild("fileview"); | 
					
						
							|  |  |  |   ComboBox* location = dynamic_cast<ComboBox*>(window->findChild("location")); | 
					
						
							| 
									
										
										
										
											2010-08-04 10:33:44 +08:00
										 |  |  |   ASSERT(location != NULL); | 
					
						
							| 
									
										
										
										
											2010-07-20 05:57:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |   IFileItem* current_folder = fileview_get_current_folder(fileview); | 
					
						
							|  |  |  |   IFileItem* fileitem = current_folder; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   JList locations = jlist_new(); | 
					
						
							|  |  |  |   JLink link; | 
					
						
							|  |  |  |   int selected_index = -1; | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |   int newItem; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   while (fileitem != NULL) { | 
					
						
							|  |  |  |     jlist_prepend(locations, fileitem); | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     fileitem = fileitem->getParent(); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |   // Clear all the items from the combo-box
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |   location->removeAllItems(); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |   // Add item by item (from root to the specific current folder)
 | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |   int level = 0; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   JI_LIST_FOR_EACH(locations, link) { | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     fileitem = reinterpret_cast<IFileItem*>(link->data); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |     // Indentation
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |     base::string buf; | 
					
						
							| 
									
										
										
										
											2008-10-14 05:43:41 +08:00
										 |  |  |     for (int c=0; c<level; ++c) | 
					
						
							|  |  |  |       buf += "  "; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |     // Location name
 | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     buf += fileitem->getDisplayName(); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |     // Add the new location to the combo-box
 | 
					
						
							|  |  |  |     newItem = location->addItem(buf.c_str()); | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     location->setItemData(newItem, fileitem); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     if (fileitem == current_folder) | 
					
						
							|  |  |  |       selected_index = level; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     level++; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |   // Add paths from recent files list
 | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     newItem = location->addItem(""); | 
					
						
							|  |  |  |     newItem = location->addItem("-------- Recent Paths --------"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::set<std::string> included; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // For each recent file...
 | 
					
						
							| 
									
										
										
										
											2010-09-18 11:28:24 +08:00
										 |  |  |     RecentFiles::const_iterator it = App::instance()->getRecentFiles()->begin(); | 
					
						
							|  |  |  |     RecentFiles::const_iterator end = App::instance()->getRecentFiles()->end(); | 
					
						
							|  |  |  |     for (; it != end; ++it) { | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |       // Get the path of the recent file
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |       base::string path = base::get_file_path(*it); | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Check if the path was not already included in the list
 | 
					
						
							|  |  |  |       if (included.find(path) == included.end()) { | 
					
						
							|  |  |  | 	included.insert(path); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	location->addItem(path); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Select the location
 | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     jwidget_signal_off(location); | 
					
						
							|  |  |  |     location->setSelectedItem(selected_index); | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |     location->getEntryWidget()->setText(current_folder->getDisplayName().c_str()); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  |     location->getEntryWidget()->deselectText(); | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  |     jwidget_signal_on(location); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   jlist_free(locations); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void update_navigation_buttons(Widget* window) | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |   Widget* fileview = window->findChild("fileview"); | 
					
						
							|  |  |  |   Widget* goback = window->findChild("goback"); | 
					
						
							|  |  |  |   Widget* goforward = window->findChild("goforward"); | 
					
						
							|  |  |  |   Widget* goup = window->findChild("goup"); | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |   IFileItem* current_folder = fileview_get_current_folder(fileview); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* update the state of the go back button: if the navigation-history
 | 
					
						
							|  |  |  |      has two elements and the navigation-position isn't the first | 
					
						
							|  |  |  |      one */ | 
					
						
							| 
									
										
										
										
											2010-07-04 02:26:27 +08:00
										 |  |  |   goback->setEnabled(jlist_length(navigation_history) > 1 && | 
					
						
							|  |  |  | 		     (!navigation_position || | 
					
						
							|  |  |  | 		      navigation_position != jlist_first(navigation_history))); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   /* update the state of the go forward button: if the
 | 
					
						
							|  |  |  |      navigation-history has two elements and the navigation-position | 
					
						
							|  |  |  |      isn't the last one */ | 
					
						
							| 
									
										
										
										
											2010-07-04 02:26:27 +08:00
										 |  |  |   goforward->setEnabled(jlist_length(navigation_history) > 1 && | 
					
						
							|  |  |  | 			(!navigation_position || | 
					
						
							|  |  |  | 			 navigation_position != jlist_last(navigation_history))); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   /* update the state of the go up button: if the current-folder isn't
 | 
					
						
							|  |  |  |      the root-item */ | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |   goup->setEnabled(current_folder != FileSystemModule::instance()->getRootFileItem()); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | static void add_in_navigation_history(IFileItem* folder) | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |   ASSERT(folder != NULL); | 
					
						
							|  |  |  |   ASSERT(folder->isFolder()); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* remove the history from the current position */ | 
					
						
							|  |  |  |   if (navigation_position) { | 
					
						
							|  |  |  |     JLink next; | 
					
						
							|  |  |  |     for (navigation_position = navigation_position->next; | 
					
						
							|  |  |  | 	 navigation_position != navigation_history->end; | 
					
						
							|  |  |  | 	 navigation_position = next) { | 
					
						
							|  |  |  |       next = navigation_position->next; | 
					
						
							|  |  |  |       jlist_delete_link(navigation_history, | 
					
						
							|  |  |  | 			navigation_position); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     navigation_position = NULL; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   /* if the history is empty or if the last item isn't the folder that
 | 
					
						
							|  |  |  |      we are visiting... */ | 
					
						
							|  |  |  |   if (jlist_empty(navigation_history) || | 
					
						
							|  |  |  |       jlist_last_data(navigation_history) != folder) { | 
					
						
							|  |  |  |     /* ...we can add the location in the history */ | 
					
						
							|  |  |  |     jlist_append(navigation_history, folder); | 
					
						
							|  |  |  |     navigation_position = jlist_last(navigation_history); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void select_filetype_from_filename(Widget* window) | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |   Widget* entry = window->findChild("filename"); | 
					
						
							|  |  |  |   ComboBox* filetype = dynamic_cast<ComboBox*>(window->findChild("filetype")); | 
					
						
							| 
									
										
										
										
											2010-08-04 10:33:44 +08:00
										 |  |  |   ASSERT(filetype != NULL); | 
					
						
							| 
									
										
										
										
											2010-07-20 05:57:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |   const char *filename = entry->getText(); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   char *p = get_extension(filename); | 
					
						
							|  |  |  |   char buf[MAX_PATH]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (p && *p != 0) { | 
					
						
							|  |  |  |     ustrcpy(buf, get_extension(filename)); | 
					
						
							|  |  |  |     ustrlwr(buf); | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     filetype->setSelectedItem(filetype->findItemIndex(buf)); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void goback_command(Widget* widget) | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |   Widget* fileview = widget->findSibling("fileview"); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   if (jlist_length(navigation_history) > 1) { | 
					
						
							|  |  |  |     if (!navigation_position) | 
					
						
							|  |  |  |       navigation_position = jlist_last(navigation_history); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (navigation_position->prev != navigation_history->end) { | 
					
						
							|  |  |  |       navigation_position = navigation_position->prev; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |       navigation_locked = true; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |       fileview_set_current_folder(fileview, | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 				  reinterpret_cast<IFileItem*>(navigation_position->data)); | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |       navigation_locked = false; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void goforward_command(Widget* widget) | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |   Widget* fileview = widget->findSibling("fileview"); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (jlist_length(navigation_history) > 1) { | 
					
						
							|  |  |  |     if (!navigation_position) | 
					
						
							|  |  |  |       navigation_position = jlist_first(navigation_history); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     if (navigation_position->next != navigation_history->end) { | 
					
						
							|  |  |  |       navigation_position = navigation_position->next; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |       navigation_locked = true; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |       fileview_set_current_folder(fileview, | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 				  reinterpret_cast<IFileItem*>(navigation_position->data)); | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |       navigation_locked = false; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  | static void goup_command(Widget* widget) | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-03-30 08:42:21 +08:00
										 |  |  |   Widget* fileview = widget->findSibling("fileview"); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |   fileview_goup(fileview); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | /* hook for the 'fileview' widget in the dialog */ | 
					
						
							| 
									
										
										
										
											2011-04-03 00:14:07 +08:00
										 |  |  | static bool fileview_msg_proc(Widget* widget, Message* msg) | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   if (msg->type == JM_SIGNAL) { | 
					
						
							|  |  |  |     switch (msg->signal.num) { | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |       case SIGNAL_FILEVIEW_FILE_SELECTED: { | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	IFileItem* fileitem = fileview_get_selected(widget); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	if (!fileitem->isFolder()) { | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  | 	  Frame* window = static_cast<Frame*>(widget->getRoot()); | 
					
						
							|  |  |  | 	  Widget* entry = window->findChild("filename"); | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	  base::string filename = base::get_file_name(fileitem->getFileName()); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  | 	  entry->setText(filename.c_str()); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	  select_filetype_from_filename(window); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | 	/* when a file is accepted */ | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |       case SIGNAL_FILEVIEW_FILE_ACCEPT: | 
					
						
							| 
									
										
										
										
											2011-01-22 10:49:07 +08:00
										 |  |  | 	widget->closeWindow(); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	break; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | 	/* when the current folder change */ | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |       case SIGNAL_FILEVIEW_CURRENT_FOLDER_CHANGED: { | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  | 	Frame* window = static_cast<Frame*>(widget->getRoot()); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	if (!navigation_locked) | 
					
						
							|  |  |  | 	  add_in_navigation_history(fileview_get_current_folder(widget)); | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	update_location(window); | 
					
						
							|  |  |  | 	update_navigation_buttons(window); | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |   return false; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-20 05:57:16 +08:00
										 |  |  | // Hook for the 'location' combo-box
 | 
					
						
							| 
									
										
										
										
											2011-04-03 00:14:07 +08:00
										 |  |  | static bool location_msg_proc(Widget* widget, Message* msg) | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   if (msg->type == JM_SIGNAL) { | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     ComboBox* combobox = dynamic_cast<ComboBox*>(widget); | 
					
						
							| 
									
										
										
										
											2010-08-04 10:33:44 +08:00
										 |  |  |     ASSERT(combobox != NULL); | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     switch (msg->signal.num) { | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |       // When the user change the location we have to set the
 | 
					
						
							|  |  |  |       // current-folder in the 'fileview' widget
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |       case JI_SIGNAL_COMBOBOX_SELECT: { | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  | 	int itemIndex = combobox->getSelectedItem(); | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	IFileItem* fileitem = reinterpret_cast<IFileItem*>(combobox->getItemData(itemIndex)); | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Maybe the user selected a recent file path
 | 
					
						
							|  |  |  | 	if (fileitem == NULL) { | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  | 	  base::string path = combobox->getItemText(itemIndex); | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  | 	  if (!path.empty()) | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  | 	    fileitem = FileSystemModule::instance()->getFileItemFromPath(path); | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 11:27:04 +08:00
										 |  |  | 	if (fileitem != NULL) { | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  | 	  Widget* fileview = widget->findSibling("fileview"); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	  fileview_set_current_folder(fileview, fileitem); | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  | 	  // Refocus the 'fileview' (the focus in that widget is more
 | 
					
						
							|  |  |  | 	  // useful for the user)
 | 
					
						
							| 
									
										
										
										
											2008-02-11 03:06:03 +08:00
										 |  |  | 	  jmanager_set_focus(fileview); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |   return false; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  | // Hook for the 'filetype' combo-box
 | 
					
						
							| 
									
										
										
										
											2011-04-03 00:14:07 +08:00
										 |  |  | static bool filetype_msg_proc(Widget* widget, Message* msg) | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   if (msg->type == JM_SIGNAL) { | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     ComboBox* combobox = dynamic_cast<ComboBox*>(widget); | 
					
						
							| 
									
										
										
										
											2010-08-04 10:33:44 +08:00
										 |  |  |     ASSERT(combobox != NULL); | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     switch (msg->signal.num) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |       // When the user select a new file-type (extension), we have to
 | 
					
						
							|  |  |  |       // change the file-extension in the 'filename' entry widget
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |       case JI_SIGNAL_COMBOBOX_SELECT: { | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  | 	std::string ext = combobox->getItemText(combobox->getSelectedItem()); | 
					
						
							|  |  |  | 	Frame* window = static_cast<Frame*>(combobox->getRoot()); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  | 	Entry* entry = window->findChildT<Entry>("filename"); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	char buf[MAX_PATH]; | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  | 	char* p; | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  | 	ustrcpy(buf, entry->getText()); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	p = get_extension(buf); | 
					
						
							|  |  |  | 	if (p && *p != 0) { | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  | 	  ustrcpy(p, ext.c_str()); | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  | 	  entry->setText(buf); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  | 	  entry->selectText(0, -1); | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	break; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |   return false; | 
					
						
							| 
									
										
										
										
											2007-09-19 07:57:02 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-02-04 10:37:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-03 00:14:07 +08:00
										 |  |  | static bool filename_msg_proc(Widget* widget, Message* msg) | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   if (msg->type == JM_KEYRELEASED && msg->key.ascii >= 32) { | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     // Check if all keys are released
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |     for (int c=0; c<KEY_MAX; ++c) { | 
					
						
							|  |  |  |       if (key[c]) | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  | 	return false; | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     // String to be autocompleted
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |     base::string left_part = widget->getText(); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |     if (left_part.empty()) | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |       return false; | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |     // First we'll need the fileview widget
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  |     Widget* fileview = widget->findSibling("fileview"); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const FileItemList& children = fileview_get_filelist(fileview); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (FileItemList::const_iterator | 
					
						
							|  |  |  | 	   it=children.begin(); it!=children.end(); ++it) { | 
					
						
							| 
									
										
										
										
											2010-08-11 10:30:15 +08:00
										 |  |  |       IFileItem* child = *it; | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |       base::string child_name = child->getDisplayName(); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-01 02:34:12 +08:00
										 |  |  |       base::string::iterator it1, it2; | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       for (it1 = child_name.begin(), it2 = left_part.begin(); | 
					
						
							|  |  |  | 	   it1!=child_name.end() && it2!=left_part.end(); | 
					
						
							|  |  |  | 	   ++it1, ++it2) { | 
					
						
							|  |  |  | 	if (std::tolower(*it1) != std::tolower(*it2)) | 
					
						
							|  |  |  | 	  break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-25 10:44:59 +08:00
										 |  |  |       // Is the pattern (left_part) in the child_name's beginning?
 | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       if (it2 == left_part.end()) { | 
					
						
							| 
									
										
										
										
											2010-01-26 08:38:05 +08:00
										 |  |  | 	widget->setText(child_name.c_str()); | 
					
						
							| 
									
										
										
										
											2010-12-09 01:28:13 +08:00
										 |  |  | 	((Entry*)widget)->selectText(child_name.size(), | 
					
						
							|  |  |  | 				     left_part.size()); | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | 	clear_keybuf(); | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  | 	return true; | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-01-31 00:43:13 +08:00
										 |  |  |   return false; | 
					
						
							| 
									
										
										
										
											2008-10-16 09:55:12 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 |