Added support for uuencoded files (Robert Davison).
[rox-archive.git] / box.py
blob7f5742329857fb41807382aca70a76e177d2b45e
1 import sys
3 import rox
4 from rox import saving, g, TRUE, FALSE
6 import formats
8 class ArchiveBox(saving.SaveBox, saving.Saveable):
9 "A savebox with an operation selector."
10 def __init__(self):
11 self.data = None
12 self.operation = None
13 saving.SaveBox.__init__(self, self, '', 'text/plain')
15 def save_cancelled(self):
16 assert formats.current_command
17 formats.current_command.kill()
19 def set_save_in_progress(self, busy):
20 if self.operation:
21 self.operation.set_sensitive(not busy)
22 saving.SaveBox.set_save_in_progress(self, busy)
24 def build_main_area(self):
25 self.vbox.add(self.save_area)
27 self.operation = g.OptionMenu()
28 self.vbox.pack_start(self.operation, FALSE, TRUE, 0)
29 self.operation.show()
30 self.operation.set_border_width(5)
31 self.updating = 0
33 self.ops_menu = g.Menu()
34 self.operation.set_menu(self.ops_menu)
36 def set_data(self, data):
37 assert not self.data
39 self.data = data
40 self.save_mode = data.mode
41 ops = [op for op in formats.operations if op.can_handle(data)]
43 name = data.default_name
44 self.save_area.entry.set_text(name)
45 start = name.rfind('/') + 1
46 #self.save_area.entry.select_region(start, -1)
47 g.Editable.select_region(self.save_area.entry, start, -1)
49 # Add all supported ops to the menu.
50 self.ops = []
51 last = None
52 for op in ops:
53 if last and last != op.__class__:
54 item = g.MenuItem()
55 item.show()
56 self.ops_menu.append(item)
57 self.ops.append(None)
58 last = op.__class__
59 item = g.MenuItem(str(op))
60 item.show()
61 self.ops_menu.append(item)
62 self.ops.append(op)
64 # Select the default
65 try:
66 self.operation.set_history(self.ops.index(data.default))
67 except ValueError:
68 print >>sys.stderr, "Warning: %s not in ops list!" % data.default
70 self.operation.connect('changed', self.op_changed)
71 self.save_area.entry.connect('changed', self.name_changed)
73 self.save_area.set_type(data.default.type)
75 def name_changed(self, entry):
76 if self.updating:
77 return
78 self.updating = 1
80 name = entry.get_text()
81 i = 0
82 for op in self.ops:
83 if op and name.endswith('.' + op.extension):
84 self.operation.set_history(i)
85 break
86 i += 1
88 self.updating = 0
90 def op_changed(self, operation):
91 op = self.ops[operation.get_history()]
92 assert op
93 self.set_type(op.type)
95 if self.updating:
96 return
97 self.updating = 1
99 name = self.save_area.entry.get_text()
100 for op2 in self.ops:
101 if op2 and name.endswith('.' + op2.extension):
102 name = name[:-len(op2.extension)-1]
103 break
104 if op.add_extension:
105 name += '.' + op.extension
106 self.save_area.entry.set_text(name)
107 start = name.rfind('/') + 1
108 #self.save_area.entry.select_region(start, -1)
109 g.Editable.select_region(self.save_area.entry, start, -1)
111 self.updating = 0
113 def save_to_file(self, path):
114 op = self.ops[self.operation.get_history()]
115 if hasattr(op, 'save_to_file'):
116 op.save_to_file(self.data, path)
117 else:
118 saving.Saveable.save_to_file(self, path)
120 def save_to_stream(self, stream):
121 op = self.ops[self.operation.get_history()]
122 op.save_to_stream(self.data, stream)