/**
   * Given a label figure object, this will calculate the correct Font needed to display into screen
   * coordinates, taking into account the current mapmode. This will typically be used by direct
   * edit cell editors that need to display independent of the zoom or any coordinate mapping that
   * is taking place on the drawing surface.
   *
   * @param label the label to use for the font calculation
   * @return the <code>Font</code> that is scaled to the screen coordinates. Note: the returned
   *     <code>Font</code> should not be disposed since it is cached by a common resource manager.
   */
  protected Font getScaledFont(IFigure label) {
    Font scaledFont = label.getFont();
    FontData data = scaledFont.getFontData()[0];
    Dimension fontSize = new Dimension(0, MapModeUtil.getMapMode(label).DPtoLP(data.getHeight()));
    label.translateToAbsolute(fontSize);

    if (Math.abs(data.getHeight() - fontSize.height) < 2) fontSize.height = data.getHeight();

    try {
      FontDescriptor fontDescriptor = FontDescriptor.createFrom(data);
      cachedFontDescriptors.add(fontDescriptor);
      return getResourceManager().createFont(fontDescriptor);
    } catch (DeviceResourceException e) {
      Trace.catching(
          DiagramUIPlugin.getInstance(),
          DiagramUIDebugOptions.EXCEPTIONS_CATCHING,
          getClass(),
          "getScaledFont",
          e); //$NON-NLS-1$
      Log.error(
          DiagramUIPlugin.getInstance(),
          DiagramUIStatusCodes.IGNORED_EXCEPTION_WARNING,
          "getScaledFont",
          e); //$NON-NLS-1$
    }
    return JFaceResources.getDefaultFont();
  }
  /*
   * @see NodeEditPart#getTargetConnectionAnchor(ConnectionEditPart)
   */
  public ConnectionAnchor getTargetConnectionAnchor(
      org.eclipse.gef.ConnectionEditPart connEditPart) {
    final ConnectionNodeEditPart connection = (ConnectionNodeEditPart) connEditPart;
    String t = ""; // $NON-NLS-1$
    try {
      t =
          (String)
              getEditingDomain()
                  .runExclusive(
                      new RunnableWithResult.Impl() {

                        public void run() {
                          Anchor a = connection.getEdge().getTargetAnchor();
                          if (a instanceof IdentityAnchor) setResult(((IdentityAnchor) a).getId());
                          else setResult(""); // $NON-NLS-1$
                        }
                      });
    } catch (InterruptedException e) {
      Trace.catching(
          DiagramUIPlugin.getInstance(),
          DiagramUIDebugOptions.EXCEPTIONS_CATCHING,
          getClass(),
          "getTargetConnectionAnchor",
          e); //$NON-NLS-1$
      Log.error(
          DiagramUIPlugin.getInstance(),
          DiagramUIStatusCodes.IGNORED_EXCEPTION_WARNING,
          "getTargetConnectionAnchor",
          e); //$NON-NLS-1$
    }
    return ((IAnchorableFigure) getFigure()).getConnectionAnchor(t);
  }
  /**
   * This method obtains the fonts that are being used by the figure at its zoom level.
   *
   * @param gep the associated <code>GraphicalEditPart</code> of the figure
   * @param actualFont font being used by the figure
   * @param display
   * @return <code>actualFont</code> if zoom level is 1.0 (or when there's an error), new Font
   *     otherwise.
   */
  private Font getZoomLevelFont(Font actualFont, Display display) {
    Object zoom = getEditPart().getViewer().getProperty(ZoomManager.class.toString());

    if (zoom != null) {
      double zoomLevel = ((ZoomManager) zoom).getZoom();

      if (zoomLevel == 1.0f) return actualFont;

      FontData[] fd = new FontData[actualFont.getFontData().length];
      FontData tempFD = null;

      for (int i = 0; i < fd.length; i++) {
        tempFD = actualFont.getFontData()[i];

        fd[i] =
            new FontData(
                tempFD.getName(), (int) (zoomLevel * tempFD.getHeight()), tempFD.getStyle());
      }

      try {
        FontDescriptor fontDescriptor = FontDescriptor.createFrom(fd);
        cachedFontDescriptors.add(fontDescriptor);
        return getResourceManager().createFont(fontDescriptor);
      } catch (DeviceResourceException e) {
        Trace.catching(
            DiagramUIPlugin.getInstance(),
            DiagramUIDebugOptions.EXCEPTIONS_CATCHING,
            getClass(),
            "getZoomLevelFonts",
            e); //$NON-NLS-1$
        Log.error(
            DiagramUIPlugin.getInstance(),
            DiagramUIStatusCodes.IGNORED_EXCEPTION_WARNING,
            "getZoomLevelFonts",
            e); //$NON-NLS-1$

        return actualFont;
      }
    } else return actualFont;
  }