Source: event_handler.js

/**
 * This file manages and calls all available events.
 * 
 * @module scripts/event_handler
 */

import settings_event from "./events/main/settings.js";
import parse_event from "./events/main/parse.js";
import run_event from "./events/main/run.js";
import parse_and_run_event from "./events/main/parse&run.js";
import change_event from "./events/main/change.js";
import debug_event from "./events/main/debug.js";
import stop_event from "./events/main/stop.js";
import clear_event from "./events/main/clear.js";
import theme_event from "./events/main/theme.js";

import update_settings_event from "./events/settings/update_settings.js";
import close_settings_event from "./events/settings/close_settings.js";

import select_project_event from "./events/projects/select_project.js";
import toggle_event from "./events/projects/toggle.js";
import favorite_event from "./events/projects/favorite.js";
import delete_version_event from "./events/projects/delete_version.js";
import delete_project_event from "./events/projects/delete_project.js";
import new_event from "./events/projects/new.js";
import close_projects_event from "./events/projects/close_projects.js";

import select_version_event from "./events/versions/select_version.js";
import close_versions_event from "./events/versions/close_versions.js";

import RequestHandler from "./request_handler.js";
import PageHandler from "./page_handler.js";



/**
 * Class for handling all User Interactions.
 * 
 * @class EventHandler
 */
class EventHandler {

    SETTINGS_EVENT_TAG = "settings";
    PARSE_EVENT_TAG = "parse";
    RUN_EVENT_TAG = "run";
    PARSE_AND_RUN_EVENT_TAG = "parse&run";
    CHANGE_EVENT_TAG = "change";
    DEBUG_EVENT_TAG = "debug";
    STOP_EVENT_TAG = "stop";
    CLEAR_EVENT_TAG = "clear";
    THEME_EVENT_TAG = "theme";

    UPDATE_SETTINGS_EVENT_TAG = "update_settings";
    CLOSE_SETTINGS_EVENT_TAG = "close_settings";

    SELECT_PROJECT_EVENT_TAG = "select_project";
    TOGGLE_EVENT_TAG = "toggle";
    FAVORITE_EVENT_TAG = "favorite";
    DELETE_VERSION_EVENT_TAG = "delete_version";
    DELETE_PROJECT_EVENT_TAG = "delete_project";
    NEW_EVENT_TAG = "new";
    CLOSE_PROJECTS_EVENT_TAG = "close_projects";

    SELECT_VERSION_EVENT_TAG = "select_version";
    CLOSE_VERSIONS_EVENT_TAG = "close_versions";

    ERROR_FORMAT = (msg) => `Error: ${msg}`;
    NOT_A_NUMBER_ERROR = "Not a valid setting.";
    NOT_A_VALID_NAME_ERROR = "Not a valid name.";
    NOT_A_VALID_FILE_ERROR = "Not a valid file.";

    REQUEST_PROJECT_NAME_MSG = "Please enter a name for the project: ";
    REQUEST_DELETE_CONFIRMATION_MSG = "Please confirm you want to delete this version: ";

    /**
     * Constructs a new Event Handler.
     * 
     * @constructor
     * 
     * @param {RequestHandler} requestHandler - The Handler for HTTP interactions.
     * @param {PageHandler} pageHandler       - The Handler for all UI modifications.
     */
    constructor(requestHandler, pageHandler) {

        this.events = {};
        this.isHandlingEvent = false;

        this.events[this.SETTINGS_EVENT_TAG] = settings_event;
        this.events[this.PARSE_EVENT_TAG] = parse_event;
        this.events[this.RUN_EVENT_TAG] = run_event;
        this.events[this.PARSE_AND_RUN_EVENT_TAG] = parse_and_run_event;
        this.events[this.CHANGE_EVENT_TAG] = change_event;
        this.events[this.DEBUG_EVENT_TAG] = debug_event;
        this.events[this.STOP_EVENT_TAG] = stop_event;
        this.events[this.CLEAR_EVENT_TAG] = clear_event;
        this.events[this.THEME_EVENT_TAG] = theme_event;

        this.events[this.UPDATE_SETTINGS_EVENT_TAG] = update_settings_event;
        this.events[this.CLOSE_SETTINGS_EVENT_TAG] = close_settings_event;

        this.events[this.SELECT_PROJECT_EVENT_TAG] = select_project_event;
        this.events[this.TOGGLE_EVENT_TAG] = toggle_event;
        this.events[this.FAVORITE_EVENT_TAG] = favorite_event;
        this.events[this.DELETE_VERSION_EVENT_TAG] = delete_version_event;
        this.events[this.DELETE_PROJECT_EVENT_TAG] = delete_project_event;
        this.events[this.NEW_EVENT_TAG] = new_event;
        this.events[this.CLOSE_PROJECTS_EVENT_TAG] = close_projects_event;

        this.events[this.SELECT_VERSION_EVENT_TAG] = select_version_event;
        this.events[this.CLOSE_VERSIONS_EVENT_TAG] = close_versions_event;

        /**
         * Calls an event based on the given name stored in the data tags.
         * 
         * @function handleEvent
         * 
         * @param {HTMLElement} target - The targeted UI element that was clicked.
         * @param {string} data_tag    - The name of the event to call.
         * @param {object} args        - The other misc. data attributes stored in the target.
         */
        this.handleEvent = (target, data_tag, args) => {

            if (data_tag != null && data_tag != "" && !this.isHandlingEvent) {

                let callback = this.events[data_tag];
                this.isHandlingEvent = true;

                callback(target, args, requestHandler, pageHandler, this);

            }

        }

    }

}

export default EventHandler;