34#define FILELISTMASK (ICONLIST_EXTENDEDSELECT|ICONLIST_SINGLESELECT|ICONLIST_BROWSESELECT|ICONLIST_MULTIPLESELECT)
35#define FILESTYLEMASK (ICONLIST_DETAILED|ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS|ICONLIST_ROWS|ICONLIST_COLUMNS|ICONLIST_AUTOSIZE)
72FXIMPLEMENT(
GNEFileSelector, FXVerticalFrame, GNEFileSelectorMap, ARRAYNUMBER(GNEFileSelectorMap))
81 myFileDialog(fileDialog),
83 myConfigType(configType),
84 myBookmarksRecentFiles(fileDialog->getApplicationWindow()->getApp(),
TL("Visited Directories")) {
86 const auto tooltipMenu = fileDialog->getApplicationWindow()->getStaticTooltipMenu();
95 myFileSelector =
new FXFileList(fileboxframe,
this, FXFileSelector::ID_FILELIST,
GUIDesignFileList);
99 myDirBox =
new FXDirBox(navigatorHorizontalFrame,
this, FXFileSelector::ID_DIRTREE,
GUIDesignDirBox);
100 myDirBox->setNumVisible(5);
101 myDirBox->setAssociations(myFileSelector->getAssociations());
103 buildBookmarkMenuPane(navigatorHorizontalFrame);
105 buildButtons(navigatorHorizontalFrame, tooltipMenu);
107 new FXLabel(filenameHorizontalFrame,
119 switch (myOpenMode) {
121 myFileSelector->showOnlyDirectories(FALSE);
122 myFileSelector->setListStyle((myFileSelector->getListStyle() & ~
FILELISTMASK) | ICONLIST_BROWSESELECT);
125 myFileSelector->showOnlyDirectories(FALSE);
126 myFileSelector->setListStyle((myFileSelector->getListStyle() & ~
FILELISTMASK) | ICONLIST_BROWSESELECT);
129 myFileSelector->showOnlyDirectories(FALSE);
130 myFileSelector->setListStyle((myFileSelector->getListStyle() & ~
FILELISTMASK) | ICONLIST_EXTENDEDSELECT);
133 myFileSelector->showOnlyDirectories(TRUE);
134 myFileSelector->setListStyle((myFileSelector->getListStyle() & ~
FILELISTMASK) | ICONLIST_BROWSESELECT);
143 setDirectory(FXSystem::getCurrentDirectory());
146 if (extensions.size() == 0) {
149 for (
const auto& extension : extensions) {
150 myFileFilterComboBox->appendIconItem(extension.c_str());
153 myFileFilterComboBox->setNumVisible(FXMIN((
int)extensions.size(), 12));
155 parseExtensions(extensions);
157 myFileSelector->setPattern(FXFileSelector::patternFromText(extensions.front().c_str()));
162 FXAccelTable* table = getShell()->getAccelTable();
164 table->removeAccel(MKUINT(KEY_BackSpace, 0));
165 table->removeAccel(MKUINT(KEY_Delete, 0));
166 table->removeAccel(MKUINT(
KEY_h, CONTROLMASK));
167 table->removeAccel(MKUINT(
KEY_w, CONTROLMASK));
168 table->removeAccel(MKUINT(
KEY_n, CONTROLMASK));
169 table->removeAccel(MKUINT(
KEY_a, CONTROLMASK));
170 table->removeAccel(MKUINT(
KEY_b, CONTROLMASK));
171 table->removeAccel(MKUINT(
KEY_s, CONTROLMASK));
172 table->removeAccel(MKUINT(
KEY_l, CONTROLMASK));
181 const bool writable = FXStat::isWritable(
myFileSelector->getDirectory());
182 return sender->handle(
this, writable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
186std::vector<std::string>
188 std::vector<std::string> files;
198std::vector<std::string>
200 std::vector<std::string> files;
214 if (filenameList.size() > 0) {
216 const std::string originFilePath = filenameList.front();
218 std::string destinyFilename = FXPath::absolute(FXPath::directory(originFilePath.c_str()),
"CopyOf" + FXPath::name(originFilePath.c_str())).text();
224 destinyFilename = filePathDialog->getFilePath();
226 if (FXFile::identical(originFilePath.c_str(), destinyFilename.c_str())) {
229 TLF(
"Unable to copy file:\n%\n", destinyFilename),
230 TL(
"The source and destiny files are the same"));
233 if (FXStat::exists(destinyFilename.c_str())) {
236 TL(
"Overwrite file"),
TLF(
"The destiny file:\n%\n", destinyFilename),
237 TL(
"already exist. Overwrite?"));
244 if (!FXFile::copyFiles(originFilePath.c_str(), destinyFilename.c_str(), TRUE)) {
247 TLF(
"Unable to copy file:\n%\n", destinyFilename),
248 TL(
"Check destiny file permissions"));
261 if (filenameList.size() > 0) {
263 const std::string originFilePath = filenameList.front();
269 const std::string destinyFilename = filePathDialog->getFilePath();
271 if (FXFile::identical(originFilePath.c_str(), destinyFilename.c_str())) {
274 TLF(
"Unable to move file:\n%\n", destinyFilename),
275 TL(
"The source and destiny files are the same"));
278 if (FXStat::exists(destinyFilename.c_str())) {
281 TL(
"Overwrite file"),
TLF(
"The destiny file:\n%\n", destinyFilename),
282 TL(
"already exist. Overwrite?"));
289 if (!FXFile::moveFiles(originFilePath.c_str(), destinyFilename.c_str(), TRUE)) {
292 TLF(
"Unable to move file:\n%\n", destinyFilename),
293 TL(
"Check destiny file permissions"));
306 if (filenameList.size() > 0) {
308 const std::string fileToDelete = filenameList.front();
311 TL(
"Deleting file"),
TL(
"Are you sure you want to delete the file:"),
316 if (!FXFile::removeFiles(fileToDelete.c_str(), TRUE)) {
319 TLF(
"Unable to delete file:\n%\n", fileToDelete),
320 TL(
"Check file permissions"));
332 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
336 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
343 switch (FXSELID(sel)) {
344 case FXFileSelector::ID_NORMAL_SIZE:
347 case FXFileSelector::ID_MEDIUM_SIZE:
350 case FXFileSelector::ID_GIANT_SIZE:
360 FXbool check = FALSE;
361 switch (FXSELID(sel)) {
362 case FXFileSelector::ID_NORMAL_SIZE:
365 case FXFileSelector::ID_MEDIUM_SIZE:
368 case FXFileSelector::ID_GIANT_SIZE:
372 sender->handle(
this, check ? FXSEL(SEL_COMMAND, ID_CHECK) : FXSEL(SEL_COMMAND, ID_UNCHECK), NULL);
380 FXEvent*
event = (FXEvent*)ptr;
381 if (event->code == KEY_Return) {
384 return FXVerticalFrame::onKeyPress(obj, sel, ptr);
391 FXEvent*
event = (FXEvent*)ptr;
396 FXMenuPane filemenu(
this);
400 auto configDirectory =
new FXMenuCommand(&filemenu,
TL(
"Config directory"),
nullptr,
this,
MID_GNE_BUTTON_CONFIG);
403 configDirectory->disable();
411 new FXMenuCommand(&filemenu,
TL(
"Select all"), NULL,
myFileSelector, FXFileList::ID_SELECT_ALL);
412 new FXMenuSeparator(&filemenu);
414 FXMenuPane sortmenu(
this);
415 new FXMenuCascade(&filemenu,
TL(
"Sort by"), NULL, &sortmenu);
416 new FXMenuRadio(&sortmenu,
TL(
"Name"),
myFileSelector, FXFileList::ID_SORT_BY_NAME);
417 new FXMenuRadio(&sortmenu,
TL(
"Type"),
myFileSelector, FXFileList::ID_SORT_BY_TYPE);
418 new FXMenuRadio(&sortmenu,
TL(
"Size"),
myFileSelector, FXFileList::ID_SORT_BY_SIZE);
419 new FXMenuRadio(&sortmenu,
TL(
"Time"),
myFileSelector, FXFileList::ID_SORT_BY_TIME);
420 new FXMenuRadio(&sortmenu,
TL(
"User"),
myFileSelector, FXFileList::ID_SORT_BY_USER);
421 new FXMenuRadio(&sortmenu,
TL(
"Group"),
myFileSelector, FXFileList::ID_SORT_BY_GROUP);
422 new FXMenuSeparator(&sortmenu);
423 new FXMenuCheck(&sortmenu,
TL(
"Reverse"),
myFileSelector, FXFileList::ID_SORT_REVERSE);
424 new FXMenuCheck(&sortmenu,
TL(
"Ignore case"),
myFileSelector, FXFileList::ID_SORT_CASE);
426 FXMenuPane viewmenu(
this);
427 new FXMenuCascade(&filemenu,
TL(
"View"), NULL, &viewmenu);
428 new FXMenuRadio(&viewmenu,
TL(
"Small icons"),
myFileSelector, FXFileList::ID_SHOW_MINI_ICONS);
429 new FXMenuRadio(&viewmenu,
TL(
"Big icons"),
myFileSelector, FXFileList::ID_SHOW_BIG_ICONS);
430 new FXMenuRadio(&viewmenu,
TL(
"Details"),
myFileSelector, FXFileList::ID_SHOW_DETAILS);
431 new FXMenuSeparator(&viewmenu);
432 new FXMenuRadio(&viewmenu,
TL(
"Rows"),
myFileSelector, FXFileList::ID_ARRANGE_BY_ROWS);
433 new FXMenuRadio(&viewmenu,
TL(
"Columns"),
myFileSelector, FXFileList::ID_ARRANGE_BY_COLUMNS);
434 new FXMenuSeparator(&viewmenu);
435 new FXMenuCheck(&viewmenu,
TL(
"Hidden files"),
myFileSelector, FXFileList::ID_TOGGLE_HIDDEN);
436 new FXMenuCheck(&viewmenu,
TL(
"Preview images"),
myFileSelector, FXFileList::ID_TOGGLE_IMAGES);
437 new FXMenuSeparator(&viewmenu);
438 new FXMenuRadio(&viewmenu,
TL(
"Normal images"),
this, FXFileSelector::ID_NORMAL_SIZE);
439 new FXMenuRadio(&viewmenu,
TL(
"Medium images"),
this, FXFileSelector::ID_MEDIUM_SIZE);
440 new FXMenuRadio(&viewmenu,
TL(
"Giant images"),
this, FXFileSelector::ID_GIANT_SIZE);
442 FXMenuPane bookmenu(
this);
443 FXMenuCascade* bookcasc =
new FXMenuCascade(&filemenu,
TL(
"Bookmarks"), NULL, &bookmenu);
444 bookcasc->setTarget(
this);
445 bookcasc->setSelector(FXFileSelector::ID_BOOKMENU);
448 FXMenuSeparator* sep1 =
new FXMenuSeparator(&bookmenu);
450 sep1->setSelector(FXRecentFiles::ID_ANYFILES);
462 new FXMenuSeparator(&filemenu);
470 filemenu.popup(NULL, event->root_x, event->root_y);
471 getApp()->runModalWhileShown(&filemenu);
478 const FXString pat = FXFileSelector::patternFromText((FXchar*)ptr);
481 FXString ext = FXFileSelector::extensionFromPattern(pat);
495 const FXString abspath = FXPath::absolute(path);
506 const FXString fullname(FXPath::absolute(path));
507 FXString name(FXPath::name(fullname));
530std::vector<std::string>
542const std::vector<std::string>&
628 const FXint index = (FXint)(FXival)ptr;
675 const FXint index = (FXint)(FXival)ptr;
696 if (path.size() > 0) {
698 if (FXStat::isDirectory(path.c_str())) {
704 myDirBox->setDirectory(path.c_str());
710 FXString dir = FXPath::directory(path.c_str());
712 if (FXStat::isDirectory(dir)) {
718 if (FXStat::exists(path.c_str())) {
724 while (!FXPath::isTopDirectory(dir) && !FXStat::isDirectory(dir)) {
725 dir = FXPath::upLevel(dir);
731 FXASSERT(dir.length() <= (
int)path.size());
732 if (ISPATHSEP(path[dir.length()])) {
733 path.erase(0, dir.length() + 1);
735 path.erase(0, dir.length());
757 const bool topDirectory = FXPath::isTopDirectory(
myFileSelector->getDirectory());
758 return sender->handle(
this, topDirectory ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
779 const auto configFileFolder = FXPath::directory(
OptionsCont::getOptions().getString(
"configuration-file").c_str());
815 const FXString dirname = FXPath::absolute(
myFileSelector->getDirectory(), filePathDialog->getFilePath().c_str());
817 if (FXStat::exists(dirname)) {
820 TLF(
"The new directory:\n%", dirname.text()),
821 TL(
"already exists"));
825 if (!FXDir::create(dirname)) {
828 TLF(
"Cannot create directory:\n%", dirname.text()),
829 TL(
"Check folder permissions"));
843 new FXMenuCommand(
myBookmarkMenuPane, (
TL(
"Set bookmark") + std::string(
"\t\t") +
TL(
"Bookmark current directory.")).c_str(),
845 new FXMenuCommand(
myBookmarkMenuPane, (
TL(
"Clear bookmarks") + std::string(
"\t\t") +
TL(
"Clear bookmarks.")).c_str(),
849 separator->setSelector(FXRecentFiles::ID_ANYFILES);
860 new FXFrame(navigatorHorizontalFrame, LAYOUT_FIX_WIDTH, 0, 0, 4, 1);
871 goUpButton->setTipText(
TL(
"Go up one directory"));
875 goHomeButton->setTipText(
TL(
"Go to home directory"));
879 goWorkDirectory->setTipText(
TL(
"Go to work directory"));
881 auto goConfigDirectory =
new MFXButtonTooltip(navigatorHorizontalFrame, staticTooltipMenu,
"",
nullptr,
885 goConfigDirectory->disable();
890 goConfigDirectory->setTipText(
TL(
"Go to netedit config directory"));
893 goConfigDirectory->setTipText(
TL(
"Go to sumo config directory"));
898 bookmenuTooltip->setTipText(
TL(
"Bookmarks"));
899 bookmenuTooltip->setSelector(FXFileSelector::ID_BOOKMENU);
903 newDirectoryButton->setTipText(
TL(
"Create new directory"));
907 showListButton->setTipText(
TL(
"Display directory with small icons"));
911 showIconsButton->setTipText(
TL(
"Display directory with big icons"));
915 showDetailsButton->setTipText(
TL(
"Display detailed directory listing"));
917 auto showHiddeToogleButton =
new MFXToggleButtonTooltip(navigatorHorizontalFrame, staticTooltipMenu,
"",
"",
921 showHiddeToogleButton->setTipText(
TL(
"Toggle show hidden files and directories"));
928 FXAccelTable* table = getShell()->getAccelTable();
930 table->addAccel(MKUINT(KEY_BackSpace, 0),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_DIRECTORY_UP));
931 table->addAccel(MKUINT(KEY_Delete, 0),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_DELETE));
932 table->addAccel(MKUINT(
KEY_h, CONTROLMASK),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_HOME));
933 table->addAccel(MKUINT(
KEY_w, CONTROLMASK),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_WORK));
934 table->addAccel(MKUINT(
KEY_n, CONTROLMASK),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_NEW));
935 table->addAccel(MKUINT(
KEY_a, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SELECT_ALL));
936 table->addAccel(MKUINT(
KEY_b, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SHOW_BIG_ICONS));
937 table->addAccel(MKUINT(
KEY_s, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SHOW_MINI_ICONS));
938 table->addAccel(MKUINT(
KEY_l, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SHOW_DETAILS));
946 for (
const auto& extension : extensions) {
948 const std::string cleanExtension = FXFileSelector::patternFromText(extension.c_str()).text();
950 std::vector<std::string> subExtensions;
952 if (cleanExtension !=
"*") {
955 for (
const auto& subExtensionStr : subExtensionsStr) {
957 subExtensions.push_back(subExtensionStr.substr(1));
FXDEFMAP(GNEFileSelector) GNEFileSelectorMap[]
@ MID_GNE_SET_ATTRIBUTE
attribute edited
@ MID_GNE_BUTTON_CONFIG
config button (used in GNEFileDialog)
#define GUIDesignFileBoxFrame
design for filebox frame
#define GUIDesignDialogContentFrame
design for content frame used in dialog
#define GUIDesignLabelFixed(width)
label, icon before text, text centered and custom width
#define GUIDesignDirBox
desing for FXDirBox
#define GUIDesignButtonIconFileDialog
button only with icon
#define GUIDesignDialogContentHorizontalFrame
design for content horizontal frame used in dialog
#define GUIDesignComboBoxVisibleItems
#define GUIDesignFileList
desing for FXDirBox
#define GUIDesignTextFieldFileDialog
text field used in file dialog
#define GUIDesignComboBoxFileDialog
Combo box used in filed dialog.
#define GUIDesignAuxiliarFrame
design for auxiliar (Without borders) frame extended in all directions
FXString gCurrentFolder
The folder used as last.
@ FILEDIALOG_SHOW_BIGICONS
@ FILEDIALOG_SHOW_SMALLICONS
@ FILEDIALOG_SHOW_DETAILS
@ FILEDIALOG_BOOK_CLR
icons for file dialogs
GNEApplicationWindow * getApplicationWindow() const
get pointer to the application window
long onCmdAccept(FXObject *, FXSelector, void *)
called when accept or yes button is pressed (can be reimplemented in children)
void parseExtensions(const std::vector< std::string > &extensions)
parse extensions from pattern text
std::string getFilename() const
Return file name, if any.
void setFilename(const FXString &path)
Change file name.
long onCmdVisit(FXObject *, FXSelector, void *)
Handler for visiting a bookmarked location.
long onKeyPress(FXObject *obj, FXSelector sel, void *ptr)
called when user press a key
void setFileBoxStyle(FXuint style)
Change file list style.
FXint getImageSize() const
Return images preview size.
std::string getDirectory() const
Return directory.
GNEFileDialog * myFileDialog
FOX needs this.
FXDirBox * myDirBox
Directory hierarchy list.
long onCmdDelete(FXObject *, FXSelector, void *)
Handler for deleting an item.
long onCmdFilter(FXObject *, FXSelector, void *)
Handler for filtering items.
const std::vector< std::string > & getFileExtension() const
get file extension
long onCmdDirTree(FXObject *, FXSelector, void *)
Handler for directory tree navigation.
long onUpdImageSize(FXObject *, FXSelector, void *)
Update handler for enabling/disabling image size command.
long onCmdItemSelected(FXObject *, FXSelector, void *)
Handler for selecting an item.
std::vector< std::string > getSelectedFiles() const
get selected files
const GNEFileDialog::ConfigType myConfigType
config type
std::vector< std::vector< std::string > > myExtensions
extensions
std::vector< std::string > getFilenames() const
get file names
FXint getItemSpace() const
Return the inter-item spacing (in pixels)
const GNEFileDialog::OpenMode myOpenMode
open mode
virtual ~GNEFileSelector()
Destructor.
MFXComboBoxIcon * myFileFilterComboBox
Combobox for pattern list.
long onCmdDirectoryUp(FXObject *, FXSelector, void *)
Handler for moving up one directory.
void setDirectory(const FXString &path)
Change directory.
long onCmdNewFolder(FXObject *, FXSelector, void *)
Handler for creating a new item or directory.
FXFileList * myFileSelector
File list widget.
void buildShortcuts()
build shortcuts
MFXTextFieldIcon * getFilenameTextField() const
get file name entry field
long onCmdItemDoubleClicked(FXObject *obj, FXSelector sel, void *ptr)
Handler for double-clicking an item.
long onCmdCopy(FXObject *, FXSelector, void *)
Handler for copying an item.
FXbool showHiddenFiles() const
Return TRUE if showing hidden files.
long onCmdMove(FXObject *, FXSelector, void *)
Handler for moving an item.
FXuint getFileBoxStyle() const
Return file list style.
long onUpdDirectoryUp(FXObject *, FXSelector, void *)
Update handler for enabling/disabling directory up command.
long onCmdHomeFolder(FXObject *, FXSelector, void *)
Handler for navigating to the home directory.
long onCmdWorkFolder(FXObject *, FXSelector, void *)
Handler for navigating to the work directory.
long onCmdItemDeselected(FXObject *, FXSelector, void *)
Handler for deselecting an item.
long onCmdAccept(FXObject *, FXSelector, void *)
Handler for accepting a command.
std::vector< std::string > getSelectedFilesOnly() const
get selected files that are not directories
void setMatchMode(FXuint mode)
Change wildcard matching mode.
long onPopupMenu(FXObject *, FXSelector, void *)
Handler for showing the popup menu.
MFXTextFieldIcon * myFilenameTextField
File name entry field.
FXMenuPane * myBookmarkMenuPane
Menu for myBookmarksRecentFiles.
long onCmdConfigFolder(FXObject *, FXSelector, void *)
Handler for navigating to the sumo/netedit config directory.
FXbool showImages() const
Return TRUE if image preview on.
long onUpdNewFolder(FXObject *, FXSelector, void *)
Update handler for enabling/disabling new command.
long onUpdSelected(FXObject *, FXSelector, void *)
Update handler for enabling/disabling commands based on selection.
void setImageSize(FXint size)
Change images preview size.
long onCmdBookmark(FXObject *, FXSelector, void *)
Handler for opening myBookmarksRecentFiles.
void buildBookmarkMenuPane(FXHorizontalFrame *navigatorHorizontalFrame)
build bookmarks menu
void setItemSpace(FXint s)
Set the inter-item spacing (in pixels)
long onCmdImageSize(FXObject *, FXSelector, void *)
Handler for showing or calculating image size.
FXuint getMatchMode() const
Return wildcard matching mode.
void buildButtons(FXHorizontalFrame *navigatorHorizontalFrame, MFXStaticToolTip *staticTooltipMenu)
build buttons
FXRecentFiles myBookmarksRecentFiles
Bookmarked places.
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
FXint getCurrentItem() const
Get the current item's index.
FXString getText() const
Get the text for this label.
FXbool selectAll()
Select all text.
void setText(const FXString &text, FXbool notify=FALSE)
Change the text and move cursor to end.
static OptionsCont & getOptions()
Retrieves the options.
std::vector< std::string > getVector()
return vector of strings