Beispiel #1
0
int main(int argc, char *argv[])
{

	if(argc != 5){
		printf("Usage: gregions mode distance regionsfile.prof \n");
		printf("\t mode = 0 -> ASCII candidates \n");
		printf("\t mode = 1 -> Reference Candidates \n");
		printf("example: bin/gregions 1 1.2 input/regions-score.1M.prof input/human_genome.fasta \n");
		exit(0);
	}

    regions_t *regions;
    sequences_t *genome;
    seq_format_t candidatesMode = SEQ_ASCII, queriesMode = SEQ_ASCII;
	uint32_t mode = atof(argv[1]);
    float distance = atof(argv[2]);
    char *profileFile = argv[3], *genomeFile = argv[4];
    char regionsFile[512];
	FILE *fp = NULL;

    const uint32_t numGenomes = 1;
    uint32_t *h_genomePositionCandidates = NULL, *h_regionsProfiledScores = NULL;
	uint32_t numQueries = 0, totalSizeQueries = 0, numCandidates = 0, totalSizeCandidates = 0;

	if(mode == 1) candidatesMode |= SEQ_REF_POS;

	fp = fopen(profileFile, "rb");
	if (fp == NULL) return(E_OPENING_FILE);
	PSA_ERROR(countRegionsProfile(fp, distance, &numQueries, &totalSizeQueries, &numCandidates, &totalSizeCandidates));
	PSA_ERROR(initRegions(&regions, numQueries, numCandidates, numCandidates));
	PSA_ERROR(allocateRegions(regions, distance, totalSizeQueries, queriesMode, totalSizeCandidates, candidatesMode));

	h_genomePositionCandidates = (uint32_t *) malloc(numCandidates * sizeof(uint32_t));
	if (h_genomePositionCandidates == NULL) PSA_ERROR(E_ALLOCATE_MEM);
	h_regionsProfiledScores = (uint32_t *) malloc(numCandidates * sizeof(uint32_t));
	if (h_regionsProfiledScores == NULL) PSA_ERROR(E_ALLOCATE_MEM);
	
	rewind(fp);
	if(mode == 1) PSA_ERROR(loadRegionsProfile(fp, regions->queries->h_ASCII, regions->queries->h_size, regions->queries->h_ASCIIposition,
		    				regions->candidates->h_refPosition, regions->alignments->h_info, h_regionsProfiledScores));
	else PSA_ERROR(loadRegionsProfile(fp, regions->queries->h_ASCII, regions->queries->h_size, regions->queries->h_ASCIIposition,
				   h_genomePositionCandidates, regions->alignments->h_info, h_regionsProfiledScores));
	regions->queries->formats |= queriesMode;
	fclose(fp);

	fp = fopen(genomeFile, "rb");
	if (fp == NULL) return(E_OPENING_FILE);
	PSA_ERROR(initSequences(&genome, numGenomes));
	PSA_ERROR(loadSequenceMFASTA(fp, &genome->h_size, &genome->h_ASCII, &genome->h_ASCIIposition, &genome->formats));
    fclose(fp);

    /* recover the candidates from genome in ASCII rep */
    if (mode == 1) PSA_ERROR(gatherCandidatesASCIIReference(regions, genome));
    else PSA_ERROR(gatherCandidatesASCIIStream(regions, h_genomePositionCandidates, genome));
	regions->candidates->formats |= candidatesMode;

	/* DEBUG REGIONS*/
	#if defined(DEBUG)
		PSA_ERROR(printRegions(regions, 4, 1));
	#endif

	if (mode == 1) sprintf(regionsFile, "%s.%u.%u.%u.ref.regions", profileFile, regions->queries->num, regions->averageSizeQuery, regions->averageCandidatesPerQuery);\
	else sprintf(regionsFile, "%s.%u.%u.%u.regions", profileFile, regions->queries->num, regions->averageSizeQuery, regions->averageCandidatesPerQuery);

    fp = fopen(regionsFile, "wb");
	if (fp == NULL) return(E_OPENING_FILE);
	PSA_ERROR(saveRegions(fp, regions));
    fclose(fp);

	PSA_ERROR(freeRegions(&regions));
	free(h_genomePositionCandidates);
	free(h_regionsProfiledScores);

    return (SUCCESS);
}
void PreferencesDialog::init() {
    setWindowFlags( Qt::Window );
    setModal( true ); 

    tab = new QTabWidget();

    quizPage = new QWidget();

    quizLengthOptionsPanel = new QGroupBox( tr( "Length" ) );
    quizLengthOptionsPanelLayout = new QVBoxLayout();
    quizLengthOptionsPanel->setLayout( quizLengthOptionsPanelLayout );

    revealingOptionsPanel = new QGroupBox( tr( "RevealingOrders" ) );
    revealingOptionsPanel->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ) );
    revealingOptionsPanelLayout = new QHBoxLayout();
    revealingOptionsPanel->setLayout( revealingOptionsPanelLayout );
  
    sequencesViewPanel = new QWidget(); 
    sequencesViewPanelLayout = new QVBoxLayout();
    sequencesViewPanelLayout->setContentsMargins( 0, 10, 0, 0 );
    sequencesViewPanel->setLayout( sequencesViewPanelLayout );
    revealingOptionsPanelLayout->addWidget( sequencesViewPanel );
    sequencesView = new QTreeWidget();
    sequencesView->headerItem()->setHidden( true );
    sequencesViewPanelLayout->addWidget( sequencesView );
    sequencesViewButtons = new QWidget();
    sequencesViewButtonsLayout = new QHBoxLayout();
    sequencesViewButtonsLayout->setContentsMargins( 0, 0, 0, 0 );
    sequencesViewButtons->setLayout( sequencesViewButtonsLayout );
    sequencesViewPanelLayout->addWidget( sequencesViewButtons );
    addSequenceButton = new QPushButton( "+" );
    //sequencesViewButtonsLayout->addStretch();
    sequencesViewButtonsLayout->addWidget( addSequenceButton );
    addSequenceButton->setToolTip( tr( "Add revealing sequence" ) );
    connect( addSequenceButton, SIGNAL( clicked() ), this, SLOT( addSequence() ) );
    removeSequenceButton = new QPushButton( "-" );
    sequencesViewButtonsLayout->addWidget( removeSequenceButton );
    removeSequenceButton->setToolTip( tr( "Remove revealing sequence" ) );
    connect( removeSequenceButton, SIGNAL( clicked() ), this, SLOT( removeSequence() ) );

    initSequences();
    connect( sequencesView, SIGNAL( itemSelectionChanged() ), this, SLOT( updateUi() ) );

    sequencesLabelBox = new QGroupBox( tr( "QuizWindow" ) );
    sequencesLabelBoxLayout = new QVBoxLayout();
    sequencesLabelBox->setLayout( sequencesLabelBoxLayout );
    revealingOptionsPanelLayout->addWidget( sequencesLabelBox );
    sequencesLabel = new QLabel();
    sequencesLabelBoxLayout->addWidget( sequencesLabel );
    sequencesLabel->setPixmap( QPixmap( ":/pics/SequenceMapLandscape.png" ) );

    quizLengthSlider = new QSlider( Qt::Horizontal );
    quizLengthSlider->setMinimum( 0 );
    quizLengthSlider->setMaximum( TermScheduler::poolCount - 1 );
    quizLengthSlider->setTickInterval( 1 );
    quizLengthSlider->setTickPosition( QSlider::TicksBothSides );
    quizLengthSlider->setFocusPolicy( Qt::StrongFocus );

    quizLengthOptionsPanelLayout->addWidget( quizLengthSlider );
    quizLengthLabelsPanel = new QWidget();
    quizLengthLabelsPanelLayout = new QHBoxLayout();
    quizLengthLabelsPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    quizLengthLabelsPanel->setLayout( quizLengthLabelsPanelLayout );
    quizLengthOptionsPanelLayout->addWidget( quizLengthLabelsPanel );

    quizLengthShortestLabel = new QLabel( tr( "QuizLengthShortest" ) );
    quizLengthMediumLabel = new QLabel( tr( "QuizLengthMedium" ) );
    quizLengthMediumLabel->setAlignment( Qt::AlignCenter );
    quizLengthLongestLabel = new QLabel( tr( "QuizLengthLongest" ) );
    quizLengthLongestLabel->setAlignment( Qt::AlignRight );
    quizLengthLabelsPanelLayout->addWidget( quizLengthShortestLabel );
    quizLengthLabelsPanelLayout->addWidget( quizLengthMediumLabel );
    quizLengthLabelsPanelLayout->addWidget( quizLengthLongestLabel );

    quizLengthSlider->setValue( prefs->getQuizLength() ); 

    quizLayout = new QVBoxLayout();
    quizPage->setLayout( quizLayout );
    quizLayout->addWidget( quizLengthOptionsPanel );
    quizLayout->addWidget( revealingOptionsPanel );
    quizLayout->addStretch();

    fontPage = new QWidget();

    fontsPanel = new QWidget();
    fontsPanelLayout = new QVBoxLayout();
    fontsPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    fontsPanel->setLayout( fontsPanelLayout );

    labelsFontPanel = new QWidget();
    labelsFontPanelLayout = new QHBoxLayout();
    labelsFontPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    labelsFontPanel->setLayout( labelsFontPanelLayout );
    fontsPanelLayout->addWidget( labelsFontPanel );
    labelsFontLabel = new QLabel( tr( "LabelsFont" ) );
    labelsFontFamilyComboBox = new QComboBox();
    labelsFontSizeComboBox = new QComboBox();
    resetDefaultLabelsFontButton = new QPushButton( tr( "ResetDefaultValue" ) );
    connect( resetDefaultLabelsFontButton, SIGNAL( clicked() ), this, SLOT( resetDefaultLabelsFont() ) );
    labelsFontPanelLayout->addWidget( labelsFontLabel );
    labelsFontPanelLayout->addWidget( labelsFontFamilyComboBox );
    labelsFontPanelLayout->addWidget( labelsFontSizeComboBox );
    labelsFontPanelLayout->addWidget( resetDefaultLabelsFontButton );

    initFontFamilyValues( labelsFontFamilyComboBox );
    selectFontFamily( labelsFontFamilyComboBox, prefs->getLabelsFontFamily() );
    initFontSizeValues( labelsFontSizeComboBox );
    selectFontSize( labelsFontSizeComboBox, prefs->getLabelsFontSizeModifier() );

    fontPanel = new QWidget();
    fontPanelLayout = new QHBoxLayout();
    fontPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    fontPanel->setLayout( fontPanelLayout );
    fontsPanelLayout->addWidget( fontPanel );
    fontLabel = new QLabel( tr( "FieldsFont" ) );
    fontFamilyComboBox = new QComboBox();
    fontSizeComboBox = new QComboBox();
    resetDefaultFontButton = new QPushButton( tr( "ResetDefaultValue" ) );
    connect( resetDefaultFontButton, SIGNAL( clicked() ), this, SLOT( resetDefaultFont() ) );
    fontPanelLayout->addWidget( fontLabel );
    fontPanelLayout->addWidget( fontFamilyComboBox);
    fontPanelLayout->addWidget( fontSizeComboBox);
    fontPanelLayout->addWidget( resetDefaultFontButton );


    initFontFamilyValues( fontFamilyComboBox );
    selectFontFamily( fontFamilyComboBox, prefs->getFontFamily() );
    initFontSizeValues( fontSizeComboBox );
    selectFontSize( fontSizeComboBox, prefs->getFontSizeModifier() );

    fontOverridesPanel = new QGroupBox( tr( "LanguageFontOverrides" ) );
    fontOverridesPanelLayout = new QVBoxLayout();
    fontOverridesPanel->setLayout( fontOverridesPanelLayout );
    fontsPanelLayout->addWidget( fontOverridesPanel );
    fontOverridesScrollView = new QScrollArea();
    fontOverridesScrollView->setWidgetResizable( true );
    fontOverridesPanelLayout->addWidget( fontOverridesScrollView );
    fontOverridesBox = new QWidget();
    fontOverridesBoxLayout = new QVBoxLayout();
    fontOverridesBox->setLayout( fontOverridesBoxLayout );
    initFontOverrides();
    fontOverridesScrollView->setWidget( fontOverridesBox );

    fontPageLayout = new QVBoxLayout();
    fontPageLayout->addWidget( fontsPanel );
    fontPageLayout->addStretch();
    fontPage->setLayout( fontPageLayout );

#if defined(Q_WS_HILDON)
    interfacePage = new QScrollArea();
    //interfacePage->setWidgetResizable( true );
    interfacePageBox = new QWidget();
#else
    interfacePage = new QWidget();
#endif

    miscInterfaceOptionsPanel = new QWidget();
    miscInterfaceOptionsPanelLayout = new QGridLayout();
    miscInterfaceOptionsPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    miscInterfaceOptionsPanel->setLayout( miscInterfaceOptionsPanelLayout );

    digraphPanel = new QGroupBox( tr( "BuiltInSupportForAccents" ) );
    digraphPanelLayout = new QVBoxLayout();
    digraphPanel->setLayout( digraphPanelLayout );
    digraphCheckBox = new QCheckBox( tr( "DigraphesEnabled" ) );
    digraphCheckBox->setCheckState( prefs->isDigraphEnabled() ? Qt::Checked : Qt::Unchecked );
    digraphPanelLayout->addWidget( digraphCheckBox );

    hideQuizButtonPanel = new QGroupBox( tr( "QuizOptions" ) );
    hideQuizButtonPanelLayout = new QVBoxLayout();
    hideQuizButtonPanel->setLayout( hideQuizButtonPanelLayout );
    hideQuizButtonCheckBox = new QCheckBox( tr( "hideQuizButtons" ) );
    hideQuizButtonCheckBox->setCheckState( prefs->areQuizButtonsHidden() ? Qt::Checked : Qt::Unchecked );
    hideQuizButtonPanelLayout->addWidget( hideQuizButtonCheckBox );

    showAltTextInTermListPanel = new QGroupBox( tr( "GlossaryManagerOptions" ) );
    showAltTextInTermListPanelLayout = new QVBoxLayout();
    showAltTextInTermListPanel->setLayout( showAltTextInTermListPanelLayout );
    showAltTextInTermListCheckBox = new QCheckBox( tr( "ShowAltInTermList" ) );
    showAltTextInTermListCheckBox->setChecked( prefs->isAltInTermListShown() ? Qt::Checked : Qt::Unchecked );
    showAltTextInTermListPanelLayout->addWidget( showAltTextInTermListCheckBox );

    miscInterfaceOptionsPanelLayout->addWidget( digraphPanel, 0, 0 );
    miscInterfaceOptionsPanelLayout->addWidget( hideQuizButtonPanel, 1, 0 );
    miscInterfaceOptionsPanelLayout->addWidget( showAltTextInTermListPanel, 2, 0 );

    keyboardAccelPanel = new QGroupBox( tr( "Keyboard Accelerators" ) );
    keyboardAccelPanelLayout = new QVBoxLayout();
    keyboardAccelPanel->setLayout( keyboardAccelPanelLayout );

    keyboardAccelListView = new QTreeWidget();
    keyboardAccelListView->setColumnCount( 2 );
    keyboardAccelListView->setMinimumWidth( 700 );
    QStringList headerLabels;
    headerLabels << tr( "Action" ) << tr( "Key" ); 
    keyboardAccelListView->setHeaderLabels( headerLabels );
    keyboardAccelListView->header()->setResizeMode( 0, QHeaderView::Stretch );
    keyboardAccelListView->setIconSize( QSize( 24, 24 ) );
    int actionCount = sizeof( action ) / sizeof( QAction* );
    for( int i = actionCount - 1; i >= 0; i-- ) {
        KeyActionListViewItem* actionItem = new KeyActionListViewItem( keyboardAccelListView, action[ i ], (Action)i );
        actionItem->setText( 0, action[ i ]->text() );
        actionItem->setIcon( 0, action[ i ]->icon() );
        keyboardAccelListView->addTopLevelItem( actionItem );
    }
    connect( keyboardAccelListView, SIGNAL( currentItemChanged( QTreeWidgetItem*, QTreeWidgetItem* ) ), this, SLOT( cancelSetAccelKey() ) );
    connect( tab, SIGNAL( currentChanged( int ) ), this, SLOT( cancelSetAccelKey() ) );
    keyboardAccelPanelLayout->addWidget( keyboardAccelListView );

    keyboardAccelButtonPanel = new QWidget();
    keyboardAccelPanelLayout->addWidget( keyboardAccelButtonPanel );
    clearAccelKeyButton = new QPushButton( tr( "Clear key" ) );
    setAccelKeyButton = new QPushButton( tr( "Set key" ) );
    resetAccelKeyButton = new QPushButton( tr( "Reset key" ) );
    
    keyboardAccelButtonPanelLayout = new QHBoxLayout( keyboardAccelButtonPanel );
    keyboardAccelButtonPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    keyboardAccelButtonPanelLayout->addStretch();
    keyboardAccelButtonPanelLayout->addWidget( clearAccelKeyButton );
    keyboardAccelButtonPanelLayout->addWidget( setAccelKeyButton );
    keyboardAccelButtonPanelLayout->addWidget( resetAccelKeyButton );

    connect( clearAccelKeyButton, SIGNAL( clicked() ), this, SLOT( clearAccelKey() ) );
    connect( setAccelKeyButton, SIGNAL( clicked() ), this, SLOT( setAccelKey() ) );
    connect( resetAccelKeyButton, SIGNAL( clicked() ), this, SLOT( resetAccelKey() ) );

    interfacePageLayout = new QVBoxLayout();
    interfacePageLayout->addWidget( miscInterfaceOptionsPanel );
    interfacePageLayout->addWidget( keyboardAccelPanel, 1 );
#if defined(Q_WS_HILDON)
    interfacePageBox->setLayout( interfacePageLayout );
    interfacePage->setWidget( interfacePageBox );
#else
    interfacePage->setLayout( interfacePageLayout );
#endif

    languagePage = new QWidget();

    languagesPanel = new QWidget();
    languagesPanelLayout = new QVBoxLayout();
    languagesPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    languagesPanel->setLayout( languagesPanelLayout );

    studyLanguagesListView = new QTreeWidget();
    studyLanguagesListView->setColumnCount( 1 );
    languagesPanelLayout->addWidget( studyLanguagesListView );
    studyLanguagesListView->setHeaderLabel( tr( "StudyLanguages" ) );
   
    initStudyLanguageValues();

    connect( studyLanguagesListView, SIGNAL( itemChanged( QTreeWidgetItem*, int ) ), this, SLOT( updateFontOverride( QTreeWidgetItem*, int ) ) );

    languageLayout = new QVBoxLayout();
    languagePage->setLayout( languageLayout );
    languageLayout->addWidget( languagesPanel, 1 );
    tab->addTab( quizPage, tr( "Quiz" ) );
    tab->addTab( languagePage, tr( "Languages" ) );
    tab->addTab( fontPage, tr( "Fonts" ) );
    tab->addTab( interfacePage, tr( "Interface" ) );

    bottomButtonsPanel = new QWidget();
    bottomButtonsPanelLayout = new QHBoxLayout();
    bottomButtonsPanelLayout->setContentsMargins( 0, 0, 0, 0 );
    bottomButtonsPanel->setLayout( bottomButtonsPanelLayout );

    acceptButton = new QPushButton( tr( "Ok" ) );
    connect( acceptButton, SIGNAL( clicked() ), this, SLOT( accept() ) );
    cancelButton = new QPushButton( tr( "Cancel" ) );
    connect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) );

    bottomButtonsPanelLayout->addStretch();
    bottomButtonsPanelLayout->addWidget( acceptButton );
    bottomButtonsPanelLayout->addWidget( cancelButton );

    mainLayout = new QVBoxLayout();
    mainLayout->addWidget( tab, 1 );
    mainLayout->addWidget( bottomButtonsPanel );
    setLayout( mainLayout );

    setWindowTitle( tr( "Preferences..." ) );

    updateUi();
}
void PreferencesDialog::init() {
    tab = new QTabWidget( this, "Tab" );

    quizPage = new QScrollView( tab, "QuizPage" );
    quizPage->setResizePolicy( QScrollView::AutoOneFit );
    quizPageBox = new QWidget( quizPage->viewport(), "QuizPage" );
    quizPage->addChild( quizPageBox );

    quizAlgorithmsPanel = new QWidget( quizPageBox, "QuizAlgorithmsPanel" );
    quizAlgorithmsPanelLayout = new QHBoxLayout( quizAlgorithmsPanel );

    quizAlgorithmOptionsPanel = new QVButtonGroup( tr( "Algorithm" ), quizAlgorithmsPanel, "QuizAlgorithmOptionsPanel" );
    quizLengthOptionsPanel = new QVGroupBox( tr( "Length" ), quizAlgorithmsPanel, "QuizLengthOptionsPanel" );
    quizAlgorithmsPanelLayout->addWidget( quizAlgorithmOptionsPanel );
    quizAlgorithmsPanelLayout->addWidget( quizLengthOptionsPanel, 1 );

    quizCharacterImageOptionsPanel = new QHGroupBox( tr( "Images associated to characters" ), quizPageBox, "QuizCharacterImageOptions" );

    quizCharacterImageLocationLabel = new QLabel( tr( "CharacterImageLocation" ), quizCharacterImageOptionsPanel );
    quizCharacterImageLocationField = new QLineEdit( quizCharacterImageOptionsPanel );
    quizCharacterImageLocationField->setText( prefs->getQuizCharacterImageLocation() );
    quizCharacterImageLocationSetButton = new QPushButton( tr( "SetCharacterImageLocation" ), quizCharacterImageOptionsPanel );
    connect( quizCharacterImageLocationSetButton, SIGNAL( clicked() ), this, SLOT( setCharacterImageLocation() ) );
    quizCharacterImageLocationClearButton = new QPushButton( tr( "ClearCharacterImageLocation" ), quizCharacterImageOptionsPanel );
    connect( quizCharacterImageLocationClearButton, SIGNAL( clicked() ), this, SLOT( clearCharacterImageLocation() ) );
    quizCharacterImageOptionsPanel->addSpace( 10 );
    quizCharacterImageTypeCheckbox = new QCheckBox( tr( "IsCharacterImageAnimated" ), quizCharacterImageOptionsPanel );
    quizCharacterImageTypeCheckbox->setChecked( prefs->isQuizCharacterImagesAnimated() );

    revealingOptionsPanel = new QHGroupBox( tr( "RevealingOrders" ), quizPageBox, "RevealingOptionsPanel" );
  
    sequencesViewPanel = new QVBox( revealingOptionsPanel ); 
    sequencesViewPanel->setSpacing( 2 );
    sequencesView = new SmartListView( sequencesViewPanel, "SequencesView" );
    sequencesView->addColumn( QString::null );
    sequencesView->header()->hide();
    sequencesViewButtons = new QHBox( sequencesViewPanel );
    sequencesViewButtons->setSpacing( 2 );
    //sequencesViewButtonsFiller = new QWidget( sequencesViewButtons, "SequenceViewButtonsFiller" ); 
    addSequenceButton = new QPushButton( "+", sequencesViewButtons, "AddSequenceButton" );
    QToolTip::add( addSequenceButton, tr( "Add revealing sequence" ) );
    connect( addSequenceButton, SIGNAL( clicked() ), this, SLOT( addSequence() ) );
    removeSequenceButton = new QPushButton( "-", sequencesViewButtons, "RemoveSequenceButton" );
    QToolTip::add( removeSequenceButton, tr( "Remove revealing sequence" ) );
    connect( removeSequenceButton, SIGNAL( clicked() ), this, SLOT( removeSequence() ) );
    //sequencesViewButtons->setStretchFactor( sequencesViewButtonsFiller, 1 );

    initSequences();
    connect( sequencesView, SIGNAL( selectionChanged( QListViewItem* ) ), this, SLOT( updateUi() ) );

    revealingOptionsPanel->addSpace( 6 );

    sequencesLabelBox = new QVGroupBox( tr( "QuizWindow" ), revealingOptionsPanel, "SequencesLabelBox" );
    sequencesLabel = new QLabel( sequencesLabelBox );
    sequencesLabel->setPixmap( Resource::loadPixmap( "SequenceMapLandscape" ) );

    sequencesViewPanel->setMaximumHeight( sequencesLabelBox->sizeHint().height() );

    quizAlgoOriginalRadioButton = new QRadioButton( tr( "OriginalQuizAlgorithm" ), quizAlgorithmOptionsPanel );
    quizAlgoSuperMemo2RadioButton = new QRadioButton( tr( "SuperMemo2Algorithm" ), quizAlgorithmOptionsPanel );
    if( prefs->getQuizAlgorithm() == Preferences::ORIGINAL )
        quizAlgoOriginalRadioButton->setChecked( true );
    else if( prefs->getQuizAlgorithm() == Preferences::SUPERMEMO2 )
        quizAlgoSuperMemo2RadioButton->setChecked( true );

    quizLengthSlider = new QSlider( 0, OriginalQuiz::poolCount - 1, 1, 1, QSlider::Horizontal, quizLengthOptionsPanel, "QuizLengthSlider" );
    quizLengthLabelsPanel = new QHBox( quizLengthOptionsPanel, "QuizLengthLabelsPanel" );
    quizLengthShortestLabel = new QLabel( tr( "QuizLengthShortest" ), quizLengthLabelsPanel, "QuizLengthShortestLabel" );
    quizLengthMediumLabel = new QLabel( tr( "QuizLengthMedium" ), quizLengthLabelsPanel, "QuizLengthMediumLabel" );
    quizLengthMediumLabel->setAlignment( QLabel::AlignCenter );
    quizLengthLongestLabel = new QLabel( tr( "QuizLengthLongest" ), quizLengthLabelsPanel, "QuizLengthLongestLabel" );
    quizLengthLongestLabel->setAlignment( QLabel::AlignRight );
    
    quizLengthSlider->setValue( prefs->getQuizLength() ); 

    quizPageFiller = new QWidget( quizPageBox, "QuizPageFiller" );

    quizLayout = new QVBoxLayout( quizPageBox );
    quizLayout->addWidget( quizAlgorithmsPanel );
    quizLayout->addWidget( quizCharacterImageOptionsPanel );
    quizLayout->addWidget( revealingOptionsPanel );
    quizLayout->addWidget( quizPageFiller, 1 );

    fontPage = new QWidget( tab, "FontPage" );

    //fontsPanel = new QVGroupBox( tr( "Fonts" ), fontPage, "FontsPanel" );
    fontsPanel = new QVBox( fontPage, "FontsPanel" );
    fontsPanel->setSpacing( 2 );

    labelsFontPanel = new QHBox( fontsPanel, "LabelsFontPanel" );
    labelsFontPanel->setSpacing( 2 );
    labelsFontLabel = new QLabel( tr( "LabelsFont" ), labelsFontPanel, "LabelsFontLabel" );
    labelsFontFamilyComboBox = new QComboBox( labelsFontPanel, "LabelsFontFamilyComboBox" );
    labelsFontSizeComboBox = new QComboBox( labelsFontPanel, "LabelsFontSizeComboBox" );
    resetDefaultLabelsFontButton = new QPushButton( tr( "ResetDefaultValue" ), labelsFontPanel, "ResetDefaultLabelsFontButton" );
    connect( resetDefaultLabelsFontButton, SIGNAL( clicked() ), this, SLOT( resetDefaultLabelsFont() ) );

    initFontFamilyValues( labelsFontFamilyComboBox );
    selectFontFamily( labelsFontFamilyComboBox, prefs->getLabelsFontFamily() );
    initFontSizeValues( labelsFontSizeComboBox );
    selectFontSize( labelsFontSizeComboBox, prefs->getLabelsFontSizeModifier() );

    fontPanel = new QHBox( fontsPanel, "FontPanel" );
    fontPanel->setSpacing( 2 );
    fontLabel = new QLabel( tr( "FieldsFont" ), fontPanel, "FontLabel" );
    fontFamilyComboBox = new QComboBox( fontPanel, "FontFamilyComboBox" );
    fontSizeComboBox = new QComboBox( fontPanel, "FontSizeComboBox" );
    resetDefaultFontButton = new QPushButton( tr( "ResetDefaultValue" ), fontPanel, "ResetDefaultFontButton" );
    connect( resetDefaultFontButton, SIGNAL( clicked() ), this, SLOT( resetDefaultFont() ) );

    initFontFamilyValues( fontFamilyComboBox );
    selectFontFamily( fontFamilyComboBox, prefs->getFontFamily() );
    initFontSizeValues( fontSizeComboBox );
    selectFontSize( fontSizeComboBox, prefs->getFontSizeModifier() );

    fontOverridesPanel = new QVGroupBox( tr( "LanguageFontOverrides" ), fontsPanel, "LanguageFontsPanel" );
    fontOverridesScrollView = new QScrollView( fontOverridesPanel, "FontOverridesScrollView" );
    fontOverridesScrollView->setResizePolicy( QScrollView::AutoOneFit );
    fontOverridesBox = new QWidget( fontOverridesScrollView->viewport() );
    fontOverridesBoxLayout = new QVBoxLayout( fontOverridesBox );
    fontOverridesScrollView->addChild( fontOverridesBox );
    initFontOverrides();

    fontPageFiller = new QWidget( fontPage, "FontPageFiller" );

    fontPageLayout = new QVBoxLayout( fontPage );
    fontPageLayout->setSpacing( 2 );
    fontPageLayout->addWidget( fontsPanel );
    fontPageLayout->addWidget( fontPageFiller, 1 );

    interfacePage = new QWidget( tab, "InterfacePage" );

    miscInterfaceOptionsPanel = new QGrid( 2, interfacePage, "MiscInterfaceOptionsPanel" );

    digraphPanel = new QVGroupBox( tr( "BuiltInSupportForAccents" ), miscInterfaceOptionsPanel, "DigraphPanel" );
    digraphCheckBox = new QCheckBox( tr( "DigraphesEnabled" ), digraphPanel, "DigraphCheckBox" );
    digraphCheckBox->setChecked( prefs->isDigraphEnabled() );

    hideQuizButtonPanel = new QVGroupBox( tr( "QuizOptions" ), miscInterfaceOptionsPanel, "HideQuizButtonPanel" );
    hideQuizButtonCheckBox = new QCheckBox( tr( "hideQuizButtons" ), hideQuizButtonPanel, "HideQuizButtonCheckBox" );
    hideQuizButtonCheckBox->setChecked( prefs->areQuizButtonsHidden() );

    showAltTextInTermListPanel = new QVGroupBox( tr( "GlossaryManagerOptions" ), miscInterfaceOptionsPanel, "ShowAltTextInTermListPanel" );
    showAltTextInTermListCheckBox = new QCheckBox( tr( "ShowAltInTermList" ), showAltTextInTermListPanel, "ShowAltInTermListCheckBox" );
    showAltTextInTermListCheckBox->setChecked( prefs->isAltInTermListShown() );

    keyboardAccelPanel = new QVGroupBox( tr( "Keyboard Accelerators" ), interfacePage, "KeyboardAccelPanel" );
    keyboardAccelListView = new SmartListView( keyboardAccelPanel, "KeyboardAccelListView" );
    keyboardAccelListView->addColumn( tr( "Action" ), 280 );
    keyboardAccelListView->addColumn( tr( "Key" ), 140 );
    keyboardAccelListView->setSorting( -1 );
    keyboardAccelListView->setAllColumnsShowFocus( true );
    keyboardAccelListView->setStretchColumn( 0 );
    int actionCount = sizeof( action ) / sizeof( QAction* );
    for( int i = actionCount - 1; i >= 0; i-- ) {
        KeyActionListViewItem* actionItem = new KeyActionListViewItem( keyboardAccelListView, action[ i ], (Action)i );
        actionItem->setText( 0, action[ i ]->text() );
        actionItem->setPixmap( 0, action[ i ]->iconSet().pixmap() );
        keyboardAccelListView->insertItem( actionItem );
    }
    connect( keyboardAccelListView, SIGNAL( returnPressed( QListViewItem* ) ), this, SLOT( keyActionClicked( QListViewItem* ) ) );
    connect( keyboardAccelListView, SIGNAL( currentChanged( QListViewItem* ) ), this, SLOT( cancelSetAccelKey() ) );
    connect( tab, SIGNAL( selected( const QString& ) ), this, SLOT( cancelSetAccelKey() ) );

    keyboardAccelButtonPanel = new QWidget( keyboardAccelPanel, "KeyboardAccelButtonPanel" );
    keyboardAccelButtonPanelFiller = new QWidget( keyboardAccelButtonPanel, "KeyboardAccelButtonPanelFiller" );  
    clearAccelKeyButton = new QPushButton( tr( "Clear key" ), keyboardAccelButtonPanel );
    setAccelKeyButton = new QPushButton( tr( "Set key" ), keyboardAccelButtonPanel );
    resetAccelKeyButton = new QPushButton( tr( "Reset key" ), keyboardAccelButtonPanel );
    
    keyboardAccelButtonPanelLayout = new QHBoxLayout( keyboardAccelButtonPanel );
    keyboardAccelButtonPanelLayout->setSpacing( 2 );
    keyboardAccelButtonPanelLayout->addWidget( keyboardAccelButtonPanelFiller, 1 );
    keyboardAccelButtonPanelLayout->addWidget( clearAccelKeyButton );
    keyboardAccelButtonPanelLayout->addWidget( setAccelKeyButton );
    keyboardAccelButtonPanelLayout->addWidget( resetAccelKeyButton );

    connect( clearAccelKeyButton, SIGNAL( clicked() ), this, SLOT( clearAccelKey() ) );
    connect( setAccelKeyButton, SIGNAL( clicked() ), this, SLOT( setAccelKey() ) );
    connect( resetAccelKeyButton, SIGNAL( clicked() ), this, SLOT( resetAccelKey() ) );

    interfacePageFiller = new QWidget( interfacePage, "InterfacePageFiller" );

    interfacePageLayout = new QVBoxLayout( interfacePage );
    interfacePageLayout->setSpacing( 2 );
    interfacePageLayout->addWidget( miscInterfaceOptionsPanel );
    interfacePageLayout->addWidget( keyboardAccelPanel );
    interfacePageLayout->addWidget( interfacePageFiller, 1 );

    languagePage = new QWidget( tab, "LanguagePage" );

    languagesPanel = new QVBox( languagePage, "LanguagesPanel" );
    languagesPanel->setSpacing( 2 );

    studyLanguagesListView = new SmartListView( languagesPanel, "StudyLanguagesListView" );
    studyLanguagesListView->setAllColumnsShowFocus( true );
    studyLanguagesListView->addColumn( tr( "StudyLanguages" ) );
    studyLanguagesListView->setStretchColumn( 0 );
    languagesPanel->setStretchFactor( studyLanguagesListView, 1 );
   
    languageUpdateNotifier = new LanguageUpdateNotifier();
    connect( languageUpdateNotifier, SIGNAL( languageAdded( const QString& ) ), this, SLOT( addFontOverride( const QString& ) ) );
    connect( languageUpdateNotifier, SIGNAL( languageRemoved( const QString& ) ), this, SLOT( removeFontOverride( const QString& ) ) );

    initStudyLanguageValues();

    languagesRightPanel = new QWidget( languagesPanel, "LanguagesRightPanel" );
    languagesRightPanelLayout = new QVBoxLayout( languagesRightPanel );

    languagesRightPanelFiller = new QWidget( languagesRightPanel, "LanguageRightPanelFiller" );

    languagesRightPanelLayout->addWidget( languagesRightPanelFiller, 1 );

    languageLayout = new QVBoxLayout( languagePage );
    languageLayout->setSpacing( 2 );
    languageLayout->addWidget( languagesPanel, 1 );

    tab->addTab( quizPage, tr( "Quiz" ) );
    tab->addTab( languagePage, tr( "Languages" ) );
    tab->addTab( fontPage, tr( "Fonts" ) );
    tab->addTab( interfacePage, tr( "Interface" ) );

    mainLayout = new QVBoxLayout( this );
    mainLayout->addWidget( tab, 1 );

    setCaption( tr( "Preferences..." ) );

    updateUi();
}