def save( self ):
        schema = self.schema()
        if ( not schema ):
            self.saved.emit()
            return
        record = self.record()
        if not record:
            record = self._model()
        save_data    = []
        column_edits = self.findChildren(XOrbColumnEdit)
        for widget in column_edits:
            columnName  = widget.columnName()
            column      = schema.column(columnName)
            if ( not column ):
                logger.warning('%s is not a valid column of %s.' % \
                               (columnName, schema.name()))
                continue
            value = widget.value()
            if ( value == IGNORED ):
                continue
            if ( column.required() and not value ):
                name = column.displayName()
                QMessageBox.information(self, 
                                        'Missing Required Field',
                                        '%s is a required field.' % name)
                return
            elif ( column.unique() ):
                query        = Q(column.name()) == value
                if ( record.isRecord() ):
                    query   &= Q(self._model) != record
                columns  = self._model.schema().primaryColumns()
                result   = self._model.select(columns = columns, where = query)
                if ( result.total() ):
                    QMessageBox.information(self,
                                            'Duplicate Entry',
                                            '%s already exists.' % value)
                    return
            save_data.append((column, value))
        for column, value in save_data:
            record.setRecordValue(column.name(), value)
        self._record = record
        self.saved.emit()