📄 uiinspect.m
字号:
%% Prepare the property inspector panel
function [propsPane, inspectorTable] = getPropsPane(obj)
% Prepare the properties pane
import java.awt.* javax.swing.*
%classNameLabel = JLabel([' ' char(obj.class)]);
classNameLabel = JLabel(' Inspectable object properties');
classNameLabel.setForeground(Color.blue);
objProps = updateObjTooltip(obj, classNameLabel); %#ok unused
propsPane = JPanel(BorderLayout);
propsPane.add(classNameLabel, BorderLayout.NORTH);
% TODO: Maybe uncomment the following - in the meantime it's unused (java properties are un-groupable)
%objReg = com.mathworks.services.ObjectRegistry.getLayoutRegistry;
%toolBar = awtinvoke('com.mathworks.mlwidgets.inspector.PropertyView$ToolBarStyle','valueOf(Ljava.lang.String;)','GROUPTOOLBAR');
%inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView(objReg, toolBar);
inspectorPane = com.mathworks.mlwidgets.inspector.PropertyView;
identifiers = disableDbstopError; %#ok "dbstop if error" causes inspect.m to croak due to a bug - so workaround
inspectorPane.setObject(obj);
inspectorPane.setAutoUpdate(true);
% TODO: Add property listeners
inspectorTable = inspectorPane;
while ~isa(inspectorTable,'javax.swing.JTable')
inspectorTable = inspectorTable.getComponent(0);
end
toolTipText = 'hover mouse over the blue label above to see the full list of properties';
inspectorTable.setToolTipText(toolTipText);
try
% Try JIDE features - see http://www.jidesoft.com/products/JIDE_Grids_Developer_Guide.pdf
com.mathworks.mwswing.MJUtilities.initJIDE;
jideTableUtils = eval('com.jidesoft.grid.TableUtils;'); % prevent JIDE alert by run-time (not load-time) evaluation
jideTableUtils.autoResizeAllColumns(inspectorTable);
inspectorTable.setRowAutoResizes(true);
inspectorTable.getModel.setShowExpert(1);
catch
% JIDE is probably unavailable - never mind...
end
propsPane.add(inspectorPane, BorderLayout.CENTER);
%mainPropsPane = JPanel;
%mainPropsPane.setLayout(BoxLayout(mainPropsPane, BoxLayout.PAGE_AXIS));
%mainPropsPane.add(inspectorPane);
% Strip all inspected props from objProps:
pause(0.1); %allow the inspector time to load...
return;
%{
rows = inspectorTable.getModel.getRows;
numRows = rows.size;
for rowIdx = 0 : numRows-1
thisRow = rows.get(rowIdx);
objProps = stripProp(objProps, char(thisRow.getDisplayName));
for childIdx = 0 : thisRow.getChildrenCount-1
objProps = stripProp(objProps, char(thisRow.getChildAt(childIdx).getDisplayName));
end
end
%}
%end % getPropsPane
%% Strip inspected property name from pre-fetched list of object properties
function objProps = stripProp(objProps, inspectedPropName) %#ok unused
try
% search for a case-insensitive match
%objProps = rmfield(objProps,inspectedPropName);
propNames = fieldnames(objProps);
idx = strcmpi(propNames,inspectedPropName);
objProps = rmfield(objProps,propNames(idx));
catch
% never mind - inspectedProp was probably not in objProps
end
%end % stripPropName
%% Get callbacks table data
function [cbData, cbHeaders, cbTableEnabled] = getCbsData(obj, stripStdCbsFlag)
% Initialize
cbData = {'(no callbacks)'};
cbHeaders = {'Callback name'};
cbTableEnabled = false;
try
classHdl = classhandle(handle(obj));
cbNames = get(classHdl.Events,'Name');
if ~isempty(cbNames) && ~iscom(obj) %only java-based please...
cbNames = strcat(cbNames,'Callback');
end
propNames = get(classHdl.Properties,'Name');
propCbIdx = [];
if ischar(propNames), propNames={propNames}; end
if ~isempty(propNames)
propCbIdx = find(~cellfun(@isempty,regexp(propNames,'(Fcn|Callback)$')));
cbNames = unique([cbNames; propNames(propCbIdx)]); %#ok logical is faster but less debuggable...
end
if ~isempty(cbNames)
if stripStdCbsFlag
cbNames = stripStdCbs(cbNames);
end
if iscell(cbNames)
cbNames = sort(cbNames);
end
hgHandleFlag = 0; try hgHandleFlag = ishghandle(obj); catch end
try
obj = handle(obj,'CallbackProperties');
catch
hgHandleFlag = 1;
end
if hgHandleFlag
% HG handles don't allow CallbackProperties - search only for *Fcn
cbNames = propNames(propCbIdx);
end
if iscom(obj)
cbs = obj.eventlisteners;
if ~isempty(cbs)
cbNamesRegistered = cbs(:,1);
cbData = setdiff(cbNames,cbNamesRegistered);
%cbData = charizeData(cbData);
if size(cbData,2) > size(cbData(1))
cbData = cbData';
end
cbData = [cbData, cellstr(repmat(' ',length(cbData),1))];
cbData = [cbData; cbs];
[sortedNames, sortedIdx] = sort(cbData(:,1));
sortedCbs = cellfun(@charizeData,cbData(sortedIdx,2),'un',0);
cbData = [sortedNames, sortedCbs];
else
cbData = [cbNames, cellstr(repmat(' ',length(cbNames),1))];
end
elseif iscell(cbNames)
%cbData = [cbNames, get(obj,cbNames)'];
cbData = cbNames;
for idx = 1 : length(cbNames)
try
cbData{idx,2} = charizeData(get(obj,cbNames{idx}));
catch
cbData{idx,2} = '(callback value inaccessible)';
end
end
else % only one event callback
%cbData = {cbNames, get(obj,cbNames)'};
%cbData{1,2} = charizeData(cbData{1,2});
try
cbData = {cbNames, charizeData(get(obj,cbNames))};
catch
cbData = {cbNames, '(callback value inaccessible)'};
end
end
cbHeaders = {'Callback name','Callback value'};
cbTableEnabled = true;
end
catch
% never mind - use default (empty) data
end
%end % getCbsData
%% Get properties table data
function [propsData, propsHeaders, propTableEnabled] = getPropsData(obj, showMetaData, showInspectedPropsFlag, inspectorTable)
try
propNames = {};
try
%propNames = fieldnames(handle(obj));
classHdl = classhandle(handle(obj));
propNames = get(classHdl.Properties,'Name');
catch
% never mind - might be a classname without any handle...
end
% Add static class fields, if available
try
if ischar(obj)
fields = java.lang.Class.forName(obj).getFields;
fieldsData = cellfun(@(c)char(toString(c)),cell(fields),'un',0);
fieldNames = cellfun(@(c)char(toString(c.getName)),cell(fields),'un',0);
else
fieldNames = fieldnames(obj);
try fieldsData = fieldnames(obj,'-full'); catch, end %#ok
end
propNames = [propNames; fieldNames];
fieldsData = strcat(fieldsData,'%');
catch
% never mind...
end
if iscell(propNames)
propNames = unique(propNames);
end
%propsData = cell(0,7);
propsData = {'(no properties)','','','','','',''};
propsHeaders = {'Name','Type','Value','Get','Set','Visible','Default'};
propTableEnabled = false;
if ~isempty(propNames)
if ~showInspectedPropsFlag
% Strip all inspected props
pause(0.01); %allow the inspector time to load...
rows = inspectorTable.getModel.getRows;
numRows = rows.size;
for rowIdx = 0 : numRows-1
thisRow = rows.get(rowIdx);
[dummy,idx] = setdiff(upper(propNames), upper(char(thisRow.getDisplayName)));
propNames = propNames(idx);
for childIdx = 0 : thisRow.getChildrenCount-1
[dummy,idx] = setdiff(upper(propNames), upper(char(thisRow.getChildAt(childIdx).getDisplayName)));
propNames = propNames(idx);
end
end
end
% Sort properties alphabetically
% Note: sorting is already a side-effect of setdiff, but setdiff is not called when showInspectedPropsFlag=1
if iscell(propNames)
propNames = sort(propNames);
end
% Strip callback properties
if ischar(propNames), propNames = {propNames}; end
propNames(~cellfun(@isempty,regexp(propNames,'(Fcn|Callback)$'))') = [];
% Add property Type & Value data
errorPrefix = '<html><font color="red"><i>'; %red
unsettablePrefix = '<html><font color="#C0C0C0"><i>'; %light gray
staticFinalPrefix = '<html><font color="#0000C0"><i>'; %light blue
for idx = 1 : length(propNames)
propName = propNames{idx};
try
% Find the property's schema.prop data
sp = findprop(handle(obj),propName); %=obj.classhandle.findprop(propName);
% fade non-settable properties (gray italic font)
prefix = '';
if strcmp(sp.AccessFlags.PublicSet,'off')
prefix = unsettablePrefix;
end
% Get the property's meta-data
propsData{idx,1} = [prefix propName];
propsData{idx,2} = '';
if ~isempty(sp)
propsData{idx,2} = [prefix sp.DataType];
propsData{idx,4} = [prefix sp.AccessFlags.PublicGet];
propsData{idx,5} = [prefix sp.AccessFlags.PublicSet];
propsData{idx,6} = [prefix sp.Visible];
if ~strcmp(propName,'FactoryValue')
propsData{idx,7} = [prefix charizeData(get(sp,'FactoryValue'))]; % sp.FactoryValue fails...
else
propsData{idx,7} = ''; % otherwise Matlab crashes...
end
%propsData{idx,8} = [prefix sp.Description];
end
% TODO: some fields (see EOL comment below) generate a Java Exception from: com.mathworks.mlwidgets.inspector.PropertyRootNode$PropertyListener$1$1.run
if strcmp(sp.AccessFlags.PublicGet,'on') % && ~any(strcmp(sp.Name,{'FixedColors','ListboxTop','Extent'}))
try
% Trap warning about unused/depracated properties
s = warning('off','all');
lastwarn('');
value = get(obj, sp.Name);
disp(lastwarn);
warning(s);
propsData{idx,3} = charizeData(value);
catch
errMsg = regexprep(lasterr, {char(10),'Error using ==> get.Java exception occurred:..'}, {' ',''});
propsData{idx,3} = [errorPrefix errMsg];
propsData{idx,1} = strrep(propsData{idx,1},propName,[errorPrefix propName]);
end
else
propsData{idx,3} = '(no public getter method)';
end
%disp({idx,propName}) % for debugging...
catch
propsData{idx,1} = propName;
[propsData{idx,2:7}] = deal('???');
try
propsData{idx,3} = charizeData(get(obj,propName));
catch
try
if ~ischar(obj)
propsData{idx,3} = charizeData(obj.(propName));
end
fieldIdx = find(~cellfun(@isempty,regexp(fieldsData,['[ .]' propName '[ %]'])));
if ~isempty(fieldIdx)
thisFieldData = fieldsData{fieldIdx(1)};
propsData{idx,2} = regexprep(thisFieldData,[' ' propName '.*'],'');
if ~isempty(regexp(thisFieldData,'final ', 'once'))
propsData{idx,1} = [staticFinalPrefix propsData{idx,1}];
propsData{idx,2} = [unsettablePrefix propsData{idx,2}];
propsData{idx,4} = [unsettablePrefix 'on'];
[propsData{idx,5:6}] = deal([unsettablePrefix 'off']);
propsData{idx,7} = [unsettablePrefix propsData{idx,3}];
propsData{idx,3} = [staticFinalPrefix propsData{idx,3}];
end
end
catch
% never mind..
end
end
end
end
propTableEnabled = true;
end
if ~showMetaData
% only show the Name & Value columns
propsData = propsData(:,[1,3]);
propsHeaders = propsHeaders(:,[1,3]);
end
catch
disp(lasterr); rethrow(lasterror)
end
%end % getPropsData
%% Convert property data into a string
function data = charizeData(data)
if ~ischar(data)
newData = strtrim(evalc('disp(data)'));
try
newData = regexprep(newData,' +',' ');
newData = regexprep(newData,'Columns \d+ through \d+\s','');
newData = regexprep(newData,'Column \d+\s','');
catch
%never mind...
end
if iscell(data)
newData = ['{ ' newData ' }'];
elseif isempty(data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -