scide: implement selectionLength for openDocument
[supercollider.git] / HelpSource / Classes / Document.schelp
blob0314e2828041d67171f913dc34f063bef99b25e9
1 class:: Document
2 redirect:: implementationClass
3 summary:: An abstract class for editor-specific text document editing classes
4 categories:: Frontends
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");
39 method:: open
40 Open a document from a path.
41 argument:: path
42 The file system path to the document. An instance of link::Classes/String::.
43 argument:: selectionStart
44 The beginning of the cursor selection of the file content.
45 argument:: selectionLength
46 The length of the cursor selection of the file content.
47 argument:: envir
48 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::.
49 discussion::
50 code::
51 Document.open("README", 292,253); // notice the selected text in the open document
54 method:: openDocuments
55 Returns an Array of all open documents.
56 code::
57 d = Document.openDocuments.do{ |doc| doc.name.postln };
60 method:: hasEditedDocuments
61 Returns true if there are edited Documents.
63 method:: closeAll
64 warning::
65 Closes all open Documents, whether edited or not.
67 argument:: leavePostWindowOpen
68 An instance of link::Classes/Boolean::.
70 method:: closeAllUnedited
71 Closes all unedited Documents.
72 argument:: leavePostWindowOpen
73 An instance of link::Classes/Boolean::.
75 method:: current
76 Gets/sets the current Document.
77 argument:: value
78 A Document.
79 discussion::
80 code::
81 Document.current.name.postln; // Prints "Document.html"
84 method:: listener
85 Returns the current Document which is the listener, i.e. the Document where interpreter messages are posted.
87 method:: allDocuments
88 Returns all documents.
90 method:: globalKeyDownAction
91 Get/set A global action to be performed when a key is pressed.
92 argument:: value
93 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
95 method:: globalKeyUpAction
96 Get/set A global action to be performed when a key is released.
97 argument:: value
98 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
100 method:: initAction
101 Get/set A an action to be performed up opening or creating a Document.
102 argument:: value
103 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
105 method:: autoRun
106 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.
107 argument:: value
108 An instance of link::Classes/Boolean::. Default value is code::true::.
110 method:: wikiBrowse
111 If set to code::true::, underlining text will create a wiki link.
112 argument:: value
113 An instance of link::Classes/Boolean::. Default value is code::true::.
115 method:: implementationClass
116 The editor implementation specific class which will handle Documents.
117 argument:: value
118 A class for implementing Document, e.g. link::Classes/CocoaDocument::.
120 method:: postColor
121 Get / set the listeners pen color.
122 argument:: col
123 An instance of link::Classes/Color::.
124 discussion::
125 code::
126 Document.postColor; // returns current post color
127 Document.postColor_(Color.red);
128 Document.postColor_(Color.green);
129 Document.postColor_(Color.blue);
130 Document.postColor_(Color.black);
132 r = Routine({
133         10.do({
134                 Document.postColor_(Color.rand);
135                 "There is no blue without yellow and without orange.".postln;
136                 0.5.rand.yield;
137         });
138         Document.postColor_(Color.black);
142 r.play;
143 r.stop;
146 method:: setTheme
147 Sets the theme for syntax colorization.
148 argument:: themeName
149 A link::Classes/Symbol::, defining the name of the theme that you've put into code::Document.themes::.
150 discussion::
151 The Document class has a preset theme called code::'default'::, which is set as follows (default SC colors):
152 code::
153 themes = (
154         default: (
155                 classColor: Color(0, 0, 0.75, 1),
156                 textColor: Color(0, 0, 0, 1),
157                 stringColor: Color(0.375, 0.375, 0.375, 1),
158                 commentColor: Color(0.75, 0, 0, 1),
159                 symbolColor: Color(0, 0.45, 0, 1),
160                 numberColor: Color(0, 0, 0, 1)
161         )
164 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:
165 code::
166 //putting a custom color theme into Document.themes
167 Document.themes.put
168 (\myTheme,
169         (
170                 classColor: Color.new255(53, 74, 187),
171                 textColor: Color.new255(0, 0, 0),
172                 stringColor: Color.new255(96, 129, 158),
173                 commentColor: Color.new255(206, 27, 28),
174                 symbolColor: Color.new255(57, 154, 20),
175                 numberColor: Color.new255(157, 80, 65)
176         )
179 //and then calling setTheme with the name:
180 Document.setTheme('myTheme');
181 //to see the current theme:
182 Document.theme;
184 You can switch to the default theme anytime by calling:
185 code::
186 Document.setTheme('default');
188 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.
190 subsection:: Path Utilities
192 Utilities and settings for dealing with documents such as super collider code files. By default the document directory is SuperCollider's application directory.
194 method:: dir
195 Get/set the default document directory. The default is dependent on link::Classes/Document#implementationClass::.
196 argument:: path
197 The file system path to the directory. An instance of link::Classes/String::.
198 discussion::
199 In Main-startUp you can set this to a more practical directory:
200 code::
201 Document.dir = "~/Documents/SuperCollider";
204 method:: wikiDir
205 Get/set the default wiki directory. The default is dependent on link::Classes/Document#implementationClass::.
206 argument:: path
207 The file system path to the directory. An instance of link::Classes/String::.
209 method:: standardizePath
210 argument:: p
211 The file system path to the directory. An instance of link::Classes/String::.
212 discussion::
213 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.
214 code::
215 Document.standardizePath("~/"); // This will print your home directory
217 Document.standardizePath(":Patches:newfoots:fastRuckAndTuck");
218 // Returns: /Volumes/Macintosh HD/Users/cruxxial/Documents/SC3docs/Patches/newfoots/fastRuckAndTuck
220 Document.standardizePath("~/Documents/SC3docs/Patches/newfoots/fastRuckAndTuck");
221 // Returns: Patches/newfoots/fastRuckAndTuck
223 Document.standardizePath("Patches/newfoots/fastRuckAndTuck")
224 // Returns: Patches/newfoots/fastRuckAndTuck
227 method:: abrevPath
228 Returns a path relative to Document.dir, if the path is inside Document.dir.
229 argument:: path
230 The file system path to the directory. An instance of link::Classes/String::.
235 instancemethods::
237 private:: prGetBackgroundColor, prGetBounds, prIsEditable, propen, prGetTitle, prinitByString, prGetLastIndex, prSetBackgroundColor, prSetFileName, prUsesAutoInOutdent, prclose, prGetSelectedBackgroundColor, prGetFileName, prSetSelectedBackgroundColor, prSelectLine, prinitByIndex, prAdd, prSetBounds, prinsertText, prSetTitle, initFromPath, initByString
239 subsection:: General Document Properties
241 method:: bounds
242 Get/set the bounds of the document.
243 argument:: argBounds
244 An instance of link::Classes/Rect::.
246 method:: path
247 Get / set the the Document's path.
248 argument:: apath
249 An instance of link::Classes/String::. A files system path.
250 discussion::
251 code::
252 Document.current.path.postln;
255 method:: dir
256 Returns the directory of a Document.
257 discussion::
258 code::
259 Document.current.dir.postln;
262 method:: ==
263 A binary operator.
264 argument:: doc
265 An instance of Document.
266 discussion::
267 code::
268 Document.current == Document.listener; // presumaably returns false
271 method:: editable
272 Get / set the the document is editable.
273 argument:: abool
274 An instance of link::Classes/Boolean::.
276 method:: name
277 Get / set the title (same as link::Classes/Document#title::).
278 argument:: aname
279 An instance of link::Classes/String::.
280 discussion::
281 code::
282 Document.current.name.postln;
285 method:: title
286 Get / set the title (same as link::Classes/Document#name::).
287 argument:: argName
288 An instance of link::Classes/String::.
290 method:: background
291 Get / set the the Document's background color.
292 argument:: color
293 An instance of link::Classes/Color::.
294 discussion::
295 code::
297 a = Document("background", "'hardly see anything");
298 a.background_(Color.blue(alpha:0.8)); // notice that alpha controls the window transparency
302 method:: alwaysOnTop
303 Get/set whether a document is always on top.
304 argument:: boolean
305 An instance of link::Classes/Boolean::.
307 method:: promptToSave
308 Get/set whether a document is prompts to save if it has been changed. Use this with caution.
309 argument:: bool
310 An instance of link::Classes/Boolean::.
312 method:: closed
313 Returns code::true:: if the document has been closed.
315 method:: isEdited
316 Returns code::true:: if the document has been edited.
317 code::
318 Document.current.isEdited.postln;
321 method:: isFront
322 Returns code::true:: if the document is in front.
324 method:: isListener
325 Returns if the document is the listener.
327 method:: didBecomeKey
328 Saves the current link::Classes/Environment::, makes the document current, and performs its link::Classes/Document#toFrontAction::.
330 method:: didResignKey
331 Performs the Document's link::Classes/Document#endFrontAction:: and restores the current link::Classes/Environment::.
335 subsection:: Controlling Document
337 method:: close
338 Close a document.
339 code::
341 Task({
342         var doc;
343         doc = Document("background", "closing in 2 seconds");
344         doc.stringColor_(Color.blue);
345         1.wait;
346         doc.background_(Color.blue(alpha:0.8));
347         1.wait;
348         doc.close;
349 }).play(AppClock);
353 method:: front
354 Bring a document to the front.
355 code::
356 Document.listener.front;
359 method:: unfocusedFront
360 Bring a document to the front without focusing it.
361 code::
362 Document.listener.unfocusedFront;
365 method:: onClose
366 Get/set the action to be performed on closing the document.
367 argument:: value
368 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
370 method:: endFrontAction
371 Get/set the action to be performed when the document becomes no longer the front document.
372 argument:: value
373 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
375 method:: toFrontAction
376 Get / set the action to be performed when the document become the front document.
377 argument:: value
378 An instance of link::Classes/Function:: or link::Classes/FunctionList::.
380 method:: mouseDownAction
381 Get/set the action to be performed on link::Classes/Document#mouseDown::.
382 note::
383 The Mac OSX built-in editor does not supports this feature. A mouseDownAction that you supply will be ignored.
385 argument:: value
386 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::.
389 method:: mouseUpAction
390 Get/set the action to be performed on link::Classes/Document#mouseUp::.
391 argument:: value
392 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::.
393 discussion::
394 code::
397 //add a mouse action to this document:
398 //example: easy button:
399 //when you click in front of a 17 a SinOsc will start up;
400 s.waitForBoot({
401         Document.current.mouseUpAction_({arg doc;
402                 var char;
403                 char = doc.rangeText(doc.selectionStart, 2);
404                 if(char == "17",{
405                         {EnvGen.kr(Env.perc, doneAction:2) * SinOsc.ar([600,720,300].choose, 0, 0.5)}.play;
406                 });
407                 if(char == "23",{
408                         {EnvGen.kr(Env.perc, doneAction:2) * PinkNoise.ar(0.2)}.play;
409                 });
410         })
414 Test here and click in front of the numbers: 17 and 23.
415 code::
416 Document.current.mouseUpAction = nil; // clear mouseUpActiont
420 method:: keyDownAction
421 Get/set the action to be performed on link::Classes/Document#keyDown::.
422 argument:: value
423 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::.
424 discussion::
425 code::
426 Document.current.keyDownAction = { arg ...args; args.postln };
427 // now type some text
428 Document.current.keyDownAction = nil;
431 method:: keyUpAction
432 Get/set the action to be performed on link::Classes/Document#keyUp::.
433 argument:: value
434 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::.
435 code::
436 Document.current.keyUpAction = { arg ...args; args.postln };
437 // now type some text
438 Document.current.keyUpAction = nil;
441 method:: makeWikiPage
442 Creates a wiki page.
443 argument:: wikiWord
444 An instance of link::Classes/String::. The name of the document.
445 argument:: extension
446 An instance of link::Classes/String::. The file extension.
447 argument:: directory
448 An instance of link::Classes/String::. The directory in which to save the page.
449 discussion::
450 code::
451 Document.current.makeWikiPage("test1");
454 method:: openWikiPage
455 Opens/creates a wiki page out of the currently selected text.
459 subsection:: Editing Content
461 method:: selectLine
462 Select a line of the document by number.
463 argument:: line
464 An link::Classes/Integer::.
465 discussion::
466 code::
467 Document.current.selectLine(390);
470 method:: selectRange
471 Select a text range in the string of the document.
472 argument:: start
473 The start index.
474 argument:: length
475 The length of the selection.
476 discussion::
477 code::
479 Document.current.selectRange(Document.current.selectedRangeLocation + 3, 150);
483 method:: balanceParens
484 Starting from the current selection, increase the selection until matching parentheses are selected.
485 argument:: level
486 Do this as many times to find ever wider brackets. Set to code::inf:: for outmost.
487 discussion::
488 code::
489 ((((
490 Document.current.balanceParens(1);
491 Document.current.balanceParens(3);
492 Document.current.balanceParens(inf);
493 ))))
496 method:: selectionStart
497 Returns the start of a current selection.
498 code::
499 Document.current.selectionStart.postln;
502 method:: selectionSize
503 Returns the size of a current selection.
504 code::
506 var doc;
507 doc = Document.current;
508 doc.selectRange(doc.selectionStart - 40, 10);
509 doc.selectionSize.postln;
514 method:: selectedString
515 Gets/sets the selected string.
516 argument:: txt
517 An instance of link::Classes/String::.
518 discussion::
519 code::
521 var doc;
522 doc = Document.current;
523 doc.selectRange(doc.selectionStart - 40, 10);
524 doc.selectedString.postln;
528 method:: currentLine
529 Returns the current line as a link::Classes/String::.
530 code::
532 var doc;
533 doc = Document.current;
534 doc.selectRange(doc.selectionStart - 40, 10);
535 doc.currentLine.postln;
539 method:: getSelectedLines
540 Returns all full lines from before code::rangestart:: to after code::rangestart + rangesize:: as a link::Classes/String::.
541 discussion::
542 code::
544 var doc;
545 doc = Document.current;
546 doc.selectRange(doc.selectionStart - 40, 10);
547 doc.getSelectedLines(doc.selectionStart - 40, 130).postln;
552 method:: string
553 Gets or sets the string within a certain range.
554 argument:: string
555 A link::Classes/String::.
556 argument:: rangestart
557 An link::Classes/Integer::.
558 argument:: rangesize
559 An link::Classes/Integer::.
560 discussion::
561 code::
562 // Select the following code in parentheses and execute it
564 Document.current.string_(": test test test test test ",
565         Document.current.selectedRangeLocation + 12,
566         18);
568 // Watch me change content
571 method:: font
572 Gets or sets the font within a certain range.
573 argument:: font
574 An instance of link::Classes/Font::.
575 argument:: rangestart
576 An link::Classes/Integer::. Default value is -1. If code::rangestart = -1::, the whole document is selected.
577 argument:: rangesize
578 An link::Classes/Integer::. Default value is 0.
579 discussion::
580 code::
581 // Select the following code in parentheses and execute it
583 Document.current.font_(Font("Impact", 14),
584         Document.current.selectedRangeLocation + 12,
585         18);
587 // Watch me change font
590 method:: stringColor
591 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::.
592 argument:: color
593 An instance of link::Classes/Color::.
594 argument:: rangeStart
595 An link::Classes/Integer::. Default is -1.
596 argument:: rangeSize
597 An link::Classes/Integer::. Default value is 0
598 discussion::
599 code::
600 // Select the following code in parentheses and execute it
602 Document.current.stringColor_(Color.rand(0.2, 0.8),
603         Document.current.selectedRangeLocation + 13,
604         16);
606 // Watch me change color
609 method:: selectedBackground
610 Gets or sets the document's background color for selected text. Applies to the whole document instance.
611 argument:: color
612 An instance of link::Classes/Color::.
613 discussion::
614 code::
615 Document.current.selectedBackground; // returns default color
617 w = Document.new("Test", "Here is a selected text...");
618 w.selectedBackground_(Color.new255(120, 180, 110));
619 w.selectRange(10, 13);
623 method:: syntaxColorize
624 Syntax colorize a document.
626 method:: underlineSelection
627 Underlines the current selection of a Document.
630 subsection:: Auto-Completion
632 note::
633 OSX version only, currently. See link::Reference/DocumentAutoCompletion::.
635 code::
636         *allowAutoComp
637         *autoCompAll
638         *autoComplete
639         *autoCompleteKeyAction
640         *openFileAutoComplete (path)
641         *openAutoComplete
642         autoComplete
645 subsection:: Subclassing and Internal Methods
647 The following methods are usually not used directly or are called by a primitive. Programmers can still call or override these as needed.
648 code::
649         *startup
650         *numberOfOpen
651         mouseUp (x, y, modifiers, buttonNumber, clickCount, clickPos)
652         keyDown (character, modifiers, unicode, keycode)
653         keyUp (character, modifiers, unicode, keycode)
654         getIdentifierCoordFromEnd (endPos)
655         dataptr
657         Private. Used only internally:
658         *newFromIndex (idx)
659         *prnumberOfOpen
660         *prGetLast
661         *prGetIndexOfListener
662         *prBasicNew
663         prAdd
664         prGetLastIndex
665         setFont (font, rangeStart, rangeSize)
666         setTextColor (color, rangeStart, rangeSize)
667         propen (path, selectionStart, selectionLength)
668         rangeText (rangestart, rangesize)
669         insertTextRange (string, rangestart, rangesize)
670         prinitByString (title, str, makeListener)
671         prSetBackgroundColor (color)
672         prGetBackgroundColor (color)
673         prSelectLine (line)
674         prIsEditable_ (editable)
675         prSetTitle (argName)
676         prGetTitle
677         prGetFileName
678         prSetFileName (apath)
679         prGetBounds (argBounds)
680         prSetBounds (argBounds)
681         prclose
682         prinsertText (dataPtr, txt)
683         prinitByIndex (idx)
684         envir
685         envir_ (ev)
686         text
687         removeUndo
688         selectedText
689         selectUnderlinedText (clickPos)
690         linkAtClickPos (clickPos)
691         selectedRangeLocation
692         selectedRangeSize
693         restoreCurrentEnvironment
694         saveCurrentEnvironment
695         initByIndex (idx)
696         initLast
697         initFromPath (path, selectionStart, selectionLength)
698         initByString (argTitle, str, makeListener)
705 examples::
707 code::
708 //unfocusedFront_
710 Document.allDocuments.at(0).unfocusedFront
715 var doc;
716 doc = Document("", "||");
717 doc.background_(Color.blue(alpha: 1.0.rand));
719 Task({
720         1000.do({
721                 doc.setFont(rangeSize: [7, 8, 9, 24].choose);
722                 0.08.wait;
723         })
724 }).play(AppClock);
726 Task({
727         100.do({
728                 1.01.wait;
729                 doc.stringColor_([Color.red(alpha: 1.0.rand), Color.green(alpha: 1.0.rand)].choose);
730         })
731 }).play(AppClock);
733 Task({
734         100.do({
735                 1.01.wait;
736                 doc.selectedString_(["\"\n#", "||", "-", "--"].choose);
737         })
738 }).play(AppClock);
740 Task({
741         var co, mul;
742         co = 0.1;
743         mul = 1.02;
744         100.do({
745                 0.16.wait;
746                 co = co * mul;
747                 if(co > 0.99, { co = 0.1 });
748                 doc.background_(Color.blue(alpha: co));
749         });
750         doc.close;
751 }).play(AppClock)
755 A simple implementation of TBT (time based text) http://tbt.dyne.org/?info=download
756 code::
757 // record: type some text
759 var time = Main.elapsedTime;
760 a = List.new;
761 r = Routine { |char|
762 loop {
763         a = a.add([char, Main.elapsedTime - time]);
764         char = 0.yield;
768 Document.new("type some text")
769         .bounds_(Rect(100,SCWindow.screenBounds.height - 250, 400, 200))
770         .keyDownAction = { |doc, key| r.value(key) ; time = Main.elapsedTime};
773 // play back text in time
775 d = Document.new("type some text")
776         .bounds_(Rect(550,SCWindow.screenBounds.height-250,400,200));
777 fork({
778         a.do { |pair|
779                 d.string = d.string ++ pair[0];
780                 pair[1].wait;
781         }
782 }, AppClock)
786 Changing the default look of documents can be done with the help of the link::#*initAction:: method. Run the following example once. Afterwards all newly created documents will have a dark grey background. To make this change happen every time you start supercollider, put the code inside your startup.scd file (and optionally wrap it in a code::{}.defer(0.1):: ).
787 code::
789 Document.listener.background = Color.red;       //a special color for post document
790 Document.listener.bounds = Rect(1, 461, 620, 567);      //move and resize post document
791 Document.initAction = {|doc|                    //function to run for every new document
792         doc.background = Color.grey(0.1, 0.9);
793         doc.bounds = Rect(0, 119, 1280, 659);
794         doc.selectedBackground = Color(0.4, 0.05, 0.18);
795         doc.stringColor = Color.grey(0.9);