summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/static/chimere/js/edit_route_map.js50
-rw-r--r--chimere/static/chimere/js/jquery.chimere.js130
-rw-r--r--chimere/widgets.py30
3 files changed, 164 insertions, 46 deletions
diff --git a/chimere/static/chimere/js/edit_route_map.js b/chimere/static/chimere/js/edit_route_map.js
index df81b49..b0bcceb 100644
--- a/chimere/static/chimere/js/edit_route_map.js
+++ b/chimere/static/chimere/js/edit_route_map.js
@@ -15,15 +15,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
See the file COPYING for details.
*/
-
-/* map edit */
+/*
+// map edit
var map;
var currentControl;
var pathCreate;
var pathModify;
-/* availaible map layers */
+// availaible map layers
var vectors = new OpenLayers.Layer.Vector("Vector Layer");
vectors.events.on({
@@ -33,7 +33,7 @@ vectors.events.on({
var currentFeature;
function featureCreated(event) {
- /* toggle to edition mode */
+ // toggle to edition mode
pathCreate.deactivate();
currentControl = pathModify;
var help_route_create = document.getElementById('help-route-create');
@@ -71,13 +71,13 @@ function initFeatureFromGeometry(linestring){
vectors.removeFeatures();
vectors.addFeatures([currentFeature]);
currentControl = pathModify;
- /*zoom to the route*/
+ // zoom to the route
var bounds = vectors.getDataExtent();
if (bounds) map.zoomToExtent(bounds);
}
function updateForm(event) {
- /* update the form */
+ // update the form
if(event){
currentFeature = event.feature;
}
@@ -93,14 +93,14 @@ function updateForm(event) {
}
-/* path control */
+// path control
var pathCreate = new OpenLayers.Control.DrawFeature(vectors,
OpenLayers.Handler.Path);
var currentControl = pathCreate;
var pathModify = new OpenLayers.Control.ModifyFeature(vectors,
{clickout:false, toggle:false});
-/* main initialisation function */
+// main initialisation function
function init(){
var options = {
controls:[new OpenLayers.Control.Navigation(),
@@ -123,34 +123,36 @@ function init(){
vectors.setOpacity(0.5);
map.addLayers([map_layer, vectors]);
- /* zoom to the appropriate extent */
+ //zoom to the appropriate extent
if (!zoomToCurrentExtent(map)){
map.setCenter(centerLonLat, 12);
}
}
+*/
function toggleDraw() {
- document.getElementById('draw-toggle-off').style.display = 'None';
- document.getElementById('draw-or').style.display = 'None';
- document.getElementById('upload').style.display = 'None';
- document.getElementById('map_edit').style.display = '';
- document.getElementById('help-route-create').style.display = 'block';
- init();
+ jQuery('#draw-toggle-off').hide();
+ jQuery('#draw-or').hide();
+ jQuery('#upload').hide();
+ jQuery('#map_edit').show();
+ jQuery('#help-route-create').show();
+ jQuery('#map_edit').chimere(chimere_init_options);
}
function toggleDrawOn() {
- jQuery('#button-move-map').removeClass('toggle-button-active').addClass('toggle-button-inactive');
- jQuery('#button-draw-map').removeClass('toggle-button-inactive').addClass('toggle-button-active');
- currentControl.activate();
- if (currentFeature){
- pathModify.selectControl.select(currentFeature);
- }
+ jQuery('#button-move-map').removeClass('toggle-button-active'
+ ).addClass('toggle-button-inactive');
+ jQuery('#button-draw-map').removeClass('toggle-button-inactive'
+ ).addClass('toggle-button-active');
+ jQuery("#map_edit").chimere("activateCurrentControl");
}
function toggleDrawOff() {
- jQuery('#button-draw-map').removeClass('toggle-button-active').addClass('toggle-button-inactive');
- jQuery('#button-move-map').removeClass('toggle-button-inactive').addClass('toggle-button-active');
- currentControl.deactivate();
+ jQuery('#button-draw-map').removeClass('toggle-button-active'
+ ).addClass('toggle-button-inactive');
+ jQuery('#button-move-map').removeClass('toggle-button-inactive'
+ ).addClass('toggle-button-active');
+ jQuery("#map_edit").chimere("deactivateCurrentControl");
}
function checkFields(){
diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js
index ea035ad..73e77cf 100644
--- a/chimere/static/chimere/js/jquery.chimere.js
+++ b/chimere/static/chimere/js/jquery.chimere.js
@@ -65,6 +65,7 @@ See the file COPYING for details.
projection: new OpenLayers.Projection('EPSG:4326'),
theme:null,
current_feature: null, // To store the active POI
+ current_control: null, // To store the current control
current_popup: null, // To store the current POI popup displayed
current_category: null, // To store the current category clicked in list
icon_offset: new OpenLayers.Pixel(0, 0),
@@ -96,7 +97,8 @@ See the file COPYING for details.
theme: settings.theme
};
if (settings.restricted_extent){
- settings.restricted_extent.transform(EPSG_DISPLAY_PROJECTION, EPSG_PROJECTION);
+ settings.restricted_extent.transform(EPSG_DISPLAY_PROJECTION,
+ EPSG_PROJECTION);
map_options['restrictedExtent'] = settings.restricted_extent;
}
@@ -111,7 +113,8 @@ See the file COPYING for details.
// hard to understand from OL documentation...
permalink_options["div"] = settings.permalink_element;
}
- settings.permalink = new OpenLayers.Control.Permalink(permalink_options);
+ settings.permalink = new OpenLayers.Control.Permalink(
+ permalink_options);
}
/* HACK new permalink createParams method
FIXME when facilities are given to personalize the permalink */
@@ -131,7 +134,8 @@ See the file COPYING for details.
settings.permalink.createParams = _createParams;
settings.map.addControl(settings.permalink);
// update with the translated permalink label
- if(settings.permalink_label && settings.permalink.div && settings.permalink.div.childNodes.length > 0){
+ if(settings.permalink_label && settings.permalink.div
+ && settings.permalink.div.childNodes.length > 0){
settings.permalink.div.childNodes[0].textContent = settings.permalink_label;
}
}
@@ -142,6 +146,12 @@ See the file COPYING for details.
settings.layerVectors = new OpenLayers.Layer.Vector("Vector Layer");
settings.map.addLayer(settings.layerVectors);
settings.layerVectors.setOpacity(0.8);
+ if (settings.edition_type_is_route){
+ settings.map.addControl(new OpenLayers.Control.DrawFeature(
+ settings.layerVectors, OpenLayers.Handler.Path));
+ settings.map.addControl(new OpenLayers.Control.ModifyFeature(
+ settings.layerVectors, {clickout:false, toggle:false}));
+ }
/* Markers layer */
settings.layerMarkers = new OpenLayers.Layer.Markers('POIs');
settings.map.addLayer(settings.layerMarkers);
@@ -174,10 +184,18 @@ See the file COPYING for details.
settings.map.events.register('click', settings.map,
helpers.hidePopup);
} else {
- map.events.register('click', settings.map, methods.setMarker);
+ if (!settings.edition_type_is_route){
+ map.events.register('click', settings.map,
+ methods.setMarker);
+ } else {
+ map.events.register('featuremodified',
+ settings.layerVectors, helpers.updateRouteForm);
+ map.events.register('featureadded',
+ settings.layerVectors, helpers.featureRouteCreated);
+ }
}
}, // end of init
-
+
/*
* Load markers and route from DB
*/
@@ -509,6 +527,60 @@ See the file COPYING for details.
if (bounds) settings.map.zoomToExtent(bounds);
}
return;
+ },
+ activateCurrentControl: function(){
+ if (settings.current_control){
+ settings.current_control.activate();
+ } else {
+ var pathCreate = settings.map.getControlsByClass(
+ 'OpenLayers.Control.DrawFeature');
+ if (pathCreate){
+ pathCreate[0].activate();
+ }
+ }
+ var pathModify = settings.map.getControlsByClass(
+ 'OpenLayers.Control.ModifyFeature');
+ if (settings.current_feature && pathModify){
+ pathModify[0].selectControl.select(settings.current_feature);
+ }
+ },
+ deactivateCurrentControl: function(){
+ if (settings.current_control){
+ settings.current_control.deactivate();
+ }
+ },
+ initFeature: function(json_geometry){
+ var json = new OpenLayers.Format.JSON();
+ var polyline = json.read(json_geometry);
+ var point_array = new Array();
+ for (i=0; i<polyline.coordinates.length; i++){
+ var point = new OpenLayers.Geometry.Point(
+ polyline.coordinates[i][0],
+ polyline.coordinates[i][1]);
+ point_array.push(point);
+ }
+ var linestring = new OpenLayers.Geometry.LineString(point_array);
+ methods.initFeatureFromGeometry(linestring);
+ },
+ initFeatureFromWkt: function(wkt_geometry){
+ var linestring = OpenLayers.Geometry.fromWKT(wkt_geometry);
+ methods.initFeatureFromGeometry(linestring);
+ },
+ initFeatureFromGeometry: function(linestring){
+ linestring.transform(EPSG_DISPLAY_PROJECTION,
+ EPSG_PROJECTION);
+ currentFeature = new OpenLayers.Feature.Vector();
+ currentFeature.geometry = linestring;
+ settings.layerVectors.removeFeatures();
+ settings.layerVectors.addFeatures([currentFeature]);
+ var pathModify = settings.map.getControlsByClass(
+ 'OpenLayers.Control.ModifyFeature');
+ if (pathModify){
+ settings.current_control = pathModify[0];
+ }
+ /*zoom to the route*/
+ var bounds = settings.layerVectors.getDataExtent();
+ if (bounds) settings.map.zoomToExtent(bounds);
}
}; // End of public methods
var helpers = {
@@ -547,16 +619,17 @@ See the file COPYING for details.
* Retrieve checked_categories, and store it in settings
*/
var initialized = false;
- $('#frm_categories .subcategories input:checkbox').each(function(index){
- if (!initialized){
- initialized = true;
- settings.checked_categories = [];
- settings.display_submited = false;
- }
- if ($(this).attr('checked') == 'checked'){
- cat_id = $(this).attr('id').split('_').pop();
- settings.checked_categories.push(parseInt(cat_id));
- }
+ $('#frm_categories .subcategories input:checkbox').each(
+ function(index){
+ if (!initialized){
+ initialized = true;
+ settings.checked_categories = [];
+ settings.display_submited = false;
+ }
+ if ($(this).attr('checked') == 'checked'){
+ cat_id = $(this).attr('id').split('_').pop();
+ settings.checked_categories.push(parseInt(cat_id));
+ }
});
if(initialized && $('#display_submited_check').attr("checked") == "checked"){
settings.display_submited = true;
@@ -621,6 +694,33 @@ See the file COPYING for details.
}
}
return map_extent;
+ },
+ featureRouteCreated: function(event) {
+ /* toggle to edition mode */
+ var pathModify = settings.map.getControlsByClass(
+ 'OpenLayers.Control.ModifyFeature')[0];
+ var pathCreate = settings.map.getControlsByClass(
+ 'OpenLayers.Control.DrawFeature')[0];
+ pathCreate.deactivate();
+ settings.current_control = pathModify;
+ jQuery('#help-route-create').hide();
+ jQuery('#help-route-modify').show();
+ pathModify.activate();
+ helpers.updateRouteForm(event);
+ pathModify.selectControl.select(event.feature);
+ },
+ updateForm: function(event) {
+ /* update the form */
+ if (event){
+ settings.current_feature = event.feature;
+ }
+ var current_geo = settings.current_feature.geometry.clone();
+ current_geo.transform(EPSG_PROJECTION, EPSG_DISPLAY_PROJECTION);
+ jQuery('#id_route').val(current_geo);
+ var vertices = current_geo.getVertices();
+ if (vertices){
+ jQuery('#id_point').val(vertices);
+ }
}
}; // End of helpers
diff --git a/chimere/widgets.py b/chimere/widgets.py
index b0ea71d..04a8e65 100644
--- a/chimere/widgets.py
+++ b/chimere/widgets.py
@@ -168,8 +168,9 @@ class RouteChooserWidget(forms.TextInput):
css = {"all": settings.OSM_CSS_URLS + \
["%schimere/css/forms.css" % settings.STATIC_URL,]
}
- js = settings.OSM_JS_URLS + \
- ["%schimere/js/edit_route_map.js" % settings.STATIC_URL,
+ js = settings.OSM_JS_URLS + list(settings.JQUERY_JS_URLS) + \
+ ["%schimere/js/jquery.chimere.js" % settings.STATIC_URL,
+ "%schimere/js/edit_route_map.js" % settings.STATIC_URL,
"%schimere/js/base.js" % settings.STATIC_URL,]
def render(self, name, value, attrs=None, area_name='', routefile_id=None):
@@ -177,6 +178,20 @@ class RouteChooserWidget(forms.TextInput):
Render a map and latitude, longitude information field
'''
tpl = getMapJS(area_name)
+ js = """
+ var EPSG_DISPLAY_PROJECTION = epsg_display_projection = new OpenLayers.Projection('EPSG:%s');
+ var EPSG_PROJECTION = epsg_projection = new OpenLayers.Projection('EPSG:%s');
+ var chimere_init_options = {};
+ chimere_init_options["map_layers"] = [new OpenLayers.Layer.OSM.Mapnik('Mapnik')];
+ chimere_init_options['dynamic_categories'] = false;
+ chimere_init_options['edition'] = true;
+ chimere_init_options['edition_type_is_route'] = true;
+ chimere_init_options["checked_categories"] = [];
+ """ % (settings.CHIMERE_EPSG_DISPLAY_PROJECTION,
+ settings.CHIMERE_EPSG_PROJECTION)
+ tpl = u"<script type='text/javascript'><!--\n"\
+ u"%s// !--></script>\n" % js
+ #TODO: manage area
help_create = ''
if not value:
help_create = u"<h3>%s</h3>\n"\
@@ -202,8 +217,8 @@ class RouteChooserWidget(forms.TextInput):
u"\"d\" or \"Del\" key."),
_(u"To add a point click in the middle of a segment and drag the new "\
u"point to the desired position"))
- tpl += u'<script src="%sedit_route_map.js"></script>\n' % \
- settings.STATIC_URL
+ #tpl += u'<script src="%sedit_route_map.js"></script>\n' % \
+ # settings.STATIC_URL
if not value:
# upload a file
tpl += u"<script type='text/javascript'><!--\n"\
@@ -244,9 +259,9 @@ class RouteChooserWidget(forms.TextInput):
style, help_modify, name, name, value, routefile_id)
tpl += u"<script type='text/javascript'><!--\n"
if not value:
- tpl += u"document.getElementById('map_edit').style.display = 'None';"
+ tpl += u"jQuery('#map_edit').hide();"
if value:
- tpl += u"init();\n"
+ tpl += u"jQuery('#map_edit').chimere(chimere_init_options);\n"
val = value
if type(value) == unicode:
try:
@@ -255,7 +270,8 @@ class RouteChooserWidget(forms.TextInput):
pass
if hasattr(val, 'json'):
tpl += u"\nvar geometry='%s';\n"\
- u"initFeature(geometry);" % val.json
+ u"jQuery('#map_edit').chimere('initFeature', geometry);"\
+ % val.json
tpl += u"\n// --></script>\n"
return mark_safe(tpl)