/* * Copyright (C) 2007-2008 Camptocamp * * This file is part of MapFish Client * * MapFish Client 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. * * MapFish Client 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 MapFish Client. If not, see . */ /** * @requires OpenLayers/Map.js * @requires OpenLayers/BaseTypes/LonLat.js * @requires OpenLayers/Layer/Vector.js * @requires OpenLayers/Feature/Vector.js * @requires OpenLayers/Geometry/Point.js * @requires OpenLayers/StyleMap.js * @requires widgets/ComboBoxFactory.js */ Ext.namespace('mapfish.widgets', 'mapfish.widgets.recenter'); /** * Class: mapfish.widgets.recenter.Base * Base class for various recentering tools. Must be extendaded in specific classes. * * Inherits from: * - {Ext.FormPanel} */ /** * Constructor: mapfish.widgets.recenter.Base * * Parameters: * config - {Object} The config object * Returns: * {} */ mapfish.widgets.recenter.Base = function(config) { Ext.apply(this, config); mapfish.widgets.recenter.Base.superclass.constructor.call(this); }; Ext.extend(mapfish.widgets.recenter.Base, Ext.FormPanel, { /** * APIProperty: scales * {Array} - List of available scales */ scales: null, /** * APIProperty: showCenter * {Boolean} - Indicates if a symbol must be shown at the new center */ showCenter: null, /** * APIProperty: defaultZoom * {Integer} - Zoom level used if no zoom level is provided by the user */ defaultZoom: null, /** * Property: vectorLayer * {} - Vector layer used to display a symbol * on new center point */ vectorLayer: null, /** * Property: expandedOnce * {Boolean} - has already been expanded (don't call addItems twice) */ expandedOnce: false, /** * Method: initComponent * Overrides super-class initComponent method. Builds the recentering form. */ initComponent: function() { mapfish.widgets.recenter.Base.superclass.initComponent.apply(this, arguments); this.on("destroy", this.destroyResources, this); this.on("collapse", this.destroyResources, this); this.on("deactivate", this.destroyResources, this); this.on("disable", this.destroyResources, this); }, /** * Method: render */ render: function() { // if container layout is accordion we defer items adding // to avoid rendering issues (on comboboxes in particular) if (!this.ownerCt.initialConfig.layout || this.ownerCt.initialConfig.layout.toLowerCase != 'accordion') { this.addItems(); } mapfish.widgets.recenter.Base.superclass.render.apply(this, arguments); }, /** * Method: expand */ expand: function() { mapfish.widgets.recenter.Base.superclass.expand.apply(this, arguments); if (!this.expandedOnce) { this.addItems(); this.expandedOnce = true; this.doLayout(); } }, /** * Method: addItems * * Adds the items. * * Usefull to defer add items when container layout is accordion * Called either by addItems or expand */ addItems: function() { OpenLayers.Console.warn("must be implemented by subclasses"); }, /** * Method: removeAll * Removes all items from both formpanel and basic form */ removeAll:function() { if (this.items) { // remove form panel items this.items.each(this.remove, this); // remove basic form items this.form.items.clear(); } }, /** * Method: addRecenterButton */ addRecenterButton: function() { this.addButton({ text: OpenLayers.i18n('mf.recenter.submit'), handler: this.recenter, scope: this }); }, /** * Method: addScaleCombo * * Adds a scale combobox in the form */ addScaleCombo: function() { this.add( mapfish.widgets.createScaleComboBox( { scales: this.scales }, { fieldLabel: OpenLayers.i18n('mf.print.scale'), typeAhead: false, mode: 'local', id: 'scale_' + this.getId(), name: "scale", hiddenName: 'scaleValue', editable: false, triggerAction: 'all' } ) ); // TODO: update default selected scale when zooming or only // when form is shown (may depend on parent containers status) }, /** * Method: recenter * Recentering action. Implemented by child classes. */ recenter: function() { OpenLayers.Console.warn("must be implemented by subclasses"); }, /** * Method: recenterOnCoords * Recenters on given coordinates and zoom level * * Parameters: * x - {Float} easting coordinate * y - {Float} northing coordinate * zoom - {Integer} zoom level (optional) */ recenterOnCoords: function(x, y, zoom) { // use default zoom level if provided in widget config, // else keep current zoom level zoom = zoom || this.defaultZoom || this.map.getZoom(); if (this.showCenter) { // display a symbol on the new center point this.showCenterMark(x, y); } this.map.setCenter(new OpenLayers.LonLat(x, y), zoom); }, /** * Method: showCenterMark * Materializes new center with a cross * * Parameters: * x - {Float} easting coordinate * y - {Float} northing coordinate */ showCenterMark: function(x, y) { this.prepareVectorLayer(); var features = [ new OpenLayers.Feature.Vector( new OpenLayers.Geometry.Point(x, y), { type: 'cross' } ) ]; this.vectorLayer.addFeatures(features); }, /** * Method: prepareVectorLayer * Adds a layer for displaying the center symbol. If it is already set, removes * existing features. */ prepareVectorLayer: function() { if (this.vectorLayer) { this.vectorLayer.destroyFeatures(); } else { var styles = new OpenLayers.StyleMap({ "default": { graphicName: "${type}", // retrieved from symbol type attribute pointRadius: 10, fillColor: "red", fillOpacity: 1 } }); this.vectorLayer = new OpenLayers.Layer.Vector( "Center Symbol", { styleMap: styles, alwaysInRange: true } ); this.map.addLayer(this.vectorLayer); } }, /** * Method: showError * Displays an error message * * Parameters: * msg - {String} message * title - {String} box title */ showError: function(msg, title) { title = title || OpenLayers.i18n('mf.error'); Ext.Msg.alert(title, msg); }, /** * Method: destroyLayer * Destroys the vector layer. */ destroyLayer: function() { var layer = this.vectorLayer; if (layer) { layer.destroy(); this.vectorLayer = null; } }, /** * Method: destroyResources * Called when the feature editing panel is destroyed, takes care * of destroying all the resources that aren't destroyed by the * Ext.Panel destroy method. */ destroyResources: function() { this.destroyLayer(); } });