void SQRCheckButton::OnLButtonClick( uint32 nFlags, int32 x, int32 y )
{
	//处理分组状态
	//复选框,可同时选多个
	if( GetStyle() & BTN_CHECK )
	{
		//切换状态
		m_bCheck = !m_bCheck;
		OnCheck( m_bCheck );
	}
	//单选框,同时只有一个可被选中
	else if( GetStyle() & BTN_RADIO )
		SetCheck( true );

	SQRButton::OnLButtonClick( nFlags, x, y );
}
void SQRCheckButton::SetCheck( bool bCheck )
{ 
	m_bCheck = bCheck; 
	
	//单选框,同时只有一个可被选中
	if( m_bCheck  && (GetStyle() & BTN_RADIO) && GetGroupID() >= 0 )
	{
		SQRWnd* pBrother = GetFirstBrother();
		while( pBrother )
		{
			if( GetClassName() == pBrother->GetClassName() && pBrother != this &&
                GetGroupID() == static_cast<SQRCheckButton*>(pBrother)->GetGroupID() )
					static_cast<SQRCheckButton*>(pBrother)->SetCheck( false );

			pBrother = pBrother->FindNextWnd();
		}
	}
	OnCheck( m_bCheck );
}
BMARefinerOptionsDialog::BMARefinerOptionsDialog(wxWindow* parent,
    const GeneralRefinerParams& current_genl,
    const LeaveOneOutParams& current_loo,
    const BlockEditingParams& current_be,
    const vector < string >& titles) :
  wxDialog(parent, -1, wxT("Alignment Refiner Options"), wxPoint(100,100), wxDefaultSize, wxDEFAULT_DIALOG_STYLE),
        rowTitles(titles)
{
    wxBoxSizer *hSizer;
    rowsToExclude = current_loo.rowsToExclude;

//    wxScrolledWindow *panel = new wxScrolledWindow(this, -1, wxDefaultPosition, wxDefaultSize, wxVSCROLL);
    wxPanel *panel = new wxPanel(this, -1);

    //  Dialog heading
//    wxBoxSizer *item1 = new wxBoxSizer( wxHORIZONTAL );
//    wxStaticText *item2 = new wxStaticText( panel, ID_TEXT, wxT("Alignment Refiner Options"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
//    item2->SetFont( wxFont( 16, wxROMAN, wxNORMAL, wxNORMAL ) );
//    item1->Add( item2, 0, wxALIGN_CENTER|wxALL, 15 );

    //  **************************************************  //
    //  Start GUI elements for general parameters

    //  Cycles/trials
    wxStaticBox *item60 = new wxStaticBox( panel, -1, wxT("General Refiner Parameters") );
    item60->SetFont( wxFont( 10, wxROMAN, wxNORMAL, wxBOLD ) );
    wxStaticBoxSizer *item64 = new wxStaticBoxSizer( item60, wxVERTICAL );

    wxFlexGridSizer *item61 = new wxFlexGridSizer( 2, 0, 0 );
    item61->AddGrowableCol( 1 );

    //  # of cycles/trial
    wxStaticText *item63 = new wxStaticText( panel, ID_TEXT, wxT("Number of refinement cycles:                    "), wxDefaultPosition, wxDefaultSize, 0 );
    item61->Add( item63, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    nCyclesSpin = new IntegerSpinCtrl(panel,
        1, 10, 1, current_genl.nCycles,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(nCyclesSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(nCyclesSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item61->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Order of phases (LOO->BE or BE->LOO)
    int initialPOIndex = (current_genl.lnoFirst) ? 0 : 1;
    wxStaticText *item65 = new wxStaticText( panel, ID_TEXT, wxT("Phase order:"), wxDefaultPosition, wxDefaultSize, 0 );
    item61->Add( item65, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    phaseOrderCombo = new wxComboBox( panel, ID_PHASE_ORDER_COMBOBOX, phaseOrderStrings[initialPOIndex], wxDefaultPosition, wxDefaultSize, sizeof(phaseOrderStrings)/sizeof(phaseOrderStrings[0]), phaseOrderStrings, wxCB_READONLY );
    item61->Add( phaseOrderCombo, 0, wxALIGN_RIGHT|wxALL, 5 );

    item64->Add( item61, 0, wxALIGN_CENTER_VERTICAL, 0 );


    //  **************************************************  //
    //  Start GUI elements for LOO/LNO block shifting parameters
    wxStaticBox *item4 = new wxStaticBox( panel, -1, wxT("Block Shifting Parameters") );
    item4->SetFont( wxFont( 10, wxROMAN, wxNORMAL, wxBOLD ) );
    wxStaticBoxSizer *item3 = new wxStaticBoxSizer( item4, wxVERTICAL );

    wxFlexGridSizer *item5 = new wxFlexGridSizer( 2, 0, 0 );
    item5->AddGrowableCol( 1 );

    //  Do LOO/LNO???
    wxStaticText *item66 = new wxStaticText( panel, ID_TEXT, wxT("Shift blocks?"), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item66, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    doLooCheck = new wxCheckBox( panel, ID_DO_LOO_CHECKBOX, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    doLooCheck->SetValue(current_loo.doLOO);
    item5->Add( doLooCheck, 0, wxALIGN_RIGHT|wxALL, 5 );

    //  LNO parameter (1 == L00; >1 = group size for running LNO)
    wxStaticText *item12 = new wxStaticText( panel, ID_TEXT, wxT("Group rows in sets of:"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
    item5->Add( item12, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    lnoSpin = new IntegerSpinCtrl(panel,
        1, 50, 1, current_loo.lno,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(lnoSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(lnoSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Blank space
    wxStaticText *item24 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item24, 0, wxALIGN_CENTER, 5 );
    wxStaticText *item25 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item25, 0, wxALIGN_CENTER, 5 );

    //  perform LOO/LNO on structures?
    wxStaticText *item6 = new wxStaticText( panel, ID_TEXT, wxT("Refine rows with structure:"), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
//    wxStaticText *item7 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
//    item5->Add( item7, 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5 );
    fixStructCheck = new wxCheckBox( panel, ID_FIX_STRUCT_CHECKBOX, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );

    unsigned int nStructs = GetNumEmptyRowTitles(false);
    bool hasNoStructures = (nStructs == 0);
    bool hasOnlyStructures = (nStructs == rowTitles.size() - 1);
    if (hasNoStructures)
        fixStructCheck->SetValue(false);
    else if (hasOnlyStructures)
        fixStructCheck->SetValue(true);
    else
        fixStructCheck->SetValue(!current_loo.fixStructures);

    item5->Add( fixStructCheck, 0, wxALIGN_RIGHT|wxALL, 5 );

    // align all non-structured rows?
    wxStaticText *item90 = new wxStaticText( panel, ID_TEXT, wxT("Refine all unstructured rows:"), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item90, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
//    wxStaticText *item100 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
//    item5->Add( item100, 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5 );
    allUnstSeqCheck = new wxCheckBox( panel, ID_ALL_UNST_SEQ_CHECKBOX, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    allUnstSeqCheck->SetValue(!hasOnlyStructures);
    item5->Add( allUnstSeqCheck, 0, wxALIGN_RIGHT|wxALL, 5 );

    //  Order of row selection in LOO/LNO
    int initialSelOrderIndex = (int) current_loo.selectorCode;
//    wxStaticText *item68 = new wxStaticText( panel, ID_TEXT, wxT("Row selection order:"), wxDefaultPosition, wxDefaultSize, 0 );
//    item5->Add( item68, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    looSelectionOrderCombo = new wxComboBox( panel, ID_LOO_SEL_ORDER_COMBOBOX, looSelectionOrderStrings[initialSelOrderIndex], wxDefaultPosition, wxDefaultSize, sizeof(looSelectionOrderStrings)/sizeof(looSelectionOrderStrings[0]), looSelectionOrderStrings, wxCB_READONLY );
    looSelectionOrderCombo->Show(false);
//    item5->Add( looSelectionOrderCombo, 0, wxALIGN_RIGHT|wxALL, 5 );

    //  # of independent refinement trials
//    wxStaticText *item62 = new wxStaticText( panel, ID_TEXT, wxT("Number of refinement trials:"), wxDefaultPosition, wxDefaultSize, 0 );
//    item5->Add( item62, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    nTrialsSpin = new IntegerSpinCtrl(panel,
        1, 10, 1, current_genl.nTrials,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(nTrialsSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(nTrialsSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    nTrialsSpin->GetTextCtrl()->Show(false);
    nTrialsSpin->GetSpinButton()->Show(false);
//    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    //  use entire sequence length, or restricted to aligned footprint
    wxStaticText *item9 = new wxStaticText( panel, ID_TEXT, wxT("Refine using full sequence:"), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
//    wxStaticText *item10 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
//    item5->Add( item10, 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5 );
    fullSeqCheck = new wxCheckBox( panel, ID_FULL_SEQ_CHECKBOX, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    fullSeqCheck->SetValue(current_loo.fullSequence);
    item5->Add( fullSeqCheck, 0, wxALIGN_RIGHT|wxALL, 5 );

    //  Allow extension/contraction of footprint (N-terminus)
    wxStaticText *item30 = new wxStaticText( panel, ID_TEXT, wxT("N-terminal footprint extension:"), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item30, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    nExtSpin = new IntegerSpinCtrl(panel,
        -1000, 1000, 5, current_loo.nExt,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(nExtSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(nExtSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Allow extension/contraction of footprint (C-terminus)
    wxStaticText *item33 = new wxStaticText( panel, ID_TEXT, wxT("C-terminal footprint extension:"), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item33, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    cExtSpin = new IntegerSpinCtrl(panel,
        -1000, 1000, 5, current_loo.cExt,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(cExtSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(cExtSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Blank space
    wxStaticText *item124 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item124, 0, wxALIGN_CENTER, 5 );
    wxStaticText *item125 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    item5->Add( item125, 0, wxALIGN_CENTER, 5 );
//    wxStaticText *item26 = new wxStaticText( panel, ID_TEXT, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
//    item5->Add( item26, 0, wxALIGN_CENTER, 5 );

    //  Block aligner's loop percentile parameter
    wxStaticText *item15 = new wxStaticText( panel, ID_TEXT, wxT("Loop percentile:"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
    item5->Add( item15, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    loopPercentSpin = new FloatingPointSpinCtrl(panel,
        0.0, 100.0, 0.1, current_loo.percentile,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(loopPercentSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(loopPercentSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Block aligner's loop extension parameter
    wxStaticText *item18 = new wxStaticText( panel, ID_TEXT, wxT("Loop extension:"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
    item5->Add( item18, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    loopExtensionSpin = new IntegerSpinCtrl(panel,
        0, 10000, 5, current_loo.extension,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(loopExtensionSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(loopExtensionSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Block aligner's loop cutoff parameter
    wxStaticText *item21 = new wxStaticText( panel, ID_TEXT, wxT("Loop cutoff (0=none):"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
    item5->Add( item21, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    loopCutoffSpin = new IntegerSpinCtrl(panel,
        0, 10000, 5, current_loo.cutoff,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(loopCutoffSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(loopCutoffSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Seed for RNG to define order of leaving out rows (useful for debugging!!)
//    wxStaticText *item27 = new wxStaticText( panel, ID_TEXT, wxT("Random number seed (0=no preference):"), wxDefaultPosition, wxDefaultSize, 0 );
//    item5->Add( item27, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    rngSpin = new IntegerSpinCtrl(panel,
        0, 1000000000, 3727851, current_loo.seed,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(rngSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(rngSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    rngSpin->GetTextCtrl()->Show(false);
    rngSpin->GetSpinButton()->Show(false);
//    item5->Add(hSizer, 0, wxALIGN_RIGHT);

    item3->Add( item5, 0, wxALIGN_CENTER_VERTICAL, 0 );


    //  **************************************************  //
    //  Start GUI elements for block extension parameters.
    wxStaticBox *item37 = new wxStaticBox( panel, -1, wxT("Block Modification Parameters") );
    item37->SetFont( wxFont( 10, wxROMAN, wxNORMAL, wxBOLD ) );
    wxStaticBoxSizer *item36 = new wxStaticBoxSizer( item37, wxVERTICAL );

    wxFlexGridSizer *item38 = new wxFlexGridSizer( 2, 0, 0 );
    item38->AddGrowableCol( 1 );

    //  Allow block extension?
    int initialValue = (current_be.algMethod >= 0 && current_be.algMethod < eGreedyExtend) ? (int) current_be.algMethod : 0;
    wxStaticText *item39 = new wxStaticText( panel, ID_TEXT, wxT("Change block model?"), wxDefaultPosition, wxDefaultSize, 0 );
    item38->Add( item39, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    esCombo= new wxComboBox( panel, ID_BE_COMBOBOX, wxT(""), wxDefaultPosition, wxDefaultSize, sizeof(blockEditAlgStrings)/sizeof(blockEditAlgStrings[0]), blockEditAlgStrings, wxCB_READONLY );
    esCombo->SetValue(blockEditAlgStrings[initialValue]);
    item38->Add( esCombo, 0, wxALIGN_RIGHT|wxALL, 5 );

    //  Expand first?
    wxStaticText *item39b = new wxStaticText( panel, ID_TEXT, wxT("Expand first?"), wxDefaultPosition, wxDefaultSize, 0 );
    item38->Add( item39b, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    extendFirstCheck = new wxCheckBox( panel, ID_BEXTEND_FIRST_CHECKBOX, wxT(""), wxDefaultPosition, wxDefaultSize, 0 );
    extendFirstCheck->SetValue(current_be.extendFirst);
    item38->Add( extendFirstCheck, 0, wxALIGN_RIGHT|wxALL, 5 );

    //  Define a minimum block size (really only relevant for shrinking blocks...
    wxStaticText *item42 = new wxStaticText( panel, ID_TEXT, wxT("Minimum block size:"), wxDefaultPosition, wxDefaultSize, 0 );
    item38->Add( item42, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    minBlockSizeSpin = new IntegerSpinCtrl(panel,
        1, 100, 1, current_be.minBlockSize,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(minBlockSizeSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(minBlockSizeSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item38->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Block extension/shrinkage threshold 1:  column of PSSM median score >= this value
    wxStaticText *item45 = new wxStaticText( panel, ID_TEXT, wxT("Median PSSM score threshold:"), wxDefaultPosition, wxDefaultSize, 0 );
    item38->Add( item45, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    medianSpin = new IntegerSpinCtrl(panel,
        -20, 20, 1, current_be.median,
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(medianSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(medianSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item38->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Block extension/shrinkage threshold 2:  % rows w/ PSSM score >= 0 must exceed this value
    wxStaticText *item48 = new wxStaticText( panel, ID_TEXT, wxT("Voting percentage (% of rows vote to extend):"), wxDefaultPosition, wxDefaultSize, 0 );
    item38->Add( item48, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    rawVoteSpin = new FloatingPointSpinCtrl(panel,
        0.0, 100.0, 1.0, 100.0*(1.0 - current_be.negRowsFraction),
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(rawVoteSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(rawVoteSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item38->Add(hSizer, 0, wxALIGN_RIGHT);

    //  Block extension/shrinkage threshold 3:  % of weight in column of PSSM median score >= 0 must exceed this value
    wxStaticText *item51 = new wxStaticText( panel, ID_TEXT, wxT("Weighted (by PSSM score) voting percentage:"), wxDefaultPosition, wxDefaultSize, 0 );
    item38->Add( item51, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    hSizer = new wxBoxSizer(wxHORIZONTAL);
    weightedVoteSpin = new FloatingPointSpinCtrl(panel,
        0.0, 100.0, 1.0, 100.0*(1.0 - current_be.negScoreFraction),
        wxDefaultPosition, wxSize(80, SPIN_CTRL_HEIGHT), 0,
        wxDefaultPosition, wxSize(-1, SPIN_CTRL_HEIGHT));
    hSizer->Add(weightedVoteSpin->GetTextCtrl(), 0, wxALIGN_RIGHT|wxLEFT|wxTOP|wxBOTTOM, 5);
    hSizer->Add(weightedVoteSpin->GetSpinButton(), 0, wxALIGN_LEFT|wxRIGHT|wxTOP|wxBOTTOM, 5);
    item38->Add(hSizer, 0, wxALIGN_RIGHT);

    item36->Add( item38, 0, wxALIGN_CENTER|wxALL, 5 );

    //  Enable/disable block-editing controls based on state of 'extendCheck' & 'shrinkCheck'.
    wxCommandEvent dummyEvent;
    dummyEvent.SetId(ID_BE_COMBOBOX);
    OnCombo(dummyEvent);

    //  Enable/disable loo controls based on state of shift blocks checkbox
    dummyEvent.SetId(ID_DO_LOO_CHECKBOX);
    OnCheck(dummyEvent);

    //  Enable/disable specific controls based on selected row selection order
    dummyEvent.SetId(ID_LOO_SEL_ORDER_COMBOBOX);
    OnLooSelOrder(dummyEvent);

    //  OK/Cancel buttons
    wxBoxSizer *item54 = new wxBoxSizer( wxHORIZONTAL );
    wxButton *item55 = new wxButton( panel, wxID_OK, wxT("OK"), wxDefaultPosition, wxDefaultSize, 0 );
    item55->SetDefault();
    item54->Add( item55, 0, wxALIGN_CENTER|wxALL, 5 );
    wxButton *item56 = new wxButton( panel, wxID_CANCEL, wxT("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
    item54->Add( item56, 0, wxALIGN_CENTER|wxALL, 5 );

    wxBoxSizer *item103 = new wxBoxSizer( wxHORIZONTAL );

    //  Place sub-sizers in outermost sizer.
    wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
    item0->Add( item64, 0, wxALIGN_CENTER|wxALL, 5 );
//    item0->Add( item3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
//    item0->Add( item36, 0, wxALIGN_CENTER|wxALL, 5 );
    item103->Add( item3, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
    item103->Add( item36, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_TOP |wxALL, 5 );
    item0->Add(item103, 0, wxALIGN_CENTER|wxALL, 2);
    item0->Add( item54, 0, wxALIGN_CENTER|wxALL, 5 );

    panel->SetAutoLayout(true);
    panel->SetSizer(item0);
    item0->Fit(this);
    item0->Fit(panel);
    item0->SetSizeHints(this);

//    return item0;
}