def rebuild(self):
        table = self.tableType()
        form  = nativestring(self.filterFormat())
        if not table and form:
            if self.layout().count() == 0:
                self.layout().addWidget(QLabel(form, self))
            else:
                self.layout().itemAt(0).widget().setText(form)
            return
        elif not form:
            return
        for child in self.findChildren(QWidget):
            child.close()
            child.setParent(None)
            child.deleteLater()
        self.setUpdatesEnabled(False)
        schema = table.schema()
        vlayout = self.layout()
        for i in range(vlayout.count()):
            vlayout.takeAt(0)
        self._plugins = []
        for line in form.split('\n'):
            row = QHBoxLayout()
            row.setContentsMargins(0, 0, 0, 0)
            row.setSpacing(0)
            for label, lookup in FORMAT_SPLITTER.findall(line):
                lbl = QLabel(label, self)
                row.addWidget(lbl)
                opts = lookup.split(':')
                if len(opts) == 1:
                    opts.append('is')
                column = schema.column(opts[0])
                if not column:
                    continue
                plugin = self.pluginFactory().plugin(column)
                if not plugin:
                    continue
                editor = plugin.createEditor(self, column, opts[1], None)
                if editor:
                    editor.setObjectName(opts[0])
                    row.addWidget(editor)
                    self._plugins.append((opts[0], opts[1], plugin, editor))
            row.addStretch(1)
            vlayout.addLayout(row)
        self.setUpdatesEnabled(True)
        self.adjustSize()