[GastForen Programmierung/Entwicklung AppleScript Dialoge mit "Pashua" erzeugen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Dialoge mit "Pashua" erzeugen

Hans Haesler
  
Beiträge gesamt: 5825

23. Okt 2010, 23:29
Beitrag # 1 von 2
Bewertung: |||
(3047 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Scripter,

mit reinem AppleScript merkt man schnell, dass nur sehr einfache Dialoge erzeugt werden können: Nur eine Texteingabezeile, weder Radiobuttons noch Checkboxen ...

Mit dem Hilfsprogramm Pashua ( http://www.bluem.net/downloads/pashua_en/ ) ist es möglich, komplexere Dialoge zu bekommen. Aber es braucht auch einen gewissen Aufwand.

Weiter unten folgt ein funktionierendes Script-Skelett, welches zeigt, wie der Dialog vorbereitet und ausgewertet wird. Die verwendeten Begriffe machen keinen grossen Sinn und müssen natürlich ans auszuführende Projekt angepasst werden.

Das Wichtigste daran ist das Zusammenstellen einer Konfigurierungs-Textkette, welche der Variablen config zugewiesen wird.

Jeder Eintrag beginnt mit einem Kürzel. Nachstehend besteht dieser aus drei Zeichen. Danach folgt ein Punkt, ein bestimmter Pashua-Begriff (z.B. "type" oder "label") ein Gleichheitszeichen und wieder ein Pashua-Begriff:

Code
chk.type=checkbox 

Die zweite Zeile beginnt mit demselben Kürzel, dann ein Punkt, der Pashua-Begriff, das Gleichheitszeichen und (hier) der Text, welcher im Dialog erscheint.

Code
chk.label=Einzelseiten 

Mit den folgenden drei Zeilen wird die Breite des Eintrags sowie die X- und Y-Position in Pixel definiert.

Code
chk.width=240 
chk.x=0
chk.y=62

Der x-Wert ist der Abstand vom linken Dialog-Rand (plus ein fixer Wert). Der y-Wert ist die vertikale Distanz. Die untersten Elemente haben die kleinsten y-Werte.

Für jede neue Gruppe muss ein anderes Kürzel benutzt werden.

In der Textkette können auch Variablen eingebunden werden. Das geschieht (wie unten gezeigt) mithilfe von &-Zeichen.

Nicht ganz einfach ist das Vorbereiten eines Strings, welcher in einem Popup-Menü verwendet wird. Ist eine Liste immer dieselbe, können die einzelnen Artikel in die config-String-Zeilen gesetzt werden. Wenn aber die Liste dynamisch geändert werden soll, muss man sie im voraus umwandeln.

Also: Liste holen, dann die AppleScript's text item delimiters definieren, bestehend aus Return, Kürzel, Punkt, option und dem Gleichheitszeichen.
In der nächsten Zeile wird die Liste in einen String verwandelt und die AppleScript's text item delimiters wieder als leerer String definiert.

Code
set itemList to {"Farbe 1", "Farbe 2", "Farbe 3"} 
set defaultItem to item 1 of itemList

set AppleScript's text item delimiters to {"
col.option="}
set itemString to text items of itemList as string
set AppleScript's text item delimiters to {""}

Die Variable defaultItem wird benutzt werden, um die Vorgabewahl im Dialog zu bestimmen.

Diese config-Textkette wird dem Handler pashuaRun() übergeben, welcher den Dialog anzeigt. Das Ergebnis wird der Variablen pashuaResult übergeben. Daraus können mithilfe der Kürzel die Entscheidungen des Anwenders geholt werden.

Für den Abbruch-Button wurde das Kürzel can (= cancel = Abbruch) benutzt. Wenn dessen Ergebnis "1" ist, dann ist dieser Button betätigt worden und in der Folge bricht man die Ausführung mit error number -128 ab.

Sonst werden die einzelnen Werte so geholt:

Code
set shadowColor to col of pashuaResult 

Wenn es ein verwendbarer String ist, kann man ihn direkt übernehmen. Bei einer Checkbox wird es "0" (= nicht aktiviert) oder "1" sein (= aktiviert). Da kann man ein entsprechendes Schlüsselwort zuweisen.

Bei Eingaben von Zahlen tut man gut daran, zu prüfen, ob es wirklich Ziffern sind.

Hier nun das ganze Script:
Code
global shadowColor 
global shadowShade
global itemString
global defaultItem

set itemList to {"Farbe 1", "Farbe 2", "Farbe 3"}
set defaultItem to item 1 of itemList

set AppleScript's text item delimiters to {"
col.option="}
set itemString to text items of itemList as string
set AppleScript's text item delimiters to {""}

set shadowShade to 100

set {shadowColor, shadowShade, pageSize, pageType} to askUser()

on askUser()
-- Einen Konfigurations-String definieren, welcher benutzt werden
-- wird um Pashua mitzuteilen, welche GUI-Elemente man benötigt
-- und welche Vorgabenwerte eingestellt werden sollen
set config to "
# Zeilen, welche mit einem »Number Sign« beginnen, sind
# Kommentare und werden ignoriert, leere Zeilen ebenso

# Den Fenstertitel eingeben
*.title=Einen Textschatten erzeugen

# Das Pop-up Menü
col.type=popup
col.label=Die Farbe für den Schatten auswählen:
col.width=240
col.option=" & itemString & "
col.default=" & defaultItem & "
col.x=0
col.y=276

# Den Tonwert für den Schatten bestimmen
shd.type=textfield
shd.label=Den Tonwert eingeben (mit oder ohne %)
shd.width=36
shd.default=" & shadowShade & "
shd.x=0
shd.y=220

# Eine Trennlinie
tr3.type=text
tr3.text=–––––––––––––––––––––––––––––––––––––––
tr3.width=240
tr3.x=0
tr3.y=200

# Radiobuttons definieren
typ.type=radiobutton
typ.label=Das Seitenformat wählen
typ.option=DIN A4 hoch
typ.option=DIN A4 quer
typ.option=DIN A3 hoch
typ.option=DIN A3 quer
typ.default=DIN A4 quer
typ.x=0
typ.y=100

# Eine Trennlinie
tr2.type=text
tr2.text=–––––––––––––––––––––––––––––––––––––––
tr2.width=240
tr2.x=0
tr2.y=80

# Checkbox definieren
chk.type=checkbox
chk.label=Einzelseiten
chk.width=240
chk.x=0
chk.y=62

# Eine Trennlinie
tr1.type=text
tr1.text=–––––––––––––––––––––––––––––––––––––––
tr1.width=240
tr1.x=0
tr1.y=50

# Copyright
cop.type=text
cop.text=© hh 2010
cop.width=240
cop.x=0
cop.y=36

# Einen Abbruch-Button hinzufügen
can.type=cancelbutton
can.label=Abbruch

# Einen Default-Button hinzufügen
default.type=defaultbutton
"
-- Pashua aufrufen und den zurückerhaltenen Record in der Variable 'pashuaResult' speichern
set pashuaResult to my pashuaRun(config)
if can of pashuaResult is not "1" then
set shadowColor to col of pashuaResult
set shadowShade to shd of pashuaResult
set pageSize to typ of pashuaResult
set pageType to chk of pashuaResult
if pageType is "1" then
set pageType to "Einzelseiten"
else
set pageType to "Doppelseiten"
end if
else
error number -128
end if
return {shadowColor, shadowShade, pageSize, pageType}
end askUser

--======================= Handler =================================
-- Eine spezielle Subroutine. Dient als Brücke zwischen Pashua und AppleScript.
--=============================================================

-- Glue code for interfacing from AppleScript to Pashua. Written by
-- Carsten Blüm <carsten@bluem.net>, 10/2003-05/2004, with improvements
-- contributed by Eddy Roosnek and Hans Haesler. You can use or modify
-- this handler any way you like in your own scripts.
on pashuaRun(config)

-- Den Pfad zur temporären Datei zusammensetzen
set AppleScript's text item delimiters to {""}
set tmpfile to (path to preferences folder as string) & "Pashua_config.txt"

-- Eine temporäre Datei erzeugen und die Konfigurations-Textkette hineinschreiben
set fhandle to open for access tmpfile with write permission
try
set eof of file tmpfile to 0
write config to fhandle
on error
try
close access fhandle
end try
end try
try
close access fhandle
end try

-- Den POSIX-Pfad zur temporären Datei holen
set posixtmpfile to POSIX path of tmpfile

set diskPath to path to startup disk as Unicode text

-- Versuchen, das Pashua-Programm zu finden
try
alias (diskPath & "Applications:Pashua.app")
set pashua to (diskPath & "Applications:Pashua.app:")
on error
display dialog "Das Pashua-Programm wurde nicht gefunden." & return ¬
& "Bitte Pashua in den globalen Ordner \"Applications\" legen." buttons "OK" default button 1 with icon 0
return -1
end try

-- Den Pfad von HFS zur POSIX-Form konvertieren
set pashuabinary to (POSIX path of pashua) & "Contents/MacOS/Pashua"

-- Pashua ausführen und die retournierte Textkette abfangen
set pashuaResult to do shell script ("'" & pashuabinary & "' '" & posixtmpfile & "'")

-- Das Resultat auswerten
set AppleScript's text item delimiters to {return}
set resultLines to text items of pashuaResult
set AppleScript's text item delimiters to {""}
set recordComponents to {}
repeat with currentLine in resultLines
set eqpos to offset of "=" in currentLine
if eqpos is not 0 then
set varKey to word 1 of currentLine
try
set varValue to (text (eqpos + 1) thru end of currentLine)
-- Anführungszeichen in 'varValue' mit einem Backslash versehen,
-- Eine bessere Methode wäre, einen Handler zu verwenden
-- aber weil der Code zum Kommunizieren mit Pashua möglichst
-- kompakt bleiben soll, wird die Aktion 'inline' durchgeführt
set AppleScript's text item delimiters to {"\""}
set textItems to every text item of varValue
set AppleScript's text item delimiters to {"\\\""}
set varValue to textItems as string
set AppleScript's text item delimiters to {""}
on error
set varValue to ""
end try
set end of recordComponents to (varKey & ":\"" & varValue & "\"")
end if
end repeat

-- Den "record", welcher aus dem tmpfile entnommen wurde, zurückschicken
set AppleScript's text item delimiters to {", "}
tell application "Finder" to set resultList to (run script "{" & (recordComponents as string) & "}")
set AppleScript's text item delimiters to {""}
return resultList

end pashuaRun

Wie gesagt, es soll nur aufzeigen, wie der Code zum Anzeigen und Auswerten eines Dialoges aussehen kann. Es gibt noch weitere Möglichkeiten, welche der Pashua-Dokumentation zu entnehmen sind.

Gruss, Hans
X

Dialoge mit "Pashua" erzeugen

michael m.
Beiträge gesamt: 162

24. Okt 2010, 17:18
Beitrag # 2 von 2
Beitrag ID: #455007
Bewertung:
(3015 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für den Einblick.
Ist ja nicht so ganz ohne und die Länge des Codes ist ja lang.

Viele Grüsse
Michael


als Antwort auf: [#454973]

Aktuell

InDesign / Illustrator
MTT_300x300_11_2022

Neuste Foreneinträge


DokumentAufsplitten: neue Versionen des JavaScripts

Cookie-Overload??

Adobe InDesign CC - Windows (x64) GPU-Unterst�tzung �ber NVIDIA Control Panel

Kein Grep auf Satzzeichen am Ende einer URL

Text und QR Code in PDF einf�gen per PitStop Aktion statt InDesign

Bildschirmflackern beim Markieren von Texten

N�chstes Treffen der IDUG Stuttgart

Automatische Sicherung

PDF �ffnen via Script UI?

Affinity Publisher � schwarz wird in CMYK separiert