/**
 * Copyright (c) 2011-2018 by Andrew Mustun. All rights reserved.
 * 
 * This file is part of the QCAD project.
 *
 * QCAD is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * QCAD is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with QCAD.
 */

/**
 * \class CharacterMapDialog
 * \brief Provides a character map dialog that shows available Unicode
 *      characters to insert into a text field.
 * \ingroup ecma_draw_text
 */
function CharacterMapDialog(parent) {
    this.parent = parent;
}

CharacterMapDialog.includeBasePath = includeBasePath;

CharacterMapDialog.prototype.show = function() {
    var font, pointSize;
    
    var dlg = WidgetFactory.createWidget(CharacterMapDialog.includeBasePath,
            "CharacterMapDialog.ui", this.parent.dialog);
    //dlg.windowIcon = new QIcon(autoPath("scripts/Draw/Text/Text.svg"));

    var characterMap = new RCharacterWidget(dlg);
    var fontFamily = this.parent.comboFont
            .itemText(this.parent.comboFont.currentIndex);
    var bold = this.parent.actionTextBold.checked ? true : false;
    var italic = this.parent.actionTextItalic.checked ? true : false;
    pointSize = this.parent.comboSize.itemText(this.parent.comboSize.currentIndex)
            * this.parent.fontHeightFactor;
    var style = "";
    style += bold ? "Bold" : "";
    style += italic ? " Italic" : "";
    font = new QFont(fontFamily, pointSize, bold ? QFont.Bold : QFont.Normal, italic);
    characterMap.updateFont(font);
    characterMap.updateSize(pointSize.toString());
    characterMap.updateStyle(style);
    characterMap.updateFontMerging(true);

    characterMap.characterSelected.connect(this, function(character) {
        var textWidget = this.parent.dialog.findChild("Text");
        var cursor = textWidget.textCursor();
        cursor.insertText(character);
        
        var singleShot = new QTimer(this.parent.dialog);
        singleShot.singleShot = true;
        singleShot.timeout.connect(this, function() {
            dlg.accept();
        });
        singleShot.start(250);
    });

    var widgets = getWidgets(dlg);
    widgets["ScrollArea"].setWidget(characterMap);
    widgets["ZoomIn"].clicked.connect(this, function() {
        font = characterMap.getDisplayFont();
        pointSize = font.pointSize();
        ++pointSize;
        characterMap.updateSize(pointSize.toString());
        this.updateSlider(widgets["ZoomSlider"], pointSize);
    });
    widgets["ZoomOut"].clicked.connect(this, function() {
        font = characterMap.getDisplayFont();
        pointSize = font.pointSize();
        pointSize = Math.max(1, --pointSize);
        characterMap.updateSize(pointSize.toString());
        this.updateSlider(widgets["ZoomSlider"], pointSize);
    });
    widgets["ZoomSlider"].valueChanged.connect(this, function(value) {
        pointSize = Math.max(1, Math.round(value / 2));
        characterMap.updateSize(pointSize.toString());
    });

    font = characterMap.getDisplayFont();
    pointSize = font.pointSize();
    this.updateSlider(widgets["ZoomSlider"], pointSize);
    widgets["ScrollArea"].setFocus(Qt.MouseFocusReason);
    dlg.show();
};

CharacterMapDialog.prototype.updateSlider = function(slider, pointSize) {
    var value = Math.round(100 / 50 * pointSize);
    slider.setValue(value);
};
