Revision 4dbf0ec391b877f21402aed9e8351fe8f7468d14 authored by D019 Rig on 19 December 2019, 23:25:22 UTC, committed by D019 Rig on 19 December 2019, 23:25:22 UTC
1 parent 4cac1d4
schemer_import.m
%SCHEMER_IMPORT Import a MATLAB color scheme
% SCHEMER_IMPORT() with no input will prompt the user to locate the
% color theme source file via the GUI.
%
% SCHEMER_IMPORT(FILENAME) imports the color scheme options given in
% the file FILENAME.
%
% SCHEMER_IMPORT(FILENAME, INCLUDEBOOLS) can control whether boolean
% preferences are included in import (default: FALSE). If INCLUDEBOOLS
% is set to true, boolean preference options such as whether to
% highlight autofixable errors, or to show variables with shared scope in
% a different colour will also be overridden, should they be set in the
% input file.
%
% SCHEMER_IMPORT(INCLUDEBOOLS, FILENAME), with a boolean or numeric input
% followed by a string input, will also work as above because the input
% order is reversible.
%
% SCHEMER_IMPORT(INCLUDEBOOLS) with a single boolean input will open the
% GUI to pick the file, and will load boolean preferences in accordance
% with INCLUDEBOOLS.
%
% RET = SCHEMER_IMPORT(...) returns 1 on success, 0 on user
% cancellation at input file selection screen, -1 on fopen error, and -2
% on any other error.
%
% NOTE:
% The file to import can either be a color scheme file as generated by
% SCHEMER_EXPORT, or an entire MATLAB preferences file such as the file
% you will find located at FULLFILE(PREFDIR,'matlab.prf'). This could be
% a MATLAB preferences file taken from a different computer or previous
% MATLAB installation. However, if you are importing from a matlab.prf
% file instead of a color scheme .prf file you should be aware that any
% colour preferences which have been left as the defaults on preference
% panels which the user has not visited on the origin system of the
% matlab.prf file will not be present in the file, and hence not updated
% on import.
%
% The MATLAB preference options which will be overwritten by
% SCHEMER_IMPORT are:
% - All settings in the Color pane of Preferencs
% - All colour settings in the Color > Programming Tools pane, but no
% checkboxes
% - From Editor/Debugger > Display pane, the following:
% - Highlight current line (colour, but not whether to)
% - Right-hand text limit (colour and thickness, but not on/off)
% - From Editor/Debugger > Language, the syntax highlighting colours for
% each language.
%
% Once the current colour preferences are overridden they cannot be
% undone, so it is recommended that you export your current preferences
% with SCHEMER_EXPORT before importing a new theme if you think you
% may wish to revert.
%
% This is not necessary if you are using the default MATLAB color scheme
% which ships with the installation, as SCHEMER comes with a copy of the
% MATLAB default color scheme (default.prf).
%
% If you wish to revert to the default MATLAB color scheme, it is
% recommended you import the file default.prf included in this
% package. This will reset Editor/Debugger>Display colours, colours for
% syntax highlighting in additional languages, as well as the colours set
% in the Colors pane. You can also revert the colors by clicking
% "Restore Default Colors" in the MATLAB preference panel interface, but
% this will be less effective because there are several panels which set
% syntax colours and not all of them have a restore button.
%
% 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/
%
% See also SCHEMER_EXPORT, PREFDIR.
% 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.
% Known issues:
%
% 1. Text colour of automatically highlighted variables does not change
% colour immediately. This is an issue with matlab; if you change the main
% text colour in the preferences pane, highlighted variables will still
% have the old text colour until matlab is restarted.
%
% 2. Java exception is thrown when first trying to update the setting
% Editor.VariableHighlighting.Color. This only happens the first
% time SCHEMER_IMPORT is run, so the current fix is to catch the error
% and then try again. However, it might be possible for other Java
% exceptions get thrown under other mysterious circumstances, which could
% cause the function to fail.
function varargout = schemer_import(fname, inc_bools)
% ------------------------ Parameters -------------------------------------
SCHEMER_VERSION = 'v1.4.0';
% ------------------------ Input handling ---------------------------------
% ------------------------ Default inputs ---------------------------------
if nargin<2
inc_bools = false; % Default off, so only override extra options if intended
end
if nargin<1
fname = []; % Ask user to select file
end
% Input switching
if nargin>=1 && ~ischar(fname) && ~isempty(fname)
if ~islogical(fname) && ~isnumeric(fname)
error('Invalid input argument 1');
end
if nargin==1
% First input omitted
inc_bools = fname;
fname = [];
elseif ischar(inc_bools)
% Inputs switched
tmp = fname;
fname = inc_bools;
inc_bools = tmp;
clear tmp;
else
error('Invalid combination of inputs');
end
end
% ------------------------ Check for file ---------------------------------
filefilt = ...
{'*.prf' , 'MATLAB preference files (*.prf)' ; ...
'*.prf;*.txt', 'Text and pref files (*.prf, *.txt)'; ...
'*' , 'All Files' };
if ~isempty(fname)
if ~exist(fname, 'file')
error('Specified file does not exist');
end
else
% Dialog asking for input filename
% Need to make this dialogue include .txt by default, at least
[filename, pathname] = uigetfile(filefilt);
% End if user cancels
if isequal(filename, 0);
if nargout>0; varargout{1} = 0; end;
return;
end
fname = fullfile(pathname, filename);
end
% ------------------------ Catch block ------------------------------------
% Somewhat inexplicably, a Java exception is thrown the first time we try
% to set 'Editor.VariableHighlighting.Color'.
% But if we try again immediately, it can be set without any problems.
% The issue is very consistent.
% The solution is to try to set this colour along with all the others,
% catch the exception when it occurs, and then attempt to set all the
% preferences again.
try
[varargout{1:nargout}] = main(fname, inc_bools);
catch ME
if ~strcmp(ME.identifier, 'MATLAB:Java:GenericException');
rethrow(ME);
end
% disp('Threw and ignored a Java exception. Retrying.');
[varargout{1:nargout}] = main(fname, inc_bools);
end
end
% ======================== Main code ======================================
function varargout = main(fname, inc_bools)
% ------------------------ Parameters -------------------------------------
% Names of boolean preferences which should always be imported
names_boolean = { ...
'ColorsUseSystem' ... % Color: Desktop: Use system colors
};
% Names of boolean preferences which the user can choose whether to import
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
};
% Names of preferences for which the values are strings
% 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 = { ...
'Editor.Language.Java.method' , ... % Java: Show methods
'^(none|bold|italic)$' ; ...
};
% Names of colour preferences, and their default value if not present in
% the .prf file
% column 1: name of preference
% column 2: default value.
% - Empty if no default,
% - Integer if specific colour,
% - String if inherited from another colour setting (which
% should appear higher up in the list)
% - Cell array of strings to take the average colour from
% column 3: whether a restart is required if this value changes
names_color = { ...
'ColorsText' , ... % Color: Desktop: main text colour
'' , ...
false ; ...
'ColorsBackground' , ... % Color: Desktop: main background
'' , ...
true ; ...
'Colors_M_Errors' , ... % Color: Syntax: errors
-65536 , ...
true ; ...
'Colors_M_Warnings' , ... % Color>PT: Analyser: warnings
-27648 , ...
true ; ...
'Colors_M_Keywords' , ... % Color: Syntax: keywords
'ColorsText' , ...
false ; ...
'Colors_M_Comments' , ... % Color: Syntax: comments
{'ColorsText','ColorsBackground'} , ...
false ; ...
'Colors_M_Strings' , ... % Color: Syntax: strings
'ColorsText' , ...
false ; ...
'Colors_M_UnterminatedStrings' , ... % Color: Syntax: unterminated strings
'Colors_M_Errors' , ...
false ; ...
'Colors_M_SystemCommands' , ... % Color: Syntax: system commands
'Colors_M_Keywords' , ...
false ; ...
'Colors_HTML_HTMLLinks' , ... % Color: Other: hyperlinks
'ColorsText' , ...
false ; ...
'Color_CmdWinWarnings' , ... % Color: Other: Warning messages
'Colors_M_Warnings' , ...
false ; ...
'Color_CmdWinErrors' , ... % Color: Other: Error messages
'Colors_M_Errors' , ...
false ; ...
'ColorsMLintAutoFixBackground' , ... % Color>PT: Analyser: autofix
'ColorsBackground' , ...
false ; ...
'Editor.VariableHighlighting.Color' , ... % Color>PT: Var&fn: highlight
'ColorsBackground' , ...
true ; ...
'Editor.NonlocalVariableHighlighting.TextColor' , ... % Color>PT: Var&fn: with shared scope
'ColorsText' , ...
false ; ...
'Editorhighlight-lines' , ... % Color>PT: CellDisp: highlight
'ColorsBackground' , ...
false ; ...
'Editorhighlight-caret-row-boolean-color' , ... % Editor>Display: Highlight current line Color
'Editorhighlight-lines' , ...
false ; ...
'EditorRightTextLimitLineColor' , ... % Editor>Display: Right-hand text limit line Color
-5723992 , ...
false ; ...
'Editor.Language.MuPAD.Color.keyword' , ... % MuPAD: Keywords
'Colors_M_Keywords' , ...
false ; ...
'Editor.Language.MuPAD.Color.operator' , ... % MuPAD: Operators
'Colors_M_SystemCommands' , ...
false ; ...
'Editor.Language.MuPAD.Color.block-comment' , ... % MuPAD: Comments
'Colors_M_Comments' , ...
false ; ...
'Editor.Language.MuPAD.Color.option' , ... % MuPAD: Options
'Colors_M_UnterminatedStrings' , ...
false ; ...
'Editor.Language.MuPAD.Color.string' , ... % MuPAD: Strings
'Colors_M_Strings' , ...
false ; ...
'Editor.Language.MuPAD.Color.function' , ... % MuPAD: System Functions
{'Colors_M_Keywords','ColorsBackground'} , ...
false ; ...
'Editor.Language.MuPAD.Color.constant' , ... % MuPAD: Constants
'Editor.NonlocalVariableHighlighting.TextColor' , ...
false ; ...
'Editor.Language.TLC.Color.Colors_M_SystemCommands' , ... % TLC: Commands
'Colors_M_Keywords' , ...
false ; ...
'Editor.Language.TLC.Color.Colors_M_Keywords' , ... % TLC: Macros
'Colors_M_SystemCommands' , ...
false ; ...
'Editor.Language.TLC.Color.Colors_M_Comments' , ... % TLC: Comments
'Colors_M_Comments' , ...
false ; ...
'Editor.Language.TLC.Color.string-literal' , ... % TLC: C Strings
'Colors_M_Strings' , ...
false ; ...
'Editor.Language.C.Color.keywords' , ... % C/C++: Keywords
'Colors_M_Keywords' , ...
false ; ...
'Editor.Language.C.Color.line-comment' , ... % C/C++: Comments
'Colors_M_Comments' , ...
false ; ...
'Editor.Language.C.Color.string-literal' , ... % C/C++: Strings
'Colors_M_Strings' , ...
false ; ...
'Editor.Language.C.Color.preprocessor' , ... % C/C++: Preprocessor
'Colors_M_SystemCommands' , ...
false ; ...
'Editor.Language.C.Color.char-literal' , ... % C/C++: Characters
'Colors_M_UnterminatedStrings' , ...
false ; ...
'Editor.Language.C.Color.errors' , ... % C/C++: Bad characters
'Colors_M_Errors' , ...
false ; ...
'Editor.Language.Java.Color.keywords' , ... % Java: Keywords
'Colors_M_Keywords' , ...
false ; ...
'Editor.Language.Java.Color.line-comment' , ... % Java: Comments
'Colors_M_Comments' , ...
false ; ...
'Editor.Language.Java.Color.string-literal' , ... % Java: Strings
'Colors_M_Strings' , ...
false ; ...
'Editor.Language.Java.Color.char-literal' , ... % Java: Characters
'Colors_M_UnterminatedStrings' , ...
false ; ...
'Editor.Language.VHDL.Color.Colors_M_Keywords' , ... % VHDL: Keywords
'Colors_M_Keywords' , ...
false ; ...
'Editor.Language.VHDL.Color.operator' , ... % VHDL: Operators
'Colors_M_SystemCommands' , ...
false ; ...
'Editor.Language.VHDL.Color.Colors_M_Comments' , ... % VHDL: Comments
'Colors_M_Comments' , ...
false ; ...
'Editor.Language.VHDL.Color.string-literal' , ... % VHDL: Strings
'Colors_M_Strings' , ...
false ; ...
'Editor.Language.Verilog.Color.Colors_M_Keywords' , ... % Verilog: Keywords
'Colors_M_Keywords' , ...
false ; ...
'Editor.Language.Verilog.Color.operator' , ... % Verilog: Operators
'Colors_M_SystemCommands' , ...
false ; ...
'Editor.Language.Verilog.Color.Colors_M_Comments' , ... % Verilog: Comments
'Colors_M_Comments' , ...
false ; ...
'Editor.Language.Verilog.Color.string-literal' , ... % Verilog: Strings
'Colors_M_Strings' , ...
false ; ...
'Editor.Language.XML.Color.error' , ... % XML: Error
'Colors_M_Errors' , ...
false ; ...
'Editor.Language.XML.Color.tag' , ... % XML: Tag
'Colors_M_Keywords' , ...
false ; ...
'Editor.Language.XML.Color.attribute' , ... % XML: Attribute name
'Colors_M_UnterminatedStrings' , ...
false ; ...
'Editor.Language.XML.Color.operator' , ... % XML: Operator
'Colors_M_SystemCommands' , ...
false ; ...
'Editor.Language.XML.Color.value' , ... % XML: Attribute value
'Colors_M_Strings' , ...
false ; ...
'Editor.Language.XML.Color.comment' , ... % XML: Comment
'Colors_M_Comments' , ...
false ; ...
'Editor.Language.XML.Color.doctype' , ... % XML: DOCTYPE declaration
'Colors_HTML_HTMLLinks' , ...
false ; ...
'Editor.Language.XML.Color.ref' , ... % XML: Character
'Colors_M_UnterminatedStrings' , ...
false ; ...
'Editor.Language.XML.Color.pi-content' , ... % XML: Processing instruction
'Colors_HTML_HTMLLinks' , ...
false ; ...
'Editor.Language.XML.Color.cdata-section' , ... % XML: CDATA section
'Editor.NonlocalVariableHighlighting.TextColor' , ...
false ; ...
'Editor.Language.VRML.Color.keyword' , ... % VRML: Keywords
'Editor.Language.XML.Color.doctype' , ...
false ; ...
'Editor.Language.VRML.Color.node-keyword' , ... % VRML: Node types
'Editor.Language.XML.Color.tag' , ...
false ; ...
'Editor.Language.VRML.Color.field-keyword' , ... % VRML: Fields
'Editor.Language.XML.Color.attribute' , ...
false ; ...
'Editor.Language.VRML.Color.data-type-keyword' , ... % VRML: Data types
'Editor.Language.XML.Color.cdata-section' , ...
false ; ...
'Editor.Language.VRML.Color.terminal-symbol' , ... % VRML: Terminal symbols
'Editor.Language.XML.Color.operator' , ...
false ; ...
'Editor.Language.VRML.Color.comment' , ... % VRML: Comments
'Editor.Language.XML.Color.comment' , ...
false ; ...
'Editor.Language.VRML.Color.string' , ... % VRML: Strings
'Editor.Language.XML.Color.value' , ...
false ; ...
'Editor.Language.VRMLX3DV.Color.keyword' , ... % VRML/X3DV: Keywords
'Editor.Language.VRML.Color.keyword' , ...
false ; ...
'Editor.Language.VRMLX3DV.Color.node-keyword' , ... % VRML/X3DV: Node types
'Editor.Language.VRML.Color.node-keyword' , ...
false ; ...
'Editor.Language.VRMLX3DV.Color.field-keyword' , ... % VRML/X3DV: Fields
'Editor.Language.VRML.Color.field-keyword' , ...
false ; ...
'Editor.Language.VRMLX3DV.Color.data-type-keyword' , ... % VRML/X3DV: Data types
'Editor.Language.VRML.Color.data-type-keyword' , ...
false ; ...
'Editor.Language.VRMLX3DV.Color.terminal-symbol' , ... % VRML/X3DV: Terminal symbols
'Editor.Language.VRML.Color.terminal-symbol' , ...
false ; ...
'Editor.Language.VRMLX3DV.Color.comment' , ... % VRML/X3DV: Comments
'Editor.Language.VRML.Color.comment' , ...
false ; ...
'Editor.Language.VRMLX3DV.Color.string' , ... % VRML/X3DV: Strings
'Editor.Language.VRML.Color.string' , ...
false ; ...
};
verbose = 0;
% ------------------------ Setup ------------------------------------------
if nargout==0
varargout = {};
else
varargout = {-2};
end
if inc_bools
names_boolean = [names_boolean names_boolextra];
end
needs_restart = false;
% ------------------------ Check file seems okay --------------------------
% Read in the contents of the entire file
flestr = fileread(fname);
% Search for occurances of main text colour
txtprf = regexp(flestr, '\sColorsText=(?<pref>[^#\s]+)\s', 'names');
if isempty(txtprf)
error('Text colour not present in colorscheme file:\n%s', fname);
elseif length(txtprf) > 1
error('Text colour defined multiple times in colorscheme file:\n%s', fname);
end
% Search for occurances of main background colour
bkgprf = regexp(flestr, '\sColorsBackground=(?<pref>[^#\s]+)\s', 'names');
if isempty(bkgprf)
error('Background colour not present in colorscheme file:\n%s', fname);
elseif length(bkgprf) > 1
error('Background colour defined multiple times in colorscheme file:\n%s', fname);
end
% Make sure the main text and background colours are not exactly the same
if strcmp(txtprf.pref, bkgprf.pref)
error('Main text and background colours are the same in this file:\n%s', fname);
end
% ------------------------ File stuff -------------------------------------
% Open for read access only
fid = fopen(fname, 'r', '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));
% ------------------------ Read and Write ---------------------------------
% Initialise tracker for unset colours
isColorSet = false(size(names_color, 1), 1);
% Loop over prf file
while ~feof(fid)
% Get one line of preferences/theme file
l = fgetl(fid);
% Ignore empty lines and lines which begin with #
if length(l)<1 || strcmp('#', l(1))
if verbose; disp('Comment'); end;
continue;
end
% Look for name pref pair, seperated by '='
% Must be at begining of string (hence ^ anchor)
% Cannot contain comment marker (#)
n = regexp(l, '^(?<name>[^=#]+)=(?<pref>[^#]+)', 'names');
% If no match, continue and scan next line
if isempty(n)
if verbose; disp('No match'); end;
continue;
end
% Trim whitespace from pref
n.pref = strtrim(n.pref);
if ismember(n.name, names_boolean)
% Deal with boolean type
switch lower(n.pref)
case 'btrue'
% Preference is true
com.mathworks.services.Prefs.setBooleanPref(n.name, 1);
if verbose; fprintf('Set bool true %s\n', n.name); end
case 'bfalse'
% Preference is false
com.mathworks.services.Prefs.setBooleanPref(n.name, 0);
if verbose; fprintf('Set bool false %s\n', n.name); end
otherwise
% Shouldn't be anything else
warning('Bad boolean for %s: %s', n.name, n.pref);
end
elseif ismember(n.name, names_integer)
% Deal with integer type
if ~strcmpi('I', n.pref(1))
warning('Bad integer pref for %s: %s', n.name, n.pref);
continue;
end
int = str2double(n.pref(2:end));
com.mathworks.services.Prefs.setIntegerPref(n.name, int);
if verbose; fprintf('Set integer %d for %s\n', int, n.name); end
elseif ismember(n.name,names_string(:, 1))
% Deal with string type
if ~strcmpi('S', n.pref(1))
warning('Bad string pref for %s: %s', n.name, n.pref);
continue;
end
str = n.pref(2:end);
% Look up which of the preference settings this is
[~, idx] = ismember(n.name, names_string(:, 1));
% Check that the setting allowed by the regex it must satisfy
if isempty(regexp(str, names_string{idx, 2}, ...
'start', 'emptymatch'))
% If not, we can't set the value to be this
warning('Invalid string for %s: %s', n.name, str);
continue;
end
com.mathworks.services.Prefs.setStringPref(n.name, str);
if verbose; fprintf('Set string %s for %s\n', str, n.name); end
elseif ismember(n.name, names_color(:, 1))
% Deal with colour type (final type to consider)
if ~strcmpi('C', n.pref(1))
warning('Bad color for %s: %s', n.name, n.pref);
continue;
end
[~, idx] = ismember(n.name, names_color(:, 1));
% Get the current setting for this parameter
previousVal = ...
com.mathworks.services.Prefs.getColorPref(names_color{idx, 1});
% Set the colour to the target value
rgb = str2double(n.pref(2:end));
jc = java.awt.Color(rgb);
com.mathworks.services.Prefs.setColorPref(n.name, jc);
com.mathworks.services.ColorPrefs.notifyColorListeners(n.name);
if verbose
fprintf('Set color (%3.f, %3.f, %3.f) for %s\n', ...
jc.getRed, jc.getGreen, jc.getBlue, n.name);
end
% Note that we have allocated this colour
isColorSet(idx) = true;
% Check if the colour has changed
if names_color{idx, 3} && ~isequal(previousVal, jc)
needs_restart = true;
end
else
% Silently ignore irrelevant preferences
% (This means you can load a whole matlab.prf file and anything not
% listed above as relevant to the color scheme will be ignored.)
end
end
% Check that at least one colour was actually set
if ~any(isColorSet)
error('Did not find any colour settings in file\n%s', fname);
if nargout>0; varargout{1} = -2; end;
return;
end
% For colours which have not been set by the color scheme, we set them from
% a backup
% Get a row vector of indices of all unset colours
unsetColorIndices = find(~isColorSet)';
% Loop over unset colours
for idx=unsetColorIndices
% Get the backup setting for this colour parameter
backupVal = names_color{idx, 2};
% Get the current setting for this parameter
previousVal = ...
com.mathworks.services.Prefs.getColorPref(names_color{idx, 1});
clear jc; % Clear variable
% Switch based on the type of backup
if isempty(backupVal)
% No backup is set
continue;
elseif iscell(backupVal)
% Backup is one of several methods of which involve refactoring one
% or more other colours
% Get an RGB value for the colour through whichever method
if all(cellfun(@ischar, backupVal))
% Backup is a list of other names to sample and average
% Initialise a holding matrix
RGB = nan(numel(backupVal), 3);
for i=1:numel(backupVal)
% Load each of the other colours
jc = com.mathworks.services.Prefs.getColorPref(backupVal{i});
% Put the R, G, B values into the holding matrix
RGB(i, 1) = jc.getRed;
RGB(i, 2) = jc.getGreen;
RGB(i, 3) = jc.getBlue;
end
% Take the average of each RGB value from the other colours
RGB = mean(RGB);
elseif length(backupVal)==2
% Backup is a name of a colour and a scale factor to apply
jc = com.mathworks.services.Prefs.getColorPref(backupVal{1});
% Get the R, G, B values
RGB = [jc.getRed, jc.getGreen, jc.getBlue];
% Rescale them
RGB = RGB * backupVal{2};
else
error('Bad backup cell for %s', names_color{idx, 1});
end
% Turn the RGB value into a Java color object
% Ensure RGB is integer and does not exceed 255
RGB = min(255, round(RGB));
% Convert to a float
RGB = RGB/255;
% Make a Java color object for this colour
jc = java.awt.Color(RGB(1), RGB(2), RGB(3));
elseif ischar(backupVal)
% The backup colour is a reference to another colour
% Look up the colour from the backup reference
jc = com.mathworks.services.Prefs.getColorPref(backupVal);
elseif isnumeric(backupVal) && numel(backupVal)==1
% The backup colour is a specific colour
% Make a java color object for this specific colour
jc = java.awt.Color(backupVal);
else
error('Bad backup value for %s', names_color{idx, 1});
end
% Assign the neglected colour to be this Java colour object from the
% backup
com.mathworks.services.Prefs.setColorPref(names_color{idx, 1}, jc);
com.mathworks.services.ColorPrefs.notifyColorListeners(names_color{idx, 1});
% Check if the colour has changed
if names_color{idx, 3} && ~isequal(previousVal, jc)
needs_restart = true;
end
end
% ------------------------ Tidy up ----------------------------------------
% fclose(fid); % Don't need to close as it will autoclose
if nargout>0; varargout{1} = 1; end;
if inc_bools
fprintf('Imported color scheme WITH boolean options from\n%s\n', fname);
else
fprintf('Imported color scheme WITHOUT boolean options from\n%s\n', fname);
end
if needs_restart
disp('Some changes require MATLAB to be restarted to be activated.');
end
end

Computing file changes ...