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));
193 const bool writable = FXStat::isWritable(
myFileSelector->getDirectory());
194 return sender->handle(
this, writable ? FXSEL(SEL_COMMAND, ID_ENABLE) : FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
198std::vector<std::string>
200 std::vector<std::string> files;
210std::vector<std::string>
212 std::vector<std::string> files;
226 if (filenameList.size() > 0) {
228 const std::string originFilePath = filenameList.front();
230 std::string destinyFilename = FXPath::absolute(FXPath::directory(originFilePath.c_str()),
"CopyOf" + FXPath::name(originFilePath.c_str())).text();
236 destinyFilename = filePathDialog->getFilePath();
238 if (FXFile::identical(originFilePath.c_str(), destinyFilename.c_str())) {
241 TLF(
"Unable to copy file:\n%\n", destinyFilename),
242 TL(
"The source and destination files are the same"));
245 if (FXStat::exists(destinyFilename.c_str())) {
248 TL(
"Overwrite file"),
TLF(
"The destination file:\n%\n", destinyFilename),
249 TL(
"already exist. Overwrite?"));
256 if (!FXFile::copyFiles(originFilePath.c_str(), destinyFilename.c_str(), TRUE)) {
259 TLF(
"Unable to copy file:\n%\n", destinyFilename),
260 TL(
"Check destination file permissions"));
273 if (filenameList.size() > 0) {
275 const std::string originFilePath = filenameList.front();
281 const std::string destinyFilename = filePathDialog->getFilePath();
283 if (FXFile::identical(originFilePath.c_str(), destinyFilename.c_str())) {
286 TLF(
"Unable to move file:\n%\n", destinyFilename),
287 TL(
"The source and destination files are the same"));
290 if (FXStat::exists(destinyFilename.c_str())) {
293 TL(
"Overwrite file"),
TLF(
"The destination file:\n%\n", destinyFilename),
294 TL(
"already exist. Overwrite?"));
301 if (!FXFile::moveFiles(originFilePath.c_str(), destinyFilename.c_str(), TRUE)) {
304 TLF(
"Unable to move file:\n%\n", destinyFilename),
305 TL(
"Check destination file permissions"));
318 if (filenameList.size() > 0) {
320 const std::string fileToDelete = filenameList.front();
323 TL(
"Deleting file"),
TL(
"Are you sure you want to delete the file:"),
328 if (!FXFile::removeFiles(fileToDelete.c_str(), TRUE)) {
331 TLF(
"Unable to delete file:\n%\n", fileToDelete),
332 TL(
"Check file permissions"));
344 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
348 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
355 switch (FXSELID(sel)) {
356 case FXFileSelector::ID_NORMAL_SIZE:
359 case FXFileSelector::ID_MEDIUM_SIZE:
362 case FXFileSelector::ID_GIANT_SIZE:
372 FXbool check = FALSE;
373 switch (FXSELID(sel)) {
374 case FXFileSelector::ID_NORMAL_SIZE:
377 case FXFileSelector::ID_MEDIUM_SIZE:
380 case FXFileSelector::ID_GIANT_SIZE:
384 sender->handle(
this, check ? FXSEL(SEL_COMMAND, ID_CHECK) : FXSEL(SEL_COMMAND, ID_UNCHECK), NULL);
392 FXEvent*
event = (FXEvent*)ptr;
393 if (event->code == KEY_Return) {
396 return FXVerticalFrame::onKeyPress(obj, sel, ptr);
403 FXEvent*
event = (FXEvent*)ptr;
408 FXMenuPane filemenu(
this);
412 auto configDirectory =
new FXMenuCommand(&filemenu,
TL(
"Config directory"),
nullptr,
this,
MID_GNE_BUTTON_CONFIG);
415 configDirectory->disable();
423 new FXMenuCommand(&filemenu,
TL(
"Select all"), NULL,
myFileSelector, FXFileList::ID_SELECT_ALL);
424 new FXMenuSeparator(&filemenu);
426 FXMenuPane sortmenu(
this);
427 new FXMenuCascade(&filemenu,
TL(
"Sort by"), NULL, &sortmenu);
428 new FXMenuRadio(&sortmenu,
TL(
"Name"),
myFileSelector, FXFileList::ID_SORT_BY_NAME);
429 new FXMenuRadio(&sortmenu,
TL(
"Type"),
myFileSelector, FXFileList::ID_SORT_BY_TYPE);
430 new FXMenuRadio(&sortmenu,
TL(
"Size"),
myFileSelector, FXFileList::ID_SORT_BY_SIZE);
431 new FXMenuRadio(&sortmenu,
TL(
"Time"),
myFileSelector, FXFileList::ID_SORT_BY_TIME);
432 new FXMenuRadio(&sortmenu,
TL(
"User"),
myFileSelector, FXFileList::ID_SORT_BY_USER);
433 new FXMenuRadio(&sortmenu,
TL(
"Group"),
myFileSelector, FXFileList::ID_SORT_BY_GROUP);
434 new FXMenuSeparator(&sortmenu);
435 new FXMenuCheck(&sortmenu,
TL(
"Reverse"),
myFileSelector, FXFileList::ID_SORT_REVERSE);
436 new FXMenuCheck(&sortmenu,
TL(
"Ignore case"),
myFileSelector, FXFileList::ID_SORT_CASE);
438 FXMenuPane viewmenu(
this);
439 new FXMenuCascade(&filemenu,
TL(
"View"), NULL, &viewmenu);
440 new FXMenuRadio(&viewmenu,
TL(
"Small icons"),
myFileSelector, FXFileList::ID_SHOW_MINI_ICONS);
441 new FXMenuRadio(&viewmenu,
TL(
"Big icons"),
myFileSelector, FXFileList::ID_SHOW_BIG_ICONS);
442 new FXMenuRadio(&viewmenu,
TL(
"Details"),
myFileSelector, FXFileList::ID_SHOW_DETAILS);
443 new FXMenuSeparator(&viewmenu);
444 new FXMenuRadio(&viewmenu,
TL(
"Rows"),
myFileSelector, FXFileList::ID_ARRANGE_BY_ROWS);
445 new FXMenuRadio(&viewmenu,
TL(
"Columns"),
myFileSelector, FXFileList::ID_ARRANGE_BY_COLUMNS);
446 new FXMenuSeparator(&viewmenu);
447 new FXMenuCheck(&viewmenu,
TL(
"Hidden files"),
myFileSelector, FXFileList::ID_TOGGLE_HIDDEN);
448 new FXMenuCheck(&viewmenu,
TL(
"Preview images"),
myFileSelector, FXFileList::ID_TOGGLE_IMAGES);
449 new FXMenuSeparator(&viewmenu);
450 new FXMenuRadio(&viewmenu,
TL(
"Normal images"),
this, FXFileSelector::ID_NORMAL_SIZE);
451 new FXMenuRadio(&viewmenu,
TL(
"Medium images"),
this, FXFileSelector::ID_MEDIUM_SIZE);
452 new FXMenuRadio(&viewmenu,
TL(
"Giant images"),
this, FXFileSelector::ID_GIANT_SIZE);
454 FXMenuPane bookmenu(
this);
455 FXMenuCascade* bookcasc =
new FXMenuCascade(&filemenu,
TL(
"Bookmarks"), NULL, &bookmenu);
456 bookcasc->setTarget(
this);
457 bookcasc->setSelector(FXFileSelector::ID_BOOKMENU);
460 FXMenuSeparator* sep1 =
new FXMenuSeparator(&bookmenu);
462 sep1->setSelector(FXRecentFiles::ID_ANYFILES);
474 new FXMenuSeparator(&filemenu);
482 filemenu.popup(NULL, event->root_x, event->root_y);
483 getApp()->runModalWhileShown(&filemenu);
490 const FXString pat = FXFileSelector::patternFromText((FXchar*)ptr);
493 FXString ext = FXFileSelector::extensionFromPattern(pat);
507 const FXString abspath = FXPath::absolute(path);
518 const FXString fullname(FXPath::absolute(path));
519 FXString name(FXPath::name(fullname));
542std::vector<std::string>
554const std::vector<std::string>&
640 const FXint index = (FXint)(FXival)ptr;
687 const FXint index = (FXint)(FXival)ptr;
708 if (path.size() > 0) {
710 if (FXStat::isDirectory(path.c_str())) {
716 myDirBox->setDirectory(path.c_str());
722 FXString dir = FXPath::directory(path.c_str());
724 if (FXStat::isDirectory(dir)) {
730 if (FXStat::exists(path.c_str())) {
736 while (!FXPath::isTopDirectory(dir) && !FXStat::isDirectory(dir)) {
737 dir = FXPath::upLevel(dir);
743 FXASSERT(dir.length() <= (
int)path.size());
744 if (ISPATHSEP(path[dir.length()])) {
745 path.erase(0, dir.length() + 1);
747 path.erase(0, dir.length());
769 const bool topDirectory = FXPath::isTopDirectory(
myFileSelector->getDirectory());
770 return sender->handle(
this, topDirectory ? FXSEL(SEL_COMMAND, ID_DISABLE) : FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
791 const auto configFileFolder = FXPath::directory(
OptionsCont::getOptions().getString(
"configuration-file").c_str());
827 const FXString dirname = FXPath::absolute(
myFileSelector->getDirectory(), filePathDialog->getFilePath().c_str());
829 if (FXStat::exists(dirname)) {
832 TLF(
"The new directory:\n%", dirname.text()),
833 TL(
"already exists"));
837 if (!FXDir::create(dirname)) {
840 TLF(
"Cannot create directory:\n%", dirname.text()),
841 TL(
"Check folder permissions"));
855 new FXMenuCommand(
myBookmarkMenuPane, (
TL(
"Set bookmark") + std::string(
"\t\t") +
TL(
"Bookmark current directory.")).c_str(),
857 new FXMenuCommand(
myBookmarkMenuPane, (
TL(
"Clear bookmarks") + std::string(
"\t\t") +
TL(
"Clear bookmarks.")).c_str(),
861 separator->setSelector(FXRecentFiles::ID_ANYFILES);
872 new FXFrame(navigatorHorizontalFrame, LAYOUT_FIX_WIDTH, 0, 0, 4, 1);
883 goUpButton->setTipText(
TL(
"Go up one directory"));
887 goHomeButton->setTipText(
TL(
"Go to home directory"));
891 goWorkDirectory->setTipText(
TL(
"Go to work directory"));
893 auto goConfigDirectory =
new MFXButtonTooltip(navigatorHorizontalFrame, staticTooltipMenu,
"",
nullptr,
897 goConfigDirectory->disable();
902 goConfigDirectory->setTipText(
TL(
"Go to netedit config directory"));
905 goConfigDirectory->setTipText(
TL(
"Go to sumo config directory"));
910 bookmenuTooltip->setTipText(
TL(
"Bookmarks"));
911 bookmenuTooltip->setSelector(FXFileSelector::ID_BOOKMENU);
915 newDirectoryButton->setTipText(
TL(
"Create new directory"));
919 showListButton->setTipText(
TL(
"Display directory with small icons"));
923 showIconsButton->setTipText(
TL(
"Display directory with big icons"));
927 showDetailsButton->setTipText(
TL(
"Display detailed directory listing"));
929 auto showHiddeToogleButton =
new MFXToggleButtonTooltip(navigatorHorizontalFrame, staticTooltipMenu,
"",
"",
933 showHiddeToogleButton->setTipText(
TL(
"Toggle show hidden files and directories"));
940 FXAccelTable* table = getShell()->getAccelTable();
942 table->addAccel(MKUINT(KEY_BackSpace, 0),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_DIRECTORY_UP));
943 table->addAccel(MKUINT(KEY_Delete, 0),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_DELETE));
944 table->addAccel(MKUINT(
KEY_h, CONTROLMASK),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_HOME));
945 table->addAccel(MKUINT(
KEY_w, CONTROLMASK),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_WORK));
946 table->addAccel(MKUINT(
KEY_n, CONTROLMASK),
this, FXSEL(SEL_COMMAND, FXFileSelector::ID_NEW));
947 table->addAccel(MKUINT(
KEY_a, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SELECT_ALL));
948 table->addAccel(MKUINT(
KEY_b, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SHOW_BIG_ICONS));
949 table->addAccel(MKUINT(
KEY_s, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SHOW_MINI_ICONS));
950 table->addAccel(MKUINT(
KEY_l, CONTROLMASK),
myFileSelector, FXSEL(SEL_COMMAND, FXFileList::ID_SHOW_DETAILS));
958 for (
const auto& extension : extensions) {
960 const std::string cleanExtension = FXFileSelector::patternFromText(extension.c_str()).text();
962 std::vector<std::string> subExtensions;
964 if (cleanExtension !=
"*") {
967 for (
const auto& subExtensionStr : subExtensionsStr) {
969 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.
void setPath(const std::string &path)
set path (either file or directory, used for testing)
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.
void setFilter(const int index)
set file filter (used for testing)
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
long setCurrentItem(const FXint index, FXbool notify=FALSE)
Set the current item (index is zero-based)
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