diff --git a/src/plugins/lib/libhtmlconst.py b/src/plugins/lib/libhtmlconst.py index a89f16a90..6a1e624d5 100644 --- a/src/plugins/lib/libhtmlconst.py +++ b/src/plugins/lib/libhtmlconst.py @@ -121,9 +121,8 @@ _COPY_OPTIONS = [ # NarrativeWeb javascript code for PlacePage's "Open Street Map"... openstreet_jsc = """ -OpenLayers.Lang.setCode("%s"); + OpenLayers.Lang.setCode("%s"); -function initialize() { map = new OpenLayers.Map("map_canvas"); var osm = new OpenLayers.Layer.OSM() map.addLayer(osm); @@ -144,8 +143,7 @@ function initialize() { map.addControl(new OpenLayers.Control.OverviewMap()); // add a layer switcher - map.addControl(new OpenLayers.Control.LayerSwitcher()); -}""" + map.addControl(new OpenLayers.Control.LayerSwitcher());""" # NarrativeWeb javascript code for PlacePage's "Google Maps"... google_jsc = """ diff --git a/src/plugins/webreport/NarrativeWeb.py b/src/plugins/webreport/NarrativeWeb.py index 389a3af4e..3a74cf62f 100644 --- a/src/plugins/webreport/NarrativeWeb.py +++ b/src/plugins/webreport/NarrativeWeb.py @@ -3981,7 +3981,7 @@ class IndividualPage(BasePage): # create family map link if self.familymappages: if len(place_lat_long): - individualdetail += self.display_ind_family_map(person) + individualdetail += self.__display_family_map(person) # display pedigree sect13 = self.display_ind_pedigree() @@ -4003,7 +4003,7 @@ class IndividualPage(BasePage): # and close the file self.XHTMLWriter(indivdetpage, of) - def _create_family_map(self, person): + def __create_family_map(self, person): """ creates individual family map page @@ -4018,6 +4018,7 @@ class IndividualPage(BasePage): return self.familymappages = self.report.options['familymappages'] + self.mapservice = self.report.options['mapservice'] minX, maxX = "0.00000001", "0.00000001" minY, maxY = "0.00000001", "0.00000001" @@ -4039,11 +4040,13 @@ class IndividualPage(BasePage): maxY = YCoordinates[-1] if YCoordinates[-1] is not None else maxY minY, maxY = Decimal(minY), Decimal(maxY) centerY = str( Decimal( ( ( (maxY - minY) / 2) + minY) ) ) + centerX, centerY = conv_lat_lon(centerX, centerY, "D.D8") try: spanY = int(maxY - minY) except ValueError: spanY = 0 + try: spanX = int(maxX - minX) except ValueError: @@ -4070,31 +4073,45 @@ class IndividualPage(BasePage): # if active # call_(report, up, head) - # add narrative-maps stylesheet... + # add narrative-maps style sheet 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") - if self.familymappages: - head += Html("script", type ="text/javascript", + # add MapService 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) + else: + head += Html("script", type ="text/javascript", + src ="http://www.openlayers.org/api/OpenLayers.js", inline =True) # set zoomlevel for size of map # the smaller the span is, the larger the zoomlevel must be... if spanY in smallset: - zoomlevel = 13 + zoomlevel = 15 elif spanY in middleset: - zoomlevel = 5 + zoomlevel = 11 elif spanY in largeset: - zoomlevel = 3 + zoomlevel = 8 else: - zoomlevel = 3 + zoomlevel = 4 # begin inline javascript code # because jsc is a string, it does NOT have to properly indented with Html("script", type ="text/javascript") as jsc: head += jsc - jsc += """ + + # if the number of places is only 1, then use code from imported javascript? + if number_markers == 1: + if self.mapservice == "Google": + jsc += google_jsc % (place_lat_long[0][0], place_lat_long[0][1]) + + # Google Maps add their javascript inside of the head element... + else: + # Family Map pages using Google Maps + if self.mapservice == "Google": + jsc += """ function initialize() { var myLatLng = new google.maps.LatLng(%s, %s); var myOptions = { @@ -4106,13 +4123,13 @@ class IndividualPage(BasePage): var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); var lifeHistory = [""" % (centerX, centerY, zoomlevel) - for index in xrange(0, (number_markers - 1)): - data = place_lat_long[index] - latitude, longitude = conv_lat_lon(data[0], data[1], "D.D8") - jsc += """ new google.maps.LatLng(%s, %s),""" % (latitude, longitude) - data = place_lat_long[-1] - latitude, longitude = conv_lat_lon(data[0], data[1], "D.D8") - jsc += """ new google.maps.LatLng(%s, %s) + for index in xrange(0, (number_markers - 1)): + data = place_lat_long[index] + latitude, longitude = conv_lat_lon(data[0], data[1], "D.D8") + jsc += """ new google.maps.LatLng(%s, %s),""" % (latitude, longitude) + data = place_lat_long[-1] + latitude, longitude = conv_lat_lon(data[0], data[1], "D.D8") + jsc += """ new google.maps.LatLng(%s, %s) ]; var flightPath = new google.maps.Polyline({ path: lifeHistory, @@ -4123,14 +4140,9 @@ class IndividualPage(BasePage): flightPath.setMap(map); }""" % (latitude, longitude) - - # there is no need to add an ending "", # as it will be added automatically! - # add body onload to initialize map - body.attr = 'onload ="initialize()" id ="FamilyMap" ' - with Html("div", class_ ="content", id ="FamilyMapDetail") as mapbackground: body += mapbackground @@ -4163,14 +4175,78 @@ class IndividualPage(BasePage): Xheight = 800 # here is where the map is held in the CSS/ Page - canvas = Html("div", id ="map_canvas") - mapbackground += canvas + with Html("div", id ="map_canvas") as canvas: + mapbackground += canvas - # add dynamic style to the place holder... - canvas.attr += ' style ="width:%dpx; height:%dpx; border: double 4px #000;" ' % (Ywidth, Xheight) + # add dynamic style to the place holder... + canvas.attr += ' style ="width: %dpx; height: %dpx;" ' % (Ywidth, Xheight) - # add fullclear for proper styling - canvas += fullclear + if self.mapservice == "OpenStreetMap": + with Html("script", type ="text/javascript") as jsc: + canvas += jsc + + if number_markers == 1: + data = place_lat_long[0] + latitude, longitude = conv_lat_lon(data[0], data[1], "D.D8") + jsc += openstreet_jsc % (Utils.xml_lang()[3:5].lower(), + longitude, latitude) + else: + jsc += """ + OpenLayers.Lang.setCode("%s"); + + map = new OpenLayers.Map("map_canvas"); + map.addLayer(new OpenLayers.Layer.OSM()); + + epsg4326 = new OpenLayers.Projection("EPSG:4326"); //WGS 1984 projection + projectTo = map.getProjectionObject(); //The map projection (Spherical Mercator) + + var centre = new OpenLayers.LonLat(%s, %s).transform(epsg4326, projectTo); + var zoom =%d; + map.setCenter (centre, zoom); + + var vectorLayer = new OpenLayers.Layer.Vector("Overlay");""" % ( + Utils.xml_lang()[3:5].lower(), + centerY, centerX, zoomlevel) + + for (lat, long, pname, h, d) in place_lat_long: + latitude, longitude = conv_lat_lon(lat, long, "D.D8") + jsc += """ + var feature = new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Point( %s, %s ).transform(epsg4326, projectTo), + {description:'%s'} + ); + vectorLayer.addFeatures(feature);""" % (longitude, latitude, pname) + jsc += """ + map.addLayer(vectorLayer); + + //Add a selector control to the vectorLayer with popup functions + var controls = { + selector: new OpenLayers.Control.SelectFeature(vectorLayer, { onSelect: + createPopup, onUnselect: destroyPopup }) + }; + + function createPopup(feature) { + feature.popup = new OpenLayers.Popup.FramedCloud("pop", + feature.geometry.getBounds().getCenterLonLat(), + null, + '
'+feature.attributes.description+'
', + null, + true, + function() { controls['selector'].unselectAll(); } + ); + //feature.popup.closeOnMove = true; + map.addPopup(feature.popup); + } + + function destroyPopup(feature) { + feature.popup.destroy(); + feature.popup = null; + } + map.addControl(controls['selector']); + controls['selector'].activate();""" + + # add fullclear for proper styling + canvas += fullclear with Html("div", class_ ="subsection", id ="references") as section: mapbackground += section @@ -4192,6 +4268,13 @@ class IndividualPage(BasePage): list1 = Html("li", _dd.display(date), inline = True) ordered1 += list1 + # add body id... + body.attr = ' id ="FamilyMap" ' + + # add body onload to initialize map for Google Maps only... + if self.mapservice == "Google": + body.attr += ' onload ="initialize()" ' + # add clearline for proper styling # add footer section footer = self.write_footer() @@ -4201,13 +4284,13 @@ class IndividualPage(BasePage): # and close the file self.XHTMLWriter(familymappage, of) - def display_ind_family_map(self, person): + def __display_family_map(self, person): """ create the family map link """ # create family map page - self._create_family_map(person) + self.__create_family_map(person) # begin family map division plus section title with Html("div", class_ = "subsection", id = "familymap") as familymap: @@ -5781,6 +5864,7 @@ class NavWebReport(Report): """ Copy all of the CSS, image, and javascript files for Narrated Web """ + imgs = [] # copy screen style sheet if CSS[self.css]["filename"]: @@ -5809,11 +5893,13 @@ class NavWebReport(Report): self.copy_file(fname, "narrative-menus.css", "styles") # copy narrative-maps if Place or Family Map pages? - if self.placemappages or self.familymappages: + if (self.placemappages or self.familymappages): fname = CSS["NarrativeMaps"]["filename"] self.copy_file(fname, "narrative-maps.css", "styles") - imgs = [] + # if OpenStreetMap is being used, copy blue marker? + if self.mapservice == "OpenStreetMap": + imgs += CSS["NarrativeMaps"]["images"] # Copy the Creative Commons icon if the Creative Commons # license is requested @@ -5832,7 +5918,11 @@ class NavWebReport(Report): imgs += CSS["ancestortree"]["images"] # Anything css-specific: - imgs += CSS[self.css]["images"] + imgs += CSS[self.css]["images"] + + # copy blue-marker if FamilyMap and OpenStreetMap are being created? + if (self.familymappages and self.mapservice == "OpenStreetMap"): + imgs += CSS["NarrativeMaps"]["images"] # copy all to images subdir: for from_path in imgs: diff --git a/src/plugins/webstuff/css/narrative-maps.css b/src/plugins/webstuff/css/narrative-maps.css index 76ef859e9..756295dd9 100644 --- a/src/plugins/webstuff/css/narrative-maps.css +++ b/src/plugins/webstuff/css/narrative-maps.css @@ -40,7 +40,7 @@ div#geo-info { /* map_canvas-- place map holder ------------------------------------------------- */ div#map_canvas { - margin-left: 30px; + margin: 15px; border: solid 4px #000; width: 900px; height: 600px; diff --git a/src/plugins/webstuff/images/Makefile.am b/src/plugins/webstuff/images/Makefile.am index 0f90f1b71..db6a12883 100644 --- a/src/plugins/webstuff/images/Makefile.am +++ b/src/plugins/webstuff/images/Makefile.am @@ -5,6 +5,7 @@ DATAFILES = \ blank.gif \ + blue-marker.png \ crosshairs.png \ document.png \ favicon2.ico \ diff --git a/src/plugins/webstuff/images/blue-marker.png b/src/plugins/webstuff/images/blue-marker.png new file mode 100644 index 000000000..83a90b4c8 Binary files /dev/null and b/src/plugins/webstuff/images/blue-marker.png differ diff --git a/src/plugins/webstuff/webstuff.py b/src/plugins/webstuff/webstuff.py index 6c1c60994..4cdd2d923 100644 --- a/src/plugins/webstuff/webstuff.py +++ b/src/plugins/webstuff/webstuff.py @@ -91,36 +91,37 @@ def load_on_reg(dbstate, uistate, plugin): # Visually Impaired style sheet with its navigation menus ["Visually Impaired", 1, _("Visually Impaired"), - path_css('Web_Visually.css'), "narrative-menus.css", [], []], + path_css('Web_Visually.css'), "narrative-menus.css", [], [] ], # no style sheet option - ["No style sheet",1, _("No style sheet"), [], None, [], []], + ["No style sheet",1, _("No style sheet"), [], None, [], [] ], # ancestor tree style sheet and its images ["ancestortree", 0, "ancestortree", path_css("ancestortree.css"), None, [path_img("Web_Gender_Female.png"), - path_img("Web_Gender_Male.png")], []], + path_img("Web_Gender_Male.png")], [] ], # media reference regions style sheet ["behaviour", 0, "Behaviour", - path_css('behaviour.css'), None, [], []], + path_css('behaviour.css'), None, [], [] ], - # NarrativeMpasstyle sheet for NarrativeWeb place maps + # NarrativeMap stylesheet/ image for NarrativeWeb place maps ["NarrativeMaps", 0, "", - path_css("narrative-maps.css"), None, [], []], + path_css("narrative-maps.css"), None, + [path_img("blue-marker.png")], [] ], # default style sheet in the options ["default", 0, _("Basic-Ash"), - path_css('Web_Basic-Ash.css'), None, [], []], + path_css('Web_Basic-Ash.css'), None, [], [] ], # default printer style sheet ["Print-Default", 0, "Print-Default", - path_css('Web_Print-Default.css'), None, [], []], + path_css('Web_Print-Default.css'), None, [], [] ], # vertical navigation style sheet ["Navigation-Vertical", 0, "Navigation-Vertical", - path_css('Web_Navigation-Vertical.css'), None, [], []], + path_css('Web_Navigation-Vertical.css'), None, [], [] ], # horizontal navigation style sheet ["Navigation-Horizontal", 0, "Navigation-Horizontal",