hilfdirselbst.ch
Facebook Twitter gamper-media
« « 1 2 » »  
tsone
Beiträge: 47
17. Jul 2017, 17:49
Beitrag #16 von 28
Beitrag ID: #558672
Bewertung:
(1934 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Uwe,

ich habe mich noch nicht weiter damit beschäftigen können. Scheint aber ne Wissenschaft für sich zu sein.

Muss mir noch überlegen, ob es für mich so überhaupt praktikabel ist, bzw. ob es meinen Arbeitsfluss unterstützt.

Trotzdem schon mal besten Dank an alle für die tolle Hilfe.

Grüße
Timo
als Antwort auf: [#558671] Top
 
X
Uwe Laubender S
Beiträge: 3882
18. Jul 2017, 11:43
Beitrag #17 von 28
Beitrag ID: #558682
Bewertung:
(1727 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Timo,
ja, das ist 'ne "Wissenschaft für sich"…

Ich würde mich jedenfalls auf regen Gedankenaustausch freuen, wenn Du Dich weiterhin mit diesem Thema beschäftigst. Der Testaufwand ist nicht unerheblich.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558672] Top
 
drerol74 m
Beiträge: 385
18. Jul 2017, 13:01
Beitrag #18 von 28
Beitrag ID: #558683
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Uwe,

ich hab's am Wochenende auch nochmal mit »After Selection Changed« ausprobiert, bei mir funktioniert das hier:

https://www.rolanddreger.net/...hp/s/5hpilI4FGNAQ6QT

index.html

Code
<!doctype html> 
<html>
<head>
<meta charset="utf-8"/>
<title>Interakives Panel</title>
<link rel="stylesheet" href="css/styles.css"/>
</head>
<body>
<div id="content">
<h1 id="constructor-name">Constructor erscheint hier ...</h1>
</div>
<script src="js/libs/CSInterface.js"></script>
<script src="js/main.js"></script>
</body>
<html>


indesign.jsx

Code
unction __main() { 

try {
var _externalObjLib = new ExternalObject("lib:\PlugPlugExternalObject");
} catch(_error) {
alert(_error);
}

if(!_externalObjLib) { return false; }

app.addEventListener(Application.AFTER_SELECTION_CHANGED, __afterSelectionChangeHandler);

return;
} /* END function __main */



function __afterSelectionChangeHandler(_event){

if(app.documents.length === 0 || app.layoutWindows.length === 0) { return false; }

var _selection;
var _constructorName;

_selection = app.selection;

if(!_selection || _selection.length === 0) {
_constructorName = "Es ist nichts ausgewählt.";
} else {
_constructorName = _selection[0].constructor.name;
}

var _csxsEventObj = new CSXSEvent();

_csxsEventObj.type = "idSelectionChanged";
_csxsEventObj.data = _constructorName;
_csxsEventObj.dispatch();

return;
} /* END function __afterSelectionChangeHandler */



main.js

Code
(function () { 

'use strict';

var _csInterface = new CSInterface();
var _output = document.getElementById("constructor-name");

_csInterface.addEventListener("idSelectionChanged", function(_event){
_output.innerHTML = _event.data;
});

_csInterface.evalScript("__main()");

}());


Schöne Grüße
Roland
als Antwort auf: [#558682] Top
 
Uwe Laubender S
Beiträge: 3882
18. Jul 2017, 20:00
Beitrag #19 von 28
Beitrag ID: #558691
Bewertung:
(1620 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Roland,
ja, ich dachte auch erst, dass das so funktioniert.

Teste mal mit dem Story-Editor oder mit einem zweiten Fenster des gleichen Dokuments. Schließe dann den Story-Editor oder das zweite Fenster. Das wird einen Fehler werfen, den Du nicht abfängst.

Ich denke, dass wir beim afterSelectionChanged eventhandler nicht um ein ordentliches try/catch herumkommen.

Hier mal ein ScriptUi-Window vom Typ Palette, das dies mit Deinem Code verdeutlicht:

Code
#targetengine uwe 

var c = 0;
var _constructorName = "Es ist nichts ausgewählt.";

var w = new Window("palette");
var myStaticText = w.add ("statictext", [0,0,200,50], c+" : "+_constructorName , {multiline: true});
w.show();

app.addEventListener(Application.AFTER_SELECTION_CHANGED, __afterSelectionChangeHandler);

function __afterSelectionChangeHandler(_event){

if(app.documents.length === 0 || app.layoutWindows.length === 0) { return };

var _selection;
var _constructorName;

_selection = app.selection;

if(!_selection || _selection.length === 0) {
_constructorName = "Es ist nichts ausgewählt.";
} else {
_constructorName = _selection[0].constructor.name;
}

myStaticText.text = c+" : "+_constructorName;
c++;
return;
} /* END function __afterSelectionChangeHandler */

*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558683] Top
 
drerol74 m
Beiträge: 385
18. Jul 2017, 23:26
Beitrag #20 von 28
Beitrag ID: #558693
Bewertung:
(1583 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Du hast recht Uwe, da hat es was. Den Texteditor könnte man noch mit instanceof LayoutWindow abfangen, aber damit gibt es dann einen Fehler bei app.activeWindow.

Ich habe es jetzt mal damit versucht:

Code
_selection = app.layoutWindows[0].selection; 


statt

Code
_selection = app.selection; 



Mit dem Texteditor wird dann halt die aktuelle Auswahl nicht angezeigt. Muss mir das aber auch noch mal genauer ansehen, wenn etwas mehr Zeit ist.


Schöne Grüße
Roland
als Antwort auf: [#558691] Top
 
drerol74 m
Beiträge: 385
19. Jul 2017, 00:26
Beitrag #21 von 28
Beitrag ID: #558694
Bewertung:
(1566 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Oder gleich das »layout« weglassen ...

Code
_selection = app.windows[0].selection; 

als Antwort auf: [#558693] Top
 
Uwe Laubender S
Beiträge: 3882
19. Jul 2017, 07:13
Beitrag #22 von 28
Beitrag ID: #558695
Bewertung:
(1498 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Roland,
was stört Dich an einem try/catch, das die beiden bekannten Fehler $ID/NoDocumentOpenError 90884 und $ID/NoWindowOpenError 90886 erkennt und abfängt und nur bei neuen Fehlern beispielsweise protokolliert?
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558694] Top
 
Uwe Laubender S
Beiträge: 3882
19. Jul 2017, 07:41
Beitrag #23 von 28
Beitrag ID: #558696
Bewertung:
(1495 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Antwort auf: Oder gleich das »layout« weglassen ...

Code
_selection = app.windows[0].selection; 



Hallo Roland,
habe ich mal getestet.
Funktioniert tadellos.

EDIT:
Leider doch nicht. Hab' mich zu früh gefreut.
Mag an der Implementierung liegen.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558694]
(Dieser Beitrag wurde von Uwe Laubender am 19. Jul 2017, 07:57 geändert)
Top
 
Uwe Laubender S
Beiträge: 3882
19. Jul 2017, 08:44
Beitrag #24 von 28
Beitrag ID: #558697
Bewertung:
(1483 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Es hatte an der Implementierung gelegen.

Hier die Version, die funktioniert.
Anmerkung: Ich benutze ein ScriptUI-Fenster vom Typ "palette" mit einem "statictext"-Element, das einen Rollbalken aufweist.

Der Rollbalken funktioniert mit CS6.
Aber nicht mehr mit CC oder höher.

Die Auswertung im Fenster enthält einen Zähler plus den Konstruktornamen aller ausgewählten Objekte. Das ist noch nicht sehr aussagekräftig für einen Anwender, dient nur dazu, das Konstrukt zu testen.

Code
#targetengine rolandsIdea 

var c = 0;

var w = new Window("palette");
var myStaticText =
w.add
(
"statictext",
[0,0,250,100],
c+" : "+"Es ist nichts ausgewählt." ,
{
multiline: true ,
scrolling : true // Will not work in CC and above. No scroll bar available.
}
);

w.show();

app.addEventListener(Application.AFTER_SELECTION_CHANGED, writeSelectionToPalette );

function writeSelectionToPalette(evt)
{
// Roland's idea:
if( app.documents.length == 0 || app.windows.length == 0 )
{
myStaticText.text = c+" : "+"Es ist nichts ausgewählt. Event A."
c++;
return
};
// Roland's idea:
var selection = app.windows[0].selection;

var result = [];

if(selection.length == 0)
{
myStaticText.text = c+" : "+"Es ist nichts ausgewählt. Event B." ;
c++
return
};

for(var n=0;n<selection.length;n++)
{
result[n] = c+" : "+selection[n].constructor.name
};

myStaticText.text = result.join("\r");

c++;
return;
};



Wobei ich sagen muss, dass ich mir noch nicht ganz sicher bin, weshalb das funktioniert und der Fehler $ID/NoWindowOpenError mit Nummer 90886 nicht geworfen wird.

Beim Schließen eines Storyeditor-Fensters konnte ich diesen in früheren Versionen provozieren. Diesmal nicht.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558696] Top
 
drerol74 m
Beiträge: 385
19. Jul 2017, 23:28
Beitrag #25 von 28
Beitrag ID: #558710
Bewertung:
(1420 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Antwort auf: was stört Dich an einem try/catch, das die beiden bekannten Fehler $ID/NoDocumentOpenError 90884 und $ID/NoWindowOpenError 90886 erkennt und abfängt und nur bei neuen Fehlern beispielsweise protokolliert?


An sich spricht – denke ich – in diesem Fall nichts dagegen, mit try/catch den Fehler zu umgehen. Wenn das mit windows[0].selection ginge, wäre es halt kürzer.


Antwort auf: Wobei ich sagen muss, dass ich mir noch nicht ganz sicher bin, weshalb das funktioniert und der Fehler $ID/NoWindowOpenError mit Nummer 90886 nicht geworfen wird.



Ich hab testweise an windows[0] und windows[1] (bei 2 Fenstern eines Dokuments) die EventListeners AFTER_ACTIVATE und BEFORE_DEACTIVATE angehängt.

Beim Schließen von windows[1] feuert zuerst AFTER_SELECTION_CHANGED. app.selection ergibt zu diesem Zeitpunkt schon einen Fehler.

Code
app.windows[0].selection.toSource() // Ergebnis: [] 
app.windows[1].selection // Fehler: Object is invalid
app.windows[1] == null // Ergebnis: true


Danach löst BEFORE_DEACTIVATE von windows[1] aus und daraufhin AFTER_ACTIVATE von windows[0]. In Folge ist app.selection dann wieder gültig.

Das ist jetzt auch nur Spekulation, aber app.selection könnte eigentlich über windows[1] auf die aktuelle Auswahl zugreifen. Als aktives Fenster wird noch app.windows[1] geführt, obwohl es gar nicht mehr aktiv ist. Dieser Fehler wird aber in app.selection nicht abgefangen und bleibt es dann hängen.

app.windows[0].selection ist allerdings zu jedem Zeitpunkt gültig, egal, ob jetzt ein oder zwei Fenster geöffnet sind oder welches gerade den Index 0 hat.

Ich denke, das ist einfach ein blöder Bug.

Schöne Grüße
Roland
als Antwort auf: [#558697] Top
 
Uwe Laubender S
Beiträge: 3882
20. Jul 2017, 22:22
Beitrag #26 von 28
Beitrag ID: #558718
Bewertung:
(1320 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Roland,
hab Dank für's Testen. Ich muss aber mal nachfragen.

Zitat von Roland Ich hab testweise an windows[0] und windows[1] (bei 2 Fenstern eines Dokuments) die EventListeners AFTER_ACTIVATE und BEFORE_DEACTIVATE angehängt.


Ok.

Zitat von Roland Beim Schließen von windows[1] feuert zuerst AFTER_SELECTION_CHANGED. app.selection ergibt zu diesem Zeitpunkt schon einen Fehler.


Beim Schließen von windows[1] ? Also dasjenigen Fensters, das nicht das aktive ist? Das würde ich mal genauer begutachten wollen. Nur um nachzuvollziehen, wie Dein Versuchsaufbau war.

Hast Du das windows[1] per Mausklick über das UI geschlossen oder per Skriptbefehl mit windows[1].close() ?

Falls per Mausklick, wird ja dann windows[1] vermutlich kurzfristig zum aktiven Fenster.
Und erhält somit den index 0. Oder auch nicht. Siehe die Fälle A und B weiter unten.

Wir sollten an dieser Stelle erstmal Begrifflichkeiten klären.
Wenn Du von windows[0] und windows[1] sprichst, dann sprichst Du immer über die gleichen Fenster, oder?

Also Beispiel:

Dokument geöffnet. Zwei Fenster des gleichen Dokuments geöffnet.
Fenster 1: windows[0], das aktive Fenster mit Namen: Unbenannt-1:1 @ 50%
Fenster 2: windows[1], das nicht aktive Fenster: Unbenannt-1:2 @ 50%

Du schließt nun Fenster 2 per Mausklick. Wie?

A. Mit 2 Mausklicks?
Klick ins Fenster, um es dann mit einem zweiten Mausklick zu schließen?
Der Name von Fenster 1 ändert sich zu: Unbenannt-1 @ 53%

B. Mit 1 Mausklick?
Klick in das x des Tabs von Fenster 2 ?
Der Name von Fenster 1 ändert sich zu: Unbenannt-1 @ 53%

A. und B. könnten unterschiedliche Reihenfolgen von events auslösen.
Im Fall A ändert sich auch der Index des Fensters bis zum Zeitpunkt des Schließens zwingend. Bei B nicht.

Und ein weiterer Unterschied könnte sein, wenn Fenster 2 per methode close() geschlossen wird.
Könnte aber auch mit Fall B abgedeckt sein.

Vielleicht hab' ich ja am Wochenende ein weing Zeit, das genauer zu untersuchen.
Ich hoffe, mit meinen Fragen oder Bemerkungen nicht allzusehr zu verwirren.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558710] Top
 
drerol74 m
Beiträge: 385
21. Jul 2017, 00:46
Beitrag #27 von 28
Beitrag ID: #558719
Bewertung:
(1301 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Uwe,

zur späten Stunden nur ganz kurz zum Ablauf:

Ich hab in meinem Fall dem linken Fenster (zu Beginn aktiv) durch das Skript Window.AFTER_ACTIVATE angehängt und dem rechten Fenster Window.BEFORE_DEACTIVATE (beide gleiches Dok). Dann wurde das rechte Fenster aktiviert und über das UI (x) geschlossen.

Die Überlegung war einfach die, dass immer eines der Fenster den Index 0 aufweisen muss, auch wenn dieser zwischen den Fenstern wechselt.

Ich muss mich jetzt für ein paar Tage aus der Diskussion ausklinken, Urlaub \o/, bin eigentlich schon gar nicht mehr da ;) Vielleicht hast du bis dahin schon Genaueres herausgefunden.

Schöne Grüße
Roland
als Antwort auf: [#558718] Top
 
Uwe Laubender S
Beiträge: 3882
24. Jul 2017, 08:15
Beitrag #28 von 28
Beitrag ID: #558734
Bewertung:
(1042 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Interaktives Panel


Hallo Roland,
danke für die genauere Beschreibung.

Bei mir sieht es allerdings auch so aus als könnte ich mich die nächsten 14 Tage kaum um den Fall kümmern.

Aber vielleicht geht ja Timo noch mal ran an die Sache.

Dir wünsche ich einen schönen Urlaub!
Bei mir steht ein Umzug an. Zwar in der gleichen Stadt, aber trotzdem zeit- und nervenaufreibend. Lebe im Moment in einer Baustelle. Und das kann man wortwörtlich so nehmen.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#558719] Top
 
« « 1 2 » »  
X