• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Der Frühling ist auch in den eingesandten Fotos deutlich zu erkennen. Zeigt uns, wer Euer Favorit ist! hier geht es lang für Euer Voting --> Klick

Standardzeilen für jedes Droplet

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
320
Hallo liebe Apfelskripter! Häufig möchte ich an Droplets noch irgendetwas ändern und habe mir nun gedacht, ich schlage gleich zwei Fliegen mit einer Klappe: Jedem Droplet stelle ich ein paar Zeilen voran, die mich bei einem Doppelklick auf dasselbe einerseits darauf hinweisen, dass es ein Droplet ist und andererseits (und das ist die wichtigere Funktion) das Droplet im Editor öffnen. Ich habe es folgendermaßen gelöst:

Code:
on run
    display dialog "Dies ist ein Droplet, bitte Ordner oder Dateien daraufziehen." & linefeed & linefeed buttons {"Edit", "OK, ich hab's verstanden"} default button 2 with icon 0
    
    if button returned of result = "Edit" then
        set myItem to (path to me)
        
        if application "Script Editor" is running then
            tell application "Script Editor"
                activate
                open myItem
            end tell
            
        else
            
            tell application "Script Editor"
                activate
                close window "Ohne Titel"
                open myItem
            end tell
            
        end if
        
    end if
end run

on open
    -- hier steht drin, was das eigentliche Droplet machen soll
end open

Das ist alles nicht besonders spektakulär, vielleicht sogar viel zu kompliziert gedacht und gemacht, aber es funktioniert für meine Zwecke - und ich bin froh, als AS-Anfänger mal wieder eine selbstgestellte Aufgabe erfolgreich gelöst zu haben :)

Falls aber jemand Verbesserungsvorschläge hat, würde ich mich freuen!

P.S: Ich nutze Leopard 10.5.8 auf deutsch. Der "display dialog" hat oben links eine rote "closebox", die bei Betätigung das Script abstürzen lässt, darüber habe ich schon einiges gelesen. Folgende Lösungsansätze habe ich aus verschiedenen Gründen verworfen:
- OS X Leopard in englischer Systemversion
- "display alert" statt "display dialog"
- "display dialog" via "Automator Runner"
- Modifikation in "/System/Library/ScriptingAdditions/StandardAdditions.osax/Contents/Resources/German.lproj/DisplayDialog.nib/objects.xib"

Habe ich irgendwelche Lösungsmöglichkeiten übersehen? Besteht das Problem auch in OS X Lion?
 

sedna

Schweizer Glockenapfel
Registriert
22.10.08
Beiträge
1.375
Hallo!

Wenn es für deine Zwecke funktioniert, dann ist es prima!
Verbesserungsvorschläge hätte ich keine :)

Lösungsmöglichkeiten hast du im Prinzip auch nicht übersehen. Im Gegenteil, gute Recherche!
...wobei...

Ich gehe davon aus, dass du nicht im System herumwurschteln willst, was ich verstehen kann und hier auch niemals jemanden empfehlen würde... allerdings ist das sozusagen ein Sonderfall und du würdest nur einen Fehler korrigieren (der übrigens in Lion mittlerweile gefixt ist).
Alle weiteren Ansätze wirst du eventuell aus ästhetischen Gründen verwerfen. Stehst du auf das Alert Stop Icon?
Angenommen, dem ist so, dann könnte man was basteln. Bevor ich lange schreibe, hänge ich mal eine Variante an.

Gruß




 

Anhänge

  • MyDroplet.app.zip
    41,4 KB · Aufrufe: 60

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
320
Hallo & Danke! Das ist mal wieder eine sehr willkommene Bereicherung :)

Dass der "closebox-bug" in Lion behoben ist, freut mich. Von einer Modifikation in meinen 10.4.11 Tiger- und 10.5.8 Leopard-Systemen habe ich Abstand genommen, da ich so vergesslich bin, dass ich bei einem (eigenen oder fremden) dritten Mac oder einer Systemneuinstallation vermutlich nicht mehr an diesen Eingriff denken würde. Ganz zu schweigen davon, dass es doch recht kompliziert ist, beispielsweise ein Droplet zu Weihnachten zu verschenken und dem Empfänger zugleich mitteilen zu müssen, dass er erst mal mit Administratorrechten sein System bearbeiten muss.

Das Icon "stop" finde ich nicht wirklich attraktiv, jedoch ist es bei den für den "display dialog" zur Verfügung stehenden Symbolen meine erste Wahl - aber in Deiner Lösung lässt sich ja mit durchaus überschaubarem Aufwand ein eigenes Icon einfügen. Allerdings erscheint beim "display alert" der Cursor als nichtdrehendes schwarzweisses kreisförmigen Zeichen, aus ästhetischen Gründen ist mir da wiederum der ganz normale pfeilförmige Mauszeiger aus dem "display dialog" lieber. Nicht dass ich etwas gegen den Münchener Automobilhersteller hätte, an dessen Logo mich das Symbol erinnert, aber mich irritiert, dass der Kreis sich nicht dreht - kommt vielleicht häufiger vor, ist mir jedoch noch nie aufgefallen.

Alles in allem ergeben sich aber zwei Fragen:

Unter Tiger kann ich Dein Droplet nicht verwenden, lässt sich das modifizieren oder ist das schlichtweg unmöglich? Habe recherchiert und probiert, bin aber zu keinem Ergebnis gekommen.

Und unter Leopard (Skripteditor 2.2.1, Intel) lässt sich der Bundle-Inhalt nicht einblenden, was unter Tiger (Skripteditor 2.1.2, PowerPC) problemlos geht. Woran liegt das denn nun schon wieder, verflixt noch mal...
 

sedna

Schweizer Glockenapfel
Registriert
22.10.08
Beiträge
1.375
Hmm, stimmt....
Da gab es einige Veränderungen!
Hier erst mal ein Link: Klick

Und was die Erinnerung noch hergibt:
In Leopard wurde zwischen Programm und Programm Bundle unterschieden. Ein Skript muss als Programm Bundle gespeichert sein, um auf den Bundle-Inhalt zugreifen zu können.
Wie das in Tiger war, weiß ich nicht mehr :eek:
Ansonsten auch noch mal hier schauen: Klick

Gruß
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
Warum einfach wenn's auch kompliziert geht?
Ähm... *lol*.


Hier (aus Spaß) ein Pimp:
Code:
[B]on[/B] [B]run[/B]
    [B]set[/B] goDoStuff [B]to[/B] runAction()
    [B]if[/B] [B]not[/B] goDoStuff [B]is[/B] false [B]then[/B] doStuff(goDoStuff)
[B]end[/B] [B]run[/B]




[B]on[/B] [B]open[/B] droppedItems
    doStuff(droppedItems)
[B]end[/B] [B]open[/B]




[B]on[/B] doStuff(droppedItems)
    -- hier steht drin, was das eigentliche Droplet machen soll
    
    (*
    repeat with aItem in droppedItems
        -- jedes dropling enzeln verarbeiten
        log aItem
    end repeat
    *)
[B]end[/B] doStuff




[B]on[/B] runAction()
    [B]set[/B] dialogButtonsMap [B]to[/B] {chooseFile:"Ordner/Dateien auswählen", edit:"Edit", cancel:"OK, ich hab's verstanden"}
    -- muss man nem dialog als (items of dialogButtonsMap) übergeben. dialoge fressen keine maps, sondern listen
    
    [B]repeat[/B]
        -- lieber display alert. das kann man mit esc loswerden, wenn man cancel button definiert, 
        -- mit enter kriegt man den default und mit space immer den dritten
        [B]set[/B] alertButtonResult [B]to[/B] button returned [B]of[/B] ¬
            ([B]display alert[/B] ¬
                "Dies ist ein Droplet, bitte Ordner oder Dateien daraufziehen." & linefeed & linefeed ¬
                buttons ([I]items[/I] [B]of[/B] dialogButtonsMap) ¬
                default button 1 ¬
                cancel button 3 ¬
                as warning ¬
                )
        
        
        [B]if[/B] alertButtonResult = (edit [B]of[/B] dialogButtonsMap) [B]then[/B]
            [B]set[/B] myItem [B]to[/B] ([B]path to[/B] [B]me[/B])
            editScript(myItem)
            [B]return[/B] false -- damit doStuff nicht ausgeführt wird
            
            
        [B]else[/B] [B]if[/B] alertButtonResult = (chooseFile [B]of[/B] dialogButtonsMap) [B]then[/B]
            [B]set[/B] selectedFilesOrFolders [B]to[/B] selectFilesOrFolders()
            [B]if[/B] [B]not[/B] selectedFilesOrFolders [B]is[/B] false [B]then[/B] [B]return[/B] selectedFilesOrFolders
            -- wenn choose from list in selectFilesOrFolders() abgebrochen wurde, ist selectedFilesOrFolders false
            -- das führt dazu, dass display alert wieder angezeigt wird wg. dem loop
            
            
        [B]else[/B] [B]if[/B] alertButtonResult = (cancel [B]of[/B] dialogButtonsMap) [B]then[/B]
            -- wird nie aufgerufen, weil bei klick auf "OK, ich… " die ausführung abgebrochen wird
            -- => ist cancel button von display alert
            -- mit display dialog bräuchte man es
            [B]return[/B] false
            
        [B]end[/B] [B]if[/B]
    [B]end[/B] [B]repeat[/B]
    
[B]end[/B] runAction


[B]on[/B] selectFilesOrFolders()
    [B]set[/B] cFLMap [B]to[/B] {files_:"Dateien", folders_:"Ordner"}
    
    [B]set[/B] cFLResult [B]to[/B] ¬
        ([B]choose from list[/B] ([I]items[/I] [B]of[/B] cFLMap) with prompt "was?")
    
    [B]if[/B] cFLResult [B]as[/B] [I]string[/I] = files_ [B]of[/B] cFLMap [B]then[/B]
        [B]set[/B] myResult [B]to[/B] ¬
            ([B]choose file[/B] [B]with[/B] multiple selections allowed)
    [B]else[/B] [B]if[/B] cFLResult [B]as[/B] [I]string[/I] = folders_ [B]of[/B] cFLMap [B]then[/B]
        [B]set[/B] myResult [B]to[/B] ¬
            ([B]choose folder[/B] [B]with[/B] multiple selections allowed)
    [B]else[/B]
        [B]set[/B] myResult [B]to[/B] false
    [B]end[/B] [B]if[/B]
    
    [B]return[/B] myResult
[B]end[/B] selectFilesOrFolders


[B]on[/B] editScript(theScript)
    -- «application id "com.apple.ScriptEditor2"» statt «application "script editor"» macht es für 10.6+ portabel, 
    -- da der Script Editor in Applescript Editor umbenannt wurde
    [B]if[/B] [I]application[/I] id "com.apple.ScriptEditor2" [B]is[/B] running [B]then[/B]
        [B]tell[/B] [I]application[/I] id "com.apple.ScriptEditor2"
            [B]activate[/B]
            [B]open[/B] theScript
        [B]end[/B] [B]tell[/B]
    [B]else[/B]
        
        [B]tell[/B] [I]application[/I] id "com.apple.ScriptEditor2"
            [B]activate[/B]
            [B]close[/B] [I]window[/I] "Ohne Titel"
            [B]open[/B] theScript
        [B]end[/B] [B]tell[/B]
    [B]end[/B] [B]if[/B]
[B]end[/B] editScript



Jajaja muss man nicht so kompliziert machen. Die anfängliche Vorlage reicht völligst. :)
 

Hifi

Schöner von Nordhausen
Registriert
10.06.04
Beiträge
320
Auch nicht schlecht, Danke!
(Warum nicht einfach mal ein bischen komplizierter :))