Index: src/mlx/config.py
===================================================================
--- src/mlx/config.py	(revision 166)
+++ src/mlx/config.py	(revision 175)
@@ -52,4 +52,58 @@
 #-------------------------------------------------------------------------------
 
+class Checklist(object):
+    """A checklist for a certain aircraft type."""
+    # The name of the section of the checklists
+    SECTION="checklists"
+    
+    @staticmethod
+    def fromConfig(config, aircraftType):
+        """Create a checklist for the given aircraft type from the given
+        config."""
+        baseName = "checklist." + const.icaoCodes[aircraftType] + "."
+        fileList = []
+        while True:
+            option = baseName + str(len(fileList))
+            if config.has_option(Checklist.SECTION, option):
+                fileList.append(config.get(Checklist.SECTION, option))
+            else:
+                break
+
+        return Checklist(fileList)
+
+    def __init__(self, fileList = None):
+        """Construct the check list with the given file list."""
+        self._fileList = [] if fileList is None else fileList[:]
+
+    def clone(self):
+        """Clone the checklist."""
+        return Checklist(self._fileList)
+
+    def toConfig(self, config, aircraftType):
+        """Add this checklist to the given config."""
+        baseName = "checklist." + const.icaoCodes[aircraftType] + "."
+        for index in range(0, len(self._fileList)):
+            option = baseName + str(index)
+            config.set(Checklist.SECTION, option,
+                       self._fileList[index])
+
+    def __eq__(self, other):
+        """Determine if the checklist is equal to the given other one."""
+        return self._fileList == other._fileList
+
+    def __len__(self):
+        """Get the length of the file list."""
+        return len(self._fileList)
+
+    def __getitem__(self, index):
+        """Get the file with the given index."""
+        return self._fileList[index]
+
+    def __iter__(self):
+        """Iterate over the files."""
+        return iter(self._fileList)
+
+#-------------------------------------------------------------------------------
+
 class Config(object):
     """Our configuration."""
@@ -89,4 +143,8 @@
 
         self._messageTypeLevels = {}
+
+        self._checklists = {}
+        for aircraftType in const.aircraftTypes:
+            self._checklists[aircraftType] = Checklist()
         
         self._modified = False
@@ -344,4 +402,14 @@
         if updateURL!=self._updateURL:
             self._updateURL = updateURL
+            self._modified = True
+
+    def getChecklist(self, aircraftType):
+        """Get the checklist for the given aircraft type."""
+        return self._checklists[aircraftType]
+
+    def setChecklist(self, aircraftType, checklist):
+        """Set the checklist for the given aircraft type."""
+        if checklist!=self._checklists[aircraftType]:
+            self._checklists[aircraftType] = checklist.clone()
             self._modified = True
 
@@ -399,4 +467,8 @@
                                     Config.DEFAULT_UPDATE_URL)
 
+        for aircraftType in const.aircraftTypes:
+            self._checklists[aircraftType] = \
+                Checklist.fromConfig(config, aircraftType)
+
         self._modified = False
 
@@ -459,4 +531,8 @@
                    "yes" if self._autoUpdate else "no")
         config.set("update", "url", self._updateURL)
+
+        config.add_section(Checklist.SECTION)
+        for aircraftType in const.aircraftTypes:
+            self._checklists[aircraftType].toConfig(config, aircraftType)
 
         try:
Index: src/mlx/const.py
===================================================================
--- src/mlx/const.py	(revision 170)
+++ src/mlx/const.py	(revision 175)
@@ -77,4 +77,36 @@
 # Aircraft type: Yakovlev Yak-40
 AIRCRAFT_YK40 = 15
+
+#-------------------------------------------------------------------------------
+
+# The list of aircraft types that we know of
+# The order is mostly from most recent to oldest considering
+# Malev's history
+aircraftTypes = [AIRCRAFT_B736, AIRCRAFT_B737, AIRCRAFT_B738,
+                 AIRCRAFT_DH8D,
+                 AIRCRAFT_F70, AIRCRAFT_CRJ2,
+                 AIRCRAFT_B762, AIRCRAFT_B763,
+                 AIRCRAFT_B733, AIRCRAFT_B734, AIRCRAFT_B735,
+                 AIRCRAFT_T154, AIRCRAFT_T134,
+                 AIRCRAFT_YK40, AIRCRAFT_DC3]
+
+#-------------------------------------------------------------------------------
+
+# A mapping of aircraft types to their ICAO codes
+icaoCodes = { AIRCRAFT_B736 : "B736",
+              AIRCRAFT_B737 : "B737",
+              AIRCRAFT_B738 : "B738",
+              AIRCRAFT_B733 : "B733",
+              AIRCRAFT_B734 : "B734",
+              AIRCRAFT_B735 : "B735",
+              AIRCRAFT_DH8D : "DH8D",
+              AIRCRAFT_B762 : "B762",
+              AIRCRAFT_B763 : "B763",
+              AIRCRAFT_CRJ2 : "CRJ2",
+              AIRCRAFT_F70  : "F70",
+              AIRCRAFT_DC3  : "DC3",
+              AIRCRAFT_T134 : "T134",
+              AIRCRAFT_T154 : "T154",
+              AIRCRAFT_YK40 : "YK40" }
 
 #-------------------------------------------------------------------------------
Index: src/mlx/gui/checklist.py
===================================================================
--- src/mlx/gui/checklist.py	(revision 172)
+++ src/mlx/gui/checklist.py	(revision 175)
@@ -6,4 +6,8 @@
 
 from mlx.i18n import xstr
+import mlx.const as const
+import mlx.config as config
+
+import os
 
 #------------------------------------------------------------------------------
@@ -12,5 +16,5 @@
     """The dialog to edit the checklists."""
     def __init__(self, gui):
-        super(ChecklistEditor, self).__init__(WINDOW_TITLE_BASE + " " +
+        super(ChecklistEditor, self).__init__(WINDOW_TITLE_BASE + " - " +
                                               xstr("chklst_title"),
                                               gui.mainWindow,
@@ -20,19 +24,269 @@
         self.add_button(xstr("button_ok"), RESPONSETYPE_ACCEPT)
 
+        self._gui = gui
+        self._checklists = {}
+        self._currentAircraftType = const.aircraftTypes[0]
+
         contentArea = self.get_content_area()
 
+        typeBox = gtk.HBox()
+
+        label = gtk.Label(xstr("chklst_aircraftType"))
+        label.set_use_underline(True)
+
+        typeBox.pack_start(label, False, False, 4)
+
+        self._aircraftTypeModel = gtk.ListStore(str, int)
+        for type in const.aircraftTypes:
+            name = aircraftNames[type] if type in aircraftNames \
+                   else "Aircraft type #%d" % (type,)
+            self._aircraftTypeModel.append([name, type])
+        self._aircraftType = gtk.ComboBox(model = self._aircraftTypeModel)
+        renderer = gtk.CellRendererText()
+        self._aircraftType.pack_start(renderer, True)
+        self._aircraftType.add_attribute(renderer, "text", 0)
+        self._aircraftType.set_tooltip_text(xstr("chklst_aircraftType_tooltip"))
+        self._aircraftType.set_active(0)
+        self._aircraftType.connect("changed", self._aircraftTypeChanged)
+        label.set_mnemonic_widget(self._aircraftType)
+
+        typeBox.pack_start(self._aircraftType, True, True, 4)
+
+        typeBoxAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
+                                         xscale = 0.0, yscale = 0.0)
+        typeBoxAlignment.set_size_request(400, -1)
+        typeBoxAlignment.add(typeBox)
+
+        contentArea.pack_start(typeBoxAlignment, False, False, 12)
+
+        fileBox = gtk.HBox()        
 
         self._fileChooser = gtk.FileChooserWidget()
         self._fileChooser.set_select_multiple(True)
-
-        self._fileChooser.set_current_folder("/home/vi")
-        
-        contentArea.pack_start(self._fileChooser, True, True, 4)
+        
+        filter = gtk.FileFilter()
+        filter.set_name(xstr("chklst_filter_audio"))
+        filter.add_pattern("*.wav")
+        filter.add_pattern("*.mp3")
+        self._fileChooser.add_filter(filter)
+            
+        filter = gtk.FileFilter()
+        filter.set_name(xstr("chklst_filter_all"))
+        filter.add_pattern("*.*")
+        self._fileChooser.add_filter(filter)
+
+        self._fileChooser.connect("selection-changed",
+                                  self._fileChooserSelectionChanged)
+
+        fileBox.pack_start(self._fileChooser, True, True, 4)
+
+        controlBox = gtk.VBox()
+        controlAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
+                                         xscale = 0.0, yscale = 0.0)
+        controlAlignment.set_padding(padding_top = 0, padding_bottom = 0,
+                                     padding_left = 32, padding_right = 32)
+        controlAlignment.add(controlBox)
+        fileBox.pack_start(controlAlignment, False, False, 0)
+
+        self._addButton = gtk.Button(xstr("chklst_add"))
+        self._addButton.set_use_underline(True)
+        self._addButton.set_tooltip_text(xstr("chklst_add_tooltip"))
+        self._addButton.connect("clicked", self._addButtonClicked)
+        addAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.0,
+                                     xscale = 0.0, yscale = 0.0)
+        addAlignment.set_padding(padding_top = 64, padding_bottom = 0,
+                                 padding_left = 0, padding_right = 0)
+        addAlignment.add(self._addButton)
+        controlBox.pack_start(addAlignment, False, False, 0)
+
+        self._removeButton = gtk.Button(xstr("chklst_remove"))
+        self._removeButton.set_use_underline(True)
+        self._removeButton.set_tooltip_text(xstr("chklst_remove_tooltip"))
+        self._removeButton.set_sensitive(False)
+        self._removeButton.connect("clicked", self._removeButtonClicked)
+
+        removeAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.0,
+                                        xscale = 0.0, yscale = 0.0)
+        removeAlignment.set_padding(padding_top = 64, padding_bottom = 0,
+                                    padding_left = 0, padding_right = 0)
+        removeAlignment.add(self._removeButton)
+        controlBox.pack_start(removeAlignment, False, False, 0)
+
+        self._moveUpButton = gtk.Button(xstr("chklst_moveUp"))
+        self._moveUpButton.set_use_underline(True)
+        self._moveUpButton.set_tooltip_text(xstr("chklst_moveUp_tooltip"))
+        self._moveUpButton.set_sensitive(False)
+        self._moveUpButton.connect("clicked", self._moveUpButtonClicked)
+
+        moveUpAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.0,
+                                        xscale = 0.0, yscale = 0.0)
+        moveUpAlignment.set_padding(padding_top = 16, padding_bottom = 0,
+                                    padding_left = 0, padding_right = 0)
+        moveUpAlignment.add(self._moveUpButton)
+        controlBox.pack_start(moveUpAlignment, False, False, 0)
+
+        self._moveDownButton = gtk.Button(xstr("chklst_moveDown"))
+        self._moveDownButton.set_use_underline(True)
+        self._moveDownButton.set_tooltip_text(xstr("chklst_moveDown_tooltip"))
+        self._moveDownButton.set_sensitive(False)
+        self._moveDownButton.connect("clicked", self._moveDownButtonClicked)
+
+        moveDownAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.0,
+                                        xscale = 0.0, yscale = 0.0)
+        moveDownAlignment.set_padding(padding_top = 4, padding_bottom = 0,
+                                    padding_left = 0, padding_right = 0)
+        moveDownAlignment.add(self._moveDownButton)
+        controlBox.pack_start(moveDownAlignment, False, False, 0)
+
+        self._fileListModel = gtk.ListStore(str, str)
+        self._fileList = gtk.TreeView(model = self._fileListModel)
+        column = gtk.TreeViewColumn(xstr("chklst_header"),
+                                    gtk.CellRendererText(), text = 0)
+        column.set_expand(True)
+        column.set_clickable(False)
+        column.set_reorderable(False)
+        self._fileList.append_column(column)
+        self._fileList.set_tooltip_column(1)
+        self._fileList.set_reorderable(True)
+        self._fileList.set_size_request(200, -1)
+        selection = self._fileList.get_selection()
+        selection.set_mode(SELECTION_MULTIPLE)
+        selection.connect("changed", self._fileListSelectionChanged)
+
+        fileBox.pack_start(self._fileList, False, False, 4)
+
+        contentArea.pack_start(fileBox, True, True, 4)
+
+        self.set_size_request(900, 500)
 
     def run(self):
         """Run the checklist editor dialog."""
+        self._checklists = {}
+        self._displayCurrentChecklist()
         self.show_all()
         response = super(ChecklistEditor, self).run()
         self.hide()
 
+        if response==RESPONSETYPE_ACCEPT:
+            self._saveChecklist()
+            config = self._gui.config
+            for (aircraftType, checklist) in self._checklists.iteritems():
+                config.setChecklist(aircraftType, checklist)
+            config.save()
+
+    def _aircraftTypeChanged(self, comboBox):
+        """Called when the aircraft's type has changed."""        
+        self._saveChecklist()
+        self._displayCurrentChecklist()
+        
+    def _fileChooserSelectionChanged(self, fileChooser):
+        """Called when the selection of the given file chooser is changed."""
+        numFiles = 0
+        numSelected = 0
+        for path in fileChooser.get_filenames():
+            numSelected += 1
+            if os.path.isfile(path): numFiles += 1
+
+        self._addButton.set_sensitive(numFiles>0 and numFiles==numSelected)
+
+    def _addButtonClicked(self, button):
+        """Called when the Add button is clicked."""
+        for path in self._fileChooser.get_filenames():
+            self._fileListModel.append([os.path.basename(path),
+                                        path])
+        self._fileChooser.unselect_all()
+        
+    def _removeButtonClicked(self, button):
+        """Called when the Remove button is clicked."""
+        selection = self._fileList.get_selection()
+        (model, paths) = selection.get_selected_rows()
+        while paths:
+            model.remove(model.get_iter(paths[0]))
+            (model, paths) = selection.get_selected_rows()
+        
+    def _moveUpButtonClicked(self, button):
+        """Called when the move up button is clicked."""
+        self._moveSelected(True)
+        
+    def _moveDownButtonClicked(self, button):
+        """Called when the move down button is clicked."""
+        self._moveSelected(False)
+
+    def _moveSelected(self, up):
+        """Move the selected files up or down."""
+        selection = self._fileList.get_selection()
+        (model, paths) = selection.get_selected_rows()
+        indexes = [(path.get_indices() if pygobject else path)[0]
+                   for path in paths]
+        indexes.sort()
+        if not up:
+            indexes.reverse()
+
+        for index in indexes:
+            fromIter = model.iter_nth_child(None, index)
+            toIter = model.iter_nth_child(None, index-1 if up else index + 1)
+            if up:
+                model.move_before(fromIter, toIter)
+            else:
+                model.move_after(fromIter, toIter)
+        
+        self._moveUpButton.set_sensitive(indexes[0]>1 if up else True)
+        numRows = model.iter_n_children(None)
+        self._moveDownButton.set_sensitive(True if up else
+                                           indexes[-1]<(numRows-2))
+
+    def _fileListSelectionChanged(self, selection):
+        """Called when the selection in the file list changes."""
+        anySelected = selection.count_selected_rows()>0
+        self._removeButton.set_sensitive(anySelected)
+
+        if anySelected:
+            (model, paths) = selection.get_selected_rows()
+            minIndex = None
+            maxIndex = None
+            for path in paths:
+                [index] = path.get_indices() if pygobject else path
+                if minIndex is None or index<minIndex: minIndex = index
+                if maxIndex is None or index>maxIndex: maxIndex = index
+                        
+            self._moveUpButton.set_sensitive(minIndex>0)
+
+            numRows = model.iter_n_children(None)
+            self._moveDownButton.set_sensitive(maxIndex<(numRows-1))
+        else:
+            self._moveUpButton.set_sensitive(False)
+            self._moveDownButton.set_sensitive(False)
+
+    def _getAircraftType(self):
+        """Get the currently selected aircraft type."""
+        index = self._aircraftType.get_active()
+        return self._aircraftTypeModel[index][1]        
+
+    def _saveChecklist(self):
+        """Save the currently displayed checklist for the previously displayed
+        aircraft type."""
+        fileList = []
+        model = self._fileListModel
+        iter = model.get_iter_first()
+        while iter is not None:
+            path = model.get(iter, 1)[0]
+            fileList.append(path)
+            iter = model.iter_next(iter)
+
+        self._checklists[self._currentAircraftType] = config.Checklist(fileList)
+        
+    def _displayCurrentChecklist(self):
+        """Display the checklist for the currently selected aircraft type."""
+        aircraftType = self._getAircraftType()
+        self._currentAircraftType = aircraftType
+        if aircraftType not in self._checklists:
+            self._checklists[aircraftType] = \
+                self._gui.config.getChecklist(aircraftType).clone()
+        checklist = self._checklists[aircraftType]
+
+        self._fileListModel.clear()
+        for path in checklist:
+            self._fileListModel.append([os.path.basename(path), path])
+        
+        
 #------------------------------------------------------------------------------
Index: src/mlx/gui/common.py
===================================================================
--- src/mlx/gui/common.py	(revision 151)
+++ src/mlx/gui/common.py	(revision 175)
@@ -2,4 +2,5 @@
 
 import mlx.const as _const
+from mlx.i18n import xstr
 
 import os
@@ -24,4 +25,5 @@
     MESSAGETYPE_QUESTION = gtk.MESSAGE_QUESTION
     MESSAGETYPE_INFO = gtk.MESSAGE_INFO
+
     RESPONSETYPE_OK = gtk.RESPONSE_OK
     RESPONSETYPE_YES = gtk.RESPONSE_YES
@@ -30,4 +32,5 @@
     RESPONSETYPE_REJECT = gtk.RESPONSE_REJECT
     RESPONSETYPE_CANCEL = gtk.RESPONSE_CANCEL
+
     ACCEL_VISIBLE = gtk.ACCEL_VISIBLE
     CONTROL_MASK = gdk.CONTROL_MASK
@@ -48,4 +51,6 @@
     FILE_CHOOSER_ACTION_OPEN = gtk.FILE_CHOOSER_ACTION_OPEN
     FILE_CHOOSER_ACTION_SAVE = gtk.FILE_CHOOSER_ACTION_SAVE
+
+    SELECTION_MULTIPLE = gtk.SELECTION_MULTIPLE
 
     def text2unicode(text):
@@ -90,4 +95,6 @@
     FILE_CHOOSER_ACTION_SAVE = gtk.FileChooserAction.SAVE
 
+    SELECTION_MULTIPLE = gtk.SelectionMode.MULTIPLE
+
     import codecs
     _utf8Decoder = codecs.getdecoder("utf-8")
@@ -192,2 +199,21 @@
 
 #------------------------------------------------------------------------------
+
+# A mapping of aircraft types to their screen names
+aircraftNames = { _const.AIRCRAFT_B736 : xstr("aircraft_b736"),
+                  _const.AIRCRAFT_B737 : xstr("aircraft_b737"),
+                  _const.AIRCRAFT_B738 : xstr("aircraft_b738"),
+                  _const.AIRCRAFT_B733 : xstr("aircraft_b733"),
+                  _const.AIRCRAFT_B734 : xstr("aircraft_b734"),
+                  _const.AIRCRAFT_B735 : xstr("aircraft_b735"),
+                  _const.AIRCRAFT_DH8D : xstr("aircraft_dh8d"),
+                  _const.AIRCRAFT_B762 : xstr("aircraft_b762"),
+                  _const.AIRCRAFT_B763 : xstr("aircraft_b763"),
+                  _const.AIRCRAFT_CRJ2 : xstr("aircraft_crj2"),
+                  _const.AIRCRAFT_F70  : xstr("aircraft_f70"),
+                  _const.AIRCRAFT_DC3  : xstr("aircraft_dc3"),
+                  _const.AIRCRAFT_T134 : xstr("aircraft_t134"),
+                  _const.AIRCRAFT_T154 : xstr("aircraft_t154"),
+                  _const.AIRCRAFT_YK40 : xstr("aircraft_yk40") }
+
+#------------------------------------------------------------------------------
Index: src/mlx/i18n.py
===================================================================
--- src/mlx/i18n.py	(revision 173)
+++ src/mlx/i18n.py	(revision 175)
@@ -132,4 +132,20 @@
     def initialize(self):
         """Initialize the strings."""
+        self.add("aircraft_b736", "Boeing 737-600")
+        self.add("aircraft_b737", "Boeing 737-700")
+        self.add("aircraft_b738", "Boeing 737-800")
+        self.add("aircraft_b733", "Boeing 737-300")
+        self.add("aircraft_b734", "Boeing 737-400")
+        self.add("aircraft_b735", "Boeing 737-500")
+        self.add("aircraft_dh8d", "Bombardier Dash 8 Q400")
+        self.add("aircraft_b762", "Boeing 767-200")
+        self.add("aircraft_b763", "Boeing 767-300")
+        self.add("aircraft_crj2", "Canadair Regional Jet CRJ-200")
+        self.add("aircraft_f70",  "Fokker F70")
+        self.add("aircraft_dc3",  "Lisunov Li-2")
+        self.add("aircraft_t134", "Tupolev Tu-134")
+        self.add("aircraft_t154", "Tupolev Tu-154")
+        self.add("aircraft_yk40", "Yakovlev Yak-40")
+
         self.add("button_ok", "_OK")
         self.add("button_cancel", "_Cancel")
@@ -626,4 +642,24 @@
 
         self.add("chklst_title", "Checklist Editor")
+        self.add("chklst_aircraftType", "Aircraft _type:")
+        self.add("chklst_aircraftType_tooltip",
+                 "The type of the aircraft for which the checklist "
+                 "is being edited.")
+        self.add("chklst_add", "_Add to checklist")
+        self.add("chklst_add_tooltip",
+                 "Append the files selected on the left to the "
+                 "checklist on the right.")
+        self.add("chklst_remove", "_Remove")
+        self.add("chklst_remove_tooltip",
+                 "Remove the selected items from the checklist.")
+        self.add("chklst_moveUp", "Move _up")
+        self.add("chklst_moveUp_tooltip",
+                 "Move up the selected file(s) in the checklist.")
+        self.add("chklst_moveDown", "Move _down")
+        self.add("chklst_moveDown_tooltip",
+                 "Move down the selected file(s) in the checklist.")
+        self.add("chklst_filter_audio", "Audio files")
+        self.add("chklst_filter_all", "All files")
+        self.add("chklst_header", "Checklist files")
 
         self.add("prefs_sounds_frame_bg", "Background")
@@ -765,4 +801,20 @@
     def initialize(self):
         """Initialize the strings."""
+        self.add("aircraft_b736", "Boeing 737-600")
+        self.add("aircraft_b737", "Boeing 737-700")
+        self.add("aircraft_b738", "Boeing 737-800")
+        self.add("aircraft_b733", "Boeing 737-300")
+        self.add("aircraft_b734", "Boeing 737-400")
+        self.add("aircraft_b735", "Boeing 737-500")
+        self.add("aircraft_dh8d", "Bombardier Dash 8 Q400")
+        self.add("aircraft_b762", "Boeing 767-200")
+        self.add("aircraft_b763", "Boeing 767-300")
+        self.add("aircraft_crj2", "Canadair Regional Jet CRJ-200")
+        self.add("aircraft_f70",  "Fokker F70")
+        self.add("aircraft_dc3",  "Liszunov Li-2")
+        self.add("aircraft_t134", "Tupoljev Tu-134")
+        self.add("aircraft_t154", "Tupoljev Tu-154")
+        self.add("aircraft_yk40", "Jakovlev Jak-40")
+
         self.add("button_ok", "_OK")
         self.add("button_cancel", "_Mégse")
