Returns an editor for the inputed table type, based on the column and
        operator types.
        
        :param      schema          | <orb.TableSchema>
                    columnName      | <str>
                    operatorType    | <orb.Query.Op>
        
        :return     <QWidget>

def createEditor( self, parent, schema, columnName, operatorType ):
        """
        Returns an editor for the inputed table type, based on the column and
        operator types.
        
        :param      schema          | <orb.TableSchema>
                    columnName      | <str>
                    operatorType    | <orb.Query.Op>
        
        :return     <QWidget>
        """
        column = schema.column(columnName)
        if ( not column ):
            return None
        
        ctype  = column.columnType()
        
        # based on the column and operator type, the editor may change
        if ( ctype == ColumnType.String ):
            if ( operatorType in (Q.Op.IsIn, Q.Op.IsNotIn) ):
                widget = XMultiTagEdit(parent)
            else:
                widget = QLineEdit(parent)
        
        elif ( ctype == ColumnType.Bool ):
            widget = QComboBox(parent)
            widget.addItems(['True', 'False'])
            widget.setEditable(True)
            widget.setInsertPolicy(QComboBox.NoInsert)
        
        elif ( ctype == ColumnType.ForeignKey ):
            widget = XOrbRecordBox(parent)
            widget.setRecords(self.collectRecords(column))
        
        else:
            widget = None
        
        return widget