zhongrj
2023-06-27 d74b495736f0c04522ec54274b70fed0ded2878d
public/map/core/manager/widgetsmanager.js
New file
@@ -0,0 +1,571 @@
define(["base/AppEvent",
        "base/ConfigData",
        "dojo/_base/declare",
        "dojo/_base/lang",
        "dojo/dom",
        "dojo/dom-construct",
        "dojo/dom-attr",
        "dojo/dom-class",
        "dojo/on",
        "utils/LayerUtil",
        "utils/ConfigUtil",
        "controls/toolbar/tools/Map3DTool",
        "controls/toolbar/tools/SwipeTool",
        "controls/toolbar/tools/ZoomInTool",
        "controls/toolbar/tools/ZoomOutTool",
        "controls/toolbar/tools/PanTool",
        "controls/toolbar/tools/FullScreenTool",
        "controls/toolbar/tools/ScreenWindowTool",
        "controls/toolbar/tools/StreetViewTool",
        "controls/toolbar/tools/MeasureLineTool",
        "controls/toolbar/tools/MeasurePolygonTool",
        "controls/toolbar/tools/ErrCorrectTool",
        "controls/toolbar/tools/ClearTool",
        "controls/toolbar/tools/CityLayerTool",
        "controls/toolbar/tools/LocationTool",
        "dojo/dom-style",
        "dojo/domReady!"
    ],
    function(AppEvent,
        ConfigData,
        declare,
        lang,
        dom,
        domConstruct,
        domAttr,
        domClass,
        on,
        LayerUtil,
        ConfigUtil,
        Map3DTool,
        SwipeTool,
        ZoomInTool,
        ZoomOutTool,
        PanTool,
        FullScreenTool,
        ScreenWindowTool,
        StreetViewTool,
        MeasureLineTool,
        MeasurePolygonTool,
        ErrCorrectTool,
        ClearTool,
        CityLayerTool,
        LocationTool,
        domStyle) {
        return declare("WidgetManager", null, {
            //--------------------------------------------
            //  系统所有widget的配置
            //--------------------------------------------
            _widgetsConfig: [{
                    "label": "分析研判",
                    "id": "AnalysisAndJudgment",
                    "widgetClass": "widgets/analysisAndJudgment/AnalysisAndJudgment",
                    "type": "sider",
                    "cssPath": "widgets/analysisAndJudgment/AnalysisAndJudgment.css",
                    "actived": false
                },
                // {
                //     "label": "周界检测",
                //     "id": "PerimeterDetection",
                //     "widgetClass": "widgets/perimeterDetection/PerimeterDetection",
                //     "type": "sider",
                //     "cssPath": "widgets/perimeterDetection/PerimeterDetection.css",
                //     "actived": false
                // },
                // {
                //     "label": "入口安检",
                //     "id": "EntranceSecurity",
                //     "widgetClass": "widgets/entranceSecurity/EntranceSecurity",
                //     "type": "sider",
                //     "cssPath": "widgets/entranceSecurity/EntranceSecurity.css",
                //     "actived": false
                // },
                {
                    "label": "实时报警",
                    "id": "RealTimePolice",
                    "widgetClass": "widgets/realTimePolice/RealTimePolice",
                    "type": "sider",
                    "cssPath": "widgets/realTimePolice/RealTimePolice.css",
                    "actived": false
                },
                {
                    "label": "客户管理",
                    "id": "ClientManagement",
                    "widgetClass": "widgets/clientManagement/ClientManagement",
                    "type": "sider",
                    "cssPath": "widgets/clientManagement/ClientManagement.css",
                    "actived": false
                },
                {
                    "label": "设备管理",
                    "id": "equipment",
                    "widgetClass": "widgets/equipment/ClientManagement",
                    "type": "sider",
                    "cssPath": "widgets/equipment/ClientManagement.css",
                    "actived": false
                },
                {
                    "label": "警情调度",
                    "id": "PoliceDispatching",
                    "widgetClass": "widgets/policeDispatching/PoliceDispatching",
                    "type": "sider",
                    "cssPath": "widgets/policeDispatching/PoliceDispatching.css",
                    "actived": false
                },
                {
                    "label": "巡逻管理",
                    "id": "PatrolManagement",
                    "widgetClass": "widgets/patrolManagement/PatrolManagement",
                    "type": "sider",
                    "cssPath": "widgets/patrolManagement/PatrolManagement.css",
                    "actived": false
                },
                {
                    "label": "出警队伍",
                    "id": "APoliceTeam",
                    "widgetClass": "widgets/aPoliceTeam/APoliceTeam",
                    "type": "sider",
                    "cssPath": "widgets/aPoliceTeam/APoliceTeam.css",
                    "actived": false
                },
                {
                    "label": "处警队伍",
                    "id": "SecurityMap",
                    "widgetClass": "widgets/securityMap/SecurityMap",
                    "type": "sider",
                    "cssPath": "widgets/securityMap/SecurityMap.css",
                    "actived": false
                },
                {
                    "label": "分发处置",
                    "id": "AlertSecurity",
                    "widgetClass": "widgets/alertSecurity/AlertSecurity",
                    "type": "sider",
                    "cssPath": "widgets/alertSecurity/AlertSecurity.css",
                    "actived": false
                },
                {
                  "label": "抢单任务",
                  "id": "task",
                  "widgetClass": "widgets/task/task",
                  "type": "sider",
                  "cssPath": "widgets/task/task.css",
                  "actived": false
                },
              {
                "label": "轨迹查看",
                "id": "trajectory",
                "widgetClass": "widgets/trajectory/trajectory",
                "type": "sider",
                "cssPath": "widgets/trajectory/trajectory.css",
                "actived": false
              },
                {
                    "label": "地图模式",
                    "id": "SupervisoryMap",
                    "widgetClass": "widgets/supervisoryMap/SupervisoryMap",
                    "type": "sider",
                    "cssPath": "widgets/supervisoryMap/SupervisoryMap.css",
                    "actived": false
                },
                {
                    "label": "卡片模式详情",
                    "id": "DetailMap",
                    "widgetClass": "widgets/detailMap/DetailMap",
                    "type": "sider",
                    "cssPath": "widgets/detailMap/DetailMap.css",
                    "actived": false
                },
                {
                    "label": "洪水风险",
                    "id": "MapBrowseWidgetCopy",
                    "widgetClass": "widgets/mapBrowsecopy/MapBrowseWidgetCopy",
                    "type": "sider",
                    "cssPath": "widgets/mapBrowsecopy/MapBrowseWidgetCopy.css",
                    "actived": false
                }, {
                    "label": "数据查询",
                    "id": "MapBrowseWidget",
                    "widgetClass": "widgets/mapBrowse/MapBrowseWidget",
                    "type": "sider",
                    "cssPath": "widgets/mapBrowse/MapBrowseWidget.css",
                    "actived": false
                }, {
                    "label": "工具箱",
                    "id": "toolBoxWidget",
                    "widgetClass": "widgets/toolbox/toolBoxWidget",
                    "type": "cover",
                    "cssPath": "widgets/toolbox/toolBoxWidget.css",
                    "actived": false
                }
            ],
            _map: null,
            _bodyDom: null,
            _mapContentDom: null,
            /**
             * 默认初始化显示在侧边栏的Widget
             */
            _defaultActivedSiderWidgetId: null,
            _topWidgetContainerDom: null,
            _widgetsTable: {},
            _activedButton: null,
            _widgetId2TabButtonIndex: {},
            constructor: function() {
                AppEvent.addAppEventListener(AppEvent.CONFIG_LOADED, lang.hitch(this, this.onConfigLoaded));
                AppEvent.addAppEventListener(AppEvent.BASE_MAP_LAYER_LOADED, lang.hitch(this, this.onMapLoaded));
                AppEvent.addAppEventListener(AppEvent.RUN_WIDGET, lang.hitch(this, this.onRunWidgetHandler));
                AppEvent.addAppEventListener(AppEvent.CLOSE_WIDGET, lang.hitch(this, this.onCloseWidgetHandler));
            },
            onConfigLoaded: function() {
                this._bodyDom = dom.byId("body");
                this._mapContentDom = dom.byId("mapcontentClass");
                this._topWidgetContainerDom = dom.byId("topWidgetContainer");
            },
            onMapLoaded: function(map) {
                try {
                    this._map = map;
                    for (var i = 0; i < this._widgetsConfig.length; i++) {
                        var widgetCfg = this._widgetsConfig[i];
                        switch (widgetCfg.type) {
                            case "sider":
                                this._parseSiderWidget(widgetCfg);
                                break;
                            case "top":
                                this._parseTopWidget(widgetCfg);
                                break;
                            case "cover":
                                this._parseCoverWidget(widgetCfg);
                                break;
                        }
                    }
                    if (this._defaultActivedSiderWidgetId != null && this._activedButton != null) {
                        this._switchTab(this._defaultActivedSiderWidgetId);
                        domClass.add(this._activedButton, "tabbuttonbar-actived");
                    }
                    this._tempAppendOthers();
                } catch (err) {
                    console.log(err);
                }
            },
            /**
             * 解析侧边栏的Widget
             */
            _parseSiderWidget: function(widgetCfg) {
                if (widgetCfg.inited) {
                    this._loadWidget(widgetCfg.widgetClass, widgetCfg.id, widgetCfg.cssPath, function(widget) {
                        domConstruct.place(widget.domNode, dom.byId("tabcontainer"));
                        widget.startup();
                        widget.close();
                    });
                }
                //            if (!widgetCfg.displaylabel) {
                //
                //               return
                //            }
                var tabButton = domConstruct.create("li", null, dom.byId("tabbuttonbar"));
                on(tabButton, "click", dojo.hitch(this, this._onTabButtonClickHandler));
                domAttr.set(tabButton, "widgetid", widgetCfg.id);
                if (widgetCfg.actived) {
                    this._defaultActivedSiderWidgetId = widgetCfg.id;
                    this._activedButton = tabButton;
                }
                tabButton.innerHTML = widgetCfg.label;
                this._widgetId2TabButtonIndex[widgetCfg.id] = tabButton;
            },
            /**
             * 解析顶部位置的Widget
             */
            _parseTopWidget: function(widgetCfg) {
                if (widgetCfg.actived) {
                    this._loadWidget(widgetCfg.widgetClass, widgetCfg.id, widgetCfg.cssPath, lang.hitch(this, function() {
                        var widget = this._widgetsTable[widgetCfg.id];
                        domConstruct.place(widget.domNode, this._topWidgetContainerDom);
                        widget.startup();
                        widget.open();
                    }));
                }
            },
            /**
             * 解析浮动在地图显示区域上的Widget
             */
            _parseCoverWidget: function(widgetCfg) {
                if (widgetCfg.actived) {
                    this._loadWidget(widgetCfg.widgetClass, widgetCfg.id, widgetCfg.cssPath, lang.hitch(this, function() {
                        var widget = this._widgetsTable[widgetCfg.id];
                        domConstruct.place(widget.domNode, this._mapContentDom);
                        widget.startup();
                    }));
                }
            },
            onRunWidgetHandler: function(widgetId) {
                var widgetCfg = this._getWidgetConfigById(widgetId);
                if (!widgetCfg) {
                    alert("该模块不存在!");
                    return;
                }
                var widget = this._widgetsTable[widgetId];
                if (widget == null) {
                    var content = {
                        thisObj: this,
                        widgetCfg: widgetCfg
                    };
                    this._loadWidget(widgetCfg.widgetClass, widgetId, widgetCfg.cssPath, lang.hitch(content, function() {
                        var widget = this.thisObj._widgetsTable[this.widgetCfg.id];
                        this.thisObj._runWidget(widget, this.widgetCfg);
                    }));
                } else {
                    this._runWidget(widget, widgetCfg);
                }
            },
            onCloseWidgetHandler: function(widgetId) {
                var widgetCfg = this._getWidgetConfigById(widgetId);
                if (!widgetCfg) {
                    return;
                }
                var widget = this._widgetsTable[widgetId];
                if (!widget) {
                    return;
                }
                widget.close();
            },
            /**
             * 运行Widget
             */
            _runWidget: function(widget, widgetCfg) {
                switch (widgetCfg.type) {
                    case "sider":
                        if (this._activedButton) {
                            domClass.remove(this._activedButton, "tabbuttonbar-actived");
                        }
                        this._switchTab(widgetCfg.id);
                        this._activedButton = null;
                        if (widgetCfg.displaylabel) {
                            this._activedButton = this._widgetId2TabButtonIndex[widgetCfg.id];
                            domClass.add(this._activedButton, "tabbuttonbar-actived");
                        }
                        break;
                    case "top":
                        this._parseTopWidget(widgetCfg);
                        if (widget.loaded() == false) {
                            widget.startup();
                        }
                        widget.open();
                        break;
                    case "cover":
                        //this._parseCoverWidget(widgetCfg);
                        domConstruct.place(widget.domNode, this._mapContentDom);
                        if (widget.loaded() == false) {
                            widget.startup();
                        }
                        widget.open();
                        break;
                }
                //会导致对sider widget派发RUNWIDGET事件时,widget.open()执行两次,故移入switch中 。  Edit by liuyl 2015/11/5
                //            if (widget.loaded() == false) {
                //               widget.startup();
                //            }
                //            widget.open();
            },
            /**
             * 临时的实例化,因为还没有规划好怎么加载
             */
            _tempAppendOthers: function() {
                return;
                var map = this._map;
                var mapDomNode = dom.byId(map.id);
                //创建常用工具条
                dojo.create("link", {
                        href: 'controls/toolbar/toolbar.css',
                        type: 'text/css',
                        rel: 'stylesheet'
                    },
                    document.getElementsByTagName('head')[0]);
                var toolbarDom = domConstruct.create("div", {
                    id: "toolBarDiv",
                    "class": "toolbar"
                }, dom.byId('mainMapWidget'));
                //全屏
                /*var tool = new FullScreenTool({
                   "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, tool);*/
                //放大
                var tool = new ZoomInTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });
                //缩小
                var tool = new ZoomOutTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });
                //复位
                var tool = new LocationTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });
                //漫游
                /*var tool = new Map3DTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });*/
                //平移
                var tool = new PanTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });
                //量距离
                var tool = new MeasureLineTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });
                //;量面积
                var tool = new MeasurePolygonTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });
                //清除
                var tool = new ClearTool({
                    "map": this._map
                });
                domConstruct.place(tool.domNode, toolbarDom);
                AppEvent.dispatchAppEvent(AppEvent.APPEND_TOOL, {
                    tool: tool,
                    hockId: ConfigData.mapWidgetId
                });
            },
            _onTabButtonClickHandler: function(evt) {
                if (this._activedButton == evt.currentTarget) {
                    return;
                }
                var clickButton = evt.currentTarget;
                var widgetId = domAttr.get(evt.currentTarget, "widgetid");
                var widget = this._widgetsTable[widgetId];
                if (widget == null) {
                    //Widget还未Load
                    var widgetCfg = this._getWidgetConfigById(widgetId);
                    this._loadWidget(widgetCfg.widgetClass, widgetId, widgetCfg.cssPath, lang.hitch(this, function() {
                        widget = this._widgetsTable[widgetId];
                        //this._confirmUserRightForSiderWidget(widget)
                        if (this._activedButton) {
                            domClass.remove(this._activedButton, "tabbuttonbar-actived");
                        }
                        this._switchTab(widget.widgetName);
                        this._activedButton = clickButton;
                        domClass.add(this._activedButton, "tabbuttonbar-actived");
                    }));
                } else {
                    //this._confirmUserRightForSiderWidget(widget)
                    if (this._activedButton) {
                        domClass.remove(this._activedButton, "tabbuttonbar-actived");
                    }
                    this._switchTab(widget.widgetName);
                    this._activedButton = clickButton;
                    domClass.add(this._activedButton, "tabbuttonbar-actived");
                }
                //var loadwidget = lang.hitch(this, this._confirmUserRightForSiderWidget(widget));
            },
            _switchTab: function(widgetId) {
                var widget;
                if (widgetId == this._defaultActivedSiderWidgetId) {
                    //第一次加载defaultWidget的时候,widget还未请求
                    widget = this._widgetsTable[widgetId];
                    if (widget != null) {
                        return;
                    }
                    //是第一次加载,先清除default,以可以走下面的判断
                    this._defaultActivedSiderWidgetId = null;
                }
                if (this._defaultActivedSiderWidgetId != null) {
                    widget = this._widgetsTable[this._defaultActivedSiderWidgetId];
                    widget.close();
                    widget.domNode.parentNode.removeChild(widget.domNode);
                }
                widget = this._widgetsTable[widgetId];
                var loadfun = lang.hitch(this, function(widget, widgetId) {
                    this._defaultActivedSiderWidgetId = widgetId;
                    domConstruct.place(widget.domNode, dom.byId("tabcontainer"));
                    if (widget.loaded() == false) {
                        widget.startup();
                    }
                    widget.open();
                });
                if (widget == null) {
                    var widgetCfg = this._getWidgetConfigById(widgetId);
                    this._loadWidget(widgetCfg.widgetClass, widgetId, widgetCfg.cssPath, lang.hitch(this, function() {
                        widget = this._widgetsTable[widgetId];
                        loadfun(widget, widgetId);
                    }));
                } else {
                    loadfun(widget, widgetId);
                }
            },
            _loadWidget: function(widgetUrl, widgetId, cssPath, callback) {
                if (cssPath && cssPath != "") {
                    dojo.create("link", {
                            href: cssPath,
                            type: "text/css",
                            rel: "stylesheet"
                        },
                        document.getElementsByTagName("head")[0]);
                }
                require([widgetUrl], lang.hitch(this, function(WidgetClass) {
                        var widget = new WidgetClass({
                            map: this._map,
                            id: widgetId
                        });
                        this._widgetsTable[widgetId] = widget;
                        if (callback)
                            callback(widget);
                    }),
                    function(err) {
                        console.log("load widget");
                        console.log(err);
                    });
            },
            _getWidgetConfigById: function(widgetId) {
                for (var i = 0; i < this._widgetsConfig.length; i++) {
                    if (this._widgetsConfig[i].id == widgetId) {
                        return this._widgetsConfig[i];
                    }
                }
            }
        });
    });