linux: shared memory interface - link with librt
[supercollider.git] / HelpSource / Classes / Document.schelp
blobf6414d386688143a4d7057767f31eeab0f4b9a51
1 class:: Document
2 redirect:: implementationClass
3 summary:: An abstract class for editor-specific text document editing classes
4 categories:: GUI
5 related:: Classes/CocoaDocument, Classes/EmacsDocument, Classes/ScelDocument
7 description::
8 The Document class represents a text document within the context of your text editing environment. You can use the class to programmatically create, modify, and query these documents. While it is an abstract class, you still use it to create a code::new:: Document. It simply passes on code::new:: to the appropriate document implementation, e.g. link::Classes/CocoaDocument::.
10 subsection:: Some Important Issues Regarding Document
12 Different text-editing environments can be used with SuperCollider. Therefore Document is an abstract class, meaning it doesn't provide all the functionality itself, but relies on subclasses to complete the functionality. Calls to code::Document.new:: or code::Document.open:: are actually passed down to the relevant class for the editor you're using, such as link::Classes/CocoaDocument:: (for most Mac users) or link::Classes/ScelDocument:: (containing an link::Classes/EmacsDocument::).
14 subsection:: Setting the Environment
16 By default code::envir:: it is set to the current link::Classes/Environment::. However, you can make it use its own link::Classes/Environment:: also. Thus, e.g., if you were to set the link::Classes/Environment:: variable code::~myVar = 12:: in the current link::Classes/Environment::, you can create a new Document window in which that link::Classes/Environment:: variable is not set.
21 classmethods::
23 private:: prGetLast, prSetSyntaxColorTheme, prnumberOfOpen, prBasicNew, prGetIndexOfListener, prDefaultUsesAutoInOutdent, initClass
25 method:: new
26 argument:: title
27 An instance of link::Classes/String:: or link::Classes/Symbol::.
28 argument:: string
29 An instance of link::Classes/String::. The contents of the document.
30 argument:: makeListener
31 Makes this document the listener, i.e. the place where SC-lang posts messages.
32 argument:: envir
33 An instance of link::Classes/Environment::. The link::Classes/Environment:: to be used by the interpreter of the document window. By defualt, it is set to the current link::Classes/Environment::.
34 discussion::
35 code::
36 Document.new("this is the title", "this is the text");
40 method:: open
41 Open a document from a path.
42 argument:: path
43 The file system path to the document. An instance of link::Classes/String::.
44 argument:: selectionStart
45 The beginning of the cursor selection of the file content.
46 argument:: selectionLength
47 The length of the cursor selection of the file content.
48 argument:: envir
49 An instance of link::Classes/Environment::. The Environment to be used by the interpreter of the document window. By defualt, it is set to the current link::Classes/Environment::.
50 discussion::
51 code::
52 Document.open("README", 292,253); // notice the selected text in the open document
55 method:: openDocuments
56 Returns an Array of all open documents.
57 code::
58 d = Document.openDocuments.do{ |doc| doc.name.postln };
61 method:: hasEditedDocuments
62 Returns true if there are edited Documents.
64 method:: closeAll
65 warning::
66 Closes all open Documents, whether edited or not.
68 argument:: leavePostWindowOpen
69 An instance of link::Classes/Boolean::.
71 method:: closeAllUnedited
72 Closes all unedited Documents.
73 argument:: leavePostWindowOpen
74 An instance of link::Classes/Boolean::.
76 method:: current
77 Gets/sets the current Document.
78 argument:: value
79 A Document.
80 discussion::
81 code::
82 Document.current.name.postln; // Prints "Document.html"
86 method:: listener
87 Returns the current Document which is the listener, i.e. the Document where interpreter messages are posted.
89 method:: allDocuments
90 Returns all documents.
92 method:: globalKeyDownAction
93 Get/set A global action to be performed when a key is pressed.
94 argument:: value
95 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
97 method:: globalKeyUpAction
98 Get/set A global action to be performed when a key is released.
99 argument:: value
100 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
102 method:: initAction
103 Get/set A an action to be performed up opening or creating a Document.
104 argument:: value
105 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
107 method:: autoRun
108 If a document begins with the link::Classes/String::, code::"/*RUN*/"::, then the code following it int he file will be exectued on opening the file, if autorun is set to true.
109 argument:: value
110 An instance of link::Classes/Boolean::. Default value is code::true::.
112 method:: wikiBrowse
113 If set to code::true::, underlining text will create a wiki link.
114 argument:: value
115 An instance of link::Classes/Boolean::. Default value is code::true::.
117 method:: implementationClass
118 The editor implementation specific class which will handle Documents.
119 argument:: value
120 A class for implementing Document, e.g. link::Classes/CocoaDocument::.
122 method:: postColor
123 Get / set the listeners pen color.
124 argument:: color
125 An instance of link::Classes/Color::.
126 discussion::
127 code::
128 Document.postColor; // returns current post color
129 Document.postColor_(Color.red);
130 Document.postColor_(Color.green);
131 Document.postColor_(Color.blue);
132 Document.postColor_(Color.black);
134 r = Routine({
135         10.do({
136                 Document.postColor_(Color.rand);
137                 "There is no blue without yellow and without orange.".postln;
138                 0.5.rand.yield;
139         });
140         Document.postColor_(Color.black);
144 r.play;
145 r.stop;
149 method:: setTheme
150 Sets the theme for syntax colorization.
151 argument:: themeName
152 A link::Classes/Symbol::, defining the name of the theme that you've put into code::Document.themes::.
153 discussion::
154 The Document class has a preset theme called code::'default'::, which is set as follows (default SC colors):
155 code::
156 themes = (
157         default: (
158                 classColor: Color(0, 0, 0.75, 1),
159                 textColor: Color(0, 0, 0, 1),
160                 stringColor: Color(0.375, 0.375, 0.375, 1),
161                 commentColor: Color(0.75, 0, 0, 1),
162                 symbolColor: Color(0, 0.45, 0, 1),
163                 numberColor: Color(0, 0, 0, 1)
164         )
167 If you want to have your own themes for syntax colorization, you need to put your color set into code::Document.themes:: first (preferably in startup.rtf file) and call code::setTheme:: by giving it the name of the theme you've added to "themes" earlier:
168 code::
169 //putting a custom color theme into Document.themes
170 Document.themes.put
171 (\myTheme,
172         (
173                 classColor: Color.new255(53, 74, 187),
174                 textColor: Color.new255(0, 0, 0),
175                 stringColor: Color.new255(96, 129, 158),
176                 commentColor: Color.new255(206, 27, 28),
177                 symbolColor: Color.new255(57, 154, 20),
178                 numberColor: Color.new255(157, 80, 65)
179         )
182 //and then calling setTheme with the name:
183 Document.setTheme('myTheme');
184 //to see the current theme:
185 Document.theme;
187 You can switch to the default theme anytime by calling:
188 code::
189 Document.setTheme('default');
191 Next time you invoke syntaxColorize, the color theme set by setTheme will be used for syntax colorization. If you want to change the background color for the document window and selected text, in order to make them fit with your syntax colorization theme, see the help for the link::Classes/Document#background:: and link::Classes/Document#selectedBackground:: methods for Document.
195 subsection:: Path Utilities
197 Utilities and settings for dealing with documents such as super collider code files. By default the document directory is SuperCollider's application directory.
199 method:: dir
200 Get/set the default document directory. The default is dependent on link::Classes/Document#implementationClass::.
201 argument:: path
202 The file system path to the directory. An instance of link::Classes/String::.
203 discussion::
204 In Main-startUp you can set this to a more practical directory:
205 code::
206 Document.dir = "~/Documents/SuperCollider";
210 method:: wikiDir
211 Get/set the default wiki directory. The default is dependent on link::Classes/Document#implementationClass::.
212 argument:: path
213 The file system path to the directory. An instance of link::Classes/String::.
215 method:: standardizePath
216 argument:: p
217 The file system path to the directory. An instance of link::Classes/String::.
218 discussion::
219 If it is a relative path, expand it to an absolute path relative to your document directory. Expand tildes in path (your home directory), resolve symbolic links (but not aliases). Also converts from OS9 macintosh path format. See PathName for more complex needs.
220 code::
221 Document.standardizePath("~/"); // This will print your home directory
223 Document.standardizePath(":Patches:newfoots:fastRuckAndTuck");
224 // Returns: /Volumes/Macintosh HD/Users/cruxxial/Documents/SC3docs/Patches/newfoots/fastRuckAndTuck
226 Document.standardizePath("~/Documents/SC3docs/Patches/newfoots/fastRuckAndTuck");
227 // Returns: Patches/newfoots/fastRuckAndTuck
229 Document.standardizePath("Patches/newfoots/fastRuckAndTuck")
230 // Returns: Patches/newfoots/fastRuckAndTuck
233 method:: abrevPath
234 Returns a path relative to Document.dir, if the path is inside Document.dir.
235 argument:: path
236 The file system path to the directory. An instance of link::Classes/String::.
241 instancemethods::
243 private:: prGetBackgroundColor, prGetBounds, prIsEditable, propen, prGetTitle, prinitByString, prGetLastIndex, prSetBackgroundColor, prSetFileName, prUsesAutoInOutdent, prclose, prGetSelectedBackgroundColor, prGetFileName, prSetSelectedBackgroundColor, prSelectLine, prinitByIndex, prAdd, prSetBounds, prinsertText, prSetTitle, initFromPath, initByString
245 subsection:: General Document Properties
247 method:: bounds
248 Get/set the bounds of the document.
249 argument:: argBounds
250 An instance of link::Classes/Rect::.
252 method:: path
253 Get / set the the Document's path.
254 argument:: apath
255 An instance of link::Classes/String::. A files system path.
256 discussion::
257 code::
258 Document.current.path.postln;
261 method:: dir
262 Returns the directory of a Document.
263 discussion::
264 code::
265 Document.current.dir.postln;
268 method:: ==
269 A binary operator.
270 argument:: doc
271 An instance of Document.
272 discussion::
273 code::
274 Document.current == Document.listener; // presumaably returns false
277 method:: editable
278 Get / set the the document is editable.
279 argument:: abool
280 An instance of link::Classes/Boolean::.
282 method:: name
283 Get / set the title (same as link::Classes/Document#title::).
284 argument:: aname
285 An instance of link::Classes/String::.
286 discussion::
287 code::
288 Document.current.name.postln;
292 method:: title
293 Get / set the title (same as link::Classes/Document#name::).
294 argument:: argName
295 An instance of link::Classes/String::.
297 method:: background
298 Get / set the the Document's background color.
299 argument:: color
300 An instance of link::Classes/Color::.
301 discussion::
302 code::
304 a = Document("background", "'hardly see anything");
305 a.background_(Color.blue(alpha:0.8)); // notice that alpha controls the window transparency
310 method:: alwaysOnTop
311 Get/set whether a document is always on top.
312 argument:: boolean
313 An instance of link::Classes/Boolean::.
315 method:: promptToSave
316 Get/set whether a document is prompts to save if it has been changed. Use this with caution.
317 argument:: bool
318 An instance of link::Classes/Boolean::.
320 method:: closed
321 Returns code::true:: if the document has been closed.
323 method:: isEdited
324 Returns code::true:: if the document has been edited.
325 code::
326 Document.current.isEdited.postln;
329 method:: isFront
330 Returns code::true:: if the document is in front.
332 method:: isListener
333 Returns if the document is the listener.
335 method:: didBecomeKey
336 Saves the current link::Classes/Environment::, makes the document current, and performs its link::Classes/Document#toFrontAction::.
338 method:: didResignKey
339 Performs the Document's link::Classes/Document#endFrontAction:: and restores the current link::Classes/Environment::.
343 subsection:: Controlling Document
345 method:: close
346 Close a document.
347 code::
349 Task({
350         var doc;
351         doc = Document("background", "closing in 2 seconds");
352         doc.stringColor_(Color.blue);
353         1.wait;
354         doc.background_(Color.blue(alpha:0.8));
355         1.wait;
356         doc.close;
357 }).play(AppClock);
361 method:: front
362 Bring a document to the front.
363 code::
364 Document.listener.front;
367 method:: unfocusedFront
368 Bring a document to the front without focusing it.
369 code::
370 Document.listener.unfocusedFront;
373 method:: onClose
374 Get/set the action to be performed on closing the document.
375 argument:: value
376 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
378 method:: endFrontAction
379 Get/set the action to be performed when the document becomes no longer the front document.
380 argument:: value
381 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
383 method:: toFrontAction
384 Get / set the action to be performed when the document become the front document.
385 argument:: value
386 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
388 method:: mouseDownAction
389 Get/set the action to be performed on link::Classes/Document#mouseDown::.
390 note::
391 The Mac OSX built-in editor does not supports this feature. A mouseDownAction that you supply will be ignored.
393 argument:: value
394 An instance of link::Classes/Function:: or link::Classes/FunctionList::. The arguments passed to the function are: code::x::, code::y::, code::modifiers::, code::buttonNumber::, code::clickCount::, code::clickPos::.
397 method:: mouseUpAction
398 Get/set the action to be performed on link::Classes/Document#mouseUp::.
399 argument:: value
400 An instance of link::Classes/Function:: or link::Classes/FunctionList::. The arguments passed to the function are: code::x::, code::y::, code::modifiers::, code::buttonNumber::, code::clickCount::, code::clickPos::.
401 discussion::
402 code::
405 //add a mouse action to this document:
406 //example: easy button:
407 //when you click in front of a 17 a SinOsc will start up;
408 s.waitForBoot({
409         Document.current.mouseUpAction_({arg doc;
410                 var char;
411                 char = doc.rangeText(doc.selectionStart, 2);
412                 if(char == "17",{
413                         {EnvGen.kr(Env.perc, doneAction:2) * SinOsc.ar([600,720,300].choose, 0, 0.5)}.play;
414                 });
415                 if(char == "23",{
416                         {EnvGen.kr(Env.perc, doneAction:2) * PinkNoise.ar(0.2)}.play;
417                 });
418         })
422 Test here and click in front of the numbers: 17 and 23.
423 code::
424 Document.current.mouseUpAction = nil; // clear mouseUpActiont
429 method:: keyDownAction
430 Get/set the action to be performed on link::Classes/Document#keyDown::.
431 argument:: value
432 An instance of link::Classes/Function:: or link::Classes/FunctionList::. The arguments passed to the function are: code::char::, code::modifiers::, code::unicode::, code::keycode::.
433 discussion::
434 code::
435 Document.current.keyDownAction = { arg ...args; args.postln };
436 // now type some text
437 Document.current.keyDownAction = nil;
441 method:: keyUpAction
442 Get/set the action to be performed on link::Classes/Document#keyUp::.
443 argument:: value
444 An instance of link::Classes/Function:: or link::Classes/FunctionList::. The arguments passed to the function are: code::char::, code::modifiers::, code::unicode::, code::keycode::.
445 code::
446 Document.current.keyUpAction = { arg ...args; args.postln };
447 // now type some text
448 Document.current.keyUpAction = nil;
452 method:: makeWikiPage
453 Creates a wiki page.
454 argument:: wikiWord
455 An instance of link::Classes/String::. The name of the document.
456 argument:: extension
457 An instance of link::Classes/String::. The file extension.
458 argument:: directory
459 An instance of link::Classes/String::. The directory in which to save the page.
460 discussion::
461 code::
462 Document.current.makeWikiPage("test1");
466 method:: openWikiPage
467 Opens/creates a wiki page out of the currently selected text.
471 subsection:: Editing Content
473 method:: selectLine
474 Select a line of the document by number.
475 argument:: line
476 An link::Classes/Integer::.
477 discussion::
478 code::
479 Document.current.selectLine(390);
483 method:: selectRange
484 Select a text range in the string of the document.
485 argument:: start
486 The start index.
487 argument:: length
488 The length of the selection.
489 discussion::
490 code::
492 Document.current.selectRange(Document.current.selectedRangeLocation + 3, 150);
497 method:: balanceParens
498 Starting from the current selection, increase the selection until matching parentheses are selected.
499 argument:: level
500 Do this as many times to find ever wider brackets. Set to code::inf:: for outmost.
501 discussion::
502 code::
503 ((((
504 Document.current.balanceParens(1);
505 Document.current.balanceParens(3);
506 Document.current.balanceParens(inf);
507 ))))
510 method:: selectionStart
511 Returns the start of a current selection.
512 code::
513 Document.current.selectionStart.postln;
516 method:: selectionSize
517 Returns the size of a current selection.
518 code::
520 var doc;
521 doc = Document.current;
522 doc.selectRange(doc.selectionStart - 40, 10);
523 doc.selectionSize.postln;
528 method:: selectedString
529 Gets/sets the selected string.
530 argument:: txt
531 An instance of link::Classes/String::.
532 discussion::
533 code::
535 var doc;
536 doc = Document.current;
537 doc.selectRange(doc.selectionStart - 40, 10);
538 doc.selectedString.postln;
543 method:: currentLine
544 Returns the current line as a link::Classes/String::.
545 code::
547 var doc;
548 doc = Document.current;
549 doc.selectRange(doc.selectionStart - 40, 10);
550 doc.currentLine.postln;
554 method:: getSelectedLines
555 Returns all full lines from before code::rangestart:: to after code::rangestart + rangesize:: as a link::Classes/String::.
556 argument:: rangestart
557 argument:: rangesize
558 discussion::
559 code::
561 var doc;
562 doc = Document.current;
563 doc.selectRange(doc.selectionStart - 40, 10);
564 doc.getSelectedLines(doc.selectionStart - 40, 130).postln;
570 method:: string
571 Gets or sets the string within a certain range.
572 argument:: rangestart
573 argument:: rangesize
575 Sets the string within a certain range.
576 argument:: string
577 argument:: rangestart
578 An link::Classes/Integer::. Default value is code::nil::.
579 argument:: rangesize
580 An link::Classes/Integer::. Default value is 1.
581 discussion::
582 code::
583 // Select the following code in parentheses and execute it
585 Document.current.string_(": test test test test test ",
586         Document.current.selectedRangeLocation + 12,
587         18);
589 // Watch me change content
593 method:: font
594 Gets or sets the font within a certain range.
595 argument:: font
596 An instance of link::Classes/Font::.
597 argument:: rangestart
598 An link::Classes/Integer::. Default value is -1. If code::rangestart = -1::, the whole document is selected.
599 argument:: rangesize
600 An link::Classes/nteger::. Default value is 0.
601 discussion::
602 code::
603 // Select the following code in parentheses and execute it
605 Document.current.font_(Font("Impact", 14),
606         Document.current.selectedRangeLocation + 12,
607         18);
609 // Watch me change font
613 method:: stringColor
614 Gets or sets the string color of a specific range of already printed text. Default is the whole document. To set the listener text color for posting, see: link::Classes/Document#postColor::.
615 argument:: color
616 An instance of link::Classes/Color::.
617 argument:: rangeStart
618 An link::Classes/Integer::. Default is -1.
619 argument:: rangeSize
620 An link::Classes/Integer::. Default value is 0
621 discussion::
622 code::
623 // Select the following code in parentheses and execute it
625 Document.current.stringColor_(Color.rand(0.2, 0.8),
626         Document.current.selectedRangeLocation + 13,
627         16);
629 // Watch me change color
633 method:: selectedBackground
634 Gets or sets the document's background color for selected text. Applies to the whole document instance.
635 argument:: color
636 An instance of link::Classes/Color::.
637 discussion::
638 code::
639 Document.current.selectedBackground; // returns default color
641 w = Document.new("Test", "Here is a selected text...");
642 w.selectedBackground_(Color.new255(120, 180, 110));
643 w.selectRange(10, 13);
648 method:: syntaxColorize
649 Syntax colorize a document.
651 method:: underlineSelection
652 Underlines the current selection of a Document.
668 subsection:: Auto-Completion
670 note::
671 OSX version only, currently. See link::Reference/DocumentAutoCompletion::.
673 code::
674         *allowAutoComp
675         *autoCompAll
676         *autoComplete
677         *autoCompleteKeyAction
678         *openFileAutoComplete (path)
679         *openAutoComplete
680         autoComplete
685 subsection:: Subclassing and Internal Methods
687 The following methods are usually not used directly or are called by a primitive. Programmers can still call or override these as needed.
688 code::
689         *startup
690         *numberOfOpen
691         mouseUp (x, y, modifiers, buttonNumber, clickCount, clickPos)
692         keyDown (character, modifiers, unicode, keycode)
693         keyUp (character, modifiers, unicode, keycode)
694         getIdentifierCoordFromEnd (endPos)
695         dataptr
697         Private. Used only internally:
698         *newFromIndex (idx)
699         *prnumberOfOpen
700         *prGetLast
701         *prGetIndexOfListener
702         *prBasicNew
703         prAdd
704         prGetLastIndex
705         setFont (font, rangeStart, rangeSize)
706         setTextColor (color, rangeStart, rangeSize)
707         propen (path, selectionStart, selectionLength)
708         rangeText (rangestart, rangesize)
709         insertTextRange (string, rangestart, rangesize)
710         prinitByString (title, str, makeListener)
711         prSetBackgroundColor (color)
712         prGetBackgroundColor (color)
713         prSelectLine (line)
714         prIsEditable_ (editable)
715         prSetTitle (argName)
716         prGetTitle
717         prGetFileName
718         prSetFileName (apath)
719         prGetBounds (argBounds)
720         prSetBounds (argBounds)
721         prclose
722         prinsertText (dataPtr, txt)
723         prinitByIndex (idx)
724         envir
725         envir_ (ev)
726         text
727         removeUndo
728         selectedText
729         selectUnderlinedText (clickPos)
730         linkAtClickPos (clickPos)
731         selectedRangeLocation
732         selectedRangeSize
733         restoreCurrentEnvironment
734         saveCurrentEnvironment
735         initByIndex (idx)
736         initLast
737         initFromPath (path, selectionStart, selectionLength)
738         initByString (argTitle, str, makeListener)
745 examples::
747 code::
748 //unfocusedFront_
750 Document.allDocuments.at(0).unfocusedFront
755 var doc;
756 doc = Document("", "||");
757 doc.background_(Color.blue(alpha: 1.0.rand));
759 Task({
760         1000.do({
761                 doc.setFont(rangeSize: [7, 8, 9, 24].choose);
762                 0.08.wait;
763         })
764 }).play(AppClock);
766 Task({
767         100.do({
768                 1.01.wait;
769                 doc.stringColor_([Color.red(alpha: 1.0.rand), Color.green(alpha: 1.0.rand)].choose);
770         })
771 }).play(AppClock);
773 Task({
774         100.do({
775                 1.01.wait;
776                 doc.selectedString_(["\"\n#", "||", "-", "--"].choose);
777         })
778 }).play(AppClock);
780 Task({
781         var co, mul;
782         co = 0.1;
783         mul = 1.02;
784         100.do({
785                 0.16.wait;
786                 co = co * mul;
787                 if(co > 0.99, { co = 0.1 });
788                 doc.background_(Color.blue(alpha: co));
789         });
790         doc.close;
791 }).play(AppClock)
795 A simple implementation of TBT (time based text) http://tbt.dyne.org/?info=download
796 code::
797 // record: type some text
799 var time = Main.elapsedTime;
800 a = List.new;
801 r = Routine { |char|
802 loop {
803         a = a.add([char, Main.elapsedTime - time]);
804         char = 0.yield;
808 Document.new("type some text")
809         .bounds_(Rect(100,SCWindow.screenBounds.height - 250, 400, 200))
810         .keyDownAction = { |doc, key| r.value(key) ; time = Main.elapsedTime};
813 // play back text in time
815 d = Document.new("type some text")
816         .bounds_(Rect(550,SCWindow.screenBounds.height-250,400,200));
817 fork({
818         a.do { |pair|
819                 d.string = d.string ++ pair[0];
820                 pair[1].wait;
821         }
822 }, AppClock)