GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
__fltk_uigetfile__.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 2010-2025 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if defined (HAVE_CONFIG_H)
27# include "config.h"
28#endif
29
30#if defined (HAVE_FLTK)
31
32# if defined (WIN32)
33# define WIN32_LEAN_AND_MEAN
34# endif
35
36# include <string>
37
38# include <FL/Fl.H>
39# include <FL/Fl_File_Chooser.H>
40
41// FLTK headers may include X11/X.h which defines Complex, and that
42// conflicts with Octave's Complex typedef. We don't need the X11
43// Complex definition in this file, so remove it before including Octave
44// headers which may require Octave's Complex typedef.
45# undef Complex
46
47#endif
48
49#include "dMatrix.h"
50#include "file-ops.h"
51
52#include "Cell.h"
53#include "defun-dld.h"
54#include "errwarn.h"
55#include "ov.h"
56
58
59DEFUN_DLD (__fltk_uigetfile__, args, ,
60 doc: /* -*- texinfo -*-
61@deftypefn {} {[@var{fname}, @var{fpath}, @var{fltidx}] =} __fltk_uigetfile__ (@dots{})
62Undocumented internal function.
63@end deftypefn */)
64{
65#if defined (HAVE_FLTK)
66
67 // Expected argument list:
68 //
69 // args(0) ... FileFilter in fltk format
70 // args(1) ... Title
71 // args(2) ... Default Filename
72 // args(3) ... SelectValue "on"/"off"/"dir"/"create"
73
74 octave_value_list retval (3, octave_value (0));
75
76 std::string file_filter = args(0).string_value ();
77 std::string title = args(1).string_value ();
78 std::string default_name = args(2).string_value ();
79
80 int multi_type = Fl_File_Chooser::SINGLE;
81 std::string flabel = "Filename:";
82
83 std::string multi = args(3).string_value ();
84 if (multi == "on")
85 multi_type = Fl_File_Chooser::MULTI;
86 else if (multi == "dir")
87 {
88 multi_type = Fl_File_Chooser::DIRECTORY;
89 flabel = "Directory:";
90 }
91 else if (multi == "create")
92 multi_type = Fl_File_Chooser::CREATE;
93
94 Fl_File_Chooser::filename_label = flabel.c_str ();
95
96 Fl_File_Chooser fc (default_name.c_str (), file_filter.c_str (),
97 multi_type, title.c_str ());
98
99 fc.preview (0);
100
101 if (multi_type == Fl_File_Chooser::CREATE)
102 fc.ok_label ("Save");
103
104 fc.show ();
105
106 while (fc.shown ())
107 Fl::wait ();
108
109 if (fc.value ())
110 {
111 int file_count = fc.count ();
112 std::string fname;
113
114 // FLTK uses forward slash even for Windows
115 std::string sep = "/";
116 std::size_t idx;
117
118 if (file_count == 1 && multi_type != Fl_File_Chooser::DIRECTORY)
119 {
120 fname = fc.value ();
121 idx = fname.find_last_of (sep);
122 retval(0) = fname.substr (idx + 1);
123 }
124 else
125 {
126 Cell file_cell = Cell (file_count, 1);
127 for (octave_idx_type n = 1; n <= file_count; n++)
128 {
129 fname = fc.value (n);
130 idx = fname.find_last_of (sep);
131 file_cell(n - 1) = fname.substr (idx + 1);
132 }
133 retval(0) = file_cell;
134 }
135
136 if (multi_type == Fl_File_Chooser::DIRECTORY)
137 retval(0) = sys::file_ops::native_separator_path (std::string (fc.value ()));
138 else
139 {
140 retval(1) = sys::file_ops::native_separator_path (std::string (fc.directory ()) + sep);
141 retval(2) = fc.filter_value () + 1;
142 }
143 }
144
145 fc.hide ();
146 Fl::flush ();
147
148 return retval;
149
150#else
151
152 octave_unused_parameter (args);
153
154 err_disabled_feature ("__fltk_uigetfile__", "OpenGL and FLTK");
155
156#endif
157}
158
159/*
160## No test needed for internal helper function.
161%!assert (1)
162*/
163
164OCTAVE_END_NAMESPACE(octave)
Definition Cell.h:41
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
#define DEFUN_DLD(name, args_name, nargout_name, doc)
Macro to define an at run time dynamically loadable builtin function.
Definition defun-dld.h:61
void err_disabled_feature(const std::string &fcn, const std::string &feature, const std::string &pkg)
Definition errwarn.cc:53