67.md at [031a1bd781]

Login

File tip/67.md artifact 91292bad48 part of check-in 031a1bd781


# TIP 67: Allow Subclassing of tk_getOpenFile, tk_getSaveFile on UNIX
	Author:        Chris Nelson <[email protected]>
	Author:        Al Zielaskowski <[email protected]>
	State:         Withdrawn
	Type:          Project
	Tcl-Version:   8.5
	Vote:          Pending
	Created:       09-Oct-2001
	Post-History:
-----

# Abstract

On Microsoft Windows it is possible to "subclass" a standard dialog
and add controls to it.  This TIP proposes adding that feature to the
_tk\_getOpenFile_ and _tk\_getSaveFile_ dialogs for non-Windows
systems \(wherever _tkfbox.tcl_ and _xmfbox.tcl_ are used for these
dialogs\).

# Rationale

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

On Microsoft Windows, it is possible to add controls to standard
dialogs \(indeed any window\) via "subclassing" \(cf
<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.\)

On UNIX, no generic technique like subclassing exists.  Even if we
wished to invade the "standard dialog," - learning about the window's
organization, adding widgets here and there - calling
_tk\_getSaveFile_ 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 _tk\_getSaveFile_ call
back into user code to add controls when the dialog is built.

# Specification

We add a _-subclass_ option to _tk\_getSaveFile_ and
_tk\_getOpenFile_ \(on UNIX only\).  The value of the _-subclass_
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.

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
_tk\_getSaveFile_ dialog is closed by examining the value of the
checkbox's global variable.

# Reference Implementation

This proposal has been implemented by Al Zielaskowski.  A patch
relative to Tk 8.4a3 follows:

	Index: tkfbox.tcl
	===================================================================
	RCS file: /pti/prod/mrd/CvsRepository/tcl/tk/library/tkfbox.tcl,v
	retrieving revision 1.1.1.1
	diff -u -w -r1.1.1.1 tkfbox.tcl
	--- tkfbox.tcl  2001/09/04 23:51:12     1.1.1.1
	+++ tkfbox.tcl  2001/10/09 19:47:50
	@@ -898,6 +898,7 @@
	        {-initialfile "" "" ""}
	        {-parent "" "" "."}
	        {-title "" "" ""}
	+       {-subclass "" "" ""}
	     }
	 
	     # The "-multiple" option is only available for the "open" file dialog.
	@@ -1087,9 +1088,22 @@
	     # Pack all the frames together. We are done with widget construction.
	     #
	     pack $f1 -side top -fill x -pady 4
	+
	+    #
	+    # Add the user's subclass frame if one was specified
	+    #
	+    if {[string length $data(-subclass)]} {
	+       frame $w.subclass -bd 0
	+       pack $w.subclass -side bottom -fill x \
	+                -padx [list [expr [winfo reqwidth $data(typeMenuLab)] + 8] \
	+               [expr [winfo reqwidth $data(okBtn)] + 8]]
	+       eval $data(-subclass) $w.subclass
	+    }
	+
	     pack $f3 -side bottom -fill x
	     pack $f2 -side bottom -fill x
	     pack $data(icons) -expand yes -fill both -padx 4 -pady 1
	+
	 
	     # Set up the event handlers that are common to Directory and File Dialogs
	     #
	Index: xmfbox.tcl
	===================================================================
	RCS file: /pti/prod/mrd/CvsRepository/tcl/tk/library/xmfbox.tcl,v
	retrieving revision 1.1.1.1
	diff -u -w -r1.1.1.1 xmfbox.tcl
	--- xmfbox.tcl  2001/09/04 23:51:12     1.1.1.1
	+++ xmfbox.tcl  2001/10/09 19:05:57
	@@ -216,6 +216,7 @@
	        {-initialfile "" "" ""}
	        {-parent "" "" "."}
	        {-title "" "" ""}
	+       {-subclass "" "" ""}
	     }
	     if { [string equal $type "open"] } {
	        lappend specs {-multiple "" "" "0"}
	@@ -277,6 +278,7 @@
	     if {![winfo exists $data(-parent)]} {
	        error "bad window path name \"$data(-parent)\""
	     }
	+
	 }
	 
	 # ::tk::MotifFDialog_BuildUI --
	@@ -360,6 +362,17 @@
	 
	     pack $bot.ok $bot.filter $bot.cancel -padx 10 -pady 10 -expand yes \
	        -side left
	+
	+
	+    #
	+    # Add the user's subclass frame if one was specified
	+    #
	+    if {[string length $data(-subclass)]} {
	+       frame $f3.subclass -bd 0
	+       pack $f3.subclass -side bottom -fill x -padx 4 -pady 4
	+       eval $data(-subclass) $f3.subclass
	+    }
	+
	 
	     # Create the bindings:
	     #

# Notice of Withdrawal

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:

 > 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.

# Copyright

This document has been placed in the public domain.