changeset 523:3c062cc72986 feature/grids

Merge with default
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 01 Aug 2017 12:35:38 +0200
parents 68178e013868 (current diff) e1a59aafe99c (diff)
children 6aad1c4c8e01
files textTable.m
diffstat 3 files changed, 159 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
diff -r 68178e013868 -r 3c062cc72986 TextTable.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextTable.m	Tue Aug 01 12:35:38 2017 +0200
@@ -0,0 +1,122 @@
+classdef TextTable < handle
+    properties
+        data
+        fmtArray
+        vertDiv
+        horzDiv
+
+        nCols
+        nRows
+    end
+
+    methods
+        function obj = TextTable(data, vertDiv, horzDiv);
+            default_arg('vertDiv', []);
+            default_arg('horzDiv', []);
+
+
+            obj.data = data;
+            obj.vertDiv = vertDiv;
+            obj.horzDiv = horzDiv;
+
+            [obj.nRows, obj.nCols] = size(data);
+            obj.fmtArray = cell(size(data));
+            obj.formatAll('%s');
+
+        end
+
+        function formatAll(obj, fmt)
+            obj.fmtArray(:,:) = {fmt};
+        end
+
+        function formatCell(obj, i, j, fmt)
+            obj.fmtArray{i,j} = fmt;
+        end
+
+        function formatRow(obj, i, fmt)
+            obj.fmtArray(i,:) = {fmt};
+        end
+
+        function formatColumn(obj, j, fmt)
+            obj.fmtArray(:,j) = {fmt};
+        end
+
+        function widths = getWidths(obj)
+            strArray = obj.getStringArray();
+
+            widths = zeros(1,obj.nCols);
+            for j = 1:obj.nCols
+                for i = 1:obj.nRows
+                    widths(j) = max(widths(j), length(strArray{i,j}));
+                end
+            end
+        end
+
+        function str = toString(obj)
+            strArray = obj.getStringArray();
+            widths = obj.getWidths();
+
+            str = '';
+
+            % First horzDiv
+            if ismember(0, obj.horzDiv)
+                str = [str, obj.getHorzDiv(widths)];
+            end
+
+            for i = 1:obj.nRows
+                str = [str, TextTable.rowToString(strArray(i,:), widths, obj.vertDiv, obj.horzDiv)];
+
+                % Interior horzDiv
+                if ismember(i, obj.horzDiv)
+                    str = [str, obj.getHorzDiv(widths)];
+                end
+            end
+        end
+
+        function str = getHorzDiv(obj, widths)
+            str = TextTable.rowToString(cell(1,obj.nCols), widths, obj.vertDiv, obj.horzDiv);
+            str(find(' ' == str)) = '-';
+            str(find('|' == str)) = '+';
+        end
+
+        function strArray = getStringArray(obj)
+            strArray = cell(size(obj.data));
+
+            for i = 1:obj.nRows
+                for j = 1:obj.nCols
+                    strArray{i,j} = sprintf(obj.fmtArray{i,j}, obj.data{i,j});
+                end
+            end
+        end
+    end
+
+    methods (Static)
+        function str = rowToString(strs, widths, vertDiv, horzDiv)
+            % First vertDiv
+            if ismember(0, vertDiv)
+                str = '| ';
+            else
+                str = ' ';
+            end
+
+            % Interior cols
+            for j = 1:length(strs) - 1
+                str = [str, sprintf('%*s ', widths(j), strs{j})];
+
+                % Interior vertDiv
+                if ismember(j, vertDiv)
+                    str = [str, '| '];
+                end
+            end
+
+            % Last col
+            str = [str, sprintf('%*s ', widths(end), strs{end})];
+
+            if ismember(length(strs), vertDiv)
+                str = [str, '|'];
+            end
+
+            str = [str, sprintf('\n')];
+        end
+    end
+end
\ No newline at end of file
diff -r 68178e013868 -r 3c062cc72986 textTable.m
--- a/textTable.m	Tue Aug 01 12:22:59 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-
-% data           -- cell array of numbers
-% leftColstrings -- cell array of strings, for left column
-% topRowStrings  -- cell array of strings, for top row
-% dataFormat     -- (optional) format specifier, e.g. '%.2f' 
-function textTable(data, leftColStrings, topRowStrings, dataFormat)
-
-    default_arg('dataFormat','%.2f')
-    
-    nRows = length(leftColStrings);
-    nCols = length(topRowStrings);
-    [m,n] = size(data);
-    
-    if(m ~= nRows || n ~=nCols)
-        error('Data dimensions must match labels');
-    end
-
-    % Find column widths
-    headerLength = 0;
-    for i = 1:nCols
-        headerLength = max(headerLength, length(topRowStrings{i} ));
-    end
- 
-    dataLength = 0;
-    for i = 1:nRows
-        for j = 1:nCols
-            temp = length(sprintf(dataFormat, data{i,j}));
-            dataLength = max(dataLength, temp);
-        end
-    end
-    dataLength = length(sprintf(dataFormat, data{1,1}));
-    
-    colWidth = max(headerLength,dataLength);
-
-    % Print headers
-    fprintf(' %*s |',colWidth,'')
-    for i = 1:nCols
-        fprintf(' %-*s |', colWidth, topRowStrings{i});
-    end
-    fprintf('\n');
-
-    % Print divider
-    m_dev = repmat('-',1,colWidth);
-    column_dev = repmat('-',1,colWidth);
-    fprintf('-%s-+',m_dev);
-    for i = 1:nCols
-        fprintf('-%s-+', column_dev);
-    end
-    fprintf('\n');
-    
-
-    % Print each row
-    dataFormat = ['%*' dataFormat(2:end)];
-    for i = 1:nRows
-        fprintf(' %*s |',colWidth,leftColStrings{i});
-        for j = 1:nCols
-            fprintf([' ' dataFormat ' |'], colWidth, data{i,j});
-        end
-        fprintf('\n');
-    end
-
-    fprintf('\n');
-
-end
\ No newline at end of file
diff -r 68178e013868 -r 3c062cc72986 toString.m
--- a/toString.m	Tue Aug 01 12:22:59 2017 +0200
+++ b/toString.m	Tue Aug 01 12:35:38 2017 +0200
@@ -51,6 +51,14 @@
 end
 
 function str = struct2string(s)
+    if isscalar(s)
+        str = structScalar2string(s);
+    else
+        str = structArray2string(s);
+    end
+end
+
+function str = structScalar2string(s)
     fn = fieldnames(s);
 
     if length(fn) == 0
@@ -68,3 +76,32 @@
     str = [str sprintf('%s: %s}',fn{end}, value2string(value))];
 end
 
+function str = structArray2string(s)
+    fn = fieldnames(s);
+
+    if length(fn) == 0
+        str = '{}';
+        return
+    end
+
+    stringArray = cell(length(s)+1, length(fn)+1);
+
+    stringArray(1,2:end) = fn;
+
+    for i = 1:length(s)
+        stringArray{i+1,1} = i;
+        for j = 1:length(fn)
+            valueStr = value2string(s(i).(fn{j}));
+            stringArray{i+1,j+1} = valueStr;
+        end
+    end
+
+    tt = TextTable(stringArray);
+    tt.fmtArray(2:end, 1) = {'%d'};
+    tt.vertDiv = [1];
+    tt.horzDiv = [1];
+    str = tt.toString();
+end
+
+
+