adding GoogleView in DataViews
From now we can use the Googlemap API to see where our ancestors and living families members lives. svn: r9725
This commit is contained in:
parent
248e96dff8
commit
73593ecead
@ -284,7 +284,7 @@ default_value = {
|
|||||||
GENERATION_DEPTH : 15,
|
GENERATION_DEPTH : 15,
|
||||||
DATA_VIEWS: ('MyGrampsView,PersonView,RelationshipView,FamilyListView,'
|
DATA_VIEWS: ('MyGrampsView,PersonView,RelationshipView,FamilyListView,'
|
||||||
'PedigreeView,EventView,SourceView,PlaceView,MediaView,'
|
'PedigreeView,EventView,SourceView,PlaceView,MediaView,'
|
||||||
'RepositoryView,NoteView'),
|
'RepositoryView,NoteView,GoogleView'),
|
||||||
ADDMEDIA_IMGDIR : '',
|
ADDMEDIA_IMGDIR : '',
|
||||||
ADDMEDIA_RELPATH : False,
|
ADDMEDIA_RELPATH : False,
|
||||||
}
|
}
|
||||||
|
359
src/DataViews/GoogleView.py
Normal file
359
src/DataViews/GoogleView.py
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
# -*- python -*-
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Gramps - a GTK+/GNOME based genealogy program
|
||||||
|
#
|
||||||
|
# Copyright (C) 2001-2007 Donald N. Allingham, Serge Noiraud
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program 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 this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
# $Id: GoogleView.py 9598 2007-12-27 15:24:30Z dsblank $
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Python modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
from gettext import gettext as _
|
||||||
|
from cgi import escape
|
||||||
|
import math
|
||||||
|
import os
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# GTK/Gnome modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import gtk
|
||||||
|
|
||||||
|
try:
|
||||||
|
import cairo
|
||||||
|
cairo_available = True
|
||||||
|
except:
|
||||||
|
cairo_available = False
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Gramps Modules
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
import gen.lib
|
||||||
|
import PageView
|
||||||
|
#from BasicUtils import name_displayer
|
||||||
|
import Utils
|
||||||
|
#import DateHandler
|
||||||
|
#import ThumbNails
|
||||||
|
import Errors
|
||||||
|
#from ReportBase import ReportUtils
|
||||||
|
#from Editors import EditPerson, EditFamily
|
||||||
|
#from DdTargets import DdTargets
|
||||||
|
#import cPickle as pickle
|
||||||
|
#import Config
|
||||||
|
#from QuestionDialog import RunDatabaseRepair, ErrorDialog
|
||||||
|
import gtkmozembed
|
||||||
|
import urlparse
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Constants
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
MOZEMBED_PATH = "/tmp/"
|
||||||
|
MOZEMBED_SUBPATH = "browser"
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# GoogleView
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
class GoogleView(PageView.PersonNavView):
|
||||||
|
|
||||||
|
def __init__(self,dbstate,uistate):
|
||||||
|
PageView.PersonNavView.__init__(self, _('GoogleView'), dbstate, uistate)
|
||||||
|
|
||||||
|
self.func_list = {
|
||||||
|
'<CONTROL>J' : self.jump,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.dbstate = dbstate
|
||||||
|
|
||||||
|
def _on_url(self, widget):
|
||||||
|
self.m.load_url(widget.get_text())
|
||||||
|
|
||||||
|
def _quit(self, widget):
|
||||||
|
gtk.main_quit()
|
||||||
|
|
||||||
|
def set_mozembed_proxy(self):
|
||||||
|
proxy = os.environ['http_proxy']
|
||||||
|
data = ""
|
||||||
|
if proxy:
|
||||||
|
host_port = None
|
||||||
|
parts = urlparse.urlparse(proxy)
|
||||||
|
if not parts[0] or parts[0] == 'http':
|
||||||
|
host_port = parts[1]
|
||||||
|
t = host_port.split(':')
|
||||||
|
host = t[0].strip()
|
||||||
|
if host:
|
||||||
|
try:
|
||||||
|
port = int(t[1])
|
||||||
|
except:
|
||||||
|
user = host
|
||||||
|
u = t[1].split('@')
|
||||||
|
password = u[0]
|
||||||
|
host = u[1]
|
||||||
|
port = int(t[2])
|
||||||
|
|
||||||
|
if port and host:
|
||||||
|
port = str(port)
|
||||||
|
data += 'user_pref("network.proxy.type", 1);\r\n'
|
||||||
|
data += 'user_pref("network.proxy.http", "'+host+'");\r\n'
|
||||||
|
data += 'user_pref("network.proxy.http_port", '+port+');\r\n'
|
||||||
|
data += 'user_pref("network.proxy.no_proxies_on", "127.0.0.1,localhost,localhost.localdomain");\r\n'
|
||||||
|
data += 'user_pref("network.proxy.share_proxy_settings", true);\r\n'
|
||||||
|
data += 'user_pref("network.http.proxy.pipelining", true);\r\n'
|
||||||
|
fd = file(MOZEMBED_PATH+MOZEMBED_SUBPATH+"/prefs.js","w+")
|
||||||
|
fd.write(data)
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
def change_page(self):
|
||||||
|
self.uistate.clear_filter_results()
|
||||||
|
|
||||||
|
def init_parent_signals_cb(self, widget, event):
|
||||||
|
# required to properly bootstrap the signal handlers.
|
||||||
|
# This handler is connected by build_widget. After the outside ViewManager
|
||||||
|
# has placed this widget we are able to access the parent container.
|
||||||
|
self.notebook.disconnect(self.bootstrap_handler)
|
||||||
|
self.notebook.parent.connect("size-allocate", self.size_request_cb)
|
||||||
|
self.size_request_cb(widget.parent,event)
|
||||||
|
|
||||||
|
def add_table_to_notebook( self, table):
|
||||||
|
frame = gtk.ScrolledWindow(None,None)
|
||||||
|
frame = gtk.ScrolledWindow(None,None)
|
||||||
|
frame.set_shadow_type(gtk.SHADOW_NONE)
|
||||||
|
frame.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
|
||||||
|
frame.add_with_viewport(table)
|
||||||
|
table.get_parent().set_shadow_type(gtk.SHADOW_NONE)
|
||||||
|
table.set_row_spacings(1)
|
||||||
|
table.set_col_spacings(0)
|
||||||
|
try:
|
||||||
|
self.notebook.append_page(frame,None)
|
||||||
|
except:
|
||||||
|
# for PyGtk < 2.4
|
||||||
|
self.notebook.append_page(frame,gtk.Label(""))
|
||||||
|
|
||||||
|
def set_active(self):
|
||||||
|
self.key_active_changed = self.dbstate.connect('active-changed',
|
||||||
|
self.goto_active_person)
|
||||||
|
|
||||||
|
|
||||||
|
def set_inactive(self):
|
||||||
|
PageView.PersonNavView.set_inactive(self)
|
||||||
|
self.dbstate.disconnect(self.key_active_changed)
|
||||||
|
|
||||||
|
def get_stock(self):
|
||||||
|
"""
|
||||||
|
Returns the name of the stock icon to use for the display.
|
||||||
|
This assumes that this icon has already been registered with
|
||||||
|
GNOME as a stock icon.
|
||||||
|
"""
|
||||||
|
return 'gramps-place'
|
||||||
|
|
||||||
|
def build_widget(self):
|
||||||
|
"""
|
||||||
|
Builds the interface and returns a gtk.Container type that
|
||||||
|
contains the interface. This containter will be inserted into
|
||||||
|
a gtk.Notebook page.
|
||||||
|
"""
|
||||||
|
self.tooltips = gtk.Tooltips()
|
||||||
|
self.tooltips.enable()
|
||||||
|
|
||||||
|
self.notebook = gtk.Notebook()
|
||||||
|
self.notebook.set_show_border(False)
|
||||||
|
self.notebook.set_show_tabs(False)
|
||||||
|
|
||||||
|
self.table_2 = gtk.Table(1,1,False)
|
||||||
|
self.add_table_to_notebook( self.table_2)
|
||||||
|
|
||||||
|
if hasattr(gtkmozembed, 'set_profile_path'):
|
||||||
|
set_profile_path = gtkmozembed.set_profile_path
|
||||||
|
else:
|
||||||
|
set_profile_path = gtkmozembed.gtk_moz_embed_set_profile_path
|
||||||
|
set_profile_path(MOZEMBED_PATH, MOZEMBED_SUBPATH)
|
||||||
|
self.m = gtkmozembed.MozEmbed()
|
||||||
|
self.set_mozembed_proxy()
|
||||||
|
self.m.set_size_request(800,600)
|
||||||
|
self.table_2.add(self.m)
|
||||||
|
|
||||||
|
#d = {}
|
||||||
|
#for iteration in dir(self.__class__):
|
||||||
|
# d[iteration]=getattr(self, iteration)
|
||||||
|
#ui.signal_autoconnect(d)
|
||||||
|
self.m.show()
|
||||||
|
return self.notebook
|
||||||
|
|
||||||
|
def ui_definition(self):
|
||||||
|
"""
|
||||||
|
Specifies the UIManager XML code that defines the menus and buttons
|
||||||
|
associated with the interface.
|
||||||
|
"""
|
||||||
|
return '''<ui>
|
||||||
|
<toolbar name="ToolBar">
|
||||||
|
<placeholder name="CommonEdit">
|
||||||
|
<toolitem action="GoogleMaps"/>
|
||||||
|
</placeholder>
|
||||||
|
</toolbar>
|
||||||
|
</ui>'''
|
||||||
|
|
||||||
|
def define_actions(self):
|
||||||
|
"""
|
||||||
|
Required define_actions function for PageView. Builds the action
|
||||||
|
group information required. We extend beyond the normal here,
|
||||||
|
since we want to have more than one action group for the PersonView.
|
||||||
|
Most PageViews really won't care about this.
|
||||||
|
|
||||||
|
Special action groups for Forward and Back are created to allow the
|
||||||
|
handling of navigation buttons. Forward and Back allow the user to
|
||||||
|
advance or retreat throughout the history, and we want to have these
|
||||||
|
be able to toggle these when you are at the end of the history or
|
||||||
|
at the beginning of the history.
|
||||||
|
"""
|
||||||
|
self._add_action('GoogleMaps', gtk.STOCK_JUMP_TO, _('_GoogleMaps'),
|
||||||
|
callback=self.google_places,
|
||||||
|
tip=_("Attempt to map places on Google Maps"))
|
||||||
|
|
||||||
|
PageView.PersonNavView.define_actions(self)
|
||||||
|
|
||||||
|
def goto_active_person(self,handle=None):
|
||||||
|
self.google_places(handle)
|
||||||
|
|
||||||
|
def google_places(self,htmlfile):
|
||||||
|
htmlfile = MOZEMBED_PATH+"/index.html"
|
||||||
|
self.createHtml()
|
||||||
|
self.m.load_url("file://"+htmlfile)
|
||||||
|
|
||||||
|
def createHtml(self):
|
||||||
|
from PlaceUtils import conv_lat_lon
|
||||||
|
db=self.dbstate.db
|
||||||
|
tmpdir = MOZEMBED_PATH
|
||||||
|
google = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \n"
|
||||||
|
google += " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
|
||||||
|
google += " <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\">\n"
|
||||||
|
google += " <head>\n"
|
||||||
|
google += " <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"/>\n"
|
||||||
|
google += " <title>Google Maps JavaScript API Example</title>\n"
|
||||||
|
google += " <script id=\"googleapiimport\" src=\"http://maps.google.com/maps?file=api&v=2\"\n"
|
||||||
|
google += " type=\"text/javascript\"></script>\n"
|
||||||
|
google += " <script type=\"text/javascript\">\n"
|
||||||
|
google += " //<![CDATA[\n"
|
||||||
|
google += """
|
||||||
|
function createMarker(point,html) {
|
||||||
|
var marker = new GMarker(point);
|
||||||
|
GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(html); });
|
||||||
|
return marker;
|
||||||
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
google += " function load() {\n"
|
||||||
|
google += " if (GBrowserIsCompatible()) {\n"
|
||||||
|
google += " var map = new GMap2(document.getElementById(\"map\"));\n"
|
||||||
|
google += " map.addControl(new GLargeMapControl());\n"
|
||||||
|
google += " map.addControl(new GMapTypeControl());\n"
|
||||||
|
google += " map.addControl(new GScaleControl());\n"
|
||||||
|
#
|
||||||
|
# We center the map on the home person if we can.
|
||||||
|
#
|
||||||
|
latitude = ""
|
||||||
|
longitude = ""
|
||||||
|
#person = db.find_person_from_handle(self.home, self.trans)
|
||||||
|
person = db.get_default_person()
|
||||||
|
if person:
|
||||||
|
birth_ref = person.get_birth_ref()
|
||||||
|
if birth_ref:
|
||||||
|
birth = db.get_event_from_handle(birth_ref.ref)
|
||||||
|
bplace_handle = birth.get_place_handle()
|
||||||
|
if bplace_handle:
|
||||||
|
place = db.get_place_from_handle(bplace_handle)
|
||||||
|
longitude = place.get_longitude()
|
||||||
|
latitude = place.get_latitude()
|
||||||
|
else:
|
||||||
|
death_ref = person.get_death_ref()
|
||||||
|
if death_ref:
|
||||||
|
death = db.get_event_from_handle(death_ref.ref)
|
||||||
|
bplace_handle = death.get_place_handle()
|
||||||
|
if bplace_handle:
|
||||||
|
place = db.get_place_from_handle(bplace_handle)
|
||||||
|
longitude = place.get_longitude()
|
||||||
|
latitude = place.get_latitude()
|
||||||
|
if ( cmp(longitude,"") == 1 | cmp(latitude,"") == 1 ):
|
||||||
|
centered=1
|
||||||
|
latitude, longitude = conv_lat_lon(latitude, longitude, "D.D8")
|
||||||
|
centeredPoint = "%s:%s"%(latitude, longitude)
|
||||||
|
google += " centeredPoint = new GLatLng(%f,%f)\n"%(float(latitude),float(longitude))
|
||||||
|
google += " map.setCenter(centeredPoint, 13);\n"
|
||||||
|
else:
|
||||||
|
centered=0
|
||||||
|
#latitude, longitude = conv_lat_lon(float(-1.568792), float(47.257971), "D.D8")
|
||||||
|
google += " ovMap=new GOverviewMapControl();\n"
|
||||||
|
google += " map.addControl(ovMap);\n"
|
||||||
|
google += " mini=ovMap.getOverviewMap();\n"
|
||||||
|
for place_handle in db.get_place_handles():
|
||||||
|
place = db.get_place_from_handle( place_handle)
|
||||||
|
if place:
|
||||||
|
descr = place.get_title()
|
||||||
|
longitude = place.get_longitude()
|
||||||
|
latitude = place.get_latitude()
|
||||||
|
city = place.get_main_location().get_city()
|
||||||
|
country = place.get_main_location().get_country()
|
||||||
|
if ( cmp(longitude,"") == 1 | cmp(latitude,"") == 1 ):
|
||||||
|
google += " var point = new GLatLng('%s','%s')\n"%(latitude,longitude)
|
||||||
|
if ( centered == 0 ):
|
||||||
|
centered = 1
|
||||||
|
google += " map.setCenter(point, 13);\n"
|
||||||
|
google += " res = createMarker(point,'<div>%s<br>%s<br>%s<br><br>%s</div>')\n"%(city,country,descr,_("This is the first place we found with a geographical location."))
|
||||||
|
else:
|
||||||
|
latitude, longitude = conv_lat_lon(latitude, longitude, "D.D8")
|
||||||
|
newP = "%s:%s"%(latitude, longitude)
|
||||||
|
if ( centeredPoint == newP ):
|
||||||
|
google += " res = createMarker(point,'<div>%s<br>%s<br>%s<br><br>%s</div>')\n"%(city,country,descr,_("This is the place for the home person."))
|
||||||
|
else:
|
||||||
|
google += " res = createMarker(point,'<div>%s<br>%s<br>%s<br><br>%s</div>')\n"%(city,country,descr,_("This is a common place we found with a geographical location."))
|
||||||
|
google += " map.addOverlay(res);\n"
|
||||||
|
if ( centered == 0 ):
|
||||||
|
# We have no valid geographic point to center the map.
|
||||||
|
# So you'll see the street where I live.
|
||||||
|
longitude = -1.568792
|
||||||
|
latitude = 47.257971
|
||||||
|
google += " var point = new GLatLng('%s','%s')\n"%(latitude,longitude)
|
||||||
|
google += " map.setCenter(point, 13);\n"
|
||||||
|
google += " res = createMarker(point,'<div>Serge Noiraud<br>Nantes, France<br>%s</div>')\n"%_("The author of this view. You see that because you have no location in your database.")
|
||||||
|
google += " map.addOverlay(res);\n"
|
||||||
|
google += " document.getElementById('map').style.top='0px';\n"
|
||||||
|
google += " document.getElementById('map').style.left='0px';\n"
|
||||||
|
google += " document.getElementById('map').style.width='100%';\n"
|
||||||
|
google += " }\n"
|
||||||
|
google += " }\n "
|
||||||
|
google += " //]]>\n"
|
||||||
|
google += " </script>\n"
|
||||||
|
google += " </head>\n"
|
||||||
|
google += " <body onload=\"load()\" onunload=\"GUnload()\">\n"
|
||||||
|
google += " <div id=\"map\" style=\"width: 1000x; height: 600px\"></div>\n"
|
||||||
|
google += " </body>\n"
|
||||||
|
google += "</html>\n"
|
||||||
|
fd = file(MOZEMBED_PATH+"/index.html","w+")
|
||||||
|
fd.write(google)
|
||||||
|
fd.close()
|
@ -17,6 +17,7 @@ pkgdata_PYTHON = \
|
|||||||
PlaceView.py\
|
PlaceView.py\
|
||||||
MediaView.py\
|
MediaView.py\
|
||||||
NoteView.py\
|
NoteView.py\
|
||||||
|
GoogleView.py\
|
||||||
RepositoryView.py
|
RepositoryView.py
|
||||||
|
|
||||||
# _MapView.py
|
# _MapView.py
|
||||||
|
@ -37,6 +37,7 @@ from PlaceView import PlaceView
|
|||||||
from MediaView import MediaView
|
from MediaView import MediaView
|
||||||
from RepositoryView import RepositoryView
|
from RepositoryView import RepositoryView
|
||||||
from NoteView import NoteView
|
from NoteView import NoteView
|
||||||
|
from GoogleView import GoogleView
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import Config
|
import Config
|
||||||
@ -57,6 +58,7 @@ except:
|
|||||||
#MapView,
|
#MapView,
|
||||||
RepositoryView,
|
RepositoryView,
|
||||||
NoteView,
|
NoteView,
|
||||||
|
GoogleView,
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_views():
|
def get_views():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user