diff --git a/src/plugins/lib/libhtmlconst.py b/src/plugins/lib/libhtmlconst.py index 3746a0d71..6e80de05e 100644 --- a/src/plugins/lib/libhtmlconst.py +++ b/src/plugins/lib/libhtmlconst.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/python # # Gramps - a GTK+/GNOME based genealogy program # @@ -7,7 +9,7 @@ # Copyright (C) 2007-2009 Stephane Charette # Copyright (C) 2008 Brian G. Matherly # Copyright (C) 2008 Jason M. Simanek -# Copyright (C) 2008-2009 Rob G. Healey +# Copyright (C) 2008-2011 Rob G. Healey # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -116,3 +118,65 @@ _COPY_OPTIONS = [ _('No copyright notice'), ] + +# NarrativeWeb javascript code for PlacePage's "Open Street Map"... +openstreet_jsc = """ + var marker; + var map; + + OpenLayers.Lang.setCode("%s"); + + function mapInit(){ + map = createMap("map"); + + map.dataLayer = new OpenLayers.Layer("Données", { "visibility": false }); + map.dataLayer.events.register("visibilitychanged", map.dataLayer, toggleData); + map.addLayer(map.dataLayer); + + var centre = new OpenLayers.LonLat({$our lon}, {$our lat}); + var zoom = 11; + + setMapCenter(centre, zoom); + + updateLocation(); + + setMapLayers("M"); + + map.events.register("moveend", map, updateLocation); + map.events.register("changelayer", map, updateLocation); + + handleResize(); + }""" + +# NarrativeWeb javascript code for PlacePage's "Google Maps"... +google_jsc = """ + var myLatlng = new google.maps.LatLng(%s, %s); + var marker; + var map; + + function initialize() { + var mapOptions = { + zoom: 13, + mapTypeId: google.maps.MapTypeId.ROADMAP, + center: myLatlng + }; + map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); + + marker = new google.maps.Marker({ + map: map, + draggable: true, + animation: google.maps.Animation.DROP, + position: myLatlng + }); + + google.maps.event.addListener(marker, 'click', toggleBounce); + } + + function toggleBounce() { + + if (marker.getAnimation() != null) { + marker.setAnimation(null); + } else { + marker.setAnimation(google.maps.Animation.BOUNCE); + } + }""" diff --git a/src/plugins/webreport/NarrativeWeb.py b/src/plugins/webreport/NarrativeWeb.py index d0cdd99fd..99438c594 100644 --- a/src/plugins/webreport/NarrativeWeb.py +++ b/src/plugins/webreport/NarrativeWeb.py @@ -101,6 +101,9 @@ from DateHandler import displayer as _dd from gen.proxy import PrivateProxyDb, LivingProxyDb from libhtmlconst import _CHARACTER_SETS, _CC, _COPY_OPTIONS +# import for Place Map Pages... +from libhtmlconst import openstreet_jsc, google_jsc + # import HTML Class from # src/plugins/lib/libhtml.py from libhtml import Html @@ -202,6 +205,7 @@ wrapper.width = 20 PLUGMAN = GuiPluginManager.get_instance() CSS = PLUGMAN.process_plugin_data('WEBSTUFF') + _html_dbl_quotes = re.compile(r'([^"]*) " ([^"]*) " (.*)', re.VERBOSE) _html_sng_quotes = re.compile(r"([^']*) ' ([^']*) ' (.*)", re.VERBOSE) @@ -2530,8 +2534,7 @@ class PlacePage(BasePage): placepage, head, body = self.write_header(_("Places")) self.placemappages = self.report.options['placemappages'] - self.googlemap = self.report.options['placemappages'] - self.openstreetmap = self.report.options['openstreetmap'] + self.mapservice = self.report.options['mapservice'] # begin PlaceDetail Division with Html("div", class_ = "content", id = "PlaceDetail") as placedetail: @@ -2544,10 +2547,10 @@ class PlacePage(BasePage): placedetail += thumbnail # add section title - placedetail += Html("h5", html_escape(self.page_title), inline = True) + placedetail += Html("h5", html_escape(self.page_title), inline =True) # begin summaryarea division and places table - with Html("div", id = 'summaryarea') as summaryarea: + with Html("div", id ='summaryarea') as summaryarea: placedetail += summaryarea with Html("table", class_ = "infolist place") as table: @@ -2578,87 +2581,53 @@ class PlacePage(BasePage): # call_generate_page(report, title, place_handle, src_list, head, body, place, placedetail) # add place map here - if ((self.placemappages or self.openstreetmap) and - (place and (place.lat and place.long) ) ): + if self.placemappages: + if (place and (place.lat and place.long)): - # get reallatitude and reallongitude from place - latitude, longitude = conv_lat_lon( place.lat, - place.long, - "D.D8") + # get reallatitude and reallongitude from place + latitude, longitude = conv_lat_lon(place.lat, place.long, "D.D8") - # add narrative-maps CSS... - fname = "/".join(["styles", "narrative-maps.css"]) - url = self.report.build_url_fname(fname, None, self.up) - head += Html("link", href = url, type = "text/css", media = "screen", rel = "stylesheet") + # add narrative-maps CSS... + fname = "/".join(["styles", "narrative-maps.css"]) + url = self.report.build_url_fname(fname, None, self.up) + head += Html("link", href = url, type = "text/css", media = "screen", rel = "stylesheet") - # add googlev3 specific javascript code - if self.googlemap: - head += Html("script", type ="text/javascript", - src ="http://maps.googleapis.com/maps/api/js?sensor=false", inline =True) - - # Place Map division - with Html("div", id = "mapstraction") as mapstraction: - placedetail += mapstraction + # add googlev3 specific javascript code + if self.mapservice == "Google": + head += Html("script", type ="text/javascript", + src ="http://maps.googleapis.com/maps/api/js?sensor=false", inline =True) # section title - mapstraction += Html("h4", _("Place Map"), inline = True) + placedetail += Html("h4", _("Place Map"), inline =True) - # begin middle division - with Html("div", id = "middle") as middle: - mapstraction += middle - - if self.openstreetmap: + # begin map_canvas division + with Html("div", id ="map_canvas") as canvas: + placedetail += canvas + + if self.mapservice == "OpenStreetMap": url = 'http://www.openstreetmap.com/?lat=%s&lon=%s&zoom=11&layers=M' % ( latitude, longitude) - middle += Html("object", data = url, inline = True) - - elif self.googlemap: - # begin inline javascript code - # because jsc is a string, it does NOT have to be properly indented - with Html("script", type = "text/javascript") as jsc: + canvas += Html("object", type ="'text/html'", width ="98%", height ="98%", + data =url) + + # begin inline javascript code + # because jsc is a string, it does NOT have to be properly indented + with Html("script", type = "text/javascript") as jsc: + if self.mapservice == "Google": head += jsc + jsc += google_jsc % (latitude, longitude) + else: + canvas += jsc + jsc += openstreet_jsc % Utils.xml_lang()[3:5].lower() + + # there is no need to add an ending "", + # as it will be added automatically! - jsc += """ - var myLatlng = new google.maps.LatLng(%s, %s);""" % (latitude, longitude) + # add fullclear for proper styling + canvas += fullclear - jsc += """ - var marker; - var map; - - function initialize() { - var mapOptions = { - zoom: 13, - mapTypeId: google.maps.MapTypeId.ROADMAP, - center: myLatlng - }; - map = new google.maps.Map(document.getElementById("middle"), mapOptions); - - marker = new google.maps.Marker({ - map: map, - draggable: true, - animation: google.maps.Animation.DROP, - position: myLatlng - }); - - google.maps.event.addListener(marker, 'click', toggleBounce); - } - - function toggleBounce() { - - if (marker.getAnimation() != null) { - marker.setAnimation(null); - } else { - marker.setAnimation(google.maps.Animation.BOUNCE); - } - }""" - # there is no need to add an ending "", - # as it will be added automatically! - - # add fullclear for proper styling - middle += fullclear - - # add javascript function call to body element - body.attr = 'onload = "initialize();"' + # add javascript function call to body element + body.attr ='onload ="initialize();" ' # source references srcrefs = self.display_ind_sources(place) @@ -4050,9 +4019,7 @@ class IndividualPage(BasePage): if not place_lat_long: return - self.placemappages = self.report.options['placemappages'] - self.googlemap = self.report.options['placemappages'] - self.openstreetmap = self.report.options['openstreetmap'] + self.familymappages = self.report.options['familymappages'] minX, maxX = "0.00000001", "0.00000001" minY, maxY = "0.00000001", "0.00000001" @@ -4110,7 +4077,7 @@ class IndividualPage(BasePage): url = self.report.build_url_fname(fname, None, self.up) head += Html("link", href =url, type ="text/css", media ="screen", rel ="stylesheet") - if self.placemappages: + if self.familymappages: head += Html("script", type ="text/javascript", src ="http://maps.googleapis.com/maps/api/js?sensor=false", inline =True) @@ -5647,8 +5614,7 @@ class NavWebReport(Report): # Place Map tab options self.placemappages = self.options['placemappages'] - self.googlemap = self.options['placemappages'] - self.openstreetmap = self.options['openstreetmap'] + self.mapservice = self.options['mapservice'] self.familymappages = self.options['familymappages'] if self.use_home: @@ -6684,33 +6650,37 @@ class NavWebOptions(MenuReportOptions): addopt( "inc_addressbook", inc_addressbook ) def __add_place_map_options(self, menu): - - category_name = _("Place Maps") + """ + options for the Place Map tab. + """ + category_name = _("Place Map Options") addopt = partial(menu.add_option, category_name) - self.__placemappages = BooleanOption(_("Include Place map on Place Pages (Google maps)"), False) - self.__placemappages.set_help(_("Whether to include a Google map on the Place Pages, " - "where Latitude/ Longitude are available.")) - self.__placemappages.connect("value-changed", self.__placemaps_changed) - addopt( "placemappages", self.__placemappages) - - self.__openstreetmap = BooleanOption(_("Include Place map on Place Pages (OpenStreetMap)"), False) - self.__openstreetmap.set_help(_("Whether to include a OpenStreet map on the Place Pages, " - "where Latitude/ Longitude are available.")) - self.__openstreetmap.connect("value-changed", self.__openstreetmap_changed) - addopt("openstreetmap", self.__openstreetmap) + self.__placemappages = BooleanOption(_("Include Place map on Place Pages"), False) + self.__placemappages.set_help(_("Whether to include a place map on the Place Pages, " + "where Latitude/ Longitude are available.")) + self.__placemappages.connect("value-changed", self.__placemap_changed) + addopt("placemappages", self.__placemappages) - self.__placemaps_changed() - self.__openstreetmap_changed() - - familymappages = BooleanOption(_("Include Individual Page Map with " - "all places shown on map (Google Maps)"), False) - familymappages.set_help(_("Whether or not to add an individual Google map " + mapopts = [ + [_("Google"), "Google"], + [_("OpenStreetMap"), "OpenStreetMap"] ] + self.__mapservice = EnumeratedListOption(_("Map Service"), mapopts[0][1]) + for opts in mapopts: + self.__mapservice.add_item(opts[0], opts[1]) + self.__mapservice.set_help(_("Choose your choice of map service for " + "creating the Place Map Pages.")) + addopt("mapservice", self.__mapservice) + + self.__placemap_changed() + + familymappages = BooleanOption(_("Include Family Map Pages with " + "all places shown on the map"), False) + familymappages.set_help(_("Whether or not to add an individual page map " "showing all the places on this page. " "This will allow you to see how your family " "traveled around the country.")) addopt( "familymappages", familymappages ) - def __archive_changed(self): """ @@ -6812,6 +6782,16 @@ class NavWebOptions(MenuReportOptions): else: self.__placemappages.set_available(True) + def __placemap_changed(self): + """ + Handles the changing nature of the place maps + """ + + if self.__placemappages.get_value(): + self.__mapservice.set_available(True) + else: + self.__mapservice.set_available(False) + # FIXME. Why do we need our own sorting? Why not use Sort.Sort? def sort_people(db, handle_list): sname_sub = defaultdict(list)