/**
 * 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.
 */

include("../IOExamples.js");


/**
 * File exporter factory.
 *
 * Responsible for filter strings, checking if this exporter is suitable
 * to export files of a given type and for instantiating the file exporter
 * on request.
 */
function ExFileExporterFactory() {
    RFileExporterFactoryAdapter.call(this);
}

ExFileExporterFactory.prototype = new RFileExporterFactoryAdapter();

ExFileExporterFactory.prototype.getFilterStrings = function() {
    return [ qsTr("Example Files %1").arg("(*.example)") ];
};

ExFileExporterFactory.prototype.canExport = function(fileName, nameFilter) {
    var fi = new QFileInfo(fileName);
    if (fi.suffix().toLowerCase()==="example") {
        return 1;
    }
    return -1;
};

ExFileExporterFactory.prototype.instantiate = function(document, messageHandler, progressHandler) {
    return new ExFileExporter(document, messageHandler, progressHandler);
};




/**
 * \ingroup ecma_misc_examples_ioexamples
 * \class ExFileExporter
 * File exporter implementation.
 * This class is instantiated if a file of the registered type is exported.
 */
function ExFileExporter(document, messageHandler, progressHandler) {
    RFileExporterAdapter.call(this, document, messageHandler, progressHandler);
};

ExFileExporter.prototype = new RFileExporterAdapter();

ExFileExporter.prototype.getCorrectedFileName = function(fileName, nameFilter) {
    var ret = fileName;
    var ext = new QFileInfo(ret).suffix().toLowerCase();

    if (ext!=="example") {
        ret += ".example";
    }

    return ret;
};

ExFileExporter.prototype.exportFile = function(fileName, nameFilter, setFileName) {
    var doc = this.getDocument();

    // the document 'doc' should be exported to file 'fileName' here...
    var file = new QFile(fileName);
    var flags = makeQIODeviceOpenMode(QIODevice.WriteOnly, QIODevice.Text);
    if (!file.open(flags)) {
        return false;
    }

    if (setFileName) {
        doc.setFileName(fileName);
    }

    var ts = new QTextStream(file);
    setUtf8Codec(ts);
    ts.writeString("Example");

    file.close();

    return true;
};




/**
 * This action registers a file exporter for files of type '.example'.
 */
function ExRegisterFileExporter(guiAction) {
    IOExamples.call(this, guiAction);
}

ExRegisterFileExporter.prototype = new IOExamples();

ExRegisterFileExporter.prototype.beginEvent = function() {
    // this can also be done in an init function to register the file exporter
    // during the application initialization:
    RFileExporterRegistry.registerFileExporter(new ExFileExporterFactory());

    var appWin = EAction.getMainWindow();
    QMessageBox.information(
        appWin,
        qsTr("Info"),
        qsTr("Registered a file exporter for file type \".example\". Use File > Save As to see the filter in action.")
    );
    // workaround for Qt keyboard focus bug:
    appWin.activateWindow();
};



/**
 * Adds a menu for this action.
 */
ExRegisterFileExporter.init = function(basePath) {
    var action = new RGuiAction(qsTr("&Register File Exporter"), RMainWindowQt.getMainWindow());
    action.setRequiresDocument(false);
    action.setScriptFile(basePath + "/ExRegisterFileExporter.js");
    action.setGroupSortOrder(71110);
    action.setSortOrder(200);
    action.setWidgetNames(["IOExamplesMenu"]);
};
