-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkText.m
More file actions
246 lines (243 loc) · 9.5 KB
/
kText.m
File metadata and controls
246 lines (243 loc) · 9.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
%kText 'Text Object Menuform'
% This MatLab function was automatically generated by a converter (KhorosToMatLab) from the Khoros Text.pane file
%
% Parameters:
% Integer: textLeftMargin 'Left Margin ', default: 0: 'left margin'
% Integer: TextLabel.labelCursorPos 'Insert Position', default: 0: 'cursor insert position'
% InputFile: textFilename 'Text File', required: 'text file'
% String: textString 'Text String', default: ' ': 'string'
%
% Example: kText(textFilename, {'textLeftMargin',0;'TextLabel.labelCursorPos',0;'textFilename','';'textString',' '})
%
% Khoros helpfile follows below:
%
% .begin tagged
%
% .item "The Text GUI Object"
% The Khoros text object may be single-line or multi-line. It may display
% read-only text, or allow the editing of read-write text. The source for default
% text may be specified directly from within the application (hard-coded) or may
% be contained in a file. The text object supports normal cut and paste
% operations. It offers a number of key bindings. Word and line wrapping are
% also supported.
%
%
% .item "Text Edit Type"
% Text objects may display text that is read only or read/write.
% Regardless of whether the text is read only or read/write,
% a cursor will appear. This is so that the user may use the text object's key
% bindings to scroll through text that may not all fit within the text window,
% since automatic addition of vertical and horizontal scrollbars to the text
% object is not yet supported. Any attempt to edit text in a read-only text
% object will ring the bell.
%
% .item "Text Wrap Type"
% When the text lines of a multi-line text object exceed the width of the text
% window, text wrapping may be done. Text wrapping dictates that text lines
% are to be automatically broken in an attempt to get all lines within the width
% of the text window. Since single-line text objects only allow a single line
% of text, text wrapping applies to multi-line text objects only. For multi-line
% text, the text object supports three wrapping modes:
% .begin tagged
% .item "No Wrap"
% No text wrapping is done
% .item "Word Wrap"
% The text object will wrap the text at the last word that will fit within the
% width of the text window. If a single word is wider than the text object,
% that word will still extend past the right hand side of the window; the user
% will be required to use key bindings to see the end of the word.
% .item "Wrap Line"
% The text object will wrap text at the last character that will fit within
% the width of the text window.
% .end tagged
%
% .item "Left Margin"
% Number of pixels that are to make up the left margin of the text window.
%
% .item "Multiline Text"
%
% Text objects may be used to edit and/or display a single line of text or
% multiple lines of text. Functionality of multi-line text objects is the same
% as that of single-line text objects, except for the following:
% .begin itemize
% .item
% If text containing a line feed is pasted to a multi-line text object,
% the line feed is retained; however, in a single-line text object,
% a line feed is replaced with a space (both types of text objects replace
% unprintable characters with a space).
% .item
% With a single-line text widget, the application may install a callback that
% will be fired when the user enters <return>. By definition, no such callback
% may be installed on a multi-line text widget, as <return> in the text of a
% multi-line text widget must be used to indicate line feed.
% .item
% Multi-line text objects may be of any height; single-line text objects will
% always be 1 character in height.
% .item
% Multi-line text objects may do text wrapping if directed to do so by the
% application; by definition, single-line text objects do not allow text wrapping.
% .end itemize
%
% .item "Insert Position"
% This integer specifies the location of the cursor, in characters. For example,
% if the insert position is 50, that implies that the cursor is at character 50
% of the text.
%
% .item "Text File"
% File containing the text to be displayed by the text widget.
% Note that this is mutually
% exclusive with 'Text String'; use one or the other, not both.
%
% .item "Text String"
% The string to be displayed by the text widget. Note that this is mutually
% exclusive with 'Text File'; use one or the other, not both.
%
% .end tagged
function varargout = kText(varargin)
if nargin ==0
Inputs={};arglist={'',''};
elseif nargin ==1
Inputs=varargin{1};arglist={'',''};
elseif nargin ==2
Inputs=varargin{1}; arglist=varargin{2};
else error('Usage: [out1,..] = kText(Inputs,arglist).');
end
if size(arglist,2)~=2
error('arglist must be of form {''ParameterTag1'',value1;''ParameterTag2'',value2}')
end
narglist={'textLeftMargin', 0;'TextLabel.labelCursorPos', 0;'textFilename', '__input';'textString', ' '};
maxval={1,1,0,0};
minval={1,1,0,0};
istoggle=[0,0,0,0];
was_set=istoggle * 0;
paramtype={'Integer','Integer','InputFile','String'};
% identify the input arrays and assign them to the arguments as stated by the user
if ~iscell(Inputs)
Inputs = {Inputs};
end
NumReqOutputs=0; nextinput=1; nextoutput=1;
for ii=1:size(arglist,1)
wasmatched=0;
for jj=1:size(narglist,1)
if strcmp(arglist{ii,1},narglist{jj,1}) % a given argument was matched to the possible arguments
wasmatched = 1;
was_set(jj) = 1;
if strcmp(narglist{jj,2}, '__input')
if (nextinput > length(Inputs))
error(['Input ' narglist{jj,1} ' has no corresponding input!']);
end
narglist{jj,2} = 'OK_in';
nextinput = nextinput + 1;
elseif strcmp(narglist{jj,2}, '__output')
if (nextoutput > nargout)
error(['Output nr. ' narglist{jj,1} ' is not present in the assignment list of outputs !']);
end
if (isempty(arglist{ii,2}))
narglist{jj,2} = 'OK_out';
else
narglist{jj,2} = arglist{ii,2};
end
nextoutput = nextoutput + 1;
if (minval{jj} == 0)
NumReqOutputs = NumReqOutputs - 1;
end
elseif isstr(arglist{ii,2})
narglist{jj,2} = arglist{ii,2};
else
if strcmp(paramtype{jj}, 'Integer') & (round(arglist{ii,2}) ~= arglist{ii,2})
error(['Argument ' arglist{ii,1} ' is of integer type but non-integer number ' arglist{ii,2} ' was supplied']);
end
if (minval{jj} ~= 0 | maxval{jj} ~= 0)
if (minval{jj} == 1 & maxval{jj} == 1 & arglist{ii,2} < 0)
error(['Argument ' arglist{ii,1} ' must be bigger or equal to zero!']);
elseif (minval{jj} == -1 & maxval{jj} == -1 & arglist{ii,2} > 0)
error(['Argument ' arglist{ii,1} ' must be smaller or equal to zero!']);
elseif (minval{jj} == 2 & maxval{jj} == 2 & arglist{ii,2} <= 0)
error(['Argument ' arglist{ii,1} ' must be bigger than zero!']);
elseif (minval{jj} == -2 & maxval{jj} == -2 & arglist{ii,2} >= 0)
error(['Argument ' arglist{ii,1} ' must be smaller than zero!']);
elseif (minval{jj} ~= maxval{jj} & arglist{ii,2} < minval{jj})
error(['Argument ' arglist{ii,1} ' must be bigger than ' num2str(minval{jj})]);
elseif (minval{jj} ~= maxval{jj} & arglist{ii,2} > maxval{jj})
error(['Argument ' arglist{ii,1} ' must be smaller than ' num2str(maxval{jj})]);
end
end
end
if ~strcmp(narglist{jj,2},'OK_out') & ~strcmp(narglist{jj,2},'OK_in')
narglist{jj,2} = arglist{ii,2};
end
end
end
if (wasmatched == 0 & ~strcmp(arglist{ii,1},''))
error(['Argument ' arglist{ii,1} ' is not a valid argument for this function']);
end
end
% match the remaining inputs/outputs to the unused arguments and test for missing required inputs
for jj=1:size(narglist,1)
if strcmp(paramtype{jj}, 'Toggle')
if (narglist{jj,2} ==0)
narglist{jj,1} = '';
end;
narglist{jj,2} = '';
end;
if ~strcmp(narglist{jj,2},'__input') && ~strcmp(narglist{jj,2},'__output') && istoggle(jj) && ~ was_set(jj)
narglist{jj,1} = '';
narglist{jj,2} = '';
end;
if strcmp(narglist{jj,2}, '__input')
if (minval{jj} == 0) % meaning this input is required
if (nextinput > size(Inputs))
error(['Required input ' narglist{jj,1} ' has no corresponding input in the list!']);
else
narglist{jj,2} = 'OK_in';
nextinput = nextinput + 1;
end
else % this is an optional input
if (nextinput <= length(Inputs))
narglist{jj,2} = 'OK_in';
nextinput = nextinput + 1;
else
narglist{jj,1} = '';
narglist{jj,2} = '';
end;
end;
else
if strcmp(narglist{jj,2}, '__output')
if (minval{jj} == 0) % this is a required output
if (nextoutput > nargout & nargout > 1)
error(['Required output ' narglist{jj,1} ' is not stated in the assignment list!']);
else
narglist{jj,2} = 'OK_out';
nextoutput = nextoutput + 1;
NumReqOutputs = NumReqOutputs-1;
end
else % this is an optional output
if (nargout - nextoutput >= NumReqOutputs)
narglist{jj,2} = 'OK_out';
nextoutput = nextoutput + 1;
else
narglist{jj,1} = '';
narglist{jj,2} = '';
end;
end
end
end
end
if nargout
varargout = cell(1,nargout);
else
varargout = cell(0);
end
if ispc
w='"C:\Program Files\dip\khorosBin\';
else
[s,w] = system('which cantata');
w=['"' w(1:end-8)];
end
global KhorosRoot
if exist('KhorosRoot')
if ~isempty(KhorosRoot)
w=['"' KhorosRoot];
end
end
callKhoros([w 'Text" '],Inputs,narglist);