blob: 40ad4dab47d4163067c686db115c92528252119d [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* SAP SE - initial API, implementation and documentation
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.internal.services.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.graphiti.mm.algorithms.AbstractText;
import org.eclipse.graphiti.mm.algorithms.styles.Font;
import org.eclipse.graphiti.mm.algorithms.styles.Style;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IMigrationService;
public class MigrationServiceImpl implements IMigrationService {
public void migrate070To080(Diagram d) {
// Traverse model and collect fonts
Map<Font, ArrayList<EObject>> fontToUser = new HashMap<Font, ArrayList<EObject>>();
Resource eResource = d.eResource();
TreeIterator<EObject> allContents = eResource.getAllContents();
while (allContents.hasNext()) {
EObject eObject = allContents.next();
if (eObject instanceof AbstractText) {
AbstractText t = (AbstractText) eObject;
Font font = t.getFont();
addFontUser(fontToUser, eObject, font);
} else if (eObject instanceof Style) {
Style s = (Style) eObject;
Font font = s.getFont();
addFontUser(fontToUser, eObject, font);
}
}
// Manage collected fonts and set the new font on the respective
// elements. Includes possibly a write.
// The caller has to use a write transaction.
for (Font font : fontToUser.keySet()) {
Font newFont = Graphiti.getGaService().manageFont(d, font.getName(), font.getSize(), font.isItalic(), font.isBold());
ArrayList<EObject> fontUsers = fontToUser.get(font);
for (EObject fontUser : fontUsers) {
if (fontUser instanceof AbstractText) {
((AbstractText) fontUser).setFont(newFont);
} else {
((Style) fontUser).setFont(newFont);
}
}
}
}
public void migrate080To090(Diagram d) {
// Traverse model and and set unfilled texts to filled
Resource eResource = d.eResource();
TreeIterator<EObject> allContents = eResource.getAllContents();
while (allContents.hasNext()) {
EObject eObject = allContents.next();
if (eObject instanceof AbstractText) {
AbstractText t = (AbstractText) eObject;
if (t.getFilled()) {
t.setFilled(Boolean.FALSE);
}
}
}
}
public boolean shouldMigrate080To090(Diagram d) {
String version = d.getVersion();
if (version == null || version.length() == 0) {
Resource eResource = d.eResource();
TreeIterator<EObject> allContents = eResource.getAllContents();
while (allContents.hasNext()) {
EObject eObject = allContents.next();
if (eObject instanceof AbstractText) {
return true;
}
}
}
return false;
}
private void addFontUser(Map<Font, ArrayList<EObject>> fontToUser, EObject fontUser, Font font) {
if (font != null) {
if (fontToUser.get(font) == null) {
fontToUser.put(font, new ArrayList<EObject>());
}
fontToUser.get(font).add(fontUser);
}
}
public boolean shouldMigrate070To080(Diagram d) {
// Traverse model and collect fonts
HashSet<Font> fonts = new HashSet<Font>();
Resource eResource = d.eResource();
TreeIterator<EObject> allContents = eResource.getAllContents();
while (allContents.hasNext()) {
EObject next = allContents.next();
if (next instanceof AbstractText) {
AbstractText t = (AbstractText) next;
Font font = t.getFont();
if (font != null)
fonts.add(font);
} else if (next instanceof Style) {
Style s = (Style) next;
Font font = s.getFont();
if (font != null)
fonts.add(font);
}
}
for (Font font : fonts) {
if (!d.getFonts().contains(font))
return true;
}
return false;
}
}