예제 #1
0
	def fillInUI(self, parent):
		import Pmw, Tkinter
		SaveModeless.fillInUI(self, parent)
		self.clientArea.columnconfigure(0, weight=1)

		row = 0

		from chimera.widgets import ModelOptionMenu
		self.surfList = ModelOptionMenu(self.clientArea,
			labelpos='w', label_text="Save surface:",
			filtFunc=lambda m: isinstance(m, MSMSModel))
		self.surfList.grid(row=row, column=0)
		row += 1

		self.saveNormalsVar = Tkinter.IntVar(self.clientArea)
		self.saveNormalsVar.set(True)
		Tkinter.Checkbutton(self.clientArea, text="Save normals",
			variable=self.saveNormalsVar).grid(row=row)
		row += 1

		self.displayedOnlyVar = Tkinter.IntVar(self.clientArea)
		self.displayedOnlyVar.set(True)
		Tkinter.Checkbutton(self.clientArea, text="Limit output to"
			" displayed surface sections",
			variable=self.displayedOnlyVar).grid(row=row)
		row += 1
예제 #2
0
 def fillInUI(self, parent):
     SaveModeless.fillInUI(self, parent)
     self.clientArea.columnconfigure(0, weight=1)
     self.clientArea.columnconfigure(1, weight=1)
     self.amount = Pmw.RadioSelect(self.clientArea,
                                   orient='vertical',
                                   buttontype='radiobutton',
                                   labelpos='w',
                                   pady=0,
                                   label_text="Record")
     self.amount.add("selected commands")
     self.amount.add("all commands")
     self.amount.invoke(1)
     self.amount.grid(row=0, column=0)
     self.commandStyle = Pmw.RadioSelect(self.clientArea,
                                         orient='vertical',
                                         command=self._adjustFileName,
                                         buttontype='radiobutton',
                                         labelpos='w',
                                         pady=0,
                                         label_text="Record as")
     self.commandStyle.add("Chimera commands")
     self.commandStyle.add("Python commands")
     self.commandStyle.invoke(0)
     self.commandStyle.grid(row=1, column=0)
     self.appending = Tkinter.IntVar(parent)
     self.appending.set(0)
     Tkinter.Checkbutton(self.clientArea,
                         variable=self.appending,
                         text="Append to file").grid(row=0,
                                                     column=1,
                                                     rowspan=2)
 def fillInUI(self, parent):
     import Tkinter as Tk
     import Pmw
     from HtmlText import HtmlText
     SaveModeless.fillInUI(self, parent)
     parent = self.clientArea
     self.notes = Pmw.ScrolledText(parent,
                                   text_pyclass=HtmlText,
                                   text_relief=Tk.FLAT,
                                   text_wrap=Tk.WORD,
                                   text_height=4,
                                   text_width=10,
                                   text_highlightthickness=0)
     self.notes.pack(side=Tk.TOP,
                     anchor=Tk.NW,
                     fill=Tk.BOTH,
                     expand=True,
                     pady=5,
                     padx=10)
     self.notes.configure(text_state=Tk.DISABLED,
                          hscrollmode='dynamic',
                          vscrollmode='dynamic',
                          text_background=parent.cget('background'))
     import exports
     self.notes.settext(exports.getNotes(self.getFilter()))
예제 #4
0
    def fillInUI(self, parent):
        import Pmw, Tkinter
        SaveModeless.fillInUI(self, parent)
        row = 0

        from chimera.widgets import MoleculeOptionMenu
        self.modelMenu = MoleculeOptionMenu(
            self.clientArea,
            labelpos='w',
            label_text="Save model:",
            command=lambda m: self.configure(self.modelMenu.getvalue(),
                                             refreshList=False))
        self.modelMenu.grid(row=row, column=0, sticky='w')
        row += 1

        from AddCharge import knownChargeModels, defaultChargeModel

        from chimera import dialogs
        self.parmsetOption = Pmw.OptionMenu(
            self.clientArea,
            labelpos='w',
            label_text="Select force field type: ",
            initialitem=defaultChargeModel,
            items=knownChargeModels)
        # not always shown; remember row number
        self._msmRow = row
        self.parmsetOption.grid(row=row, column=0, sticky='w')
        row += 1
예제 #5
0
    def fillInUI(self, parent):
        import Pmw, Tkinter
        SaveModeless.fillInUI(self, parent)
        self.clientArea.columnconfigure(0, weight=1)

        row = 0

        from chimera.widgets import ModelOptionMenu
        self.surfList = ModelOptionMenu(
            self.clientArea,
            labelpos='w',
            label_text="Save surface:",
            filtFunc=lambda m: isinstance(m, MSMSModel))
        self.surfList.grid(row=row, column=0)
        row += 1

        self.saveNormalsVar = Tkinter.IntVar(self.clientArea)
        self.saveNormalsVar.set(True)
        Tkinter.Checkbutton(self.clientArea,
                            text="Save normals",
                            variable=self.saveNormalsVar).grid(row=row)
        row += 1

        self.displayedOnlyVar = Tkinter.IntVar(self.clientArea)
        self.displayedOnlyVar.set(True)
        Tkinter.Checkbutton(self.clientArea,
                            text="Limit output to"
                            " displayed surface sections",
                            variable=self.displayedOnlyVar).grid(row=row)
        row += 1
예제 #6
0
    def fillInUI(self, parent):

        SaveModeless.fillInUI(self, parent)

        from CGLtk import Hybrid
        br = Hybrid.Entry(self.clientArea, 'Bit rate (Kb/sec):', 6,
                          self.default_bit_rate)
        br.frame.grid(row=0, column=0, sticky='w')
        self.bit_rate = br.variable
예제 #7
0
  def fillInUI(self, parent):

    SaveModeless.fillInUI(self, parent)

    from CGLtk import Hybrid
    br = Hybrid.Entry(self.clientArea, 'Bit rate (Kb/sec):', 6,
                      self.default_bit_rate)
    br.frame.grid(row = 0, column = 0, sticky = 'w')
    self.bit_rate = br.variable
예제 #8
0
	def fillInUI(self, parent):
		SaveModeless.fillInUI(self, parent)
		self.saveTypes = Pmw.RadioSelect(self.clientArea, pady=0,
			buttontype='checkbutton', labelpos='w',
			orient='vertical', label_text="Save:")
		self.saveTypes.grid(row=0, column=0)
		for name in self.structMeasure.notebook.pagenames():
			mode = 'normal'
			if name not in [DISTANCES, ANGLES, BONDROTS, GEOMETRIES]:
				mode = 'disabled'
			self.saveTypes.add(name, state=mode)
			if mode == 'normal':
				self.saveTypes.invoke(name)
    def fillInUI(self, parent):
        SaveModeless.fillInUI(self, parent)
        from chimera.tkoptions import SymbolicEnumOption, BooleanOption

        class ColorModeOption(SymbolicEnumOption):
            values = ["color", "gray", "mono"]
            labels = ["color", "grayscale", "black & white"]

        self.colorMode = ColorModeOption(self.clientArea,
                                         0,
                                         "color mode",
                                         "color",
                                         None,
                                         balloon="output color range")
        self.orientation = BooleanOption(
            self.clientArea,
            1,
            "rotate 90",
            False,
            None,
            balloon="If true, output will be rotated 90 degrees\n"
            "(i.e. landscape mode)")

        class ExtentOption(SymbolicEnumOption):
            values = ["visible", "all"]
            labels = ["visible region", "entire alignment"]

        self.extent = ExtentOption(
            self.clientArea,
            2,
            "extent",
            "visible",
            None,
            balloon="save the entire alignment or just the visible part")
        self.hideNodes = BooleanOption(
            self.clientArea,
            3,
            "hide tree control nodes",
            True,
            None,
            balloon="Hide square boxes used as controls for tree")
        if not self.mav.seqCanvas.treeShown:
            self.hideNodes.forget()
        self._nodesHandler = self.mav.triggers.addHandler(
            DISPLAY_TREE, self._treeDispCB, None)
	def fillInUI(self, parent):
		SaveModeless.fillInUI(self, parent)

		self.selUnsel = Pmw.OptionMenu(self.clientArea, items=[
			"selected", "unselected"], labelpos='w', label_text=
			"Write")
		self.selUnsel.grid(row=0, column=0, sticky='e')
		self.classMenu = Pmw.OptionMenu(self.clientArea, items=
			map(lambda c: c.__name__.lower() + "s", classes))
		self.classMenu.grid(row=0, column=1, sticky='w')

		from tkoptions import NamingStyleOption
		if self.prefs[self.PREF_NAMING] in NamingStyleOption.values:
			default = self.prefs[self.PREF_NAMING]
		else:
			default = None
		self.naming = NamingStyleOption(self.clientArea, 1, None,
							default, None)
예제 #11
0
	def fillInUI(self, *args):
		if isinstance(self, SaveModeless):
			SaveModeless.fillInUI(self, *args)
		else:
			SaveModal.fillInUI(self, *args)
		import Tkinter
		self.saveRegion = Tkinter.IntVar(self.clientArea)
		self.saveRegion.set(False)
		Tkinter.Checkbutton(self.clientArea, variable=self.saveRegion,
			text="Restrict save to active region").grid(row=0,
			sticky='w')
		self.omitGaps = Tkinter.IntVar(self.clientArea)
		self.omitGaps.set(True)
		Tkinter.Checkbutton(self.clientArea, variable=self.omitGaps,
			text="Omit all-gap columns").grid(row=1, sticky='w')
		self.appendNumberings = Tkinter.IntVar(self.clientArea)
		Tkinter.Checkbutton(self.clientArea,
			variable=self.appendNumberings, text="Append sequence"
			" numberings to sequence names").grid(row=2, sticky='w')
예제 #12
0
	def fillInUI(self, parent):
		SaveModeless.fillInUI(self, parent)
		from chimera.tkoptions import SymbolicEnumOption
		self.headerChoice = SymbolicEnumOption(self.clientArea,
							0, "Save", None, None)
		self.omitNoValueVar = Tkinter.IntVar(self.clientArea)
		self.omitNoValueVar.set(True)
		frame = Tkinter.Frame(self.clientArea)
		frame.grid(row=1, column=0, columnspan=2)
		ckb = Tkinter.Checkbutton(frame, variable=self.omitNoValueVar,
						text="Omit no-value positions")
		ckb.grid()
		chimera.help.register(ckb, balloon=
				"If on, conservations positions without\n"
				"values will not have lines in the output file")
		self._populateMenu()
		from MAViewer import SHOW_HEADERS, HIDE_HEADERS
		for trig in [SHOW_HEADERS, HIDE_HEADERS]:
			self.mav.triggers.addHandler(trig,
						self._populateMenu, None)
예제 #13
0
	def fillInUI(self, parent):
		import Pmw, Tkinter
		SaveModeless.fillInUI(self, parent)
		row = 0

		from chimera.widgets import MoleculeOptionMenu
		self.modelMenu = MoleculeOptionMenu(self.clientArea,
			labelpos='w', label_text="Save model:",
			command=lambda m: self.configure(
			self.modelMenu.getvalue(), refreshList=False))
		self.modelMenu.grid(row=row, column=0, sticky='w')
		row += 1

		from AddCharge import knownChargeModels, defaultChargeModel

		from chimera import dialogs
		self.parmsetOption = Pmw.OptionMenu(self.clientArea,
			labelpos='w', label_text="Select force field type: ",
			initialitem=defaultChargeModel, items=knownChargeModels)
		# not always shown; remember row number
		self._msmRow = row
		self.parmsetOption.grid(row=row, column=0, sticky='w')
		row += 1
예제 #14
0
 def fillInUI(self, *args):
     if isinstance(self, SaveModeless):
         SaveModeless.fillInUI(self, *args)
     else:
         SaveModal.fillInUI(self, *args)
     import Tkinter
     self.saveRegion = Tkinter.IntVar(self.clientArea)
     self.saveRegion.set(False)
     Tkinter.Checkbutton(self.clientArea,
                         variable=self.saveRegion,
                         text="Restrict save to active region").grid(
                             row=0, sticky='w')
     self.omitGaps = Tkinter.IntVar(self.clientArea)
     self.omitGaps.set(True)
     Tkinter.Checkbutton(self.clientArea,
                         variable=self.omitGaps,
                         text="Omit all-gap columns").grid(row=1,
                                                           sticky='w')
     self.appendNumberings = Tkinter.IntVar(self.clientArea)
     Tkinter.Checkbutton(self.clientArea,
                         variable=self.appendNumberings,
                         text="Append sequence"
                         " numberings to sequence names").grid(row=2,
                                                               sticky='w')
예제 #15
0
	def fillInUI(self, parent):
		SaveModeless.fillInUI(self, parent)

		from chimera.tkoptions import NamingStyleOption
		self.namingStyle = NamingStyleOption(self.clientArea, 0, None,
								None, None)
    def fillInUI(self, parent):
        SaveModeless.fillInUI(self, parent)

        from chimera.tkoptions import NamingStyleOption
        self.namingStyle = NamingStyleOption(self.clientArea, 0, None, None,
                                             None)
예제 #17
0
	def fillInUI(self, parent):
		SaveModeless.fillInUI(self, parent)
		self.clientArea.columnconfigure(1, weight=1)

		startFrame = self.movie.startFrame
		endFrame = self.movie.endFrame
		from chimera.tkoptions import IntOption, BooleanOption, \
						FloatOption, StringOption
		self.startFrame = IntOption(self.clientArea, 0,
					"Starting frame", startFrame, None,
					min=startFrame, max=endFrame, width=6)

		numFrames = endFrame - startFrame + 1
		defStride = 1 + int(numFrames/300)
		self.stride = IntOption(self.clientArea, 2, "Step size",
			defStride, None, min=1, max=numFrames, width=3)

		self.endFrame = IntOption(self.clientArea, 3, "Ending frame",
			endFrame, None, min=startFrame, max=endFrame, width=6)

		self.roundtrip = BooleanOption(self.clientArea, 4, "Encode"
			' forward then backward ("roundtrip")', prefs[
			RECORDER_ROUNDTRIP], None, balloon=
			"Encode the frames in forward and then reverse\n"
			"order so that if the movie is played as a loop\n"
			"the motion seems continuous")

		class FrameQuality(BooleanOption):
			labels = ["screen", "supersampled"]
		self.supersample = FrameQuality(self.clientArea, 5,
			"Frame quality", prefs[RECORDER_SUPERSAMPLE],
			self.supersampleCB, balloon=
			"Whether each frame should be taken as is from\n"
			"the screen (fast) or redrawn at higher quality\n"
			"with several samples per pixel.")

		from chimera.printer import SupersampleOption
		self.samples = SupersampleOption(self.clientArea, 6,
			"Samples", prefs[RECORDER_SAMPLES], None)
		self.supersampleCB()

		self.raytrace = BooleanOption(self.clientArea, 7, "Raytrace"
			" with POV-Ray", prefs[RECORDER_RAYTRACE], None)
			
		def povOptCB():
			from chimera.dialogs import display
			d = display("preferences")
			from chimera.printer import POVRAY_SETUP
			d.setCategoryMenu(POVRAY_SETUP)
		Tkinter.Button(self.clientArea, text="POV-Ray Options", pady=0,
			command=povOptCB).grid(row=8, column=0, columnspan=2)
			
		self.recordArgs = StringOption(self.clientArea, 9,
			"Additional recording options",
			prefs[RECORDER_RECORD_ARGS], None, balloon=
			"Options (other than 'supersample' and 'raytrace')\n"
			"for recording frames as per Chimera's 'movie record'"
			" command")

		self.encodeArgs = StringOption(self.clientArea, 10,
			"Additional encoding options",
			prefs[RECORDER_ENCODE_ARGS], None, balloon=
			"Options (other than 'mformat', 'output', and\n"
			"'roundtrip') for composing the frames into the\n"
			"final animation as per Chimera's 'movie encode'\n"
			"command")
		
		Tkinter.Label(self.clientArea, text=
			"On some computers it may be necessary to make sure"
			" that no\nwindows occlude the main Chimera graphics"
			" window (even\npartially) during non-raytraced movie"
			" recording").grid(row=11, column=0, columnspan=2)
예제 #18
0
    def fillInUI(self, parent):
        SaveModeless.fillInUI(self, parent)
        self.clientArea.columnconfigure(1, weight=1)

        startFrame = self.movie.startFrame
        endFrame = self.movie.endFrame
        from chimera.tkoptions import IntOption, BooleanOption, \
            FloatOption, StringOption
        self.startFrame = IntOption(self.clientArea,
                                    0,
                                    "Starting frame",
                                    startFrame,
                                    None,
                                    min=startFrame,
                                    max=endFrame,
                                    width=6)

        numFrames = endFrame - startFrame + 1
        defStride = 1 + int(numFrames / 300)
        self.stride = IntOption(self.clientArea,
                                2,
                                "Step size",
                                defStride,
                                None,
                                min=1,
                                max=numFrames,
                                width=3)

        self.endFrame = IntOption(self.clientArea,
                                  3,
                                  "Ending frame",
                                  endFrame,
                                  None,
                                  min=startFrame,
                                  max=endFrame,
                                  width=6)

        self.roundtrip = BooleanOption(
            self.clientArea,
            4, "Encode"
            ' forward then backward ("roundtrip")',
            prefs[RECORDER_ROUNDTRIP],
            None,
            balloon="Encode the frames in forward and then reverse\n"
            "order so that if the movie is played as a loop\n"
            "the motion seems continuous")

        class FrameQuality(BooleanOption):
            labels = ["screen", "supersampled"]

        self.supersample = FrameQuality(
            self.clientArea,
            5,
            "Frame quality",
            prefs[RECORDER_SUPERSAMPLE],
            self.supersampleCB,
            balloon="Whether each frame should be taken as is from\n"
            "the screen (fast) or redrawn at higher quality\n"
            "with several samples per pixel.")

        from chimera.printer import SupersampleOption
        self.samples = SupersampleOption(self.clientArea, 6, "Samples",
                                         prefs[RECORDER_SAMPLES], None)
        self.supersampleCB()

        self.raytrace = BooleanOption(self.clientArea, 7, "Raytrace"
                                      " with POV-Ray",
                                      prefs[RECORDER_RAYTRACE], None)

        def povOptCB():
            from chimera.dialogs import display
            d = display("preferences")
            from chimera.printer import POVRAY_SETUP
            d.setCategoryMenu(POVRAY_SETUP)

        Tkinter.Button(self.clientArea,
                       text="POV-Ray Options",
                       pady=0,
                       command=povOptCB).grid(row=8, column=0, columnspan=2)

        self.recordArgs = StringOption(
            self.clientArea,
            9,
            "Additional recording options",
            prefs[RECORDER_RECORD_ARGS],
            None,
            balloon="Options (other than 'supersample' and 'raytrace')\n"
            "for recording frames as per Chimera's 'movie record'"
            " command")

        self.encodeArgs = StringOption(
            self.clientArea,
            10,
            "Additional encoding options",
            prefs[RECORDER_ENCODE_ARGS],
            None,
            balloon="Options (other than 'mformat', 'output', and\n"
            "'roundtrip') for composing the frames into the\n"
            "final animation as per Chimera's 'movie encode'\n"
            "command")

        Tkinter.Label(self.clientArea,
                      text="On some computers it may be necessary to make sure"
                      " that no\nwindows occlude the main Chimera graphics"
                      " window (even\npartially) during non-raytraced movie"
                      " recording").grid(row=11, column=0, columnspan=2)
예제 #19
0
	def fillInUI(self, parent):
		import Pmw, Tkinter
		SaveModeless.fillInUI(self, parent)
		row = 0

		from chimera.widgets import MoleculeScrolledListBox, \
							ModelOptionMenu
		self.modelList = MoleculeScrolledListBox(self.clientArea,
			labelpos='w', label_text="Save models:",
			listbox_selectmode='extended',
			selectioncommand=lambda: self.configure(
			self.modelList.getvalue(), refreshList=False))
		self.modelList.grid(row=row, column=0, sticky='nsew')
		self.clientArea.rowconfigure(row, weight=1)
		self.clientArea.columnconfigure(0, weight=1)
		row += 1

		from chimera import dialogs
		self.labelMap = {
			"individual":
				"a single file [individual @MOLECULE sections]",
			"combined":
				"a single file [combined @MOLECULE section]",
			"multiple":
				"multiple files [appending model number]"
		}
		preferred = self.labelMap[self.prefs["multiSaveMol2"]]
		self.multiSaveMenu = Pmw.OptionMenu(self.clientArea,
			labelpos='w', label_text="Save multiple models in",
			initialitem=preferred, items=self.labelMap.values())
		# not always shown; remember row number
		self._msmRow = row
		row += 1

		self.saveRelativeVar = Tkinter.IntVar(self.clientArea)
		self.saveRelativeVar.set(False)
		self.relativeFrame = f = Tkinter.Frame(self.clientArea)
		Tkinter.Checkbutton(f, variable=self.saveRelativeVar,
			text="Save relative to model:").grid(row=0,
			column=0, sticky='e')
		self.relModelMenu = ModelOptionMenu(f)
		self.relModelMenu.grid(row=0, column=1, sticky='w')
		self.saveUntransformedVar = Tkinter.IntVar(parent)
		self.saveUntransformedVar.set(True)
		self.untransformedButton = Tkinter.Checkbutton(self.clientArea,
					variable=self.saveUntransformedVar,
					text="Use untransformed coordinates")
		self._rfRow = row
		row += 1

		self.sybylHydNamesVar = Tkinter.IntVar(self.clientArea)
		self.sybylHydNamesVar.set(
				self.prefs["hydrogen naming"] == "sybyl")
		Tkinter.Checkbutton(self.clientArea,
			variable=self.sybylHydNamesVar,
			text="Use Sybyl-style hydrogen naming (e.g. HE12"
			" rather than 2HE1)").grid(row=row, column=0,
			sticky="w")
		row += 1

		self.resNumsVar = Tkinter.IntVar(self.clientArea)
		self.resNumsVar.set(self.prefs["residue numbers"])
		Tkinter.Checkbutton(self.clientArea, variable=self.resNumsVar,
			text="Include residue sequence numbers in substructure"
			" names").grid(row=row, column=0, sticky='w')
		row += 1

		self.writeGaffVar = Tkinter.IntVar(self.clientArea)
		self.resNumsVar.set(False)
		Tkinter.Checkbutton(self.clientArea, variable=self.writeGaffVar,
			text="Write Amber/GAFF atom types instead of Sybyl atom types"
			).grid(row=row, column=0, sticky='w')
		row += 1

		self.rigidVar = Tkinter.IntVar(self.clientArea)
		self.rigidVar.set(False)
		Tkinter.Checkbutton(self.clientArea, variable=self.rigidVar,
			text="Write current selection to @SETS section of file"
			).grid(row=row, column=0, sticky="w")
		row += 1
	def fillInUI(self, parent):
		SaveModeless.fillInUI(self, parent)
		row = 0

		from chimera.widgets import MoleculeScrolledListBox, \
							ModelOptionMenu
		self.modelList = MoleculeScrolledListBox(self.clientArea,
			labelpos='w', label_text="Save models:",
			listbox_selectmode='extended',
			selectioncommand=lambda: self.configure(
			self.modelList.getvalue(), refreshList=False))
		self.modelList.grid(row=row, column=0, sticky='nsew')
		self.clientArea.rowconfigure(row, weight=1)
		self.clientArea.columnconfigure(0, weight=1)
		row += 1

		import Tkinter, Pmw
		self.dispOnlyVar = Tkinter.IntVar(parent)
		self.dispOnlyVar.set(False)
		Tkinter.Checkbutton(self.clientArea, variable=self.dispOnlyVar,
			text="Save displayed atoms only").grid(row=row,
			column=0, sticky='w')
		row += 1

		self.selOnlyVar = Tkinter.IntVar(parent)
		self.selOnlyVar.set(False)
		Tkinter.Checkbutton(self.clientArea, variable=self.selOnlyVar,
			text="Save selected atoms only").grid(row=row,
			column=0, sticky='w')
		row += 1

		self.saveRelativeVar = Tkinter.IntVar(parent)
		self.saveRelativeVar.set(False)
		self.relativeFrame = f = Tkinter.Frame(self.clientArea)
		Tkinter.Checkbutton(f, variable=self.saveRelativeVar,
			text="Save relative to model:"
			).grid(row=0, column=0, sticky='e')
		self.relModelMenu = ModelOptionMenu(f)
		self.relModelMenu.grid(row=0, column=1, sticky='w')
		self.saveUntransformedVar = Tkinter.IntVar(parent)
		self.saveUntransformedVar.set(True)
		self.untransformedButton = Tkinter.Checkbutton(self.clientArea,
					variable=self.saveUntransformedVar,
					text="Use untransformed coordinates")
		self._rfRow = row
		row += 1

		self.frameSave = Pmw.OptionMenu(self.clientArea,
			labelpos='w', label_text="Save",
			initialitem="current frame",
			items=["current frame", "all frames"])
		# not always shown; remember row number
		self._fsRow = row
		row += 1
			
		from chimera import dialogs
		self.labelMap = {
			"single": "a single file",
			"multiple":
				"multiple files [appending model number]"
		}
		preferred = self.labelMap[self.prefs["multiSavePDB"]]
		self.multiSaveMenu = Pmw.OptionMenu(self.clientArea,
			labelpos='w', label_text="Save multiple models in",
			initialitem=preferred, items=self.labelMap.values())
		# not always shown; remember row number
		self._msmRow = row
		row += 1