<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - Cocoa Modul Serie</title>
		<link>https://www.blitzforum.de/worklogs/479/</link>
		<description>Worklog von Chaos Interactive</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Sun, 03 Feb 2013 14:15:46 +0100</pubDate>
		<lastBuildDate>Sun, 03 Feb 2013 14:15:46 +0100</lastBuildDate>

		<item>
			<title>Aufräumen...</title>
			<link>https://www.blitzforum.de/worklogs/479/#3641</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3641</guid>
			<author>d-bug</author>
			<description>Hallo zusammen,&lt;br /&gt;&lt;br /&gt;da ich immer mehr das Gef&amp;uuml;hl bekomme, dass der Einsatz von brl.reflection zwar ein super Sache ist, aber auch zu unkontrollierbarer Inkonsistenz f&amp;uuml;hrt, habe ich beschlossen ein wenig aufzur&amp;auml;umen. Events werden z.B. manchmal nur beim zweiten oder dritten mal ausgel&amp;ouml;st, was nur unzureichend ist. Au&amp;szlig;erdem werden Objekte manchmal nicht erstellt, was nat&amp;uuml;rlich &amp;uuml;berhaupt nicht passieren sollte!&lt;br /&gt;&lt;br /&gt;Meine Aufr&amp;auml;um-Aktion bezieht sich also haupts&amp;auml;chlich auf den Einsatz von brl.reflection an Stellen, wo es nicht zwingend ben&amp;ouml;tigt wird. Zum einen werde ich die Delegate-Methoden fest in NSObject integrieren. Damit habe ich auch bereits begonnen. Dazu ist es allerdings n&amp;ouml;tig, das jede Subklasse auf Cocoa-Seite eine korrespondierende BBObject Klasse mit sich f&amp;uuml;hrt. Dies habe ich zum Test schon an den NSWindow-und NSPanel-Subklassen ausprobiert und bin begeistert vom Ergebnis. Nicht nur, dass man es mittels Properties recht simpel umsetzen kann, nein, es scheint auch bisher deutlich fl&amp;uuml;ssiger zu laufen. Schade nur, dass ich dazu jede Initialisierungs-Methode einer Klasse auf BlitzMax-Seite anpassen muss. Will hei&amp;szlig;en, ich muss wirklich jede einzelne, der gef&amp;uuml;hlten 200 Klassen anpacken... Au&amp;szlig;erdem muss ich auch noch die ganzen Aufrufe der Delegates im Cocoa-Controller &amp;auml;ndern und die passenden Funktionen jeder BlitzMax-Klasse umstricken. Ein Arsch voll Arbeit! (wie man so sch&amp;ouml;n sagt)&lt;br /&gt;&lt;br /&gt;Als weiteren Trick lasse ich nun das Target/Action-System und die Notifications per Event-Hook ausl&amp;ouml;sen. Ich verspreche mir davon, dass so schnell nichts mehr verloren geht, da ich ja sozusagen die Events cachen lasse, bzw. macht der Event-Queue das ja schon von Haus aus f&amp;uuml;r mich. In diesen Hook werde ich auch noch die eigentlichen Events einpflanzen, aber das mach ich sp&amp;auml;ter. Au&amp;szlig;erdem kann man durch diesen Umbau wieder auf die gute alte Update-Schleife zur&amp;uuml;ckgreifen, solange man irgendwo ein WaitEvent() einbaut. Das wird ein paar meiner geplanten Features deutlich vereinfachen. So quasi aus Kompatibilit&amp;auml;ts-Gr&amp;uuml;nden, l&amp;ouml;se ich auch gleich noch die ganzen BlitzMax-Events f&amp;uuml;r den Umgang mit MaxGUI und brl.system mit aus.&lt;br /&gt;&lt;br /&gt;Als letzte &amp;Auml;nderung schmei&amp;szlig;e ich alle alloc(), retain(), release_() und autorelease() Methoden und Funktionen raus und lasse das Cocoa-Gadget mit der Initialisierungsmethode seines BlitzMax-Pondons erstellen. Leider musste ich n&amp;auml;mlich feststellen, dass sogar ich als Entwickler des Moduls, nicht genug Disziplin besitze um die Garbage-Collector Geschichte von Objective-C verantwortungsvoll zu nutzen. Das erstellen eines Gadgets sieht demzufolge jetzt so aus:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Local gadget:NSGadgetKlasse = (New NSGadgetKlasse).initMethodeDerKlasse()[/syntax] Wei&amp;szlig; der Geier, warum ich das nicht von Anfang an so gemacht habe. Nun gut, ich als Geier wei&amp;szlig; es nat&amp;uuml;rlich: BLANKE FAULHEIT! Ich war einfach nur zu faul eine entsprechenden Konstruktor in Objective-C zu schreiben. Faulheit zahlt sich eben doch nicht aus! &lt;br /&gt;&lt;br /&gt;So, die ganzen Methoden, die ich im letzten Post rausschmiss werden auch wieder eingebunden, allerdings diesmal ohne Reflection. Am Ende werden nur noch NSNotification und Target/Action - Reflection ben&amp;ouml;tigen. Da bei beiden aber sowieso die passende TMethod in eine Variable gespeichert wird, sollte das ganze deutlich beschleunigt werden.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gr&amp;uuml;&amp;szlig;e&lt;br /&gt;&lt;br /&gt;buggy&lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Sun, 03 Feb 2013 14:15:46 +0100</pubDate>
		</item>

		<item>
			<title>Und weiter gehts...</title>
			<link>https://www.blitzforum.de/worklogs/479/#3636</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3636</guid>
			<author>d-bug</author>
			<description>Hallo zusammen,&lt;br /&gt;&lt;br /&gt;es gibt eine &amp;Auml;nderung, die ich selbstverst&amp;auml;ndlich niemandem vorenthalten m&amp;ouml;chte. Es gibt jetzt kein Subclassing mehr f&amp;uuml;r komplette Cocoa-Klassen. &lt;br /&gt;&lt;br /&gt;Z.B. kann jetzt nur noch auf eine NSView gezeichnet werden, wenn man eine neue, auf NSView basierende Klasse in Objective-C und deren Wrapper in BlitzMax schreibt. Der Grund daf&amp;uuml;r ist recht einfach: Das wurde alles vieeel zu langsam. Stellt euch vor, ihr schreibt eine recht umfangreiche Applikation. F&amp;uuml;r jede Methode eines Gadgets dieser Applikation wird ein callback gen BlitzMax geschossen, der via brl.reflection Modul die passende BlitzMax-Type-Instanz sucht, dann die BlitzMax-Methode in der Instanz sucht und diese dann ausf&amp;uuml;hrt. Das f&amp;auml;llt bei wenigen Gadgets noch nicht so auf, aber je mehr Gadgets es werden, desto langsamer wird es.&lt;br /&gt;&lt;br /&gt;Das w&amp;auml;re mir wahrscheinlich auch nicht aufgefallen, wenn ich nicht im Zuge der Testphase die IDE wieder zusammen schrauben w&amp;uuml;rde. Es wunderte mich schon heftig, dass eine Animation zweier NSView's so derbe ruckelte. Der Grund daf&amp;uuml;r wahr einzig und alleine, dass die views einen callback f&amp;uuml;r ihre drawRect Methode nach BlitzMax &amp;uuml;bergaben. Als ich das ganze subclass-Ged&amp;ouml;ns auskommentierte, ging pl&amp;ouml;tzlich alles super sauber von statten. &lt;br /&gt;&lt;br /&gt;Dann kommen wir auch gleich zur TestApp-IDE.&lt;br /&gt;Bisher hab ich mich eigentlich nur um die den eigentlichen Editor gek&amp;uuml;mmert. Man kann zwar bisher weder laden noch speichern, aber AutoCompletion usw. gibt es bereits. Vielleicht sind meine Priorit&amp;auml;ten ein wenig durcheinander...&lt;br /&gt;&lt;br /&gt;Zur Abwechslung gibt es jetzt auch mal ein paar Bilder:&lt;br /&gt;&lt;br /&gt;Wo wir gerade von AutoCompletion sprachen... deren Liste:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=12226&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Wenn man jetzt Enter dr&amp;uuml;cken w&amp;uuml;rde passiert das:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=12227&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;AutoCompletion f&amp;uuml;gt also die Keywords mit deren Parametern ein. Als w&amp;auml;re das noch nicht genug, kann man sich mittels Tab und Shift+Tab vorw&amp;auml;rts und r&amp;uuml;ckw&amp;auml;rts durch die Parameter tabben um sie einfacher bearbeiten zu k&amp;ouml;nnen. ...und als w&amp;auml;re das immer noch nicht genug, kann man beim eingeben des Parameters wieder eine AutoCompletion-Liste anzeigen lassen, die dann allerdings nur noch registrierte Variablen enth&amp;auml;lt! Man muss allerdings das ganze mit ESC beenden, wenn man mal wieder was normales tippen will.&lt;br /&gt;&lt;br /&gt;Dann h&amp;auml;tte ich da noch die Suche zu bieten:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=12228&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Eigentlich eine OS X-Standardsuche... Die Filter sind allerdings etwas anders als normal.&lt;br /&gt;&lt;br /&gt;Weiter gehts mit Quick-Help:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;https://www.blitzforum.de/upload/file.php?id=12225&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Das Popup als solches sieht noch etwas ungeschliffen aus. Da muss ich noch ein wenig mit den Farben spielen. Man kann die Hilfe Wahlweise wie ein Tooltip, nach Ablauf einer Zeitspanne einblenden lassen, oder einfach durch die Tastenkombination CTRL+CMD+? anzeigen lassen.&lt;br /&gt;&lt;br /&gt;Weitere Features (ohne Bild):&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Automatische Gro&amp;szlig;/Kleinschreibung f&amp;uuml;r Sprachen die das auch unterst&amp;uuml;tzen (BlitzMax z.b.)&lt;br /&gt;&lt;li&gt;Klammervergleich&lt;br /&gt;&lt;li&gt;Klammer-und Anf&amp;uuml;hrungszeichenvervollst&amp;auml;ndigung&lt;br /&gt;&lt;li&gt;Bl&amp;ouml;cke ein/auskommentieren&lt;br /&gt;&lt;li&gt;Zoom mit Gesten u/o Tastatur&lt;br /&gt;&lt;li&gt;Automatisches Einr&amp;uuml;cken (auch Sprachbasierend)&lt;br /&gt;&lt;li&gt;Tab-basierendes Layout (ebenfalls mit Gestensteuerung)&lt;br /&gt;&lt;li&gt;au&amp;szlig;erdem noch vieles was Scintilla von Hause aus zu bieten hat.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Es gibt da noch viel dran zu tun, aber als Test f&amp;uuml;r die Module ist es wirklich super geeignet.&lt;br /&gt;&lt;br /&gt;Bis dahin...&lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Sun, 27 Jan 2013 16:29:01 +0100</pubDate>
		</item>

		<item>
			<title>Und täglich grüßt....</title>
			<link>https://www.blitzforum.de/worklogs/479/#3627</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3627</guid>
			<author>d-bug</author>
			<description>Hall&amp;ouml;le,&lt;br /&gt;&lt;br /&gt;nach dem ich feststellen konnte, dass TimeMachine auch nicht das Wahre ist (speziell dann, wenn man damit ein Backup macht, seinen Rechner neu aufsetzt und dann tats&amp;auml;chlich glaubt man bekomme seine Daten auch wieder), musste ich mich aufs neue mit Cocoa auseinander setzen! Nicht dass es noch wirklich Spa&amp;szlig; machen w&amp;uuml;rde... Wei&amp;szlig; der Geier, die wievielte Version das jetzt schon ist.&lt;br /&gt;&lt;br /&gt;Diesmal war ich allerdings nicht mehr in der Laune alles per Hand einzukl&amp;ouml;ppeln, sonderen schrieb mir eine Art Parser f&amp;uuml;r developer.apple.com Seiten. Nat&amp;uuml;rlich ging auch das nicht ohne weiteres vonstatten. ZumBeispiel schaffte ich es nicht mit BlitzMax https Seiten direkt auszulesen. Was macht der findige Schreiberling da? Er kopiert alle Daten von der Seite in ein Textfile und liest dieses dann aus.&lt;br /&gt;&lt;br /&gt;Das macht den Parser nat&amp;uuml;rlich unn&amp;ouml;tig kompliziert, erf&amp;uuml;llt aber seinen Zweck.&lt;br /&gt;Also, was kann der Parser:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Eine Klasse auslesen und aus Klassen-Methoden und Instanz-Methoden - Type, Funktionen und Methoden f&amp;uuml;r BMX zaubern, das ganze in ein eigenes Include-File f&amp;uuml;r appkit.mod oder foundation.mod speichern.&lt;br /&gt;&lt;li&gt;Aus den gewonnenen Methoden und Funktionen Callbacks f&amp;uuml;r die Objective-C runtime extrahieren und in die objc.bmx und objc.m Dateien des objc.mod schreiben .&lt;br /&gt;&lt;li&gt;String Konstanten automatisch in die String-&amp;Uuml;bersetzer Funktion des objc.mod einf&amp;uuml;gen.&lt;br /&gt;&lt;li&gt;Int Konstanten mit Referenznamen anhand einer Vergleichsliste wieder in Int-Konstanten f&amp;uuml;r BlitzMax umwandeln&lt;br /&gt;&lt;li&gt;Die Dokumentation gleich mit auslesen (Allerdings mit der falschen Codepage. Statt UTF-8 eben UTF-16)&lt;br /&gt;&lt;li&gt;Mich &amp;auml;rgern!&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;...und das kann er nicht:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;NSArray, NSMutableArray automatisch umwandeln. (Woher soll er auch wissen was im Array gespeichert ist?)&lt;br /&gt;&lt;li&gt;@protocol auslesen und in setter und getter umwandeln &lt;br /&gt;&lt;li&gt;Delegates schreiben&lt;br /&gt;&lt;li&gt;Mir die Arbeit 100%ig abnehmen...&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Sprich, ich muss trotzdem noch mal jede Klasse absuchen und berichtigen. Das geht aber immer noch schneller als alles per Hand einzuhacken!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In den letzten paar Tagen habe ich schon mal folgendes vollbracht (auskommentiert gibts noch nicht oder wirds auch nie geben)...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cocoa.appkit&lt;/b&gt; [syntax=&amp;quot;bmax&amp;quot;]Include &amp;quot;classes/NSActionCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSAffineTransform.bmx&amp;quot; 'additions&lt;br /&gt;Include &amp;quot;classes/NSAlert.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSAnimation.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSAnimationContext.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSAppleScript.bmx&amp;quot; 'Use LUA instead&lt;br /&gt;Include &amp;quot;classes/NSApplication.bmx&amp;quot; 'NSCoder&lt;br /&gt;'Include &amp;quot;classes/NSArrayController.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSATSTypesetter.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSAttributedString.bmx&amp;quot; 'additions&lt;br /&gt;Include &amp;quot;classes/NSBezierPath.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSBitmapImageRep.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSBox.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSBrowser.bmx&amp;quot; 'NSDragOperation, delegate&lt;br /&gt;Include &amp;quot;classes/NSBrowserCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSBundle.bmx&amp;quot; 'additions&lt;br /&gt;Include &amp;quot;classes/NSButton.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSButtonCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCachedImageRep.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSCell.bmx&amp;quot; 'NSFormatter&lt;br /&gt;'Include &amp;quot;classes/NSCIImageRep.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSClipView.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCoder.bmx&amp;quot;	 'additions&lt;br /&gt;'Include &amp;quot;classes/NSCollectionView.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCollectionViewItem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSColor.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSColorList.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSColorPanel.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSColorPicker.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSColorSpace.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSColorWell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSComboBox.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSComboBoxCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSControl.bmx&amp;quot; 'NSFormatter&lt;br /&gt;'Include &amp;quot;classes/NSController.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSCursor.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCustomImageRep.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDatePicker.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDatePickerCell.bmx&amp;quot; 'delegate&lt;br /&gt;'Include &amp;quot;classes/NSDictionaryController.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDockTile.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDocument.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDocumentController.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDraggingImageComponent.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDraggingInfo.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDraggingItem.bmx&amp;quot; 'imageComponentsProvider&lt;br /&gt;Include &amp;quot;classes/NSDraggingSession.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDrawer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSEPSImageRep.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSEvent.bmx&amp;quot;												&lt;br /&gt;'Include &amp;quot;classes/NSFileWrapper.bmx&amp;quot; 'additions&lt;br /&gt;Include &amp;quot;classes/NSFont.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSFontCollection.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSFontDescriptor.bmx&amp;quot;	&lt;br /&gt;Include &amp;quot;classes/NSFontManager.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSFontPanel.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSForm.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSFormCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSGlyphGenerator.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSGlyphInfo.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSGradient.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSGraphicsContext.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSHelpManager.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSImage.bmx&amp;quot;	 'delegate, pixmap support&lt;br /&gt;Include &amp;quot;classes/NSImageCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSImageRep.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSImageView.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSLayoutManager.bmx&amp;quot; 'delegate, NSTypeSetter, NSGlyph, NSGlyphGenerator&lt;br /&gt;Include &amp;quot;classes/NSLevelIndicator.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSLevelIndicatorCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSMatrix.bmx&amp;quot;	 'delegate&lt;br /&gt;Include &amp;quot;classes/NSMenu.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSMenuItem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSMenuItemCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSMenuView.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableAttributedString.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableFontCollection.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableParagraphStyle.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNib.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNibConnector.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNibControlConnector.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNibOutletConnector.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSObjectController.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOpenGLContext.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOpenGLLayer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOpenGLPixelBuffer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOpenGLPixelFormat.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOpenGLView.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSOpenPanel.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSOutlineView.bmx&amp;quot; 'datasource completion, delegate completion&lt;br /&gt;Include &amp;quot;classes/NSOutlineViewDataSource.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPageController.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPageLayout.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPanel.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSParagraphStyle.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPasteboard.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPasteboardItem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPathCell.bmx&amp;quot; 'delegate&lt;br /&gt;Include &amp;quot;classes/NSPathComponentCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPathControl.bmx&amp;quot; 'delegate, NSDragOperation&lt;br /&gt;'Include &amp;quot;classes/NSPDFImageRep.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPersistentDocument.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPICTImageRep.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPopover.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSPopUpButton.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPopUpButtonCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPredicateEditor.bmx&amp;quot; 'later...&lt;br /&gt;'Include &amp;quot;classes/NSPredicateEditorRowTemplate.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSPrinter.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPrintInfo.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPrintOperation.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSPrintPanel.bmx&amp;quot; 'NSViewController&lt;br /&gt;Include &amp;quot;classes/NSProgressIndicator.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSResponder.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRuleEditor.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSRulerMarker.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSRulerView.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRunningApplication.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSSavePanel.bmx&amp;quot; 'delegate&lt;br /&gt;Include &amp;quot;classes/NSScreen.bmx&amp;quot;	&lt;br /&gt;Include &amp;quot;classes/NSScroller.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSScrollView.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSearchField.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSearchFieldCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSecureTextField.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSecureTextFieldCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSegmentedCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSegmentedControl.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSShadow.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSSharingService.bmx&amp;quot; 'later...&lt;br /&gt;'Include &amp;quot;classes/NSSharingServicePicker.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSSlider.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSliderCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSound.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSpeechRecognizer.bmx&amp;quot; 'delegate&lt;br /&gt;Include &amp;quot;classes/NSSpeechSynthesizer.bmx&amp;quot; 'delegate&lt;br /&gt;Include &amp;quot;classes/NSSpellChecker.bmx&amp;quot; 'NSTextCheckingResult, NSOrthography, NSViewController&lt;br /&gt;Include &amp;quot;classes/NSSplitView.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSStatusBar.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSStatusItem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSStepper.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSStepperCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSString.bmx&amp;quot; 'replaced by String&lt;br /&gt;'Include &amp;quot;classes/NSTableCellView.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSTableColumn.bmx&amp;quot; 'NSSortDescriptor&lt;br /&gt;Include &amp;quot;classes/NSTableHeaderCell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTableHeaderView.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSTableRowView.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSTableView.bmx&amp;quot; 'datasource completion, delegate completion, NSSortDescriptor&lt;br /&gt;Include &amp;quot;classes/NSTableViewDataSource.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTabView.bmx&amp;quot; 'delegate&lt;br /&gt;Include &amp;quot;classes/NSTabViewItem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSText.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextAttachment.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextAttachmentCell.bmx&amp;quot; 'NSTextAttachmentCell protocol&lt;br /&gt;Include &amp;quot;classes/NSTextBlock.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextContainer.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextField.bmx&amp;quot; 'delegate?&lt;br /&gt;Include &amp;quot;classes/NSTextFieldCell.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSTextFinder.bmx&amp;quot; 'later...&lt;br /&gt;'Include &amp;quot;classes/NSTextInputContext.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSTextList.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextStorage.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextTab.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextTable.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextTableBlock.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTextView.bmx&amp;quot; 'delegate completion, NSOrthography&lt;br /&gt;Include &amp;quot;classes/NSTokenField.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTokenFieldCell.bmx&amp;quot;	&lt;br /&gt;Include &amp;quot;classes/NSToolbar.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSToolbarItem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSToolbarItemGroup.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSTouch.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSTrackingArea.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSTreeController.bmx&amp;quot; 'later...&lt;br /&gt;'Include &amp;quot;classes/NSTreeNode.bmx&amp;quot; 'later...&lt;br /&gt;'Include &amp;quot;classes/NSTypesetter.bmx&amp;quot; 'later...&lt;br /&gt;'Include &amp;quot;classes/NSURL.bmx&amp;quot; 'additions&lt;br /&gt;'Include &amp;quot;classes/NSUserDefaultsController.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSView.bmx&amp;quot; 'NSLayoutConstraint, NSDraggingSession, NSTextInputContext&lt;br /&gt;Include &amp;quot;classes/NSViewAnimation.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSViewController.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSWindow.bmx&amp;quot; 'NSWindowController&lt;br /&gt;'Include &amp;quot;classes/NSWindowController.bmx&amp;quot; 'later...&lt;br /&gt;Include &amp;quot;classes/NSWorkspace.bmx&amp;quot; 'NSRunningApplication&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;cocoa.foundation&lt;/b&gt; [syntax=&amp;quot;bmax&amp;quot;]Include &amp;quot;classes/NSAffineTransform.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSAppleEventDescriptor.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSAppleEventManager.bmx&amp;quot;	&lt;br /&gt;'Include &amp;quot;classes/NSAppleScript.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSArchiver.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSArray.bmx&amp;quot; '- replaced by blitz arrays&lt;br /&gt;'Include &amp;quot;classes/NSAssertionHandler.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSAttributedString.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSAutoreleasePool.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSBlockOperation.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSBundle.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCache.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCachedURLResponse.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSCalendar.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSCharacterSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSClassDescription.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCloneCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCloseCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCoder.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSComparisonPredicate.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCompoundPredicate.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCondition.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSConditionLock.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSConnection.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCountCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCountedSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSCreateCommand.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSData.bmx&amp;quot; 'byte ptr support&lt;br /&gt;'Include &amp;quot;classes/NSDataDetector.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDate.bmx&amp;quot; 'NSCalendarDate&lt;br /&gt;Include &amp;quot;classes/NSDateComponents.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDateFormatter.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDecimalNumber.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDecimalNumberHandler.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDeleteCommand.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSDictionary.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDirectoryEnumerator.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDistantObject.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDistantObjectRequest.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDistributedLock.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSDistributedNotificationCenter.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSEnumerator.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSError.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSException.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSExistsCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSExpression.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSFileCoordinator.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSFileHandle.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSFileManager.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSFileVersion.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSFileWrapper.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSFormatter.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSGarbageCollector.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSGetCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSHashTable.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSHost.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSHTTPCookie.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSHTTPCookieStorage.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSHTTPURLResponse.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSIndexPath.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSIndexSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSIndexSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSInputStream.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSInvocation.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSInvocationOperation.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSKeyedArchiver.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSKeyedUnarchiver.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSLinguisticTagger.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSLocale.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSLock.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSLogicalTest.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMachBootstrapServer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMachPort.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMapTable.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMessagePort.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMessagePortNameServer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMetadataItem.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMetadataQuery.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMetadataQueryAttributeValueTuple.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMetadataQueryResultGroup.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMethodSignature.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMiddleSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMoveCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableArray.bmx&amp;quot; '- replaced by blitz arrays&lt;br /&gt;Include &amp;quot;classes/NSMutableAttributedString.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableCharacterSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableData.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSMutableDictionary.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableIndexSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableOrderedSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSMutableString.bmx&amp;quot; '- replaced by blitz strings&lt;br /&gt;'Include &amp;quot;classes/NSMutableURLRequest.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNameSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNetService.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNetServiceBrowser.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSNotification.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSNotificationCenter.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNotificationQueue.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSNull.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSNumber.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSNumberFormatter.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSObject.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOperation.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOperationQueue.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOrderedSet.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOrthography.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSOutputStream.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPipe.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPointerArray.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPointerFunctions.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPort.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPortCoder.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPortMessage.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPortNameServer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPositionalSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPredicate.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSProcessInfo.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPropertyListSerialization.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSPropertySpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSProtocolChecker.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSProxy.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSQuitCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRandomSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRangeSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRecursiveLock.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRegularExpression.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRelativeSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSRunLoop.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScanner.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptClassDescription.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptCoercionHandler.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptCommandDescription.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptExecutionContext.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptObjectSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptSuiteRegistry.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSScriptWhoseTest.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSSet.bmx&amp;quot; 'NSSortDescriptor, enum methods, testing methods&lt;br /&gt;'Include &amp;quot;classes/NSSetCommand.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSSocketPort.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSSocketPortNameServer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSSortDescriptor.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSSpecifierTest.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSSpellServer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSStream.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSString.bmx&amp;quot; '- replaced by blitz strings&lt;br /&gt;'Include &amp;quot;classes/NSTask.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSTextCheckingResult.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSThread.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSTimer.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSTimeZone.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUbiquitousKeyValueStore.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUnarchiver.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSUndoManager.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUniqueIDSpecifier.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSURL.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLAuthenticationChallenge.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLCache.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLConnection.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLCredential.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLCredentialStorage.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLDownload.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLHandle.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLProtectionSpace.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLProtocol.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLRequest.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSURLResponse.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUserAppleScriptTask.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUserAutomatorTask.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSUserDefaults.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUserNotification.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUserNotificationCenter.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUserScriptTask.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUserUnixTask.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSUUID.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/NSValue.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSValueTransformer.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSWhoseSpecifier.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXMLDocument.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXMLDTD.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXMLDTDNode.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXMLElement.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXMLNode.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXMLParser.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXPCConnection.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXPCInterface.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXPCListener.bmx&amp;quot;&lt;br /&gt;'Include &amp;quot;classes/NSXPCListenerEndpoint.bmx&amp;quot;&lt;br /&gt;[/syntax]&lt;br /&gt;&lt;br /&gt;Die Kommentare hinter den Include bedeuten nur, dass Klassen-Referenzen noch fehlen, oder ich die Klasse auf sp&amp;auml;ter verschoben habe, weil ich noch nicht wei&amp;szlig;, ob ichs umsetzen kann. &amp;quot;additions&amp;quot; sind Erweiterungen der eigentlichen foundation Klasse und werden auch da eingetragen... Nat&amp;uuml;rlich sind die Kommentare bei mir sch&amp;ouml;ne einger&amp;uuml;ckt hinter den Include Anweisungen was aber nicht in die Codeboxen vom BBP &amp;uuml;bernommen wird.&lt;br /&gt;&lt;br /&gt;Wie man sehen kann, habe ich mein Augenmerk momentan auf die das cocoa.appkit Modul gelegt und die Foundation Klassen nur dann umgesetzt, wenn ich sie in Appkit ben&amp;ouml;tigte. Das wird sich aber noch &amp;auml;ndern.&lt;br /&gt;&lt;br /&gt;Im Gro&amp;szlig;en und Ganzen kann man aber schon ansatzweise erkennen, was das f&amp;uuml;r ein Monster an Modulen wird!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Die cocoa.scintilla, cocoa.psmtabbarcontrol und cocoa.appstorewindow Module hab ich &amp;uuml;brigens auch schon wieder neu geschrieben. Diese allerdings per Hand, weil es Drittanbieter Klassen oder Frameworks sind, die nicht auf developer.apple.com dokumentiert sind und mein Parser da schlichtweg versagen w&amp;uuml;rde!&lt;br /&gt;&lt;br /&gt;So, das ganze hat bisher ungef&amp;auml;hr 2 Wochen in Anspruch genommen. Ich habe wirklich unerm&amp;uuml;dlich daran rum geschraubt!&lt;br /&gt;&lt;br /&gt;Mir ist sogar gelungen ansatzweise Drag&amp;amp;Drop einzubinden, was aber gerade noch in den Kinderschuhen steckt. Das konnte KEINE der alten Versionen! (Man braucht ja schlie&amp;szlig;lich Lichtblicke...)&lt;br /&gt;&lt;br /&gt;So, genug des trockenen Geschwafels.&lt;br /&gt;&lt;br /&gt;buggy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PS: Voll vergessen das Sample dranzuh&amp;auml;ngen!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]'This sample is based on CocoaDragAndDrop sample from developer.apple.com.&lt;br /&gt;'There are tons of modifications, but the base is still the same.&lt;br /&gt;SuperStrict&lt;br /&gt;Framework cocoa.appkit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'This view demonstrates the minimum requirement of accepting drag operations&lt;br /&gt;'It accepts file paths and print it to the output panel of MaxIDE if they where accepted.&lt;br /&gt;Type NSDraggingSampleView Extends NSImageView&lt;br /&gt;&lt;br /&gt;	Field highlight:Int&lt;br /&gt;&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;	' Init method...&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;	Method initWithFrame:NSDraggingSampleView(frameRect:NSRect)&lt;br /&gt;		Super.initWithFrame(frameRect)&lt;br /&gt;		setImageFrameStyle(NSImageFrameGrayBezel)&lt;br /&gt;&lt;br /&gt;		'register dragging types for images...&lt;br /&gt;		registerForDraggedTypes(NSImage.imagePasteboardTypes())&lt;br /&gt;		Return Self&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;	' NSDraggingDestination protocol methods&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;	'method called whenever a drag enters our drop zone&lt;br /&gt;	Method draggingEntered:Int(sender:NSDraggingInfo)&lt;br /&gt;		'Check if the pasteboard contains image data and source/user wants it copied&lt;br /&gt;		If (NSImage.canInitWithPasteboard(sender.draggingPasteboard())) And (sender.draggingSourceOperationMask() &amp;amp; NSDragOperationCopy)&lt;br /&gt;			'highlight our drop zone&lt;br /&gt;			highlight = YES&lt;br /&gt;			setNeedsDisplay(YES)&lt;br /&gt;			Return NSDragOperationCopy&lt;br /&gt;		EndIf&lt;br /&gt;		Return NSDragOperationNone&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	'method called whenever a drag exits our drop zone&lt;br /&gt;	Method draggingExited(sender:NSDraggingInfo)&lt;br /&gt;		'remove highlight of the drop zone&lt;br /&gt;		highlight = NO&lt;br /&gt;		setNeedsDisplay(YES)&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt; 	'draw method is overridden to do drop highlighing&lt;br /&gt;	Method drawRect(rect:NSRect)&lt;br /&gt;		'do the usual draw operation to display the image &lt;br /&gt;		'was allready done by the Cocoa part of the framework to avoid glitches.&lt;br /&gt;		'It just calls an empty method in this case!&lt;br /&gt;		Super.drawRect(rect)&lt;br /&gt;		'highlight by overlaying a red border (the original grey border wasn't very impressive)&lt;br /&gt;		If highlight&lt;br /&gt;			NSColor.redColor().set()&lt;br /&gt;			NSBezierPath.setDefaultLineWidth(5.0)&lt;br /&gt;			NSBezierPath.strokeRect(rect)&lt;br /&gt;		EndIf&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	'method to determine if we can accept the drop&lt;br /&gt;	Method prepareForDragOperation:Int(sender:NSDraggingInfo)&lt;br /&gt;		'finished with the drag so remove any highlighting&lt;br /&gt;		highlight = NO&lt;br /&gt;		setNeedsDisplay(YES)&lt;br /&gt;		'check to see if we can accept the data&lt;br /&gt;		Return NSImage.canInitWithPasteboard(sender.draggingPasteboard())&lt;br /&gt;	End MEthod&lt;br /&gt;&lt;br /&gt;	'method that should handle the drop data&lt;br /&gt;	Method performDragOperation:Int(sender:NSDraggingInfo)&lt;br /&gt;		If sender.draggingSource() &amp;lt;&amp;gt; Self&lt;br /&gt;			Local pasteboard:NSPasteboard = sender.draggingPasteboard()&lt;br /&gt;			'set the image using the best representation we can get from the pasteboard&lt;br /&gt;			If NSImage.canInitWithPasteboard(pasteboard)&lt;br /&gt;				Local newImage:NSImage = NSImage.alloc().initWithPasteboard(pasteboard)&lt;br /&gt;				If newImage Self.setImage(newImage)&lt;br /&gt;				newImage.release_()&lt;br /&gt;			EndIf&lt;br /&gt;			'if the drag comes from a file, set the window title to the filename&lt;br /&gt;			Local fileURL:NSURL = NSURL.URLFromPasteboard(pasteboard)&lt;br /&gt;			If fileURL &amp;lt;&amp;gt; Null&lt;br /&gt;				Self.window().setTitle(fileURL.absoluteString())&lt;br /&gt;			Else&lt;br /&gt;				Self.window().setTitle(&amp;quot;(no name)&amp;quot;)&lt;br /&gt;			EndIf&lt;br /&gt;		EndIf&lt;br /&gt;		Return YES&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	'method called whenever a drag is updated over our drop zone&lt;br /&gt;	Method draggingUpdated:Int(sender:NSDraggingInfo)&lt;br /&gt;		'Check if the pasteboard contains image data and source/user wants it copied&lt;br /&gt;		If (NSImage.canInitWithPasteboard(sender.draggingPasteboard())) And (sender.draggingSourceOperationMask() &amp;amp; NSDragOperationCopy)&lt;br /&gt;			Return NSDragOperationCopy&lt;br /&gt;		EndIf&lt;br /&gt;		Return NSDragOperationNone&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;	' NSDraggingSource protocol methods&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;	'catch mouse down events in order to start drag&lt;br /&gt;	Method mouseDown(event:NSEvent)&lt;br /&gt;		'Dragging operation occur within the context of a special pasteboard (NSDragPboard).&lt;br /&gt;		'All items written or read from a pasteboard must conform to NSPasteboardWriting or &lt;br /&gt;		'NSPasteboardReading respectively.  NSPasteboardItem implements both these protocols&lt;br /&gt;		'and is as a container for any object that can be serialized to NSData. */&lt;br /&gt;		Local pbItem:NSPasteboardItem = NSPasteboardItem.alloc().init()&lt;br /&gt;&lt;br /&gt;		'Our pasteboard item will support public.tiff, public.pdf, and our custom UTI (see comment in -draggingEntered)&lt;br /&gt;		'representations of our data (the image).  Rather than compute both of these representations now, promise that &lt;br /&gt;		'we will provide either of these representations when asked.  When a receiver wants our data in one of the above &lt;br /&gt;		'representations, we'll get a call to  the NSPasteboardItemDataProvider protocol method –pasteboard:item:provideDataForType:.&lt;br /&gt;		pbItem.setDataProvider_forTypes(Self, [&amp;quot;NSPasteboardTypeTIFF&amp;quot;, &amp;quot;NSPasteboardTypePDF&amp;quot;])&lt;br /&gt;&lt;br /&gt;		'create a new NSDraggingItem with our pasteboard item.&lt;br /&gt;		Local dragItem:NSDraggingItem = NSDraggingItem.alloc().initWithPasteboardWriter(pbItem)&lt;br /&gt;		pbItem.release_()&lt;br /&gt;&lt;br /&gt;		'The coordinates of the dragging frame are relative to our view.  Setting them to our view's bounds will cause the drag image&lt;br /&gt;		'to be the same size as our view.  Alternatively, you can set the draggingFrame to an NSRect that is the size of the image in&lt;br /&gt;		'the view but this can cause the dragged image to not line up with the mouse if the actual image is smaller than the size of the&lt;br /&gt;		'our view.&lt;br /&gt;		Local draggingRect:NSRect = self.bounds()&lt;br /&gt;&lt;br /&gt;		'While our dragging item is represented by an image, this image can be made up of multiple images which&lt;br /&gt;		'are automatically composited together in painting order.  However, since we are only dragging a single&lt;br /&gt;		'item composed of a single image, we can use the convince method below. For a more complex example&lt;br /&gt;		'please see the MultiPhotoFrame sample.&lt;br /&gt;		dragItem.setDraggingFrame_contents(draggingRect, image())&lt;br /&gt;&lt;br /&gt;		'create a dragging session with our drag item and ourself as the source.&lt;br /&gt;		Local draggingSession:NSDraggingSession = beginDraggingSessionWithItems_event_source([dragItem], event, Self)&lt;br /&gt;&lt;br /&gt;		'causes the dragging item to slide back to the source if the drag fails.&lt;br /&gt;		draggingSession.setAnimatesToStartingPositionsOnCancelOrFail(YES)&lt;br /&gt;		draggingSession.setDraggingFormation(NSDraggingFormationNone)&lt;br /&gt;&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	'NSDraggingSource protocol method.  Returns the types of operations allowed in a certain context.&lt;br /&gt;	Method draggingSession_sourceOperationMaskForDraggingContext:Int(session:NSDraggingSession, context:Int)&lt;br /&gt;		Select context&lt;br /&gt;			Case NSDraggingContextOutsideApplication&lt;br /&gt;				Return NSDragOperationCopy&lt;br /&gt;			Case NSDraggingContextWithinApplication&lt;br /&gt;		End Select&lt;br /&gt;		Return NSDragOperationCopy&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	'method called by pasteboard to support promised drag types.&lt;br /&gt;	Method pasteboard_item_provideDataForType(pasteboard:NSPasteboard, item:NSPasteboardItem, dragType:String)&lt;br /&gt;&lt;br /&gt;		'I don't get it :O&lt;br /&gt;		'DragType is an UTI while the initialization type is a constant string variable...&lt;br /&gt;		'How to get an UTI on different systems where different UTIs can occure for each type?&lt;br /&gt;		'THIS IS FUCKING HORRIBLE!&lt;br /&gt;&lt;br /&gt;		'Instead of using this shit, one should use path based dragging!&lt;br /&gt;		Select ExtractExt(dragType).toLower()&lt;br /&gt;			Case &amp;quot;tiff&amp;quot;&lt;br /&gt;				pasteboard.setData_forType(Self.image().TIFFRepresentation(), &amp;quot;NSPasteboardTypeTIFF&amp;quot;)&lt;br /&gt;			Case &amp;quot;pdf&amp;quot;&lt;br /&gt;				pasteboard.setData_forType(Self.dataWithPDFInsideRect(Self.bounds()), &amp;quot;NSPasteboardTypePDF&amp;quot;)&lt;br /&gt;		End Select&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;	' subclassing methods&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;	Function alloc:NSDraggingSampleView()&lt;br /&gt;		Return New NSDraggingSampleView&lt;br /&gt;	EndFunction&lt;br /&gt;&lt;br /&gt;	Method autorelease:NSDraggingSampleView()&lt;br /&gt;		Return NSDraggingSampleView(Super.autorelease())&lt;br /&gt;	EndMethod&lt;br /&gt;&lt;br /&gt;	Method retain:NSDraggingSampleView()&lt;br /&gt;		Return NSDraggingSampleView(Super.retain())&lt;br /&gt;	EndMethod&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Type NSSampleController Extends NSObject&lt;br /&gt;&lt;br /&gt;	Method initUI(notification:NSNotification)&lt;br /&gt;		Local mask:Int&lt;br /&gt;		Local frame:NSRect&lt;br /&gt;		Local window:NSWindow&lt;br /&gt;		Local view:NSDraggingSampleView&lt;br /&gt;&lt;br /&gt;		'set window mask&lt;br /&gt;		mask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask&lt;br /&gt;&lt;br /&gt;		'precalculate window frame from main screen visible frame&lt;br /&gt;		frame = NSMakeRect(200.0,200.0,300.0,300.0)&lt;br /&gt;&lt;br /&gt;		'initialize window&lt;br /&gt;		frame = NSWindow.frameRectForContentRect_styleMask(frame, mask)&lt;br /&gt;		window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer(frame, mask, NSBackingStoreBuffered, YES).retain()&lt;br /&gt;		window.setMinSize(NSMakeSize(100.0, 100.0))&lt;br /&gt;&lt;br /&gt;		'create dragging destination&lt;br /&gt;		view = NSDraggingSampleView.alloc().initWithFrame(window.contentView().frame()).retain()&lt;br /&gt;		window.setContentView(view)&lt;br /&gt;&lt;br /&gt;		'set delegate of the window&lt;br /&gt;		window.setDelegate(Self)&lt;br /&gt;&lt;br /&gt;		'make the window key&lt;br /&gt;		window.makeKeyAndOrderFront(Self)&lt;br /&gt;&lt;br /&gt;		'precalculate window frame from main screen visible frame&lt;br /&gt;		frame = NSMakeRect(600.0,200.0,300.0,300.0)&lt;br /&gt;&lt;br /&gt;		'initialize window&lt;br /&gt;		frame = NSWindow.frameRectForContentRect_styleMask(frame, mask)&lt;br /&gt;		window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer(frame, mask, NSBackingStoreBuffered, YES).retain()&lt;br /&gt;		window.setMinSize(NSMakeSize(100.0, 100.0))&lt;br /&gt;&lt;br /&gt;		'create dragging destination&lt;br /&gt;		view = NSDraggingSampleView.alloc().initWithFrame(window.contentView().frame()).retain()&lt;br /&gt;		window.setContentView(view)&lt;br /&gt;&lt;br /&gt;		'set delegate of the window&lt;br /&gt;		window.setDelegate(Self)&lt;br /&gt;&lt;br /&gt;		'make the window key&lt;br /&gt;		window.makeKeyAndOrderFront(Self)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	Method logNotification(notification:NSNotification)&lt;br /&gt;		If notification NSLog(notification.name())&lt;br /&gt;	End Method&lt;br /&gt;&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;	'#pragma mark -&lt;br /&gt;	'#pragma mark internal methods&lt;br /&gt;	'---------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;	Function alloc:NSSampleController()&lt;br /&gt;		Return New NSSampleController&lt;br /&gt;	EndFunction&lt;br /&gt;&lt;br /&gt;	Method autorelease:NSSampleController()&lt;br /&gt;		Return NSSampleController(Super.autorelease())&lt;br /&gt;	EndMethod&lt;br /&gt;&lt;br /&gt;	Method init:NSSampleController()&lt;br /&gt;		Return NSSampleController(Super.init())&lt;br /&gt;	EndMethod&lt;br /&gt;&lt;br /&gt;	Method retain:NSSampleController()&lt;br /&gt;		Return NSSampleController(Super.retain())&lt;br /&gt;	EndMethod&lt;br /&gt;&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'create controller&lt;br /&gt;Global app:NSApplication = NSApplication.sharedApplication()&lt;br /&gt;Local controller:NSSampleController = NSSampleController.alloc().init().retain()&lt;br /&gt;&lt;br /&gt;'bind notifications&lt;br /&gt;Local nc:NSNotificationCenter = NSNotificationCenter.defaultCenter()&lt;br /&gt;nc.addObserver(controller, &amp;quot;initUI&amp;quot;, &amp;quot;NSApplicationDidFinishLaunchingNotification&amp;quot;, Null)&lt;br /&gt;&lt;br /&gt;'start app&lt;br /&gt;app.setDelegate(controller)&lt;br /&gt;app.run()[/syntax]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Viel Spa&amp;szlig; noch&lt;br /&gt;&lt;br /&gt;buggy^2&lt;br /&gt;</description>
			<pubDate>Sun, 30 Dec 2012 20:20:51 +0100</pubDate>
		</item>

		<item>
			<title>35 - Wir können entkäfern</title>
			<link>https://www.blitzforum.de/worklogs/479/#3559</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3559</guid>
			<author>d-bug</author>
			<description>Hallo zusammen,&lt;br /&gt;&lt;br /&gt;weil ChaosEdit ja laut Plan erst mal nur eine feste Sprache unterst&amp;uuml;tzen soll, aber durch LUA-Scripts auch die Unterst&amp;uuml;tzung anderer Sprachen beherrschen soll, hab ich mir erst mal Gedanken gemacht, wie ich das am besten umsetzen kann. Zum einen werden nun Tasks mit view Callbacks gef&amp;uuml;ttert die beim Starten, bei STDOUT, bei STDERR und beim Beenden des Tasks angesprungen werden. Jede Sprache kann so ihren eigene Build-Chain implementieren. Au&amp;szlig;erdem wird noch ein Callback zum erstellen der Argumente f&amp;uuml;r den jeweiligen Compiler ben&amp;ouml;tigt. Zu Testzwecken hab ich das erst mal mit der fest implementierten Sprache BlitzMax umgesetzt. Sp&amp;auml;ter folgt dann per LUA noch Bismuth und vielleicht auch noch Monkey, wobei ich darin so &amp;uuml;berhaupt keine Aktien habe.&lt;br /&gt;C-Dialekte werden wahrscheinlich erst mal nicht compilierbar sein. Denn damit hab ich definitiv zu wenig Erfahrung. Den Kopf k&amp;ouml;nnen sich andere machen... &lt;br /&gt;&lt;br /&gt;Die letzten paar Tage hab ich mich mal ein wenig intensiver mit dem Thema &amp;quot;Entk&amp;auml;fern&amp;quot; von Codes auseinander gesetzt. Dazu musste erst mal die NSOutlineViewDataSource Klasse korrigiert werden. Danach habe ich eine allgemein g&amp;uuml;ltige CEDebuggerView mit dazugeh&amp;ouml;rigem CEDebuggerStack (die DataSource f&amp;uuml;r die View) implementiert. Diese sieht momentan wie folgt aus:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120624_debugger.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Ob die so jetzt endg&amp;uuml;ltig ist wird die Zeit zeigen. Vielleicht fallen mir beim Implementieren anderer Sprachen auch noch andere Anforderungen ein. Auf jeden Fall kann man derzeit noch nicht in den Code springen, oder gar tiefer als einen Level debuggen. Icons fehlen auch noch und die Reihen-&amp;Uuml;berschriften sind auch noch eher fragw&amp;uuml;rdig.&lt;br /&gt;&lt;br /&gt;Auch auf dem Screen zu sehen ist der Changes-Tracker (In Ermangelung eines besseren Namens so betitelt!) Man kann ihn rechts neben der Zeilennummerierung bestaunen. Gr&amp;uuml;n hei&amp;szlig;t, die Zeile ist unbearbeitet, Orange hei&amp;szlig;t, die Zeile ist bearbeitet. Wirklich nichts wildes!&lt;br /&gt;&lt;br /&gt;Ein kleines Problem ist noch aufgetaucht: W&amp;auml;hrend ich frohen Mutes meine vier Kerne mit dem Rippen einer mir eigenen DVD qu&amp;auml;lte, habe ich bei 4x 100% CPU-Auslastung am Debugger gebastelt und mich beim kompilieren &amp;uuml;belst gewundert, dass die Ausgabe des Tasks so inkonsistent war. Mal kam nur eine Zeile in der STDERR Pipe an, dann kamen nur ein paar Zeilen... Da muss ich mir noch was einfallen lassen um das zu fixen. Vielleicht Buffern oder so. Mal sehen... Hab mich auch noch nicht schlau gemacht, ob das bei OSX normal ist.&lt;br /&gt;&lt;br /&gt;Wenn der Debugger dann soweit ist werde ich wohl mal anfangen mich mit dem Thema &amp;quot;Projekte&amp;quot; auseinander zu setzen. Irgendwann muss die leere, graue View (links auf dem Screen) ja mal verschwinden!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, anderes ist nicht passiert, denn ich habe meine Zeit eher mit dem Rippen meiner DVD-Sammlung verbracht, als mit Programmieren. Hab mir daf&amp;uuml;r endlich mal ein Herz gefasst. Aber auch nur, weil ich Filme per itunes jetzt direkt auf den Fernseher streamen kann *h&amp;uuml;stel*!&lt;br /&gt;&lt;br /&gt;Also dann: GUTE NACHT!</description>
			<pubDate>Sun, 24 Jun 2012 19:13:39 +0200</pubDate>
		</item>

		<item>
			<title>34 - Hundeklöten</title>
			<link>https://www.blitzforum.de/worklogs/479/#3555</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3555</guid>
			<author>d-bug</author>
			<description>Hall&amp;ouml;le,&lt;br /&gt;&lt;br /&gt;ein sch&amp;ouml;nes, langes Wochenende neigt sich dem Ende und ich habe es voll damit verbracht an ChaosEdit und cocoa.appkit rum zu schrauben. Gut das ich mit der IDE angefangen habe, sonst w&amp;auml;ren mir wohl so einige Bugs in den Modulen durch die Lappen gegangen:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Farben wurden direkt in eine NSNumber Klasse mit dem RGBA Wert in NSDictionary abgelegt. Ziemlich dumm, wenn man bedenkt das NSAttributedString die NSColor-Klasse direkt ben&amp;ouml;tigen. Hatte ich wohl wegen Scintilla so gemacht?!&lt;br /&gt;&lt;li&gt;Scintilla musste f&amp;uuml;r den vorherigen Punkt dann auch noch umgebaut werden.&lt;br /&gt;&lt;li&gt;NSTableViewDataSource funktionierte gar nicht! (NSOutlineDataSource tut es auch immer noch nicht)&lt;br /&gt;&lt;li&gt;NSTask kam neu dazu. Das ist quasi ein stabiler TProcess Ersatz f&amp;uuml;r Mac OS X. Ich habs nicht komplett eingebaut, aber die wichtigsten Sachen sind drin. (N&amp;auml;heres sp&amp;auml;ter)&lt;br /&gt;&lt;li&gt;NSSavePanel und NSOpenPanel fehlten auch noch komplett!&lt;br /&gt;&lt;li&gt;NSApplication: Die Methode endSheet musste immer zwei mal getriggert werden. Komische Sache, denn den Fehler hab ich immer noch nicht gefunden, allerdings konnte ich es durch einen Umbau fixen.&lt;br /&gt;&lt;li&gt;und... und... und...&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So, das waren mal die wichtigsten &amp;Auml;nderungen, denke ich. Aufgefallen sind sie bei:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120610_Close.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Lecker Closedialog, der die ganzen offenen und bearbeiteten Dokumente zusammen tr&amp;auml;gt. Hierbei fiel zumindest die Sache mit den Sheets und mit der NSTableViewDataSource auf.&lt;br /&gt;&lt;br /&gt;und bei:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120610_Konsole.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Lecker Konsole. Bestehend aus NSTask, NSTextField und NSTextView. Letztere braucht die Farben in NSAttributedString. (Der Screen erkl&amp;auml;rt auch den Titel des Worklog-Eintrags!)&lt;br /&gt;&lt;br /&gt;Die Konsole selbst kann mittels NSTask alle Terminal Befehle ausf&amp;uuml;hren. Sprich sp&amp;auml;ter auch den bmk. Der Task wird gestartet und triggert dann Delegate-Methoden wenns in der stdout pipe was neues gibt. stdin wird auch bereits unterst&amp;uuml;tzt, fehlt eigentlich nur noch stderr. Diese wird im Moment noch mit stdout zusammen gew&amp;uuml;rfelt.&lt;br /&gt;&lt;br /&gt;Trotzdem ist das NSTask um einiges einfacher zu handhaben als TProcess! Das hatte ich n&amp;auml;mlich vorher versucht und hab es mal wieder nicht hinbekommen. Am Ende war ich so leid, dass ich mich nach einer Alternative umschaute.&lt;br /&gt;&lt;br /&gt;Das wars auch mal wieder.&lt;br /&gt;&lt;br /&gt;Bis dann!</description>
			<pubDate>Sun, 10 Jun 2012 20:11:19 +0200</pubDate>
		</item>

		<item>
			<title>33 - Popover</title>
			<link>https://www.blitzforum.de/worklogs/479/#3553</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3553</guid>
			<author>d-bug</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;da NSPopover mit normalem BlitzMax nicht zu handhaben ist, die Gr&amp;uuml;nde daf&amp;uuml;r hatte ich ja schon breit gertreten, habe ich mich mal nach einer Alternative umgeschaut. Ausl&amp;ouml;ser war die verkorkste Implementation der CallTips im Cocoa scintilla.framework. Diese reagieren weder auf das setzen des Styles noch werden sie gescheit ein-oder ausgeblendet.&lt;br /&gt;&lt;br /&gt;Wie dem auch sei, ich fand schlie&amp;szlig;lich die MAAttachedWindow Klasse. Mit ein Bisschen Design und Spucke kann man aus der einen ziemlich guten NSPopover Ersatz machen!&lt;br /&gt;&lt;br /&gt;Das ganze sieht dann so aus:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120603_CEQuickHelp.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Au&amp;szlig;erdem hab ich noch einen ganzen Haufen virtuelle KeyCodes in Konstanten packen m&amp;uuml;ssen. Bin mal gespannt, ob die nach dem Entfall von Carbon noch g&amp;uuml;ltig sind. Die stammen n&amp;auml;mlich alle noch von dort.&lt;br /&gt;&lt;br /&gt;In ChaosEdit selbst ist nicht viel passiert. Ich hab tats&amp;auml;chlich 2 Tage gebraucht um das Popover-Ged&amp;ouml;ns zu implementieren und mit Content zu versehen. So viel zum Thema Motivation. Da ich ja unter der Woche nichts mehr mache, wars das dann auch schon wieder.&lt;br /&gt;&lt;br /&gt;Als n&amp;auml;chstes muss ich mir mal eine gute L&amp;ouml;sung zum parsen der Keywords einfallen lassen. Momentan ratter ich da einfach nur die commands.txt aus dem BlitzMax/docs/html/Modules Ordner durch. Diese enth&amp;auml;lt aber keinerlei Informationen &amp;uuml;ber den Typ des Keywords. Typ im Sinne von: &amp;quot;Ist es ein Type, eine Funktion oder etwa eine Methode?&amp;quot;. Wenn ich nun die ganzen Module durchrattern w&amp;uuml;rde, dann w&amp;uuml;rde das ewig dauern. Das kann man ein mal machen, aber nicht bei jedem Start der IDE. Da w&amp;uuml;rde man schon auf Dauer etwas ungehalten werden, wenn man die IDE startet, denke ich. Da das im Moment noch nicht geht, ist das Icon auf dem Bild, oben, auch noch falsch!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cheers &lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Sun, 03 Jun 2012 17:31:34 +0200</pubDate>
		</item>

		<item>
			<title>32 - Hurra, wir leben noch!</title>
			<link>https://www.blitzforum.de/worklogs/479/#3551</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3551</guid>
			<author>d-bug</author>
			<description>Hallo zusammen,&lt;br /&gt;&lt;br /&gt;als Beweis daf&amp;uuml;r, dass hier noch flei&amp;szlig;ig weiter gearbeitet wird, schreibe ich heute mal wieder einen Eintrag.&lt;br /&gt;&lt;br /&gt;Eigentlich k&amp;ouml;nnte man sagen, dass ich derzeit eine Leiche ausgrabe und ihr frische Gew&amp;auml;nder anziehe! Als Fallstudie zu den Cocoa Modulen habe ich n&amp;auml;mlich begonnen ChaosEdit aufzufrischen, bzw. zu klonen!&lt;br /&gt;&lt;br /&gt;Momentan sieht das ganze so aus, dass ich ein paar Zeilen an ChaosEdit schreibe und je nach Aufkommen von Bugs, Optimierungsbedarf und Buggies-Hirnrissen die Module fixe und optimiere. Zum Beispiel ist mir beim zusammen hexen eines Bezels, nebst ein/ausfaden, aufgefallen, dass die ganzen Float und Double &amp;Uuml;bergaben an Cocoa gar nicht funktionieren. Das lag wohl an unzureichender Kenntnis der libobjc. Es bedurfte wieder einiger Stunden Googelei um den n&amp;ouml;tigen Fix zu finden, aber ich habe es letztendlich geschafft.&lt;br /&gt;&lt;br /&gt;Mal kurz ein Screen vom ganzen, damits nicht so langweilig wird...&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120528_ChaosEdit.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Die Chrome-Tabs sind &amp;uuml;brigens ein Style der PSMTabbar, denn ich da noch rein gehackt habe. Falls sich jemand fragt, was die &amp;quot;'#pragma mark ...&amp;quot; Kommentare da sollen: Die machen lustige Sachen mit der CodeTree f&amp;uuml;r diesen Code. Die mit dem &amp;quot;-&amp;quot; macht einen Separator und die andere macht einen Men&amp;uuml;-Eintrag, der quasi als &amp;Uuml;berschrift gilt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;N&amp;auml;chster Punkt w&amp;auml;re der Stein der die neue Version der Module ins rollen brachte. Vielleicht habt ihr euch bereits gefragt, wozu man denn riesige Texte durchwuseln will um daraus ein Men&amp;uuml; zu basteln:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120528_CECodeTree.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Na klar, der alte Sack bastelt in ChaosEdit wieder eine CodeTree nach Vorlage der &amp;auml;lteren XCode IDE!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gestern habe ich dann das Scintilla Modul auf den neusten Stand gebracht. Eigentlich war nichts berauschendes bei den Updates dabei, au&amp;szlig;er einer kleinen Sache: Wer OSX kennt, wei&amp;szlig; des w&amp;auml;hrend einer Textsuche ind Safari oder XCode die Treffer mit gold/gelb hinterlegt werden. Das ging zwar schon seit langem auf eine eher abgespeckte Weise mittels Indicatoren, kann aber nun seit Scintilla 3.1.0 auch in sch&amp;ouml;n dargestellt werden:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120528_SexyMatches.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;(Hier bei der Suche nach &amp;quot;Scintilla&amp;quot; geschnappt)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vorgestern hatte ich dann noch angefangen den NSTextFinder f&amp;uuml;r Scintilla zu klonen. Daraus entstand dann heute ein tiefer Eingriff in das Scintilla Modul! Erst hatte ich die Suche in ein eigenes Modul packen wollen, hatte mich aber heute Morgen dagegen entschieden und angefangen es direkt ins Scintilla Modul zu integrieren. Daraus erfolgte, dass aus der eigentlich SCNScintillaView jetzt eine Art Container-Klasse wurde die den TextFinder und eine niegel nagel neue, private ScintillaView Klasse enth&amp;auml;lt. Gott sei dank, hatte ich zum senden der Scintilla Methoden bereits eine eigene Methode implementiert, die von jeder anderen Methode, sei es nun Getter oder Setter, angesprungen wurde. So brauchte ich nur noch diese eine Methode zu &amp;auml;ndern.&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://d-bug.chaos-interactive.de/data/cocoa_modul_series/120528_SCNTextFinder.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;Wie man sieht fehlt da wohl noch das ganze Replace Zeugs!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Abschlie&amp;szlig;end noch ein paar warme Worte zur IDE:&lt;br /&gt;Sicherlich wird sich das UI das ich hier zeigte noch zig mal &amp;auml;ndern. Z.B. bin ich von den Chrome-Tabs nicht so hundert prozentig &amp;uuml;berzeugt, m&amp;ouml;chte die Tabs aber gerne in der Titlebar des Fensters behalten. Gestern hab ich ne Mail von Panic &amp;uuml;ber Coda 2 bekommen. Das brachte mich da auf eine Idee...&lt;br /&gt;&lt;br /&gt;Nat&amp;uuml;rlich fehlen da noch tonnenweise Features, wie z.B. so vernachl&amp;auml;ssigbare Sachen wie &amp;quot;Kompilieren&amp;quot;! Wer braucht denn auch so was?! Der Fortschritt an ChaosEdit h&amp;auml;ngt von meiner Laune ab. Mal hab ich da gar keinen Bock drauf, mal hab ich keine Zeit... Dann bleibt es eben mal ein/zwei Wochen liegen.&lt;br /&gt;&lt;br /&gt;Ich schreibe ChaosEdit eigentlich zur Zeit nur zum Testen der Module und um sp&amp;auml;ter einen gescheiten, erweiterbaren Editor f&amp;uuml;r mich zu haben. Ob ich das Ding unters Volk werfe ist unklar, nachdem ich der letzte eher ein Disaster war. Selbst wenn ich ihn ver&amp;ouml;ffentliche, dann nur als abgespeckte Version von meiner pers&amp;ouml;nlichen IDE, die ich zuvor unter h&amp;auml;rtesten Umweltbedingungen getestet habe. Warum der Unterschied? Ganz einfach, Ich hab da n&amp;auml;mlich so ein paar Features im Sinn, die eher mit meinen privaten Engines und dergleichen zu tun haben.&lt;br /&gt;&lt;br /&gt;Wenn einem eine gescheite L&amp;ouml;sung f&amp;uuml;r PlugIns einf&amp;auml;llt, die nichts mit Lua zu tun hat, dann immer her damit. Momentan habe ich zumindest schon eine Schnittstelle f&amp;uuml;r Lexer-Abh&amp;auml;ngige Dingenses per Lua realisiert!&lt;br /&gt;&lt;br /&gt;So, genug Geschafel!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
			<pubDate>Mon, 28 May 2012 19:27:35 +0200</pubDate>
		</item>

		<item>
			<title>31 - Das Grauen hat zwei Namen...</title>
			<link>https://www.blitzforum.de/worklogs/479/#3539</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3539</guid>
			<author>d-bug</author>
			<description>...&lt;b&gt;NSTableView&lt;/b&gt; und &lt;b&gt;NSOutlineView&lt;/b&gt;! *grusel*&lt;br /&gt;&lt;br /&gt;Zumindest sind die beiden Klassen mein pers&amp;ouml;nliches Grauen, mit dem ich aber soeben abgeschlossen habe! Da sie ja nicht lauff&amp;auml;hig sind, wenn man nicht zumindest die dazugeh&amp;ouml;renden Klassen und Protokolle mit wrappt, artet das ganze gleich in eine riesen Schlammschlacht aus. Bis auf die Sortierung der Eintr&amp;auml;ge habe ich diese allerdings gewonnen! Mit der NSSortDescriptor Klasse, die zum Sortieren notwendig ist, lieg ich noch ein Bisschen im Klinsch, aber auch die krieg ich noch klein, JAWOLL!&lt;br /&gt;&lt;br /&gt;Momentan habe ich mich allerdings, zur Entspannung, auf die NSFontManager Klasse gest&amp;uuml;rzt.&lt;br /&gt;&lt;br /&gt;Zeit f&amp;uuml;r ein kleines Update der Liste:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Include &amp;quot;classes/nslevelindicator.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nslevelindicatorcell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstableview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstableheaderview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstablecolumn.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstableviewdatasource.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsindexset.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsoutlineview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsoutlineviewdatasource.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdragginginfo.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdraggingsource.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdraggingdestination.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdraggingsession.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nspasteboardwriting.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsaffinetransform.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsfontdescriptor.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsfontmanager.bmx&amp;quot;[/syntax]&lt;br /&gt;&lt;br /&gt;Btw. hat das Grauen noch mehr Namen! Ein weiterer Name w&amp;auml;re &lt;b&gt;BlitzMaxIstTotalVeraltetMitSeinemSnowLeopardSDK&lt;/b&gt;! So kommt es mir zumindest vor. Manche feinen Neuerungen aus dem 10.7 SDK k&amp;ouml;nnen einfach nicht realisiert werden. NSPopover z.B., oder die Vereinfachung des Drag&amp;amp;Drop Gedingsels. Bei letzterem wurde es dann auch schwierig die alte Dokumentation zu finden, weil Apple sie teilweise vom Server gefegt hat. Es gibt noch ein paar andere Features von Lion die nicht umgesetzt werden k&amp;ouml;nnen - z.B. NSTextFinder oder View-basierende TableViews.&lt;br /&gt;&lt;br /&gt;Fullscreen-Support funktioniert allerdings tadellos. Wahrscheinlich, weil Apple hier nur vorhandene Methoden mit neuen Konstanten f&amp;uuml;ttert. Die dazu geh&amp;ouml;renden Notifications funktionieren sowieso immer. :&amp;gt;&lt;br /&gt;&lt;br /&gt;Wie auch immer, sollte Mark sich nicht dazu entscheiden auf die neue SDK umzusteigen, sehe ich keine gro&amp;szlig;e Zukunft mehr in BlitzMax auf dem Macces. Ich nehme sogar an, dass es durch den kompletten Wegfall von Carbon in Mountain Lion schon gar nicht mehr funktionieren wird. Warten wir einfach mal ab was die Zukunft bring.&lt;br /&gt;&lt;br /&gt;Ich mach trotzdem mal so weiter wie bisher!&lt;br /&gt;&lt;br /&gt;Gru&amp;szlig;e</description>
			<pubDate>Sun, 13 May 2012 17:25:45 +0200</pubDate>
		</item>

		<item>
			<title>30 - AAAAAAAAAAAAARGGGGLLLL</title>
			<link>https://www.blitzforum.de/worklogs/479/#3531</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3531</guid>
			<author>d-bug</author>
			<description>Hallo,&lt;br /&gt;&lt;br /&gt;wie dumm kann ein Mensch alleine eigentlich sein? Also von mir kann ich jedenfalls mit Fug und Recht behaupten, dass ich einfach nur noch dumm bin! Ich hatte ja im letzten Post geschrieben, dass ich bei der Bug-Suche diverse Vorgehensweisen durch gespielt und durch getestet hatte... Nur eines hatte ich nie getan und auch nie vermutet:&lt;br /&gt;Es gab da einen Aufruf namens scintilla.lineString(line) in einer For/Next Schleife. Dieser sollte mir eigentlich nur beim Iterieren der Schleife eben immer sch&amp;ouml;n die zur line passenden Text in eine Variable packen, damit ich diese weiter verarbeiten kann. Hat es ja auch gemacht! Dummerweise muss aber in der Methode lineString der String vom CString (nein, kein NSString) in ein BBString konvertiert werden und den Speicher wieder freigegeben werden. Jetzt ratet mal warum die letzte Version 12Sek gebraucht hat. :&amp;gt;&lt;br /&gt;&lt;br /&gt;Memo an den zuk&amp;uuml;nftigen User: Lieber vor der Schleife den gesammten Text in ein String[] parken! Geht vieeeel viel schneller!&lt;br /&gt;&lt;br /&gt;Nachdem ich das ge&amp;auml;ndert hatte, hat sich nun der Speed drastisch erh&amp;ouml;ht! Bei den getesteten 150 Men&amp;uuml;eintr&amp;auml;gen, kam ich nun auf 80ms! Das ist sogar deutlich schneller als MaxGUI bzw. CocoaExt. Wobei ich aber f&amp;uuml;r die Zahlen keine Gew&amp;auml;hr &amp;uuml;bernehme, weil ich nicht wei&amp;szlig;, was bei Tests noch im Hintergrund abging.&lt;br /&gt;&lt;br /&gt;Jetzt ist es aber eh zu sp&amp;auml;t um alles wieder R&amp;uuml;ckg&amp;auml;ngig zu machen! Ich bin mit der neuen Version in manchen Bereichen schon wesentlich weiter als ich es mit der alten war. Daf&amp;uuml;r fehlen eben aber auch noch so Hammer-Controls wie NSTextView, NSTableView, NSOutlineView und noch ein paar kleinere wie NSScrollView, NSOpenGLView usw. Was ich allerdings wieder einbaute ist brl.reflections! Da der Schuldige ja nun anderweitig gefunden wurde, hab ich mich offiziell bei Mr.Reflection entschuldigt und ihn wieder in mein Modul-Team aufgenommen!&lt;br /&gt;&lt;br /&gt;Also sind Actions nun wieder Methoden, Delegates, Notifications und eigene Actions werden nicht mehr vorgefertigt, sondern k&amp;ouml;nnen vom Programmierer bei Bedarf im Controller oder in Subklassen implementiert werden usw.&lt;br /&gt;&lt;br /&gt;Kurze Liste des aktuellen Gadget Standes (kopiert aus der include Phase des Moduls (man ist ja faul)):&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Include &amp;quot;classes/nsobject.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsgraphicscontext.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nserror.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdata.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsurl.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdictionary.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsattributedstring.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsnumber.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsvalue.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdate.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscolor.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscolorlist.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscolorspace.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsfont.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsimage.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsnotification.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsnotificationcenter.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsevent.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsresponder.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsapplication.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscursor.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nslayoutconstraint.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstrackingarea.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nspasteboard.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nspasteboarditem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nspasteboarditemdataprovider.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsfilewrapper.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsscreen.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscontrol.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsactioncell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsshadow.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsclipview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsscrollview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsmenu.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsmenuitem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsmenuitemcell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nswindow.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nspanel.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscolorpanel.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstext.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsformatter.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsbutton.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsbuttoncell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nspopupbutton.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nspopupbuttoncell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssound.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdocktile.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsdrawer.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstoolbar.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstoolbaritem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nswindowcontroller.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsundomanager.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssplitview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstabview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstabviewitem.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsimageview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstextview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsuserdefaults.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsbox.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscolorwell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstextfield.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstextfieldcell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssecuretextfield.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssecuretextfieldcell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssearchfield.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssearchfieldcell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstokenfield.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nstokenfieldcell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsanimation.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsviewanimation.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsstepper.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssteppercell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsslider.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsslidercell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsscroller.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsgradient.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsbezierpath.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nscharacterset.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssegmentedcontrol.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nssegmentedcell.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsrulerview.bmx&amp;quot;&lt;br /&gt;Include &amp;quot;classes/nsrulermarker.bmx&amp;quot;[/syntax]&lt;br /&gt;Dies sind noch nicht alle 100%ig fertig, aber schon mal als Klasse implementiert, um aus anderen Klassen darauf zugreifen zu k&amp;ouml;nnen...&lt;br /&gt;&lt;br /&gt;Die Todo-Liste muss ich euch nicht vorf&amp;uuml;hren, da die sich eigentlich st&amp;uuml;ndlich verl&amp;auml;ngert, wenn ich am programmieren bin. Wie man sieht habe ich keinen Masterplan sonder hacke wild vor mich hin!&lt;br /&gt;&lt;br /&gt;Die Kompilier-Zeit des cocoa.appkit Moduls (ja, so hei&amp;szlig;t es nun...) k&amp;ouml;nnte am Ende genau so lang sein  wie die von wxMax! Dauert jetzt schon ziemlich. :&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Gr&amp;uuml;&amp;szlig;e!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; P.S: cocoa.psmtabbarcontrol und cocoa.scintilla sind auch schon fertig!</description>
			<pubDate>Wed, 02 May 2012 20:07:10 +0200</pubDate>
		</item>

		<item>
			<title>29 - Back to the roots</title>
			<link>https://www.blitzforum.de/worklogs/479/#3518</link>
			<guid>https://www.blitzforum.de/worklogs/479/#3518</guid>
			<author>d-bug</author>
			<description>Hallo zusammen,&lt;br /&gt;&lt;br /&gt;eigentlich dachte ich cocoa.cocoa w&amp;auml;re so gut wie abgeschlossen und startete einen umfangreichen Test zum Thema Kompatibilit&amp;auml;t, allgemeines Zusammenspiel und dergleichen. Das h&amp;auml;tte ich mal lassen sollen, denn dann k&amp;ouml;nnte ich mit ruhigem Gewissen irgend etwas anderes machen!&lt;br /&gt;&lt;br /&gt;Als ich versuchte ein gr&amp;ouml;&amp;szlig;eres Textfile (den ScintillaView code) einzulesen, auszuwerten und f&amp;uuml;r jede Funktion, jedes Type, jede Methode, jede Konstante und jede Globale einen Men&amp;uuml;-Eintrag zu kreieren kam die gro&amp;szlig;e Ern&amp;uuml;chterung. 12000ms! Wir reden hier vom Erstellen von gef&amp;uuml;hlten 150 Eintr&amp;auml;gen (keine Ahnung, habs nicht nachgez&amp;auml;hlt)... 12sek bei einem Men&amp;uuml;, was vor dem &amp;Ouml;ffnen neu aufgebaut werden muss ist schon ziemlich happig...&lt;br /&gt;&lt;br /&gt;Das wollte ich so nicht auf mir sitzen lassen und hab das ganze mit CocoaExt noch mal nachprogrammiert... 100ms! Immer noch lahm, aber doch deutlich schneller als cocoa.cocoa! Also ran ans Werk und Bremsen gesucht. Zwei bis drei Tests sp&amp;auml;ter, lieg ich immer noch bei 11000ms! Jetzt wei&amp;szlig; ich erst mal keinen Rat mehr. Ich meine, ich hab nun wirklich nicht den lahmsten Mac der Welt, also kann ich das schon mal ausschlie&amp;szlig;en. Ich will gar nicht wissen wie lange das auf meinem MacBook brauchen w&amp;uuml;rde. Meine Vermutungen gehen ganz stark zum &amp;uuml;berm&amp;auml;&amp;szlig;igen Einsatz des brl.reflections Modul. Das hat ja ohnehin den Ruf eine absolute Schnecke unter den Seinen zu sein. Da ich sogar beim Erstellen von Gadgets damit hantiere denke ich mal, dass es daran liegen mag.&lt;br /&gt;&lt;br /&gt;Aus Trotz hab ich jetzt angefangen das ganze System umzubauen. Neben dem konsequenten Verzicht auf brl.reflections habe ich auch damit begonnen die ganzen Variablen-und Typenamen wieder mit NS (NextStep) beginnen zu lassen. Noch dazu halte ich mich nun weitestgehend an die original Methoden-Namen (eben bis auf die Doppelpunkte). Daf&amp;uuml;r verzichte ich allerdings auf das Copy-Paste-Spektakel beim erstellen der Dokumentation. Diese wird es nun nicht mehr geben, immerhin gibt es die ja auf &lt;a href=&quot;https://developer.apple.com/&quot; target=&quot;_blank&quot;&gt;developer.apple.com&lt;/a&gt; quasi vorgefertigt und geschenkt! Die Notifications und Delegates, die vorher per Reflections gesucht und ausgef&amp;uuml;hrt wurden sind nun im Basis-Type (NSObject) schon integriert. Actions werden nun als Function-Callbacks &amp;uuml;bergeben, haben daf&amp;uuml;r aber einen Parameter mehr als das original. W&amp;auml;hrend in der alten Version eine Action so aussah:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Method action(sender:CCObject)&lt;br /&gt;    'mach was tolles&lt;br /&gt;End Method[/syntax]&lt;br /&gt;Sieht sie jetzt eben so aus:&lt;br /&gt;[syntax=&amp;quot;bmax&amp;quot;]Function action(target:NSObject, sender:NSObject)&lt;br /&gt;    'mach was total tolles&lt;br /&gt;End Function[/syntax]&lt;br /&gt;Dies war n&amp;ouml;tig um die Actions auch an den passenden Pl&amp;auml;tzen unterbringen zu k&amp;ouml;nnen. Bei den Vorgefertigten wird da n&amp;auml;mlich eine Methode nach Objective-C gebeamt. Das funktioniert aber nur, wenn ich den pointer des targets habe. Da man bei Funktionen so schlecht auf Self zur&amp;uuml;ckgreifen kann, hab ich eben den Parameter target:NSObject dazu geschmiert. St&amp;ouml;rt ja auch nicht weiter, finde ich...&lt;br /&gt;&lt;br /&gt;Zwischenzeitlich habe ich noch versucht die libobjc nebst &lt;a href=&quot;https://github.com/nilium/pub.objectivec&quot; target=&quot;_blank&quot;&gt;Wrapper von Nilium&lt;/a&gt; zu implementieren um weitestgehend auf das hin-und-her schieben von Funktions-Pointern zu verzichten, aber das scheiterte bereits beim ersten Struct. Ich bin, glaube ich, noch immer nicht gut genug um NSRect mittels objc_msgSend_stret und MemCopy direkt in ein Array oder Type auszulesen! Zumindest scheiterte es genau daran!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Momentaner Stand der Dinge:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;NSObject wird zum Dauerl&amp;auml;ufer und erst gegen Ende fertig&lt;br /&gt;&lt;li&gt;NSResponder: Events funktionieren schon mal!&lt;br /&gt;&lt;li&gt;NSEvent: fertig (Alles geht eh nicht,  da BMax keine unsigned Datentypen unterst&amp;uuml;tzt (oder?))&lt;br /&gt;&lt;li&gt;NSColor: fertig&lt;br /&gt;&lt;li&gt;NSDate: fertig (die gabs nicht mal in der letzten Version ...)&lt;br /&gt;&lt;li&gt;NSNumber: fertig (ebenfalls ohne unsigned Datentypen)&lt;br /&gt;&lt;li&gt;NSValue: fertig&lt;br /&gt;&lt;li&gt;NSImage: fertig&lt;br /&gt;&lt;li&gt;NSDictionary: Bis die Daten-Typen-Integration auch fertig. Die w&amp;auml;chst mit dem Modul.&lt;br /&gt;&lt;li&gt;NSNotification: fertig (Die Ausf&amp;uuml;hrende Funktion mal nicht eingerechnet)&lt;br /&gt;&lt;li&gt;NSApplication: ca. 50%&lt;br /&gt;&lt;li&gt;NSMenu: fertig&lt;br /&gt;&lt;li&gt;NSMenuItem: fertig&lt;br /&gt;&lt;li&gt;NSWindow: ca. 5%&lt;br /&gt;&lt;li&gt;NSSchlagMichTot: Also alles andere ... noch nicht mal begonnen! (Bin ja auch erst 2 Tage dran)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mit kurzen Worten: Alles begann von vorne! Geht aber schneller voran, da die Dokumentations-Kopiererei flach f&amp;auml;llt!&lt;br /&gt;&lt;br /&gt;Gr&amp;uuml;&amp;szlig;e&lt;br /&gt;&lt;br /&gt;buggy</description>
			<pubDate>Tue, 10 Apr 2012 23:45:39 +0200</pubDate>
		</item>


	</channel>
</rss>
