/**
     * Generate code that will be inserted into the ModelConnector to connect a database object with this control.
     * This is called during the codegen process. This is very similar to the QListControl code, but there are
     * some differences. In particular, this control does not support ManyToMany references.
     *
     * @param QCodeGenBase $objCodeGen
     * @param QSqlTable $objTable
     * @param QSqlColumn|QReverseReference|QManyToManyReference $objColumn
     * @return string
     */
    public function ConnectorCreate(QCodeGenBase $objCodeGen, QSqlTable $objTable, $objColumn)
    {
        $strObjectName = $objCodeGen->ModelVariableName($objTable->Name);
        $strControlVarName = $objCodeGen->ModelConnectorVariableName($objColumn);
        $strLabelName = addslashes(QCodeGen::ModelConnectorControlName($objColumn));
        // Read the control type in case we are generating code for a subclass
        $strControlType = $objCodeGen->GetControlCodeGenerator($objColumn)->GetControlClass();
        $strRet = <<<TMPL
\t\t/**
\t\t * Create and setup a {$strControlType} {$strControlVarName}
\t\t * @param string \$strControlId optional ControlId to use
\t\t * @return {$strControlType}
\t\t */
\t\tpublic function {$strControlVarName}_Create(\$strControlId = null) {

TMPL;
        $strControlIdOverride = $objCodeGen->GenerateControlId($objTable, $objColumn);
        if ($strControlIdOverride) {
            $strRet .= <<<TMPL
\t\t\tif (!\$strControlId) {
\t\t\t\t\$strControlId = '{$strControlIdOverride}';
\t\t\t}

TMPL;
        }
        $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName} = new {$strControlType}(\$this->objParentObject, \$strControlId);
\t\t\t\$this->{$strControlVarName}->Name = QApplication::Translate('{$strLabelName}');
\t\t\t\$this->{$strControlVarName}->DateTime = \$this->{$strObjectName}->{$objColumn->PropertyName};

TMPL;
        switch ($objColumn->DbType) {
            case QDatabaseFieldType::DateTime:
                $strRet .= "\t\t\t\$this->{$strControlVarName}->DateTimePickerType = QDateTimePickerType::DateTime;\n";
                break;
            case QDatabaseFieldType::Time:
                $strRet .= "\t\t\t\$this->{$strControlVarName}->DateTimePickerType = QDateTimePickerType::Time;\n";
                break;
            default:
                $strRet .= "\t\t\t\$this->{$strControlVarName}->DateTimePickerType = QDateTimePickerType::Date;\n";
        }
        if ($strMethod = QCodeGen::$PreferredRenderMethod) {
            $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName}->PreferredRenderMethod = '{$strMethod}';

TMPL;
        }
        $strRet .= $this->ConnectorCreateOptions($objCodeGen, $objTable, $objColumn, $strControlVarName);
        $strRet .= <<<TMPL
\t\t\treturn \$this->{$strControlVarName};
\t\t}


TMPL;
        return $strRet;
    }
    /**
     * Generate code that will be inserted into the ModelConnector to connect a database object with this control.
     * This is called during the codegen process.
     *
     * @param QCodeGenBase $objCodeGen
     * @param QTable $objTable
     * @param mixed $objColumn
     * @return string
     */
    public function ConnectorCreate(\QCodeGenBase $objCodeGen, \QSqlTable $objTable, $objColumn)
    {
        $strControlVarName = $objCodeGen->ModelConnectorVariableName($objColumn);
        $strLabelName = addslashes(QCodeGen::ModelConnectorControlName($objColumn));
        $strControlType = $objCodeGen->GetControlCodeGenerator($objColumn)->GetControlClass();
        $strRet = <<<TMPL
\t\t/**
\t\t * Create and setup a {$strControlType} {$strControlVarName}
\t\t * @param string \$strControlId optional ControlId to use
\t\t * @return {$strControlType}
\t\t */
\t\tpublic function {$strControlVarName}_Create(\$strControlId = null) {

TMPL;
        $strControlIdOverride = $objCodeGen->GenerateControlId($objTable, $objColumn);
        if ($strControlIdOverride) {
            $strRet .= <<<TMPL
\t\t\tif (!\$strControlId) {
\t\t\t\t\$strControlId = '{$strControlIdOverride}';
\t\t\t}

TMPL;
        }
        $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName} = new {$strControlType}(\$this->objParentObject, \$strControlId);
\t\t\t\$this->{$strControlVarName}->Name = QApplication::Translate('{$strLabelName}');

TMPL;
        $strRet .= static::ConnectorRefresh($objCodeGen, $objTable, $objColumn, true);
        if ($objColumn->NotNull) {
            $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName}->Required = true;

TMPL;
        }
        if ($strMethod = QCodeGen::$PreferredRenderMethod) {
            $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName}->PreferredRenderMethod = '{$strMethod}';

TMPL;
        }
        $strRet .= static::ConnectorCreateOptions($objCodeGen, $objTable, $objColumn, $strControlVarName);
        $strRet .= <<<TMPL
\t\t\treturn \$this->{$strControlVarName};
\t\t}


TMPL;
        return $strRet;
    }
    /**
     * @param QCodeGenBase $objCodeGen
     * @param QSqlColumn|QReverseReference| QManyToManyReference $objColumn
     * @return string
     */
    public function ConnectorVariableDeclaration(QCodeGenBase $objCodeGen, $objColumn)
    {
        $strClassName = $objCodeGen->GetControlCodeGenerator($objColumn)->GetControlClass();
        $strPropName = QCodeGen::ModelConnectorPropertyName($objColumn);
        $strControlVarName = $this->VarName($strPropName);
        $strRet = <<<TMPL
\t\t/**
\t\t * @var {$strClassName} {$strControlVarName}
\t\t * @access protected
\t\t */
\t\tprotected \${$strControlVarName};

\t\t/**
\t\t * @var string str{$strPropName}NullLabel
\t\t * @access protected
\t\t */
\t\tprotected \$str{$strPropName}NullLabel;


TMPL;
        if ($objColumn instanceof QSqlColumn && !$objColumn->Reference->IsType || $objColumn instanceof QManyToManyReference && !$objColumn->IsTypeAssociation || $objColumn instanceof QReverseReference) {
            $strRet .= <<<TMPL
\t\t/**
\t\t* @var obj{$strPropName}Condition
\t\t* @access protected
\t\t*/
\t\tprotected \$obj{$strPropName}Condition;

\t\t/**
\t\t* @var obj{$strPropName}Clauses
\t\t* @access protected
\t\t*/
\t\tprotected \$obj{$strPropName}Clauses;

TMPL;
        }
        return $strRet;
    }
    /**
     * @param QCodeGenBase $objCodeGen
     * @param QSqlColumn|QReverseReference| QManyToManyReference $objColumn
     * @return string
     */
    public function ConnectorVariableDeclaration(QCodeGenBase $objCodeGen, $objColumn)
    {
        $strClassName = $objCodeGen->GetControlCodeGenerator($objColumn)->GetControlClass();
        $strPropName = $objCodeGen->ModelConnectorPropertyName($objColumn);
        $strControlVarName = $this->VarName($strPropName);
        $strRet = <<<TMPL
\t\t/**
\t\t * @var {$strClassName} {$strControlVarName}
\t\t * @access protected
\t\t */
\t\tprotected \${$strControlVarName};

\t\t/**
\t\t* @var obj{$strPropName}Condition
\t\t* @access protected
\t\t*/
\t\tprotected \$obj{$strPropName}Condition;

\t\t/**
\t\t* @var obj{$strPropName}Clauses
\t\t* @access protected
\t\t*/
\t\tprotected \$obj{$strPropName}Clauses;

TMPL;
        return $strRet;
    }
    /**
     * Generate code that will be inserted into the ModelConnector to connect a database object with this control.
     * This is called during the codegen process. This is very similar to the QListControl code, but there are
     * some differences. In particular, this control does not support ManyToMany references.
     *
     * @param QCodeGenBase $objCodeGen
     * @param QSqlTable $objTable
     * @param QSqlColumn|QReverseReference|QManyToManyReference $objColumn
     * @return string
     */
    public function ConnectorCreate(QCodeGenBase $objCodeGen, QSqlTable $objTable, $objColumn)
    {
        $strObjectName = $objCodeGen->ModelVariableName($objTable->Name);
        $strClassName = $objTable->ClassName;
        $strControlVarName = $objCodeGen->ModelConnectorVariableName($objColumn);
        $strLabelName = addslashes(QCodeGen::ModelConnectorControlName($objColumn));
        // Read the control type in case we are generating code for a subclass of QTextBox
        $strControlType = $objCodeGen->GetControlCodeGenerator($objColumn)->GetControlClass();
        $strRet = <<<TMPL
\t\t/**
\t\t * Create and setup a {$strControlType} {$strControlVarName}
\t\t * @param string \$strControlId optional ControlId to use
\t\t * @return {$strControlType}
\t\t */
\t\tpublic function {$strControlVarName}_Create(\$strControlId = null) {

TMPL;
        $strControlIdOverride = $objCodeGen->GenerateControlId($objTable, $objColumn);
        if ($strControlIdOverride) {
            $strRet .= <<<TMPL
\t\t\tif (!\$strControlId) {
\t\t\t\t\$strControlId = '{$strControlIdOverride}';
\t\t\t}

TMPL;
        }
        $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName} = new {$strControlType}(\$this->objParentObject, \$strControlId);
\t\t\t\$this->{$strControlVarName}->Name = QApplication::Translate('{$strLabelName}');

TMPL;
        if ($objColumn->NotNull) {
            $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName}->Required = true;

TMPL;
        }
        if ($objColumn->DbType == QDatabaseFieldType::Blob) {
            $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName}->TextMode = QTextMode::MultiLine;

TMPL;
        }
        if ($objColumn->VariableType == QType::String && is_numeric($objColumn->Length)) {
            $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName}->MaxLength = {$strClassName}::{$objColumn->PropertyName}MaxLength;

TMPL;
        }
        if ($strMethod = QCodeGen::$PreferredRenderMethod) {
            $strRet .= <<<TMPL
\t\t\t\$this->{$strControlVarName}->PreferredRenderMethod = '{$strMethod}';

TMPL;
        }
        $strRet .= $this->ConnectorCreateOptions($objCodeGen, $objTable, $objColumn, $strControlVarName);
        $strRet .= $this->ConnectorRefresh($objCodeGen, $objTable, $objColumn, true);
        $strRet .= <<<TMPL
\t\t\treturn \$this->{$strControlVarName};
\t\t}


TMPL;
        return $strRet;
    }