/**
   * Computes actual grid specification (origin + single cell width and height) in the coordinates
   * relative to the diagram content pane.
   *
   * <p>This specification depends only on the grid-relative properties stored in the {@link
   * EditPartViewer}, so client may cache it and rely on {@link
   * EditPartViewer#addPropertyChangeListener(PropertyChangeListener)}
   *
   * @param viewer
   * @return grid specification in the coordinate system relative to diagram content pane, or <code>
   *     null</code> if grid is not enabled
   */
  private static PrecisionRectangle getRelativeGridSpec(EditPartViewer viewer) {
    Boolean enabled = (Boolean) viewer.getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);
    if (enabled == null || !enabled) {
      return null;
    }
    double gridX = 0;
    double gridY = 0;
    Dimension spacing = (Dimension) viewer.getProperty(SnapToGrid.PROPERTY_GRID_SPACING);
    if (spacing != null) {
      gridX = spacing.preciseWidth();
      gridY = spacing.preciseHeight();
    }
    if (gridX <= 0) {
      gridX = SnapToGrid.DEFAULT_GRID_SIZE;
    }
    if (gridY <= 0) {
      gridY = SnapToGrid.DEFAULT_GRID_SIZE;
    }
    Point origin = (Point) viewer.getProperty(SnapToGrid.PROPERTY_GRID_ORIGIN);
    PrecisionRectangle result =
        new PrecisionRectangle( //
            origin == null ? 0 : origin.preciseX(),
            origin == null ? 0 : origin.preciseY(),
            gridX,
            gridY);

    return result;
  }
  public void testCopyToImageActionEnablement() throws Exception {

    getTestFixture().openDiagram();

    List children = getTestFixture().getDiagramEditPart().getChildren();

    CircuitEditPart circuitEP = null;
    ListIterator li = children.listIterator();
    while (li.hasNext()) {
      Object ep = li.next();
      if (ep instanceof CircuitEditPart) {
        circuitEP = (CircuitEditPart) ep;
      }
    }

    assertNotNull(circuitEP);

    CopyToImageAction action = new CopyToImageAction(getWorkbenchPage());
    action.init();
    EditPartViewer viewer = getDiagramEditPart().getRoot().getViewer();
    viewer.deselectAll();
    viewer.select(getDiagramEditPart());
    flushEventQueue();
    assertTrue(action.isEnabled());

    viewer.deselectAll();
    viewer.select(circuitEP);
    flushEventQueue();
    assertTrue(action.isEnabled());
  }
  protected void configureEditPartViewer(EditPartViewer viewer) {
    ScalableFreeformRootEditPart rootEditPart = new ScalableFreeformRootEditPart();
    viewer.setRootEditPart(rootEditPart);
    getGraphicalViewer()
        .setContextMenu(
            new ProcessContextMenuProvider(
                getParentEditor().getActionRegistry(), getGraphicalViewer()));

    ((FigureCanvas) viewer.getControl()).setScrollBarVisibility(FigureCanvas.ALWAYS);
  }
  @Override
  public void mouseDown(MouseEvent e, EditPartViewer viewer) {
    if (viewer.getContents() instanceof ERDiagramEditPart) {
      ERDiagramEditPart editPart = (ERDiagramEditPart) viewer.getContents();
      ERDiagram diagram = (ERDiagram) editPart.getModel();

      diagram.mousePoint = new Point(e.x, e.y);

      editPart.getFigure().translateToRelative(diagram.mousePoint);
    }

    super.mouseDown(e, viewer);
  }
  /** Tests the CTRL-D keystroke which initiates a delete from model action. See Bugzilla 115108. */
  public void testDeleteFromModel() throws Exception {

    getTestFixture().openDiagram();

    LEDEditPart editPartToDelete =
        (LEDEditPart)
            getLogicTestFixture()
                .createShapeUsingTool(LogicSemanticType.LED, new Point(0, 0), getDiagramEditPart());

    List primaryEditParts = getDiagramEditPart().getPrimaryEditParts();

    assertTrue(primaryEditParts.contains(editPartToDelete));

    EObject semanticElement = (EObject) editPartToDelete.getAdapter(EObject.class);
    EObject semanticContainer = semanticElement.eContainer();

    // Select the edit part to be deleted.
    EditPartViewer rootViewer = getDiagramEditPart().getRoot().getViewer();
    rootViewer.deselectAll();
    rootViewer.select(editPartToDelete);

    // Set the preference to not confirm the element deletion.
    ((IPreferenceStore) getDiagramEditPart().getDiagramPreferencesHint().getPreferenceStore())
        .setValue(IPreferenceConstants.PREF_PROMPT_ON_DEL_FROM_MODEL, false);

    // Create the CTRL-D event
    Event e = new Event();
    e.character = (char) 0x4;
    e.keyCode = 100;
    e.stateMask = SWT.CTRL;
    e.widget = editPartToDelete.getViewer().getControl();

    // Simulate the CTRL-D keystroke
    SelectionTool tool = new SelectionTool();
    tool.setEditDomain((EditDomain) getDiagramWorkbenchPart().getDiagramEditDomain());
    tool.activate();
    tool.keyDown(new KeyEvent(e), rootViewer);

    // Verify that the edit part and the semantic element have been deleted.
    primaryEditParts = getDiagramEditPart().getPrimaryEditParts();

    assertFalse(
        "Primary edit part not deleted.",
        primaryEditParts.contains(editPartToDelete)); // $NON-NLS-1$

    assertFalse(
        "Semantic element not deleted.",
        semanticContainer.eContents().contains(semanticElement)); // $NON-NLS-1$
  }
  /** Configure outline viewer. */
  protected void configureOutlineViewer() {
    final EditPartViewer viewer = getViewer();
    viewer.setEditDomain(editor.getEditDomain());
    viewer.setEditPartFactory(getEditPartFactory());
    ContextMenuProvider provider = getMenuContentProvider();
    viewer.setContextMenu(provider);

    viewer.addDropTargetListener(new JSSTemplateTransferDropTargetListener(viewer));
    viewer.addDragSourceListener(
        new TemplateTransferDragSourceListener(viewer) {
          @Override
          protected Object getTemplate() {
            List<Object> models = new ArrayList<Object>();
            Object obj = super.getTemplate();
            if (obj == null) {
              List<?> selection = getViewer().getSelectedEditParts();
              for (Object it : selection) {
                if (it instanceof EditPart) {
                  Object model = ((EditPart) it).getModel();
                  if (model instanceof IDragable) {
                    models.add(model);
                  }
                  if (model instanceof MBand) {
                    BandTypeEnum bandType = ((MBand) model).getBandType();
                    if (BandTypeEnum.DETAIL.equals(bandType)
                        || BandTypeEnum.GROUP_FOOTER.equals(bandType)
                        || BandTypeEnum.GROUP_HEADER.equals(bandType)) {
                      models.add(model);
                    }
                  }
                }
              }
            }
            return models;
          }
        });
    // Add images drop listeners
    viewer.addDropTargetListener(
        new ImageResourceDropTargetListener(viewer, ResourceTransfer.getInstance()));
    viewer.addDropTargetListener(
        new ImageResourceDropTargetListener(viewer, FileTransfer.getInstance()));
    viewer.addDropTargetListener(
        new ImageResourceDropTargetListener(viewer, ImageURLTransfer.getInstance()));

    IPageSite site = getSite();
    site.registerContextMenu(provider.getId(), provider, site.getSelectionProvider());

    IToolBarManager tbm = site.getActionBars().getToolBarManager();
    registerToolbarAction(tbm);

    showPage(ID_ACTION_OUTLINE);
  }
 /**
  * Computes actual grid specification (origin + single cell width and height) in the absolute
  * coordinate system. Note, in contrast to {@link #getRelativeGridSpec(EditPartViewer)} this
  * specification depends on the active zoom or scroll and can't be cached by clients.
  *
  * @param viewer
  * @return absolute grid specification, or <code>null</code> if grid is not enabled
  */
 public static PrecisionRectangle getAbsoluteGridSpec(EditPartViewer viewer) {
   PrecisionRectangle spec = getRelativeGridSpec(viewer);
   if (spec != null) {
     GraphicalEditPart diagramEP = (GraphicalEditPart) viewer.getContents();
     diagramEP.getContentPane().translateToAbsolute(spec);
   }
   return spec;
 }
 /** {@inheritDoc} */
 public List getAffectedFiles() {
   if (viewer != null) {
     EditPart editpart = viewer.getRootEditPart().getContents();
     if (editpart instanceof IGraphicalEditPart) {
       View view = (View) ((IGraphicalEditPart) editpart).getModel();
       if (view != null) {
         IFile f = WorkspaceSynchronizer.getFile(view.eResource());
         return f != null ? Collections.singletonList(f) : Collections.EMPTY_LIST;
       }
     }
   }
   return super.getAffectedFiles();
 }
  public DiagramGridSpec(EditPartViewer viewer) {
    myViewer = viewer;
    myGridListener =
        new GridSpecListener() {

          @Override
          public void gridSpecChanged() {
            myRelativeGridSpec = null;
            myAbsoluteGridSpec = null;
          }
        };
    myViewer.addPropertyChangeListener(myGridListener);
  }
  /**
   * Always returns the same instance to avoid endless creation
   *
   * @return active grid specification in absolute coordinates or <code>null</code> if not enabled
   */
  public PrecisionRectangle getAbsoluteGridSpec() {
    PrecisionRectangle result = getRelativeGridSpec();
    if (result == null) {
      return null;
    }

    if (myAbsoluteGridSpec == null) {
      myAbsoluteGridSpec = new PrecisionRectangle();
    }
    myAbsoluteGridSpec.setPreciseBounds(
        result.preciseX(), result.preciseY(), result.preciseWidth(), result.preciseHeight());
    GraphicalEditPart diagramEP = (GraphicalEditPart) myViewer.getContents();
    diagramEP.getContentPane().translateToAbsolute(myAbsoluteGridSpec);

    return myAbsoluteGridSpec;
  }
  /**
   * Returns the bytes of an encoded image for the specified IFigure in the specified format.
   *
   * @param figure the Figure to create an image for.
   * @param format one of SWT.IMAGE_BMP, SWT.IMAGE_BMP_RLE, SWT.IMAGE_GIF SWT.IMAGE_ICO,
   *     SWT.IMAGE_JPEG, or SWT.IMAGE_PNG
   * @return the bytes of an encoded image for the specified Figure
   */
  private byte[] createImage(final IFigure figure, final int format) {

    final Device device = viewer.getControl().getDisplay();

    final Rectangle r = figure.getBounds();

    final ByteArrayOutputStream result = new ByteArrayOutputStream();

    Image image = null;
    GC gc = null;
    Graphics g = null;
    try {
      image = new Image(device, r.width, r.height);
      gc = new GC(image);
      g = new SWTGraphics(gc);
      g.translate(r.x * -1, r.y * -1);

      figure.paint(g);

      final ImageLoader imageLoader = new ImageLoader();
      imageLoader.data = new ImageData[] {image.getImageData()};
      imageLoader.save(result, format);

    } catch (Exception e) {
      // the image size may not exceed 16M, svg requires less space for graphs than png and jpeg
      e.printStackTrace();
    } finally {
      if (g != null) {
        g.dispose();
      }
      if (gc != null) {
        gc.dispose();
      }
      if (image != null) {
        image.dispose();
      }
    }
    return result.toByteArray();
  }
 public void dispose() {
   myViewer.removePropertyChangeListener(myGridListener);
   myRelativeGridSpec = null;
   myAbsoluteGridSpec = null;
 }
  public Command dropMutliAssociation(
      Association association,
      EditPartViewer viewer,
      PreferencesHint diagramPreferencesHint,
      Point location,
      View containerView) {
    Command command = new CompoundCommand();
    // 0. Obtain list of property to display
    ArrayList<Property> endToDisplay = new ArrayList(association.getMemberEnds());

    // 1. creatiuon of the diamon of association
    AssociationDiamonViewCreateCommand nodeCreation =
        new AssociationDiamonViewCreateCommand(
            getEditingDomain(),
            containerView,
            viewer,
            diagramPreferencesHint,
            location,
            new SemanticAdapter(association, null));
    ((CompoundCommand) command).add(new ICommandProxy(nodeCreation));

    // 2. for each element create a graphical representation of the type and
    // finally the branch
    Iterator<Property> iteratorProp = endToDisplay.iterator();
    int index = 0;
    while (iteratorProp.hasNext()) {
      index += 1;
      // source editPart
      EditPart sourceEditPart = null;
      // end of the association end
      Property currentEnd = iteratorProp.next();

      // look for if an editpart exist for this element
      Collection<EditPart> editPartSet = viewer.getEditPartRegistry().values();
      Iterator<EditPart> editPartIterator = editPartSet.iterator();

      while (editPartIterator.hasNext() && sourceEditPart == null) {

        EditPart currentEditPart = editPartIterator.next();

        if ((!(currentEditPart instanceof CompartmentEditPart))
            && currentEditPart instanceof GraphicalEditPart
            && currentEnd
                .getType()
                .equals(((GraphicalEditPart) currentEditPart).resolveSemanticElement())) {
          sourceEditPart = currentEditPart;
        }
      }
      // descriptor for the branch
      ConnectionViewDescriptor viewBranchDescriptor =
          new ConnectionViewDescriptor(
              UMLElementTypes.Association_4019,
              ((IHintedType) UMLElementTypes.Association_4019).getSemanticHint(),
              diagramPreferencesHint);

      // the editpart exist -> only creation of the branch
      if (sourceEditPart != null) {

        GraphicalAssociationBranchViewCommand aBranchCommand =
            new GraphicalAssociationBranchViewCommand(
                getEditingDomain(),
                (IAdaptable) nodeCreation.getCommandResult().getReturnValue(),
                new SemanticAdapter(null, sourceEditPart.getModel()),
                sourceEditPart.getViewer(),
                ((IGraphicalEditPart) sourceEditPart).getDiagramPreferencesHint(),
                viewBranchDescriptor,
                currentEnd);

        // CustomDeferredCreateConnectionViewCommand aBranchCommand = new
        // CustomDeferredCreateConnectionViewCommand(getEditingDomain(),
        // ((IHintedType)UMLElementTypes.Association_4019).getSemanticHint(),
        // (IAdaptable)nodeCreation.getCommandResult().getReturnValue(), new SemanticAdapter(null,
        // sourceEditPart.getModel()), sourceEditPart.getViewer(),
        // ((IGraphicalEditPart)sourceEditPart).getDiagramPreferencesHint(), viewBranchDescriptor,
        // null);

        aBranchCommand.setElement(association);
        ((CompoundCommand) command).add(new ICommandProxy(aBranchCommand));
      } else { // the editpart does not exist

        // creation of the node
        IAdaptable elementAdapter = new EObjectAdapter(currentEnd.getType());
        ViewDescriptor descriptor =
            new ViewDescriptor(
                elementAdapter, Node.class, null, ViewUtil.APPEND, false, diagramPreferencesHint);

        // get the command and execute it.
        CreateCommand nodeCreationCommand =
            new CreateCommand(getEditingDomain(), descriptor, containerView);
        ((CompoundCommand) command).add(new ICommandProxy(nodeCreationCommand));
        SetBoundsCommand setBoundsCommand =
            new SetBoundsCommand(
                getEditingDomain(),
                "move",
                (IAdaptable) nodeCreationCommand.getCommandResult().getReturnValue(),
                new Point(location.x + 200, location.y + index * 100));
        ((CompoundCommand) command).add(new ICommandProxy(setBoundsCommand));
        // Creation of the branch
        GraphicalAssociationBranchViewCommand aBranchCommand =
            new GraphicalAssociationBranchViewCommand(
                getEditingDomain(),
                (IAdaptable) nodeCreation.getCommandResult().getReturnValue(),
                (IAdaptable) nodeCreationCommand.getCommandResult().getReturnValue(),
                viewer,
                diagramPreferencesHint,
                viewBranchDescriptor,
                currentEnd);

        // CustomDeferredCreateConnectionViewCommand aBranchCommand = new
        // CustomDeferredCreateConnectionViewCommand(getEditingDomain(),
        // ((IHintedType)UMLElementTypes.Association_4019).getSemanticHint(),
        // (IAdaptable)nodeCreation.getCommandResult().getReturnValue(),
        // (IAdaptable)nodeCreationCommand.getCommandResult().getReturnValue(), viewer,
        // diagramPreferencesHint, viewBranchDescriptor, null);

        aBranchCommand.setElement(association);
        ((CompoundCommand) command).add(new ICommandProxy(aBranchCommand));
        // creation of the link
      }
    }
    return command;
  }
  /**
   * Ask for a file name and save the viewer containing the currently selected GraphicalEditPart to
   * a image file.
   */
  @Override
  public void run() {
    final IEditorInput editorInput =
        (IEditorInput) getWorkbenchPart().getAdapter(IEditorInput.class);
    final SaveAsDialog dialog = new SaveAsDialog(new Shell(Display.getDefault()));
    dialog.setBlockOnOpen(true);
    if (editorInput == null) {
      dialog.setOriginalName("viewerImage" + counter + ".png");
    } else {
      final String fileName = editorInput.getName();
      final int extensionPos = fileName.lastIndexOf(".");
      dialog.setOriginalName(fileName.substring(0, extensionPos) + ".png");
    }
    dialog.create();
    dialog.setMessage(
        "If you don't choose an extension png will be used a default. "
            + "\n"
            + "Export is limited to file size of 15MByte -> you may use file ..(read more) "
            + "\n"
            + "type svg for very large graphs."
            + "\n"
            + "After export the workspace needs a manual refresh to show new image file.");
    dialog.setTitle("Specify file to export viewer image (png, jpeg, bmp, svg)");
    dialog.open();
    if (Window.CANCEL == dialog.getReturnCode()) {
      return;
    }

    final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
    final IPath path = root.getLocation().append(dialog.getResult());

    int format;
    final String ext = path.getFileExtension();
    if (ext.equals("png")) {
      format = SWT.IMAGE_PNG;
      // GIFs work only with 8Bit and not with 32 Bits color depth
      //		} else if (ext.equals("gif")) {
      //			format = SWT.IMAGE_GIF;
    } else if (ext.equals("jpeg")) {
      format = SWT.IMAGE_JPEG;
    } else if (ext.equals("bmp")) {
      format = SWT.IMAGE_BMP;
      // } else if (ext.equals("ico")) {
      // format = SWT.IMAGE_ICO;
    } else if (ext.equalsIgnoreCase("svg")) {
      format = SWT.IMAGE_UNDEFINED; // TODO: find a more appropriate constant for representing SVGs
    } else {
      MessageDialog.openError(
          null,
          "Invalid file extension!",
          "The specified extension ("
              + ext
              + ") is not a valid image format extension.\nPlease use png, jpeg, bmp or svg!");
      return;
    }

    IFigure figure = ((SimpleRootEditPart) viewer.getRootEditPart()).getFigure();
    if (figure instanceof Viewport) {
      // This seems to trim the figure to the smallest rectangle containing all child figures
      ((Viewport) figure).setSize(1, 1);
      ((Viewport) figure).validate();
      figure = ((Viewport) figure).getContents();
    }
    if (format == SWT.IMAGE_UNDEFINED) {
      try {
        final File file = path.toFile();
        this.exportToSVG(file, figure);
      } catch (final IOException e) {
        e.printStackTrace();
      }
    } else {
      final byte[] imageCode = createImage(figure, format);
      try {
        final File file = path.toFile();
        final FileOutputStream fos = new FileOutputStream(file);
        fos.write(imageCode);
        fos.flush();
        fos.close();
        counter++;
      } catch (final IOException e) {
        e.printStackTrace();
      }
    }
  }