<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE TIP SYSTEM "http://tcl.activestate.com/cgi-bin/tct/tip/tipxml.dtd">
<!-- Converted at Thu Feb 09 11:56:55 GMT 2012 -->
<!-- TIP AutoGenerator - written by Donal K. Fellows -->

<TIP number='67'>
<header><title>Allow Subclassing of tk_getOpenFile, tk_getSaveFile on UNIX</title><author address="mailto:nelson@pinebush.com">Chris Nelson</author><author address="mailto:zielasko@pinebush.com">Al Zielaskowski</author><status type='project' state='withdrawn' tclversion="8.5" vote='prior'>$Revision: 1.5 $</status><history></history><created day='9' month='oct' year='2001' /></header>
<abstract>On Microsoft Windows it is possible to &quot;subclass&quot; a standard dialog and add controls to it. This TIP proposes adding that feature to the <emph style="italic">tk_getOpenFile</emph> and <emph style="italic">tk_getSaveFile</emph> dialogs for non-Windows systems (wherever <emph style="italic">tkfbox.tcl</emph> and <emph style="italic">xmfbox.tcl</emph> are used for these dialogs).</abstract>
<body><section title="Rationale">
<para>In our work with Tk, we have need to save files in various formats and give the user control over more than just the file name when saving. While it is possible to have two separate dialogs - one for specifying the file name and location and another for other attributes - this is unwieldy and not very user friendly: all the related information should be in one dialog</para>
<para>On Microsoft Windows, it is possible to add controls to standard dialogs (indeed any window) via &quot;subclassing&quot; (cf <url ref="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/commdlg_4qlv.asp"/>). (This requires C programming but it is, at least, possible.)</para>
<para>On UNIX, no generic technique like subclassing exists. Even if we wished to invade the &quot;standard dialog,&quot; - learning about the window&apos;s organization, adding widgets here and there - calling <emph style="italic">tk_getSaveFile</emph> blocks the caller and then returns a value after the dialog is destroyed so we have no opportunity to manipulate the dialog. To work around this, we need to have <emph style="italic">tk_getSaveFile</emph> call back into user code to add controls when the dialog is built.</para>
</section>
<section title="Specification">
<para>We add a <emph style="italic">-subclass</emph> option to <emph style="italic">tk_getSaveFile</emph> and <emph style="italic">tk_getOpenFile</emph> (on UNIX only). The value of the <emph style="italic">-subclass</emph> option is a Tcl command to evaluate to fill an extra frame near the bottom of the dialog. When the dialog is constructed, the subclass command, if any, is evaluated with the path to the frame appended as an additional argument. The subclass command can then fill the frame as needed.</para>
<para>No additional semantic changes are needed for these additional controls to communicate with the program as such communication can be done through side effects. For example, user interaction with a checkbox created by the subclass command can be detected after the <emph style="italic">tk_getSaveFile</emph> dialog is closed by examining the value of the checkbox&apos;s global variable.</para>
</section>
<section title="Reference Implementation">
<para>This proposal has been implemented by Al Zielaskowski. A patch relative to Tk 8.4a3 follows:</para>
<verbatim><vline encoding='base64'>SW5kZXg6IHRrZmJveC50Y2w=</vline><vline encoding='base64'>PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ==</vline><vline encoding='base64'>UkNTIGZpbGU6IC9wdGkvcHJvZC9tcmQvQ3ZzUmVwb3NpdG9yeS90Y2wvdGsvbGlicmFyeS90a2Zib3gudGNsLHY=</vline><vline encoding='base64'>cmV0cmlldmluZyByZXZpc2lvbiAxLjEuMS4x</vline><vline encoding='base64'>ZGlmZiAtdSAtdyAtcjEuMS4xLjEgdGtmYm94LnRjbA==</vline><vline encoding='base64'>LS0tIHRrZmJveC50Y2wgIDIwMDEvMDkvMDQgMjM6NTE6MTIgICAgIDEuMS4xLjE=</vline><vline encoding='base64'>KysrIHRrZmJveC50Y2wgIDIwMDEvMTAvMDkgMTk6NDc6NTA=</vline><vline encoding='base64'>QEAgLTg5OCw2ICs4OTgsNyBAQA==</vline><vline encoding='base64'>ICAgICAgICB7LWluaXRpYWxmaWxlICIiICIiICIifQ==</vline><vline encoding='base64'>ICAgICAgICB7LXBhcmVudCAiIiAiIiAiLiJ9</vline><vline encoding='base64'>ICAgICAgICB7LXRpdGxlICIiICIiICIifQ==</vline><vline encoding='base64'>KyAgICAgICB7LXN1YmNsYXNzICIiICIiICIifQ==</vline><vline encoding='base64'>ICAgICB9</vline><vline encoding='base64'>IA==</vline><vline encoding='base64'>ICAgICAjIFRoZSAiLW11bHRpcGxlIiBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgZm9yIHRoZSAib3BlbiIgZmlsZSBkaWFsb2cu</vline><vline encoding='base64'>QEAgLTEwODcsOSArMTA4OCwyMiBAQA==</vline><vline encoding='base64'>ICAgICAjIFBhY2sgYWxsIHRoZSBmcmFtZXMgdG9nZXRoZXIuIFdlIGFyZSBkb25lIHdpdGggd2lkZ2V0IGNvbnN0cnVjdGlvbi4=</vline><vline encoding='base64'>ICAgICAj</vline><vline encoding='base64'>ICAgICBwYWNrICRmMSAtc2lkZSB0b3AgLWZpbGwgeCAtcGFkeSA0</vline><vline encoding='base64'>Kw==</vline><vline encoding='base64'>KyAgICAj</vline><vline encoding='base64'>KyAgICAjIEFkZCB0aGUgdXNlcidzIHN1YmNsYXNzIGZyYW1lIGlmIG9uZSB3YXMgc3BlY2lmaWVk</vline><vline encoding='base64'>KyAgICAj</vline><vline encoding='base64'>KyAgICBpZiB7W3N0cmluZyBsZW5ndGggJGRhdGEoLXN1YmNsYXNzKV19IHs=</vline><vline encoding='base64'>KyAgICAgICBmcmFtZSAkdy5zdWJjbGFzcyAtYmQgMA==</vline><vline encoding='base64'>KyAgICAgICBwYWNrICR3LnN1YmNsYXNzIC1zaWRlIGJvdHRvbSAtZmlsbCB4IFw=</vline><vline encoding='base64'>KyAgICAgICAgICAgICAgICAtcGFkeCBbbGlzdCBbZXhwciBbd2luZm8gcmVxd2lkdGggJGRhdGEodHlwZU1lbnVMYWIpXSArIDhdIFw=</vline><vline encoding='base64'>KyAgICAgICAgICAgICAgIFtleHByIFt3aW5mbyByZXF3aWR0aCAkZGF0YShva0J0bildICsgOF1d</vline><vline encoding='base64'>KyAgICAgICBldmFsICRkYXRhKC1zdWJjbGFzcykgJHcuc3ViY2xhc3M=</vline><vline encoding='base64'>KyAgICB9</vline><vline encoding='base64'>Kw==</vline><vline encoding='base64'>ICAgICBwYWNrICRmMyAtc2lkZSBib3R0b20gLWZpbGwgeA==</vline><vline encoding='base64'>ICAgICBwYWNrICRmMiAtc2lkZSBib3R0b20gLWZpbGwgeA==</vline><vline encoding='base64'>ICAgICBwYWNrICRkYXRhKGljb25zKSAtZXhwYW5kIHllcyAtZmlsbCBib3RoIC1wYWR4IDQgLXBhZHkgMQ==</vline><vline encoding='base64'>Kw==</vline><vline encoding='base64'>IA==</vline><vline encoding='base64'>ICAgICAjIFNldCB1cCB0aGUgZXZlbnQgaGFuZGxlcnMgdGhhdCBhcmUgY29tbW9uIHRvIERpcmVjdG9yeSBhbmQgRmlsZSBEaWFsb2dz</vline><vline encoding='base64'>ICAgICAj</vline><vline encoding='base64'>SW5kZXg6IHhtZmJveC50Y2w=</vline><vline encoding='base64'>PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ==</vline><vline encoding='base64'>UkNTIGZpbGU6IC9wdGkvcHJvZC9tcmQvQ3ZzUmVwb3NpdG9yeS90Y2wvdGsvbGlicmFyeS94bWZib3gudGNsLHY=</vline><vline encoding='base64'>cmV0cmlldmluZyByZXZpc2lvbiAxLjEuMS4x</vline><vline encoding='base64'>ZGlmZiAtdSAtdyAtcjEuMS4xLjEgeG1mYm94LnRjbA==</vline><vline encoding='base64'>LS0tIHhtZmJveC50Y2wgIDIwMDEvMDkvMDQgMjM6NTE6MTIgICAgIDEuMS4xLjE=</vline><vline encoding='base64'>KysrIHhtZmJveC50Y2wgIDIwMDEvMTAvMDkgMTk6MDU6NTc=</vline><vline encoding='base64'>QEAgLTIxNiw2ICsyMTYsNyBAQA==</vline><vline encoding='base64'>ICAgICAgICB7LWluaXRpYWxmaWxlICIiICIiICIifQ==</vline><vline encoding='base64'>ICAgICAgICB7LXBhcmVudCAiIiAiIiAiLiJ9</vline><vline encoding='base64'>ICAgICAgICB7LXRpdGxlICIiICIiICIifQ==</vline><vline encoding='base64'>KyAgICAgICB7LXN1YmNsYXNzICIiICIiICIifQ==</vline><vline encoding='base64'>ICAgICB9</vline><vline encoding='base64'>ICAgICBpZiB7IFtzdHJpbmcgZXF1YWwgJHR5cGUgIm9wZW4iXSB9IHs=</vline><vline encoding='base64'>ICAgICAgICBsYXBwZW5kIHNwZWNzIHstbXVsdGlwbGUgIiIgIiIgIjAifQ==</vline><vline encoding='base64'>QEAgLTI3Nyw2ICsyNzgsNyBAQA==</vline><vline encoding='base64'>ICAgICBpZiB7IVt3aW5mbyBleGlzdHMgJGRhdGEoLXBhcmVudCldfSB7</vline><vline encoding='base64'>ICAgICAgICBlcnJvciAiYmFkIHdpbmRvdyBwYXRoIG5hbWUgXCIkZGF0YSgtcGFyZW50KVwiIg==</vline><vline encoding='base64'>ICAgICB9</vline><vline encoding='base64'>Kw==</vline><vline encoding='base64'>IH0=</vline><vline encoding='base64'>IA==</vline><vline encoding='base64'>ICMgOjp0azo6TW90aWZGRGlhbG9nX0J1aWxkVUkgLS0=</vline><vline encoding='base64'>QEAgLTM2MCw2ICszNjIsMTcgQEA=</vline><vline encoding='base64'>IA==</vline><vline encoding='base64'>ICAgICBwYWNrICRib3Qub2sgJGJvdC5maWx0ZXIgJGJvdC5jYW5jZWwgLXBhZHggMTAgLXBhZHkgMTAgLWV4cGFuZCB5ZXMgXA==</vline><vline encoding='base64'>ICAgICAgICAtc2lkZSBsZWZ0</vline><vline encoding='base64'>Kw==</vline><vline encoding='base64'>Kw==</vline><vline encoding='base64'>KyAgICAj</vline><vline encoding='base64'>KyAgICAjIEFkZCB0aGUgdXNlcidzIHN1YmNsYXNzIGZyYW1lIGlmIG9uZSB3YXMgc3BlY2lmaWVk</vline><vline encoding='base64'>KyAgICAj</vline><vline encoding='base64'>KyAgICBpZiB7W3N0cmluZyBsZW5ndGggJGRhdGEoLXN1YmNsYXNzKV19IHs=</vline><vline encoding='base64'>KyAgICAgICBmcmFtZSAkZjMuc3ViY2xhc3MgLWJkIDA=</vline><vline encoding='base64'>KyAgICAgICBwYWNrICRmMy5zdWJjbGFzcyAtc2lkZSBib3R0b20gLWZpbGwgeCAtcGFkeCA0IC1wYWR5IDQ=</vline><vline encoding='base64'>KyAgICAgICBldmFsICRkYXRhKC1zdWJjbGFzcykgJGYzLnN1YmNsYXNz</vline><vline encoding='base64'>KyAgICB9</vline><vline encoding='base64'>Kw==</vline><vline encoding='base64'>IA==</vline><vline encoding='base64'>ICAgICAjIENyZWF0ZSB0aGUgYmluZGluZ3M6</vline><vline encoding='base64'>ICAgICAj</vline></verbatim>
</section>
<section title="Notice of Withdrawal">
<para>This TIP was Withdrawn by the TIP Editor following discussion on the tcl-core mailing list. The following is a summary of reasons for withdrawal:</para>
<quote>This would make porting code between platforms obscenely difficult as there is no way for the subclassing to work the same way on all platforms. Better for people to roll their own, perhaps starting from the foundations of the UNIX file browsing code if they wish.</quote>
</section>
<section title="Copyright">
<para>This document has been placed in the public domain.</para>
</section>
</body></TIP>

