[TxMt] Suggestion for DIALOG2 enhancement - interactive async windows
Hans-Joerg Bibiko
bibiko at eva.mpg.de
Wed Jul 9 08:42:02 UTC 2008
Hi,
I just fiddling with the GetBundle GUI. While doing this I thought
that it would be nice to have a asynchronous window created via
"$DIALOG" window create ...
which I can modify while runtime.
A simple example:
Supposing you have a NIB which shows names and last names of persons
in a table, and you want to select one person in order to display more
information. But I want to be able to display either all male persons
or all female persons, and if I selected an item the window shouldn't
be closed.
What I did is to set up such a NIB with a pop-down menu 'Choose
Gender'. Fine.
But how can I notify the running script in the background that I
changed that pop-down menu?
I didn't find a way to do this. That's why I introduced a new method
to '"$DIALOG" window' named 'getparams'.
This method is very simple. It write the current NSDictionary
'parameters' of the current nibController to the standard output.
Nothing else.
But then I was able to ask the async window: Are there any changes? If
so, then I changed the content of the parameters accordingly and
updated the window's parameters.
Here is a screencast to illustrate this example:
http://www.bibiko.de/TM_intact_async_window.mov (1.7MB)
By using the new method 'getparams' it opens ways to do more useful
things, I believe.
You can hide/show items easier, change the content of data cells,
change the title of buttons according to the status of radio buttons
or checkboxes, etc.....
Here is the code for "$DIALOG2" > window.mm
...
else if([command isEqualToString:@"getparams"])
{
if([proxy numberOfArguments] < 4)
ErrorAndReturn(@"no window token given");
NSString* token = [proxy argumentAtIndex:3];
TMDNibController* nibController = [TMDNibController
controllerForToken:token];
if(nibController)
{
id params = [[nibController parameters] mutableCopy];
[params removeObjectForKey:@"controller"];
NSString* error = nil;
if(NSData* data = [NSPropertyListSerialization
dataFromPropertyList:params format:NSPropertyListXMLFormat_v1_0
errorDescription:&error])
{
NSString* outpl = [[[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding] autorelease];
[proxy writeStringToOutput:outpl];
}
else
{
fprintf(stderr, "%s\n", [error UTF8String] ?: "unknown error
serializing returned property list");
fprintf(stderr, "%s\n", [[[nibController parameters] description]
UTF8String]);
}
}
else
{
[proxy writeStringToError:@"There is no window with that token"];
}
}
I guess one could improve and simplify the code.
Is this worth to implement this?
Thanks,
--Hans
More information about the textmate
mailing list