/*
* Copyright (c) 2013 Bundesamt by Kartographie und Geodäsie.
* See license.txt in the BKG WebMap distribution or repository for the
* full text of the license.
*
* Author: Dirk Thalheim
*/
/**
* @requires OpenLayers/Util.js
* @requires OpenLayers/Control/PanZoomBar.js
* @requires OpenLayers/Control/Panel.js
* @requires OpenLayers/Control/NavToolbar.js
* @requires OpenLayers/Control/MousePosition.js
* @requires OpenLayers/Control/ScaleLine.js
*/
/**
* @namespace BKGWebMap.Control
*/
BKGWebMap.Control = BKGWebMap.Control || {};
/**
* Factory-Funktion zur Generierung von Steuerelementen.<br/>
* Es wird ein JavaScript Objekt übergeben, das die zu generierenden Steuerelemente konfiguriert. Über den Attributnamen
* wird entschieden welches Steuerelement generiert werden soll. Der Attributwert wird zur Konfiguration des
* Steuerelements verwendet. Details dazu finden sich in der <a href="../factories.html#controls">MapBuilder-Referenz</a>.
* <br/>
* Die generierten OpenLayers.Control-Instanzen werden der <code>controls</code>-Liste hinzugefügt.
*
* @param {object} config - Konfiguration der Steuerelemente als object, wobei der key den Control-Typ definiert.
* @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
* eingefügt werden sollen.
* @returns {Array<OpenLayers.Control>} - Zurückgegeben wird die modifizierte Liste der Steuerelemente.
*/
BKGWebMap.Control.create = function(config, controls) {
controls = controls || [];
// SidePanel ggf. zuerst behandeln
BKGWebMap.Control.FACTORIES['sidePanel'](controls, config.sidePanel);
delete config.sidePanel;
// Konfigurierbare der restlichen Steuerelemente
for (var key in config) {
if(!config.hasOwnProperty(key)) continue;
// Direkte Übergabe eines Control-Elements
if(config[key] instanceof OpenLayers.Control) {
controls.push(config[key]);
continue;
}
// Control aus Konfiguration erzeugen
var factory = BKGWebMap.Control.FACTORIES[key];
if(!factory) continue;
factory(controls, config[key]);
}
return controls;
};
/**
* Registry für Factory-Funktionen zur Controlgenerierung.
*
* Funktionen erwarten Zielliste <code>controls</code>, in die Steuerelemente eingefügt werden sollen und Konfiguration
* des Steuerelements (Typ abhängig von Funktion). Es können weitere Funktionen zur Layergenerierung registriert werden.
*
* @type {object<string, Function>}
*/
BKGWebMap.Control.FACTORIES = {};
/**
* Fügt die Zoom-Steuerelemente der Control-Liste hinzu.
* @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
* eingefügt werden sollen.
* @param {boolean} usePanZoomBar - true wenn OpenLayers.Control.PanZoomBar verwendet werden soll. Ansonsten wird
* OpenLayers.Control.Zoom verwendet.
*/
BKGWebMap.Control.FACTORIES['zoomBar'] = function(controls, usePanZoomBar) {
if(usePanZoomBar) {
controls.push(new OpenLayers.Control.PanZoomBar());
} else {
if (OpenLayers.Control.Zoom) {
controls.push(new OpenLayers.Control.Zoom());
} else if (OpenLayers.Control.PanZoom) {
controls.push(new OpenLayers.Control.PanZoom());
}
}
};
/**
* Fügt ein Panel für weitere Steuerelemente der Karte hinzu.
* @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
* eingefügt werden sollen.
* @param {object} config - Konfiguration für Panel.
* @param {object} config.controls - Konfiguration für Steuerelemente im Panel (s. Konstruktor OpenLayers.Control.Panel).
*/
BKGWebMap.Control.FACTORIES['panel'] = function(controls, config) {
if (!config) return;
var subControls = [];
if (config.controls) {
subControls = BKGWebMap.Control.create(config.controls);
delete config.controls;
}
var panel = new OpenLayers.Control.Panel(config);
panel.addControls(subControls);
controls.push(panel);
};
/**
* Fügt das SidePanel der Control-Liste hinzu.
* @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
* eingefügt werden sollen.
* @param {object} config - Konfiguration für das SidePanel (s. BKGWebMap.Control.SidePanel).
*/
BKGWebMap.Control.FACTORIES['sidePanel'] = function(controls, config) {
if (!config) return;
config.size = config.size || 250;
config.maximized = config.maximized || false;
controls.push(new BKGWebMap.Control.SidePanel(config));
};
/**
* Fügt eine ScaleLine der Control-Liste hinzu.
* @param {Array<OpenLayers.Control>} controls - Liste der Steuerelemente, in die die neue erzeugten Steuerelemente
* eingefügt werden sollen.
* @param {boolean} enabled - <code>true</code> wenn ScaleLine verwendet werden soll
*/
BKGWebMap.Control.FACTORIES['scaleLine'] = function(controls, enabled) {
if (!enabled) return;
controls.push(new OpenLayers.Control.ScaleLine());
};