예제 #1
0
 private void configureIconSize(DivIconOptions divIconOptions) {
   if (getState().iconAnchor != null) {
     divIconOptions.setIconAnchor(
         Point.create(getState().iconAnchor.getLat(), getState().iconAnchor.getLon()));
   }
   if (getState().iconSize != null) {
     divIconOptions.setIconSize(
         Point.create(getState().iconSize.getLat(), getState().iconSize.getLon()));
   }
 }
예제 #2
0
  @Override
  protected void update() {
    if (marker != null) {
      removeLayerFromParent();
      marker.removeClickListener();
      marker.removeMouseOverListener();
      marker.removeMouseOutListener();
      marker.removeContextMenuListener();
    }
    LatLng latlng = LatLng.create(getState().point.getLat(), getState().point.getLon());
    MarkerOptions options = createOptions();

    URLReference urlReference = getState().resources.get("icon");
    String divIcon = getState().divIcon;
    if (urlReference != null && urlReference.getURL().startsWith("fonticon://")) {
      // fonticons have special handling
      com.vaadin.client.ui.Icon vIcon = getIcon();
      String fontAwesomeChar = vIcon.getElement().getInnerText();
      StringBuilder svgSb = new StringBuilder();
      // TODO make this configurable, consider making also possible to
      // use configurable SVG marker without fontawesome icon in marker
      svgSb.append(
          "<svg width=\"25px\" height=\"40px\"><path fill=\"#44AEEA\" stroke=\"#005FA8\" d=\"M12.544,0.5C5.971,0.5,0.5,6.24,0.5,12.416c0,2.777,1.564,6.308,2.694,8.745\n"
              + "L12.5,38.922l9.262-17.761c1.13-2.438,2.738-5.791,2.738-8.745C24.5,6.24,19.117,0.5,12.544,0.5L12.544,0.5z\"/><text fill=\"#fff\" x=\"12.5\" y=\"20\" text-anchor=\"middle\" font-size=\"16\" class=\"");
      svgSb.append(vIcon.getStyleName());
      svgSb.append("\">");
      svgSb.append(fontAwesomeChar);
      svgSb.append("</text></svg>");

      DivIconOptions divIconOptions = DivIconOptions.create();
      divIconOptions.setClassName("v-leaflet-custom-svg");
      divIconOptions.setHtml(svgSb.toString());
      divIconOptions.setIconSize(Point.create(25, 40));
      divIconOptions.setIconAnchor(Point.create(12.5, 40));
      configureIconSize(divIconOptions);

      DivIcon icon = DivIcon.create(divIconOptions);
      options.setIcon(icon);

    } else if (divIcon != null) {
      DivIconOptions divIconOptions = DivIconOptions.create();
      configureIconSize(divIconOptions);
      if (ComponentStateUtil.hasStyles(getState())) {
        StringBuilder builder = new StringBuilder();
        for (String style : getState().styles) {
          builder.append(style).append(" ");
        }
        divIconOptions.setClassName(builder.toString());
      }
      divIconOptions.setHtml(divIcon);
      DivIcon icon = DivIcon.create(divIconOptions);
      options.setIcon(icon);
    } else if (urlReference != null) {
      IconOptions iconOptions = IconOptions.create();
      iconOptions.setIconUrl(urlReference.getURL());
      if (getState().iconAnchor != null) {
        iconOptions.setIconAnchor(
            Point.create(getState().iconAnchor.getLat(), getState().iconAnchor.getLon()));
      }
      if (getState().iconSize != null) {
        iconOptions.setIconSize(
            Point.create(getState().iconSize.getLat(), getState().iconSize.getLon()));
      }
      Icon icon = Icon.create(iconOptions);
      options.setIcon(icon);
    }

    String title = getState().title;
    if (title != null) {
      options.setTitle(title);
    }

    if (hasEventListener("dragend")) {
      options.setDraggable(true);
    }

    marker = Marker.create(latlng, options);
    if (hasEventListener("dragend")) {
      marker.addDragEndListener(
          new ClickListener() {
            @Override
            public void onClick(MouseEvent event) {
              dragServerRcp.dragEnd(U.toPoint(marker.getLatLng()));
            }
          });
    }
    if (hasEventListener(EventId.MOUSEOVER)) {
      /*
       * Add listener lazily to avoid extra event if layer is modified in
       * server side listener. This can be removed if "clear and rebuild"
       * style component updates are changed into something more
       * intelligent at some point.
       */
      Scheduler.get()
          .scheduleDeferred(
              new ScheduledCommand() {
                @Override
                public void execute() {
                  marker.addMouseOverListener(
                      new MouseOverListener() {
                        @Override
                        public void onMouseOver(MouseEvent event) {
                          mouseOverRpc.onMouseOver(U.toPoint(event.getLatLng()));
                        }
                      });
                }
              });
    }
    if (hasEventListener(EventId.MOUSEOUT)) {
      marker.addMouseOutListener(
          new MouseOutListener() {
            @Override
            public void onMouseOut(MouseEvent event) {
              mouseOutRpc.onMouseOut(U.toPoint(event.getLatLng()));
            }
          });
    }
    if (hasEventListener(EventId.CONTEXTMENU)) {
      marker.addContextMenuListener(
          new ContextMenuListener() {
            @Override
            public void onContextMenu(MouseEvent event) {
              contextMenuRpc.onContextMenu(
                  U.toPoint(event.getLatLng()),
                  MouseEventDetailsBuilder.buildMouseEventDetails(
                      event.getNativeEvent(), getLeafletMapConnector().getWidget().getElement()));
            }
          });
    }
    String popup = getState().popup;
    if (popup != null) {
      PopupOptions popupOptions = LeafletPopupConnector.popupOptionsFor(getState().popupState);
      marker.bindPopup(popup, popupOptions);
    }
    addToParent(marker);

    marker.addClickListener(handler);
  }