Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Raw File Download

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
content badge
swh:1:cnt:e74107c6a883c96f5e6684996d29a0cca930c632

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
%SCHEMER_EXPORT Export current MATLAB color scheme to text file
%   If this is your first time using SCHEMER_EXPORT, please ensure you
%   read the IMPORTANT NOTE at the bottom of the help section before using
%   this function.
%
%   SCHEMER_EXPORT() with no input will prompt the user to locate a
%   destination file via the GUI, and will save the current color scheme
%   to this location. Please read the IMORTANT NOTE below
%   before running this script or it may not work correctly.
%   The MATLAB preference options which are exported are:
%   - All settings in the Color pane of Preferences
%   - All settings in the Color > Programming Tools pane
%   - From Editor/Debugger > Display pane, the following:
%      - Highlight current line (whether to highlight, and the colour)
%      - Right-hand text limit (colour and thickness, whether on/off)
%   The output format is the same as used in MATLAB's preferences file,
%   which is found at FULLFILE(PREFDIR,'matlab.prf').
%
%   SCHEMER_EXPORT(FILENAME) exports the relevant MATLAB preferences
%   to the file FILENAME.
%
%   SCHEMER_EXPORT(FILENAME, FLAG_MODE) controls which settings are output
%   into the preference file FILENAME. Along with the colour settings for
%   MATLAB syntax highlighting, one can also export the boolean preferences
%   (such as whether cells and non-local variables, etc, should be coloured
%   differently to the regular backgound and text); and one can also export
%   the colour settings for syntax highlighting in other languages
%   supported by MATLAB.
%
%   The FLAG_MODE settings available are:
%     0 - neither booleans, nor additional languages are exported
%     1 - boolean settings are exported, but not additional languages
%     2 - additional language colours are exported, but not boolean settings
%     3 - both booleans and additional languages are exported
%
%   By default FLAG_MODE is set to 1, so boolean settings will be
%   exported, but the settings for syntax highlighting in additional
%   languages will not be.
%
%   The colour settings for all MATLAB syntax highlighting will always be
%   exported, even for syntax options which are currently disabled, and
%   regardless of whether the boolean settings are being exported. This is
%   because users loading your exported color scheme may want syntax
%   options highlighted which you are not currently using. Consequently,
%   when designing a color scheme, it is advisable to set colours for all
%   possisble MATLAB colour settings, even if you don't usually use them.
%   By default, SCHEMER_IMPORT will not import boolean settings, so users
%   will keep their syntax options enabled or disabled as they prefer even
%   after importing your color scheme.
%
%   Colours for highlighting syntax in other languages supported by MATLAB
%   (MuPAD, TLC, VRML, C++, Java, VHDL, Verilog, XML) can be set in the
%   preferences panel Editor/Debugger > Language. If you have not set any
%   of these colours yourself, you should not export them. If SCHEMER_IMPORT
%   loads a color scheme without additional language syntax included, the
%   MATLAB colours are extended to highlight syntax in the other languages
%   consistent with the MATLAB scheme.
%
%   SCHEMER_EXPORT(FLAG_MODE, FILENAME), with a numeric input followed by a
%   string, will also work as above because the input order is reversible.
%
%   SCHEMER_EXPORT(FLAG_MODE) with a single numeric input will open the GUI
%   to pick the filename and will save the output according to FLAG_MODE.
%
%   RET = SCHEMER_EXPORT(...) returns 1 on success, 0 on user
%   cancellation at the output file selection screen, -1 on fopen error,
%   and -2 on any other error.
%
%   [RET, NAMES, PREFS] = SCHEMER_EXPORT(...) also returns two cell
%   arrays listing the names and preferences which were saved to file.
%
%   For more details on how to get and set MATLAB preferences with
%   commands, see the following URL.
%   http://undocumentedmatlab.com/blog/changing-system-preferences-programmatically
%
%   IMPORTANT NOTE:
%   You must have, at any point since installing MATLAB, visited the
%   Color, Color>Programming Tools and Editor/Debugger>Display panes of
%   the Preferences diaglogue within MATLAB and then clicked OK in order
%   for all the settings to be exported correctly. You will obviously have
%   done this for any settings you have changed but, for example, you may
%   have left the Editor/Debugger>Display settings unchanged. If this
%   preference pane has not been set its entries will not have been
%   defined, and when trying to export these they will be incorrectly saved
%   as off (for booleans) or black (for colours).
%
%   Example 1: User is not sure if they have OK'd all the relevent
%   Preferences panes (or sure they haven't).
%       - Open File>Preferences
%       - On the left-hand side
%         - Click Colors
%         - Click Programming Tools (underneath "Colors" as a subsection)
%         - Click Editor/Debugger (a different panel to Colors)
%         - Click Display (underneath "Editor/Debugger" as a subsection)
%       - Click OK
%           (Yes, that is literally all you need to do to make sure you can
%           export correctly. There is no need to click anywhere which was
%           not mentioned. You just have to have each pane appear, and then
%           click OK at the end.)
%       - Go to your command window and execute SCHEMER_EXPORT
%       - The GUI appears, and you pick where to save the file.
%
%   Example 2:  User is sure they have OK'd all the relevent Preferences
%   panes already.
%       schemer_export
%
%   Example 3: User is sure they have OK'd all the relevent Preferences
%   panes already, knows the path they wish to save to, and doesn't want
%   to export their boolean settings.
%       schemer_export('some/path/schemeName.prf', 0)
%
%   Example 4: User has set some colour preferences for C/C++ syntax
%   highlighting in addition to MATLAB syntax highlighting, and wants to
%   output this along with their boolean settings
%       schemer_export(3)
%
%   See also SCHEMER_IMPORT, PREFDIR, COLOR2JAVARGBINT.

% Copyright (c) 2013-2016,  Scott C. Lowe <scott.code.lowe@gmail.com>
% All rights reserved.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions are
% met:
%     * Redistributions of source code must retain the above copyright
%       notice, this list of conditions and the following disclaimer.
%     * Redistributions in binary form must reproduce the above copyright
%       notice, this list of conditions and the following disclaimer in
%       the documentation and/or other materials provided with the distribution
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
% POSSIBILITY OF SUCH DAMAGE.

function varargout = schemer_export(fname, flag_mode)

% ------------------------ Parameters -------------------------------------
SCHEMER_VERSION = 'v1.4.0';
SCHEMER_URLGIT  = 'https://github.com/scottclowe/matlab-schemer';
SCHEMER_URLFEX  = 'https://www.mathworks.com/matlabcentral/fileexchange/53862-matlab-schemer';
DEFOUTNAME      = 'ColorSchemeForMATLAB.prf';

% ------------------------ Input handling ---------------------------------
% Default inputs
if nargin<2
    % Default is on. Recipient can pick themselves whether to import.
    flag_mode = 1;
end
if nargin<1
    fname = [];
end
% Input switching
if nargin>=1 && ~ischar(fname) && ~isempty(fname)
    if ~isnumeric(fname)
        error('Invalid input argument 1');
    end
    if nargin==1
        % First input omitted
        flag_mode = fname;
        fname = [];
    elseif ischar(flag_mode)
        % Inputs switched
        tmp = fname;
        fname = flag_mode;
        flag_mode = tmp;
        clear tmp;
    else
        error('Invalid combination of inputs');
    end
end
% Mode handling
if ~isnumeric(flag_mode)
    error('Export mode flag must be numeric.');
elseif flag_mode < 0 || flag_mode > 3
    error('Bad mode specified: %s', num2str(flag_mode));
end
inc_bools      = mod(flag_mode, 2);
inc_otherlangs = flag_mode >= 2;
% 0:  no bools,  no other languages
% 1: yes bools,  no other languages
% 2:  no bools, yes other languages
% 3: yes bools, yes other languages

% ------------------------ Settings ---------------------------------------
% Names of boolean preferences which should always be output
names_boolean = {                                   ...
    'ColorsUseSystem'                               ; ... % Color:    Desktop:    Use system colors
};
% Names of boolean preferences which the user can choose whether to output
names_boolextra = {                                 ...
    'ColorsUseMLintAutoFixBackground'               ; ... % Color>PT: Analyser:   autofix highlight
    'Editor.VariableHighlighting.Automatic'         ; ... % Color>PT: Var&fn:     auto highlight
    'Editor.NonlocalVariableHighlighting'           ; ... % Color>PT: Var&fn:     with shared scope
    'EditorCodepadHighVisible'                      ; ... % Color>PT: CellDisp:   highlight cells
    'EditorCodeBlockDividers'                       ; ... % Color>PT: CellDisp:   show lines between cells
    'Editorhighlight-caret-row-boolean'             ; ... % Editor>Display:       Highlight current line
    'EditorRightTextLineVisible'                    ; ... % Editor>Display:       Show Right-hand text limit
};
% Names of preferences for which the values are integers
names_integer = {                                   ...
    'EditorRightTextLimitLineWidth'                 ; ... % Editor>Display:       Right-hand text limit Width
};
% The names of the main colour panels, so we can let the user know by name
% if there is an issue with any of them
panels_main = {                                     ...
    'Color'                                         ; ...
    'Color > Programming Tools'                     ; ...
    'Editor/Debugger > Display'                     ; ...
};
% Names of colour preferences which are in the main panels and used in
% MATLAB syntax highlighting
names_color_main = {                                ...
  { ... % Color panel
    'ColorsText'                                    ; ... % Color:    Desktop:    main text colour
    'ColorsBackground'                              ; ... % Color:    Desktop:    main background
    'Colors_M_Keywords'                             ; ... % Color:    Syntax:     keywords
    'Colors_M_Comments'                             ; ... % Color:    Syntax:     comments
    'Colors_M_Strings'                              ; ... % Color:    Syntax:     strings
    'Colors_M_UnterminatedStrings'                  ; ... % Color:    Syntax:     unterminated strings
    'Colors_M_SystemCommands'                       ; ... % Color:    Syntax:     system commands
    'Colors_M_Errors'                               ; ... % Color:    Syntax:     errors
    'Colors_HTML_HTMLLinks'                         ; ... % Color:    Other:      hyperlinks
  } ...
  { ... % Color > Programming Tools
    'Colors_M_Warnings'                             ; ... % Color>PT: Analyser:   warnings
    'ColorsMLintAutoFixBackground'                  ; ... % Color>PT: Analyser:   autofix
    'Editor.VariableHighlighting.Color'             ; ... % Color>PT: Var&fn:     highlight
    'Editor.NonlocalVariableHighlighting.TextColor' ; ... % Color>PT: Var&fn:     with shared scope
    'Editorhighlight-lines'                         ; ... % Color>PT: CellDisp:   highlight
  } ...
  { ... % Editor/Debugger > Display
    'Editorhighlight-caret-row-boolean-color'       ; ... % Editor>Display:       Highlight current line Color
    'EditorRightTextLimitLineColor'                 ; ... % Editor>Display:       Right-hand text limit line Color
  }
};
% Names of colour preferences which are known to have been added since the
% year 2011, and so their presence in the preferences is not guaranteed
%   column 1: name of setting
%   column 2: first version in which preference might have been implemented
%   column 3: first version in which preference has been observed to exist
names_color_versioned = { ...
    'Color_CmdWinWarnings'                          , ... % Color: Command Window Warning messages
        '7.13'                                          , ... % Known to NOT be in 2011a (7.12)
        '8.2'                                           ; ... % Known to be in 2013b
    'Color_CmdWinErrors'                            , ... % Color: Command Window Error messages
        '8.3'                                           , ... % Known to NOT be in 2013b (8.2)
        '8.4'                                           ; ... % Known to be in 2014b
};
% Names of colour preferences for syntax highlighting in languages other
% than MATLAB
names_color_otherlangs = {                          ...
  { ... % MuPAD
    'Editor.Language.MuPAD.Color.keyword'               ; ...
    'Editor.Language.MuPAD.Color.operator'              ; ...
    'Editor.Language.MuPAD.Color.block-comment'         ; ...
    'Editor.Language.MuPAD.Color.option'                ; ...
    'Editor.Language.MuPAD.Color.string'                ; ...
    'Editor.Language.MuPAD.Color.function'              ; ...
    'Editor.Language.MuPAD.Color.constant'              ; ...
  } ...
  { ... % TLC
    'Editor.Language.TLC.Color.Colors_M_SystemCommands' ; ...
    'Editor.Language.TLC.Color.Colors_M_Keywords'       ; ...
    'Editor.Language.TLC.Color.Colors_M_Comments'       ; ...
    'Editor.Language.TLC.Color.string-literal'          ; ...
  } ...
  { ... % C/C++
    'Editor.Language.C.Color.keywords'                  ; ...
    'Editor.Language.C.Color.line-comment'              ; ...
    'Editor.Language.C.Color.string-literal'            ; ...
    'Editor.Language.C.Color.preprocessor'              ; ...
    'Editor.Language.C.Color.char-literal'              ; ...
    'Editor.Language.C.Color.errors'                    ; ...
  } ...
  { ... % Java
    'Editor.Language.Java.Color.keywords'               ; ...
    'Editor.Language.Java.Color.line-comment'           ; ...
    'Editor.Language.Java.Color.string-literal'         ; ...
    'Editor.Language.Java.Color.char-literal'           ; ...
  } ...
  { ... % VHDL
    'Editor.Language.VHDL.Color.Colors_M_Keywords'      ; ...
    'Editor.Language.VHDL.Color.operator'               ; ...
    'Editor.Language.VHDL.Color.Colors_M_Comments'      ; ...
    'Editor.Language.VHDL.Color.string-literal'         ; ...
  } ...
  { ... % Verilog
    'Editor.Language.Verilog.Color.Colors_M_Comments'   ; ...
    'Editor.Language.Verilog.Color.operator'            ; ...
    'Editor.Language.Verilog.Color.Colors_M_Keywords'   ; ...
    'Editor.Language.Verilog.Color.string-literal'      ; ...
  } ...
  { ... % XML
    'Editor.Language.XML.Color.error'                   ; ...
    'Editor.Language.XML.Color.tag'                     ; ...
    'Editor.Language.XML.Color.attribute'               ; ...
    'Editor.Language.XML.Color.operator'                ; ...
    'Editor.Language.XML.Color.value'                   ; ...
    'Editor.Language.XML.Color.comment'                 ; ...
    'Editor.Language.XML.Color.doctype'                 ; ...
    'Editor.Language.XML.Color.ref'                     ; ...
    'Editor.Language.XML.Color.pi-content'              ; ...
    'Editor.Language.XML.Color.cdata-section'           ; ...
  }
};

% Names of colour preferences for syntax highlighting in languages other
% than MATLAB
names_color_vrml = {                          ...
    % VRML
    'Editor.Language.VRML.Color.keyword'                ; ...
    'Editor.Language.VRML.Color.node-keyword'           ; ...
    'Editor.Language.VRML.Color.field-keyword'          ; ...
    'Editor.Language.VRML.Color.data-type-keyword'      ; ...
    'Editor.Language.VRML.Color.terminal-symbol'        ; ...
    'Editor.Language.VRML.Color.comment'                ; ...
    'Editor.Language.VRML.Color.string'                 ; ...
};
% First version of matlab which uses VRMLX3DV instead of VRML
version_vrmlx3dv = '9.0';

% Names of preferences for other language syntax and where setting value
% is a string
%   column 1: name of preference
%   column 2: a regex which the string must match if it is to be exported
%             use '.' or '.+' to allow any non-empty string to be output
%             use  '' or '.*' for anything, including empty strings
%             use '\S' for anything except empty or whitespace-only strings
%             use '^str1|str2|str3$' to allow only a finite set of strings
names_string_otherlang = {                              ...
    'Editor.Language.Java.method'                       , ... % Java: Show methods
        '^(none|bold|italic)$'                             ; ...
};


% ------------------------ Setup ------------------------------------------
% Initialise output
if nargout==0
    % Empty if no output requested
    varargout = {};
else
    % -2 to signify unknown error otherwise
    varargout = {-2};
end
% If we are outputting all the bools, add them to the list to do
if inc_bools
    names_boolean = [names_boolean; names_boolextra];
end

% ------------------------ Check -------------------------------------
% Check the user is not exporting without having visited any of the
% preference panels, or has otherwise set text and background to match
if isequal(com.mathworks.services.Prefs.getColorPref('ColorsText').getRGB, ...
        com.mathworks.services.Prefs.getColorPref('ColorsBackground').getRGB)

    % Define the base error message. We will add to it depending on the
    % exact set up.
    msg = 'Colour for text and background appear to be the same.';

    % The values match, so give an error
    if com.mathworks.services.Prefs.getColorPref('ColorsText').getRGB ...
            == -16777216
        % Since the colour is black, it seems the user hasn't visited the
        % colour preference panes at all
        msg = [msg, 10, ...
               'Are you sure you have visited all the preference panels,'...
               ' as per the instructions in the function description?'];

    elseif com.mathworks.services.Prefs.getBooleanPref('ColorsUseSystem')
        % The colour is something else, but both text and background match.
        % The user is managing to use the colours by overriding them with
        % the system colours.
        msg = [msg, 10, ...
           'Although you have enabled system colors, the underlying ', ...
           'colour settings match. This is not permitted because the ', ...
           'text would be illegible if system colours were disabled.'];

    else
        % The colour is something else, but both text and background match.
        % Presumably the text is currently illegible to the user right now.
        msg = [msg, 10, ...
           'This is not permitted because the text is illegible.'];
    end

    % Raise the error with the completed message
    error(msg);
end

% Go through all the main color preference panels, checking their settings
% are available to us
% Initialise outer level of holding variables
cprefs_main = cell(size(names_color_main));
colors_main = cell(size(names_color_main));
% Loop over every one of the main colour preference panels
for iPanel = 1:numel(names_color_main)
    % Fetch the colours for this panel
    [cprefs_main{iPanel}, colors_main{iPanel}] = ...
        fetch_colors(names_color_main{iPanel});
    % Only give the error on the Color and Programming Tools pages, because
    % there are only two colours set in the Editor > Display and they could
    % plausibly both be black. We instead check this panel seperately below.
    if iPanel <= 2 && all(colors_main{iPanel} == -16777216)
        % This panel appears to all be black, so we make an error
        error(...
            ['Colours for all of %1$s panel appear to be black. ' 10 ...
             'This will be because you have never set the preferences ' ...
             'in this panel. You can do so by visiting the %1$s ' ...
             'Preferences page and clicking OK, as detailed in the ' ...
             'description of this function.'], panels_main{iPanel});
    end
end
% Check the Editor > Display panel has been initialised.
% If it hasn't, the line width will appear to be 0, which is not a possible
% setting.
if com.mathworks.services.Prefs.getIntegerPref(...
        'EditorRightTextLimitLineWidth') == 0
    % It hasn't been set, so we generate an error
    error(...
        ['Properties from the %1$s preference panel could not be loaded. ' ...
         10 ...
         'This will be because you have never set the preferences in '...
         'this panel. You can do so by visiting the %1$s ' ...
         'Preferences page and clicking OK, as detailed in the ' ...
         'description of this function.'], panels_main{3});
end

% Let the user know they are doing a stupid thing if they export when using
% the default settings
if com.mathworks.services.Prefs.getBooleanPref('ColorsUseSystem')
    warning(...
        ['You are exporting with system colors for main text and background.'...
         10, 'The exported theme will look different on different systems.']);
end

% ------------------------ File stuff -------------------------------------
if isempty(fname)
    % Get user's name
    username = java.lang.System.getProperty('user.name');
    % Prepend username to default filename
    outFileName = [char(username) DEFOUTNAME];
    % Dialog asking for savename, with smart default output filename
    [filename, pathname] = uiputfile(outFileName, ...
        'Select file to write MATLAB color scheme');
    % End if user cancels
    if isequal(filename, 0);
        if nargout>0; varargout{1} = 0; end;
        return;
    end
    fname = fullfile(pathname, filename);
end

% Open for write access of text file, create if necessary
fid = fopen(fname, 'w+t', 'n');
if isequal(fid, -1);
    if nargout>0; varargout{1} = -1; end;
    return;
end
% Add a cleanup object incase of failure
finishup = onCleanup(@() fclose(fid));

% Find the name of the color scheme based on the filename
[~, schemename] = fileparts(fname);

% Write a few comments to the start of the file
fprintf(fid, '# %s - MATLAB color scheme\n', schemename);
fprintf(fid, '# Generated with schemer_export %s, on MATLAB %s\n', ...
                SCHEMER_VERSION, version);
fprintf(fid, '# %s\n', char(java.util.Date));
fprintf(fid, '# To enable this color scheme in MATLAB use schemer_import, available at:\n');
fprintf(fid, '#     %s\n', SCHEMER_URLGIT);
fprintf(fid, '#     %s\n', SCHEMER_URLFEX);


% ------------------------ Read and Write ---------------------------------
% Loop through the boolean type settings
prefs_boolean = cell(size(names_boolean));
for i=1:length(names_boolean)
    % Check the name of this preference
    nm = names_boolean{i};
    % Get the value of this boolean preference
    prefs_boolean{i} = com.mathworks.services.Prefs.getBooleanPref(nm);
    % Construct the string to output
    outstr = [nm '=B'];
    if prefs_boolean{i}
        outstr = [outstr 'true'];
    else
        outstr = [outstr 'false'];
    end
    outstr = [outstr '\n'];
    % Write this boolean value to the output file
    fprintf(fid, outstr);
end

% Loop through the integer type settings
prefs_integer = cell(size(names_integer));
for i=1:length(names_integer)
    % Check the name of this preference
    nm = names_integer{i};
    % Get the integer value for this preference
    prefs_integer{i} = com.mathworks.services.Prefs.getIntegerPref(nm);
    % Write this integer value to the output file
    fprintf(fid, '%s=I%d\n', nm, prefs_integer{i});
end

% Loop through the colour type settings for MATLAB syntax highlighting
for iPanel=1:numel(names_color_main)
    for iPref=1:numel(names_color_main{iPanel})
        % Check the name of this preference
        nm = names_color_main{iPanel}{iPref};
        % Write its colour value to the output file
        fprintf(fid, '%s=C%d\n', nm, colors_main{iPanel}(iPref));
    end
end

% Loop over colours which may or may not be available
% Initialise cell arrays for successful fields
onames_versioned = {};
cprefs_versioned = {};
% Loop over the colours
for iPref=1:size(names_color_versioned, 1)
    % Check the name of this preference
    nm = names_color_versioned{iPref, 1};
    % Try to get the colour for this preference
    prf = com.mathworks.services.Prefs.getColorPref(nm);
    % If the current MATLAB version is less the first version where it is
    % not known whether it has implemented this preference feature
    % Or if the MATLAB version is less than the first version known to have
    % implemented the feature and the colour appears to be black
    % Then we skip this preference
    if verLessThan('matlab', names_color_versioned{iPref, 2}) ...
        || ( ...
            verLessThan('matlab', names_color_versioned{iPref, 3}) ...
            && prf.getRGB==-16777216 ...
           )
        % It appears that this version of MATLAB does not include this
        % preference. So we skip it.
        continue;
    end
    % Otherwise, we write its colour value to the output file
    fprintf(fid, '%s=C%d\n', nm, prf.getRGB);
    % And we add the values to the list to output
    onames_versioned{end+1} = nm;
    cprefs_versioned{end+1} = prf;
end


% Initialise a cell array to output for other language syntax
onames_langs = {};
cprefs_langs = {};
% Loop through the colour type settings for other language syntax, only if
% it is requested
if inc_otherlangs
    % Go through all the language color syntax preference panels, checking
    % their settings are available to us
    % Loop over every one of the main colour preference panels
    for iPanel = 1:numel(names_color_otherlangs)
        [panel_prefs, panel_colors] = fetch_colors(...
            names_color_otherlangs{iPanel});
        if all(panel_colors==-16777216)
            % All the colours in this panel are black, so we assume the
            % color settings have not loaded because they have not been set
            continue;
        end
        % Not all the colours are black, so we assume we have loaded the
        % values for this language panel.

        % Loop again over every colour setting in the panel
        for iPref = 1:numel(names_color_otherlangs{iPanel})
            % Get the name for the color setting we are interested in
            nm = names_color_otherlangs{iPanel}{iPref};
            % Write its colour value to the output file
            fprintf(fid, '%s=C%d\n', nm, panel_colors(iPref));
        end
        % Remember the prefences so we can return them
        onames_langs = [onames_langs; names_color_otherlangs{iPanel}];
        cprefs_langs = [cprefs_langs; panel_prefs];
    end
end

% We have to do special handling for VRML because in R2016a, MathWorks
% changed the encoding name from VRML to VRMLX3DV. Aside from this, nothing
% else was changed. The rest of the preference name is the same, and the
% default values are unchanged.
if inc_otherlangs
    % Deal with VRML and VRMLX3DV possibilities
    if verLessThan('matlab', version_vrmlx3dv)
        names_color_vrml_usable = names_color_vrml;
    else
        names_color_vrml_usable = strrep(names_color_vrml, ...
            '.VRML.', '.VRMLX3DV.');
    end
    % Get the colours from the appropriate preference names
    [panel_prefs, panel_colors] = fetch_colors(names_color_vrml_usable);
    % If all the colours in this panel are black, we assume the color
    % settings have not loaded because they have not been set.
    if ~all(panel_colors==-16777216)
        for iPref = 1:numel(names_color_vrml)
            % Get the name for the color setting we are interested in
            nm = names_color_vrml{iPref};
            % Write its colour value to the output file
            fprintf(fid, '%s=C%d\n', nm, panel_colors(iPref));
        end
        % Remember the prefences so we can return them
        onames_langs = [onames_langs; names_color_otherlangs{iPanel}];
        cprefs_langs = [cprefs_langs; panel_prefs];
    end
end

% Do strings for other languages
if inc_otherlangs
    for iPref=1:size(names_string_otherlang, 1)
        % Get the name for the string preference we are interested in
        nm  = names_string_otherlang{iPref, 1};
        % Read the string
        str = com.mathworks.services.Prefs.getStringPref(nm);
        % Turn it from a java.lang.String object to a regular char object
        str = char(str);
        % Check it is okay
        if isempty(regexp(str, names_string_otherlang{iPref, 2}, ...
                    'start', 'emptymatch'))
            % It did not have any matches for the regex, so we will not use
            % this setting. We will assume its value is not available.
            continue;
        end
        % It matched the regex for acceptable values, so we will export it
        fprintf(fid, '%s=S%s\n', nm, str);
        % Remember the prefence so we can return it
        onames_langs = [onames_langs; nm];
        cprefs_langs = [cprefs_langs; str];
    end
end

% ------------------------ Tidy up ----------------------------------------
% fclose(fid); % Don't need to close as it will autoclose
if nargout>0; varargout{1} = 1; end;

fprintf('Exported color scheme to %s\n', fname);

if nargout>1;
    varargout{2} = cat(1, ...
                    names_boolean       , ...
                    names_integer       , ...
                    names_color_main{:} , ...
                    onames_versioned    , ...
                    onames_langs        );
    varargout{3} = cat(1, ...
                    prefs_boolean       , ...
                    prefs_integer       , ...
                    cprefs_main{:}      , ...
                    cprefs_versioned    , ...
                    cprefs_langs        );
end

end


function [prefs, colors] = fetch_colors(names)
    % Initialise holding variable for settings in this panel
    prefs = cell(size(names));
    colors = nan(size(names));
    % Loop over every colour setting in the panel
    for iName = 1:numel(names)
        % Read the preference for this colour and get a Java color object
        prefs{iName} = com.mathworks.services.Prefs.getColorPref(...
            names{iName});
        % Turn this into an integer colour value
        colors(iName) = prefs{iName}.getRGB;
    end
end

back to top

Software Heritage — Copyright (C) 2015–2026, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Content policy— Contact— JavaScript license information— Web API