source: trunk/gui/scripts/deviceEditor.tcl @ 5896

Last change on this file since 5896 was 5659, checked in by ldelgass, 9 years ago

whitespace

File size: 7.6 KB
Line 
1# -*- mode: tcl; indent-tabs-mode: nil -*-
2# ----------------------------------------------------------------------
3#  COMPONENT: deviceEditor - general-purpose device editor
4#
5#  This widget takes a <structure> description and chooses a specific
6#  editor appropriate for the contents of the structure.  If the
7#  <structure> contains a molecule, then it chooses a MoleculeViewer.
8#  If it contains a 1D device, then it chooses a deviceViewer1D.
9# ======================================================================
10#  AUTHOR:  Michael McLennan, Purdue University
11#  Copyright (c) 2004-2012  HUBzero Foundation, LLC
12#
13#  See the file "license.terms" for information on usage and
14#  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
15# ======================================================================
16package require Itk
17
18option add *DeviceEditor.autoCleanUp yes widgetDefault
19
20itcl::class Rappture::DeviceEditor {
21    inherit itk::Widget Rappture::ControlOwner
22
23    itk_option define -autocleanup autoCleanUp AutoCleanUp 1
24
25    constructor {owner args} {
26        Rappture::ControlOwner::constructor $owner
27    } {
28        # defined below
29    }
30    public method value {args}
31    public method download {option args}
32    public method add {dataobj {settings ""}}
33    public method delete {args}
34    public method parameters {title args} {
35        # do nothing
36    }
37    public method snap {w h}
38
39    protected method _redraw {}
40    protected method _type {xmlobj}
41
42    private variable _current ""  ;# active device editor
43
44    public common _molvisHosts ""
45
46    public proc setMolvisServer {namelist} {
47        if {[regexp {^[a-zA-Z0-9\.]+:[0-9]+(,[a-zA-Z0-9\.]+:[0-9]+)*$} $namelist match]} {
48            set _molvisHosts $namelist
49        } else {
50            error "bad visualization server address \"$namelist\": should be host:port,host:port,..."
51        }
52    }
53}
54
55itk::usual DeviceEditor {
56}
57
58# ----------------------------------------------------------------------
59# CONSTRUCTOR
60# ----------------------------------------------------------------------
61itcl::body Rappture::DeviceEditor::constructor {owner args} {
62    itk_component add top {
63        frame $itk_interior.top
64    }
65    pack $itk_component(top) -fill x
66
67    eval itk_initialize $args
68}
69
70
71# ----------------------------------------------------------------------
72# USAGE: value ?-check? ?<newval>?
73#
74# Clients use this to query/set the value for this widget.  With
75# no args, it returns the current value for the widget.  If the
76# <newval> is specified, it sets the value of the widget and
77# sends a <<Value>> event.  If the -check flag is included, the
78# new value is not actually applied, but just checked for correctness.
79# ----------------------------------------------------------------------
80itcl::body Rappture::DeviceEditor::value {args} {
81    set onlycheck 0
82    set i [lsearch -exact $args -check]
83    if {$i >= 0} {
84        set onlycheck 1
85        set args [lreplace $args $i $i]
86    }
87
88    if {[llength $args] == 1} {
89        if {$_xmlobj != ""} {
90            if {$itk_option(-autocleanup)} {
91                # delete any existing object
92                itcl::delete object $_xmlobj
93            }
94            set _xmlobj ""
95        }
96
97        set newval [lindex $args 0]
98        if {$newval != ""} {
99            if {$onlycheck} {
100                return
101            }
102            if {![Rappture::library isvalid $newval]} {
103                error "bad value \"$newval\": should be Rappture::Library"
104            }
105            set _xmlobj $newval
106        }
107        _redraw
108        $_current configure -device $_xmlobj
109        event generate $itk_component(hull) <<Value>>
110
111    } elseif {[llength $args] == 0} {
112        sync  ;# querying -- must sync controls with the value
113    } else {
114        error "wrong # args: should be \"value ?-check? ?newval?\""
115    }
116    return $_xmlobj
117}
118
119# ----------------------------------------------------------------------
120# USAGE: add <dataobj> ?<settings>?
121#
122# Clients use this to add a data object to the plot.  The optional
123# <settings> are used to configure the plot. Allowed settings are
124# -color, -brightness, -width, -linestyle, and -raise. Only
125# -brightness and -raise do anything.
126# ----------------------------------------------------------------------
127itcl::body Rappture::DeviceEditor::add {dataobj {settings ""}} {
128    set _xmlobj $dataobj
129    if {"" == $_current} {    # Make sure viewer instance exists
130        _redraw
131    }
132    eval $_current add $dataobj [list $settings]
133}
134
135# ----------------------------------------------------------------------
136# USAGE: delete ?<dataobj> <dataobj> ...?
137#
138# Clients use this to delete a dataobj from the plot. If no dataobjs
139# are specified, then all dataobjs are deleted.
140# ----------------------------------------------------------------------
141itcl::body Rappture::DeviceEditor::delete {args} {
142    if {"" != $_current} {
143        eval $_current delete $args
144        set _xmlobj [lindex [$_current get] end]
145    }
146}
147
148# ----------------------------------------------------------------------
149# USAGE: download coming
150# USAGE: download controls <downloadCommand>
151# USAGE: download now
152#
153# Clients use this method to create a downloadable representation
154# of the plot.  Returns a list of the form {ext string}, where
155# "ext" is the file extension (indicating the type of data) and
156# "string" is the data itself.
157# ----------------------------------------------------------------------
158itcl::body Rappture::DeviceEditor::download {option args} {
159    if {"" != $_current} {
160        return [eval $_current download $option $args]
161    }
162    return ""
163}
164
165# ----------------------------------------------------------------------
166# USAGE: _redraw
167#
168# Used internally to load new device data into the appropriate
169# editor.  If the editor needs to be created, it is created and
170# activated within this widget.  Then, the data is loaded into
171# the editor.
172# ----------------------------------------------------------------------
173itcl::body Rappture::DeviceEditor::_redraw {} {
174    if {$_current != ""} {
175        $_current configure -device ""
176        set _current ""
177    }
178    switch -- [_type $_xmlobj] {
179        molecule {
180            if { ![winfo exists $itk_component(hull).mol] } {
181                catch {
182                    destroy $itk_component(hull).dev
183                }
184                set servers [Rappture::VisViewer::GetServerList "pymol"]
185                Rappture::MolvisViewer $itk_component(hull).mol $servers
186                pack $itk_component(hull).mol -expand yes -fill both
187            }
188            set _current $itk_component(hull).mol
189        }
190        device1D {
191            if { ![winfo exists $itk_component(hull).dev] } {
192                catch {
193                    destroy $itk_component(hull).mol
194                }
195                Rappture::DeviceViewer1D $itk_component(hull).dev $this
196                pack $itk_component(hull).dev -expand yes -fill both
197            }
198            set _current $itk_component(hull).dev
199        }
200    }
201}
202
203# ----------------------------------------------------------------------
204# USAGE: _type <xmlobj>
205#
206# Used internally to determine the type of the device data stored
207# within the <xmlobj>.  Returns a name such as "molecule" or
208# "device1D" indicating the type of editor that should be used to
209# display the data.
210# ----------------------------------------------------------------------
211itcl::body Rappture::DeviceEditor::_type {xmlobj} {
212    if {$xmlobj == ""} {
213        return ""
214    }
215    if {[llength [$xmlobj children -type molecule components]] > 0} {
216        return "molecule"
217    }
218    return "device1D"
219}
220
221itcl::body Rappture::DeviceEditor::snap { w h } {
222    return [$_current snap $w $h]
223}
Note: See TracBrowser for help on using the repository browser.