'use strict';

var obsidian = require('obsidian');

/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

function __extends(d, b) {
    if (typeof b !== "function" && b !== null)
        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

function __awaiter(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

var CTPSettingTab = /** @class */ (function (_super) {
    __extends(CTPSettingTab, _super);
    function CTPSettingTab(plugin, settings) {
        var _this = _super.call(this, plugin.app, plugin) || this;
        _this.settings = settings;
        _this.plugin = plugin;
        return _this;
    }
    CTPSettingTab.prototype.display = function () {
        var _this = this;
        var containerEl = this.containerEl;
        containerEl.empty();
        containerEl.createEl('h2', { text: 'Cycle through Panes Configuration' });
        var descEl = createFragment();
        descEl.append(createEl("p", { text: 'These are the View Types this Plugin will cycle through using any of the available commands.' }), createEl("p", { text: 'To add a new View Type to this List, simply run the Command: "Cycle through Panes: Enable this View Type". More advanced Users can edit and delete the Types in the text field (one per line).' }));
        new obsidian.Setting(containerEl)
            .setName('Enabled View Types')
            .setDesc(descEl)
            .addTextArea(function (cb) {
            var value = "";
            _this.settings.viewTypes.forEach(function (type) { return value += type + '\n'; });
            cb.setValue(value);
            cb.setPlaceholder('markdown');
            cb.onChange(function (newValue) { return __awaiter(_this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            //                                                    No empty lines
                            this.settings.viewTypes = newValue.split('\n').filter(function (pre) { return !!pre; });
                            return [4 /*yield*/, this.plugin.saveSettings()];
                        case 1:
                            _a.sent();
                            return [2 /*return*/];
                    }
                });
            }); });
        });
        // new Setting(containerEl)
        // .setName('Dont switch to Panes in Sidebar')
        // .setDesc('If this is enabled, only Panes in your actual workspace are considered to switch to.')
        // .addToggle((cb) => {
        //     cb.setValue(this.settings.onlyRootLeaves);
        //     cb.onChange(async value => {
        //         this.settings.onlyRootLeaves = value;
        //         await this.plugin.saveSettings();
        //     })
        // });
    };
    return CTPSettingTab;
}(obsidian.PluginSettingTab));

var DEFAULT_SETTINGS = {
    viewTypes: ['markdown'],
    onlyRootLeaves: true,
};

var CycleThroughPanes = /** @class */ (function (_super) {
    __extends(CycleThroughPanes, _super);
    function CycleThroughPanes() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.lastPanes = [];
        return _this;
    }
    CycleThroughPanes.prototype.getLeavesOfTypes = function (types) {
        var _this = this;
        var leaves = [];
        this.app.workspace.iterateAllLeaves(function (leaf) {
            if (types.contains(leaf.view.getViewType())
                && (!_this.settings.onlyRootLeaves
                    || leaf.getRoot() == _this.app.workspace.rootSplit)) {
                leaves.push(leaf);
            }
        });
        return leaves;
    };
    CycleThroughPanes.prototype.onload = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        console.log('loading plugin: Cycle through panes');
                        return [4 /*yield*/, this.loadSettings()];
                    case 1:
                        _a.sent();
                        this.addSettingTab(new CTPSettingTab(this, this.settings));
                        this.addCommand({
                            id: 'cycle-through-panes',
                            name: 'Cycle through Panes',
                            checkCallback: function (checking) {
                                var active = _this.app.workspace.activeLeaf;
                                if (active) {
                                    if (!checking) {
                                        var leaves = _this.getLeavesOfTypes(_this.settings.viewTypes);
                                        var index = leaves.indexOf(active);
                                        if (index === leaves.length - 1) {
                                            _this.app.workspace.setActiveLeaf(leaves[0], true, true);
                                        }
                                        else {
                                            _this.app.workspace.setActiveLeaf(leaves[index + 1], true, true);
                                        }
                                    }
                                    return true;
                                }
                                return false;
                            }, hotkeys: [
                                {
                                    modifiers: ["Ctrl"],
                                    key: "Tab"
                                }
                            ]
                        });
                        this.addCommand({
                            id: 'cycle-through-panes-reverse',
                            name: 'Cycle through panes (Reverse)',
                            checkCallback: function (checking) {
                                var active = _this.app.workspace.activeLeaf;
                                if (active) {
                                    if (!checking) {
                                        var leaves = _this.getLeavesOfTypes(_this.settings.viewTypes);
                                        var index = leaves.indexOf(active);
                                        if (index !== undefined) {
                                            if (index === 0) {
                                                _this.app.workspace.setActiveLeaf(leaves[leaves.length - 1], true, true);
                                            }
                                            else {
                                                _this.app.workspace.setActiveLeaf(leaves[index - 1], true, true);
                                            }
                                        }
                                    }
                                    return true;
                                }
                                return false;
                            }, hotkeys: [
                                {
                                    modifiers: ["Ctrl", "Shift"],
                                    key: "Tab"
                                }
                            ]
                        });
                        this.addCommand({
                            id: 'cycle-through-panes-add-view',
                            name: 'Enable this View Type',
                            checkCallback: function (checking) {
                                var active = _this.app.workspace.activeLeaf;
                                if (active && !_this.settings.viewTypes.contains(active.view.getViewType())) {
                                    if (!checking) {
                                        _this.settings.viewTypes.push(active.view.getViewType());
                                        _this.saveSettings();
                                    }
                                    return true;
                                }
                                return false;
                            }
                        });
                        this.addCommand({
                            id: 'cycle-through-panes-remove-view',
                            name: 'Disable this View Type',
                            checkCallback: function (checking) {
                                var active = _this.app.workspace.activeLeaf;
                                if (active && _this.settings.viewTypes.contains(active.view.getViewType())) {
                                    if (!checking) {
                                        _this.settings.viewTypes.remove(active.view.getViewType());
                                        _this.saveSettings();
                                    }
                                    return true;
                                }
                                return false;
                            }
                        });
                        //fires when a new file is opened or the focus switches to another pane
                        this.app.workspace.on("file-open", function () {
                            var _a;
                            var active = _this.app.workspace.activeLeaf;
                            //use just markdown panes
                            if (!active || !_this.settings.viewTypes.contains(active.view.getViewType())) {
                                return;
                            }
                            //if a file gets opened in current pane
                            if (((_a = _this.lastPanes) === null || _a === void 0 ? void 0 : _a.last()) == active.id) {
                                return;
                            }
                            //keep a history of 10 panes
                            if (_this.lastPanes.length > 10) {
                                _this.lastPanes.splice(0, 1);
                            }
                            //add current pane to history
                            _this.lastPanes.push(active.id);
                        });
                        this.addCommand({
                            id: 'focus-on-last-active-pane',
                            name: 'Focus on last active pane',
                            callback: function () {
                                var leaf;
                                //Cycle thorough the history until a pane is still there and not the current pane
                                for (var i = 2; i <= _this.lastPanes.length; i++) {
                                    if (_this.lastPanes[_this.lastPanes.length - i] == _this.lastPanes.last())
                                        continue;
                                    leaf = _this.app.workspace.getLeafById(_this.lastPanes[_this.lastPanes.length - i]);
                                    if (leaf)
                                        break;
                                }
                                if (leaf) {
                                    _this.app.workspace.setActiveLeaf(leaf, true, true);
                                }
                            }
                        });
                        return [2 /*return*/];
                }
            });
        });
    };
    CycleThroughPanes.prototype.onunload = function () {
        console.log('unloading plugin: Cycle through panes');
    };
    CycleThroughPanes.prototype.loadSettings = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _a, _b, _c, _d;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        _a = this;
                        _c = (_b = Object).assign;
                        _d = [{}, DEFAULT_SETTINGS];
                        return [4 /*yield*/, this.loadData()];
                    case 1:
                        _a.settings = _c.apply(_b, _d.concat([_e.sent()]));
                        return [2 /*return*/];
                }
            });
        });
    };
    CycleThroughPanes.prototype.saveSettings = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.saveData(this.settings)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    return CycleThroughPanes;
}(obsidian.Plugin));

module.exports = CycleThroughPanes;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,[encoded data, 42116 characters]
