1#---------------------------------------------------------------------------
2# files.tcl ---
3#
4#	xcircuit Tcl script for handling multiple-file writes
5#
6#	Tim Edwards 12/5/05 for MultiGiG
7#---------------------------------------------------------------------------
8
9set XCOps(module,files) 1
10
11#---------------------------------------------------------------------------
12# Forced write all
13#---------------------------------------------------------------------------
14
15proc xcircuit::forcewriteall {} {
16   set pages [page links all]
17   for {set i 1} {$i <= $pages} {incr i} {
18      page $i changes 1
19      set techlist [technology used $i]
20      foreach tech $techlist {
21	 if {[technology writable $tech]} {technology changed $tech 1}
22      }
23   }
24   destroy .writeall
25   xcircuit::promptwriteall
26}
27
28#---------------------------------------------------------------------------
29# Write all pages.  Determine which pages are enabled/disabled in the
30# ".writeall" window, and save each one.
31#---------------------------------------------------------------------------
32
33proc xcircuit::writeall {} {
34   global XCOps
35
36   if {![catch {raise .writeall}]} {
37      set rows [lindex [grid size .writeall.list] 1]
38      incr rows -1
39      for {set i 1} {$i <= $rows} {incr i} {
40	 if {$XCOps(cbox${i}) > 0} {
41	    set pagelist [pack slaves .writeall.list.pframe${i}]
42	    set firstpage [lindex $pagelist 0]
43	    set pageno [${firstpage} cget -text]
44	    if {$pageno == "-" || $pageno == "X"} {
45	       set tname [.writeall.list.f${i} cget -text]
46	       set fname [technology filename $tname]
47	       if {$fname == "(no associated file)"} {
48		  # Fix me:  this works only on one technology at a time!
49		  xcircuit::promptsavetech
50	       } else {
51	          technology save $tname
52	       }
53	    } else {
54	       page ${pageno} update
55	       page ${pageno} save
56	    }
57	 }
58	 unset XCOps(cbox${i})
59      }
60      destroy .writeall
61   }
62}
63
64#---------------------------------------------------------------------------
65# Prompt for writing all pages
66#---------------------------------------------------------------------------
67
68proc xcircuit::promptwriteall {} {
69   global XCOps
70
71   # Get list of unique filenames.
72
73   set pages [page links all]
74   set filelist {}
75   for {set i 1} {$i <= $pages} {incr i} {
76      set changes [page $i changes]
77      if {$changes > 0} {
78	 if {[page $i filename] == {}} {
79	    page $i filename [page $i label]
80	 }
81         lappend filelist [page $i filename]
82      }
83   }
84   set filelist [lsort -unique -dictionary $filelist]
85
86   set techlist {}
87   set badtechslist {}
88   foreach tech [technology list] {
89      if {[technology changed $tech] > 0} {
90	 if {[technology writable $tech] > 0} {
91	    lappend techlist $tech
92	 } else {
93	    lappend badtechslist $tech
94	 }
95      }
96   }
97
98   set filestowrite [expr [llength $filelist] + [llength $techlist]]
99
100   # Set up the "writeall" window
101
102   catch {destroy .writeall}
103   toplevel .writeall -bg beige
104   frame .writeall.tbar -bg beige
105   frame .writeall.list -bg beige
106   frame .writeall.bbar -bg beige
107
108   pack .writeall.tbar -side top -padx 5 -pady 5 -fill x
109   pack .writeall.list -side top -padx 5 -pady 5 -fill x
110   pack .writeall.bbar -side top -padx 5 -pady 5 -fill x
111
112   if {$filestowrite == 0} {
113      label .writeall.tbar.title -text \
114		"(No modified pages or technologies to write)" -bg \
115		beige -fg gray40
116      pack .writeall.tbar.title -side left
117   } else {
118      label .writeall.tbar.title -text "Write All Modified Pages and Technologies:" \
119		-bg beige -fg blue
120      pack .writeall.tbar.title -side left
121
122      label .writeall.list.ftitle -text "Filename" -bg beige -fg brown
123      label .writeall.list.ptitle -text "Pages" -bg beige -fg brown
124      label .writeall.list.wtitle -text "Write?" -bg beige -fg brown
125      grid .writeall.list.ftitle -row 0 -column 0 -sticky news
126      grid .writeall.list.ptitle -row 0 -column 1 -sticky news
127      grid .writeall.list.wtitle -row 0 -column 2 -sticky news
128   }
129
130   set k 0
131   foreach j $filelist {
132      incr k
133      label .writeall.list.f${k} -text "$j" -anchor w -bg beige
134      frame .writeall.list.pframe${k} -bg beige
135      set XCOps(cbox${k}) 1
136      checkbutton .writeall.list.cbox${k} -bg beige -variable XCOps(cbox${k})
137
138      set l 0
139      for {set i 1} {$i <= $pages} {incr i} {
140	 if {[page $i filename] == $j} {
141            set changes [page $i changes]
142            if {$changes > 0} {
143	       incr l
144	       button .writeall.list.pframe${k}.b${l} -text "$i" -bg \
145			white -command "page goto $i ; \
146			promptsavepage"
147	       pack .writeall.list.pframe${k}.b${l} -side left -padx 5
148	    }
149         }
150      }
151      grid .writeall.list.f${k} -row $k -column 0 -sticky news
152      grid .writeall.list.pframe${k} -row $k -column 1 -sticky news
153      grid .writeall.list.cbox${k} -row $k -column 2 -sticky news
154   }
155
156   foreach j $techlist {
157      incr k
158      label .writeall.list.f${k} -text "$j" -anchor w -bg beige
159      frame .writeall.list.pframe${k} -bg beige
160      set XCOps(cbox${k}) 1
161      checkbutton .writeall.list.cbox${k} -bg beige -variable XCOps(cbox${k})
162
163      button .writeall.list.pframe${k}.b1 -text "-" -bg white \
164			-command "set XCOps(technology) $j ; \
165				  xcircuit::promptsavetech"
166      pack .writeall.list.pframe${k}.b1 -side left -padx 5
167      grid .writeall.list.f${k} -row $k -column 0 -sticky news
168      grid .writeall.list.pframe${k} -row $k -column 1 -sticky news
169      grid .writeall.list.cbox${k} -row $k -column 2 -sticky news
170   }
171
172   foreach j $badtechslist {
173      incr k
174      label .writeall.list.f${k} -text "$j" -anchor w -bg beige -fg gray60
175      frame .writeall.list.pframe${k} -bg beige
176      set XCOps(cbox${k}) 0
177      checkbutton .writeall.list.cbox${k} -bg beige -variable XCOps(cbox${k})
178
179      button .writeall.list.pframe${k}.b1 -text "X" -bg white -fg gray60 \
180			-command "set XCOps(technology) $j ; \
181				  xcircuit::promptsavetech"
182      pack .writeall.list.pframe${k}.b1 -side left -padx 5
183      grid .writeall.list.f${k} -row $k -column 0 -sticky news
184      grid .writeall.list.pframe${k} -row $k -column 1 -sticky news
185      grid .writeall.list.cbox${k} -row $k -column 2 -sticky news
186   }
187
188   if {$filestowrite > 0} {
189      button .writeall.bbar.okay -text Write -bg beige -command \
190		{xcircuit::writeall}
191      pack .writeall.bbar.okay -side left -ipadx 10 -padx 5
192   }
193
194   if {$filestowrite < $pages} {
195      button .writeall.bbar.force -text Force -bg beige -command \
196	{xcircuit::forcewriteall}
197      pack .writeall.bbar.force -side left -ipadx 10 -padx 5
198   }
199
200   button .writeall.bbar.cancel -text Cancel -bg beige -command \
201	{destroy .writeall}
202   pack .writeall.bbar.cancel -side right -ipadx 10 -padx 5
203}
204
205