class IMapView(Interface): """ A view implementing this interface provides configurable map widgets. """ # TODO: is this the right field for an IMapView or should it be # mapfields here? mapwidgets = schema.Object( title=_('Map Widgets'), description=_('A mapping from mapids to IMapWidgets'), schema=IMaps)
class IMapLayers(IEnumerableMapping): """ A mapping of IMapLayer instances specific for IMapWidget... looked up as ((view, request, context, mapwidget), name) """ js = schema.TextLine( title=_(u"Javascript to configure layers."), description=_("Returns some js-code to set up available layers."), required=True)
class IMapLayer(Interface): """ A pluggable interface making it easier to configure layers. """ jsfactory = schema.Text( title=_(u"Javascript factory"), description=_( u"Javascript code which returns a new instance of this " u"layer and does not expect any parameters" ), required=True)
class GeoAdvancedConfGroup(group.Group): label = _(u"Advanced") description = _(u"Advanced configurations") fields = field.Fields(IGeoSettings).select('map_viewlet_managers') def updateWidgets(self): super(GeoAdvancedConfGroup, self).updateWidgets() widgets = ('googleapi', 'bingapi') for w in self.widgets: if w in widgets: self.widgets[w].size = 80 self.widgets[w].update()
class GeopointForm(subform.EditSubForm): heading = _(u"Default map position") contents_top = _( u"Set the centre point and the zoom level of the map " u"used when the system cannot use any other point to center the map " u"(e.g. when displaying the map " u"to georeference an item for the first time)") template = ViewPageTemplateFile('geopointform.pt') implements(IMapView) fields = field.Fields(IGeoSettings).select('longitude', 'latitude', 'zoom') mapfields = ['geosettings-cgmap'] def update(self): self.updateWidgets() def applyChanges(self, data): content = self.getContent() return form.applyChanges(self, content, data)
def control_panel_fields(): form_fields = field.Fields(IGeoSettings).select('default_layers', 'bingapi', 'googleapi') form_fields += field.Fields(IGeoFeatureStyle).select( 'map_viewlet_position') default_layer_field = form_fields['default_layers'] default_layer_field.field.value_type = Choice(title=_(u"Layers"), source="maplayersVocab") return form_fields
def control_panel_fields(): form_fields = field.Fields(IGeoSettings).select( 'default_layers', 'bingapi') form_fields += field.Fields(IGeoFeatureStyle).select( 'map_viewlet_position') default_layer_field = form_fields['default_layers'] default_layer_field.field.value_type = Choice( title=_(u"Layers"), source="maplayersVocab" ) return form_fields
class GeoStylesGroup(group.Group): label = _(u"Style") description = _(u"Set default styles for geographical shapes") @property def fields(self): fields = field.Fields(IGeoFeatureStyle).select('marker_image') fields += field.Fields(IGeoSettings).select('imgpath') fields += field.Fields(IGeoFeatureStyle).select( 'marker_image_size', 'map_width', 'linecolor', 'map_height', 'polygoncolor', 'display_properties', 'linewidth', ) fields['linecolor'].widgetFactory = ColorpickerAlphaFieldWidget fields['polygoncolor'].widgetFactory = ColorpickerAlphaFieldWidget return fields
class BingHybridMapLayer(BingMapLayer): name = u"bing_hyb" Title = _(u"Bing Hybrid")
class GoogleSatelliteMapLayer(MapLayer): name = u"google_sat" Title = _(u"Satellite (Google)") type = 'google'
class IMapWidget(Interface): """ Provides configuration options for a specific map widget. """ mapid = schema.TextLine( title=_(u"Map id"), description=_(u"Used to identify the map in the dom-tree and to "\ u"lookup an IMapWidget component if necessary."), default=u"default-cgmap", required=True) klass = schema.TextLine( title=_(u"Class attribute"), description=_(u"The html element class attribute."), default=u"widget-cgmap", required=True) style = schema.TextLine( title=_(u"Style attribute"), description=_(u"The html element style attribute."), required=False) js = schema.Text( title=_("Javascript extras"), description=_(u"Additional Javascript code inserted after the map" u" widget."), required=False) layers = schema.Object( title=_('Layers'), description=_('A mapping from layerids to ILayers'), schema=IMapLayers) usedefault = schema.Bool( title=_(u"Enable default layers."), description=_(u"If set to true, the default IMapLayers implementation" u" adds all enabled default layers from the geo settings" u" tool."), default=True, required=False) def addClass(klass): '''
class GoogleHybridMapLayer(MapLayer): name = u"google_hyb" Title = _(u"Hybrid (Google)") type = 'google'
class GeoControlpanelForm(extensible.ExtensibleForm, form.EditForm): # This is a copy of plone/app/z3cform/templates/macros.pt plus subforms template = ViewPageTemplateFile('form-with-subforms.pt') form.extends(form.EditForm, ignoreButtons=True) default_fieldset_label = _(u"Base settings") heading = _(u'Configure Collective Geo Settings') fields = control_panel_fields() groups = (GeoStylesGroup, GeoAdvancedConfGroup) label = _(u'Geo Settings') form_name = _(u"Configure element") description = _(u"Collective Geo Default Settings") level = 1 @property def css_class(self): return "subform openlayers-level-%s" % self.level def __init__(self, context, request): super(GeoControlpanelForm, self).__init__(context, request) _subform = GeopointForm(self.context, self.request, self) self.ptool = getToolByName(self.context, 'plone_utils') _subform.level = self.level + 1 self.subforms = [_subform, ] def update(self): # update subforms first, else the values won't # be available in button handler for _subform in self.subforms: _subform.update() super(GeoControlpanelForm, self).update() @button.buttonAndHandler(_(u'Apply'), name='apply') def handle_apply(self, action): subdata, suberrors = self.subforms[0].extractData() data, errors = self.extractData() if errors or suberrors: self.status = self.formErrorsMessage return changes = self.applyChanges(data) coordinate_changes = self.subforms[0].applyChanges(subdata) if changes or coordinate_changes: self.status = self.successMessage notify(GeoSettingsEvent(self.context, data)) else: self.status = self.noChangesMessage self.ptool.addPortalMessage(self.status, 'info') self.request.response.redirect(self.back_link) @button.buttonAndHandler(_(u'Cancel'), name='cancel') def handle_cancel(self, action): self.ptool.addPortalMessage(self.noChangesMessage, 'info') self.request.response.redirect(self.back_link) @property def back_link(self): return back_to_controlpanel(self.context)['url']
class GoogleTerrainMapLayer(MapLayer): name = u"google_ter" Title = _(u"Terrain (Google)") type = 'google'
class GoogleStreetMapLayer(MapLayer): name = u"google_map" Title = _(u"Google") type = 'google'
class BingAerialMapLayer(BingMapLayer): name = u"bing_aer" Title = _(u"Bing Aerial")
class BingRoadsMapLayer(BingMapLayer): name = u"bing_rod" Title = _(u"Bing Roads")
class BingStreetMapLayer(BingMapLayer): name = u"bing_map" Title = _(u"Bing")
class OSMMapLayer(MapLayer): name = u"osm" Title = _(u"OpenStreetMap")