Fischer-Bayern.de
Letztes Update: 12.01.2005 | 1:00:02 Uhr
Droplet/Applet-Kombination 
Peter Fischer


Dieser Artikel behandelt ein Problem, das mit AppleScript-Studio auftritt. Bisher konnten wir ein Skript so gestalten, dass es sowohl als Applet als auch als Droplet funktioniert hat. D.h. es konnte per Doppelklick gestartet werden oder es wurde dadurch gestartet, dass man Dateien und/oder Ordner auf das Skript-Icon gezogen hat.

Dies wurde ermöglicht, indem man einen "on run"-Handler (für den Start per Doppelklick) und einen "on open"-Handler in das Skript integrierte.

Vielleicht kommt Ihnen die Thematik schon bekannt vor. Wer in der AppleScript-Studio-Mailingliste eingetragen ist, hat dort sicherlich mein Posting schon entdeckt:

Mein Original-Posting

Dieses Posting wurde dann auch auf einer englischsprachigen Website, die sich mit AppleScript-Studio befasst, aufgegriffen:

AppleScript-Studio Log


Aber es kann ja nicht schaden, dieses Thema noch einmal in Deutsch zu lesen.



Beginnt man ein neues Projekt in 'Project Builder', muss man sich entscheiden, ob daraus eine AppleScript Application oder ein AppleScript Droplet werden soll. Eine Kombination aus beiden ist also nicht so ohne Weiteres möglich. - Es ist aber nicht unmöglich!


Ich hatte zunächst auch versucht, eine AppleScript Application nachträglich mit einem 'on open'-Handler zu versehen. Dieser wurde jedoch stets ignoriert. - Man konnte keine Objekte auf das Skript ziehen. Also suchte ich nach einem Weg, ein Droplet dazu zu bringen, nach dem Start per Doppelklick eine Reaktion zu zeigen.

Man muss dazu ein Projekt als AppleScript Droplet anlegen und nachträglich einen 'on launched'-Handler hinzufügen. Dieser wird dann vom Skriptprogramm richtig erkannt.



Grundsätzliche Überlegungen:

Warum braucht man eine Kombination aus Droplet und Applet? Nun, in der Vergangenheit wurde diese Kombination oft dazu benutzt, spezifische Einstellungen eines Droplets zu ändern, indem man es per Doppelklick gestartet hatte und so einen Dialog o. ä. präsentiert bekam. Das Droplet selbst ist ja in der Regel dazu konzipiert, im Hintergrund und ohne Interface seine Arbeit zu verrichten. Aber auch wenn das Programm ein Interface erfordert, bietet ein Droplet einen Vorteil: Man kann darauf mehrere Ordner ziehen, wogegen in einem Applet nur die Auswahl einer einzelnen Datei oder eines einzelnen Ordners möglich ist (außer man benutzt eine OSAX, die eine Mehrfachauswahl ermöglicht).

Mit meiner, hier beschriebenen Methode stehen uns alle Wege offen. Wollen wir mal davon ausgehen, dass wir bei der Benutzung als Droplet kein Interface benötigen und beim Applet dagegen schon.

Das Droplet kann ja leicht ohne Interface auskommen - Dateien oder Ordner werden darauf gezogen und verarbeitet.

Starten wir das Programm per Doppelklick, stehen ihm keine Werte zur Verfügung. - Was soll es denn bearbeiten? Hier brauchen wir ein Interface zur Kommunikation!

Wir erstellen also in Interface Builder das benötigte Fenster. Damit es nicht beim Droplet-Start (Drag & Drop) erscheint, muss in der Info-Palette des Interface Builders die Option "Visible at launch time" deaktiviert sein.



Wie ich bereits weiter oben beschrieben habe, fügen wir dem Skript einen 'on launched'-Handler hinzu. In diesem Handler muss nun entschieden werden, ob das Fenster geöffnet werden soll, oder ob es geschlossen bleibt.

Meine Idee war es nun, eine Liste zu definieren.
property InternList : {}


Falls das Skript als Droplet gestartet wird, werden die Referenzen zu den, auf das Skript gezogenen Dateien oder Ordnern an diese interne Liste übergeben. Die Liste enthält also gleich nach dem Programm-Start Werte.
on open theFileList
   set InternList to theFileList
end open

Starten wir das Skript per Doppelklick, kann diese Liste nichts enthalten. Das ist die Chance für uns, den weiteren Programmverlauf zu beeinflussen.

Im 'on launched'-Handler werden also diese Möglichkeiten überprüft.

on launched theObject
   if InternList = {} then
      set visible of window "Name_of_your_Mainwindow" to true
   else
      -- statements for processing the files or folders
   end if
end launched

Das definierte Fenster wird also nur sichtbar gemacht, wenn die interne Liste leer ist. Das war eigentlich schon der ganze Trick bei der Sache. Man kann so also im Skript genau definieren, wann das Fenster erscheinen soll. Dadurch stehen uns sehr viele Möglichkeiten offen.

Panther-Benutzer, die mit XCode arbeiten, sollten statt des "on launched"-Handlers den Handler "on activated" benutzen, damit das Skript erwartungsgemäß funktioniert. (Vielen Dank an Matthias Giesel für diesen Hinweis) Falls Sie noch Fragen zur Thematik haben, steht Ihnen das AppleScript-Forum jederzeit zur Verfügung.

Ein Beispiel-Projekt können Sie hier herunter laden:

Beispiel-Projekt

Beispiel-Projekt fŸr XCode



In der Hoffnung, etwas hilfreich gewesen zu sein

Peter Fischer



 

 

Workshop



snow@fischer-bayern.de

Ebene 1