diff options
| -rw-r--r-- | chimere/static/chimere/js/edit_route_map.js | 50 | ||||
| -rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 130 | ||||
| -rw-r--r-- | chimere/widgets.py | 30 | 
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) | 
