| /******************************************************************************* |
| * Copyright (c) 2014 TwelveTone LLC and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Steven Spungin <steven@spungin.tv> - initial API and implementation, Bug 432372 |
| *******************************************************************************/ |
| |
| package org.eclipse.e4.tools.emf.ui.internal.handlers; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.concurrent.ConcurrentHashMap; |
| import org.eclipse.e4.core.contexts.IEclipseContext; |
| import org.eclipse.e4.core.di.annotations.Execute; |
| import org.eclipse.e4.tools.emf.ui.internal.common.component.tabs.EmfUtil; |
| import org.eclipse.e4.tools.emf.ui.internal.common.component.tabs.IViewEObjects; |
| import org.eclipse.e4.tools.emf.ui.internal.common.component.tabs.empty.E; |
| import org.eclipse.e4.tools.emf.ui.internal.common.component.tabs.empty.EmptyFilterOption; |
| import org.eclipse.emf.ecore.EAttribute; |
| import org.eclipse.emf.ecore.EObject; |
| |
| public class MarkDuplicateItemsBase extends AbstractHandler { |
| |
| private String attName; |
| |
| @Execute |
| public void execute(IEclipseContext context) { |
| IViewEObjects viewer = (IViewEObjects) context.get(VIEWER_KEY); |
| Collection<EObject> duplicates = getDuplicateList(getAttName(), viewer.getAllEObjects()); |
| applyEmptyOption(duplicates, getAttName(), EmptyFilterOption.EXCLUDE); |
| viewer.highlightEObjects(duplicates); |
| } |
| |
| static Collection<EObject> getDuplicateList(String attName, Collection<EObject> all) { |
| Map<String, List<EObject>> map = getDuplicateMap(attName, all); |
| List<EObject> duplicates = new ArrayList<>(); |
| for (String key : map.keySet()) { |
| List<EObject> list = map.get(key); |
| if (list.size() > 1) { |
| duplicates.addAll(list); |
| } |
| } |
| return duplicates; |
| } |
| |
| static Map<String, List<EObject>> getDuplicateMap(String attName, Collection<EObject> selected) { |
| ConcurrentHashMap<String, List<EObject>> map = new ConcurrentHashMap<>(); |
| for (Iterator<?> it = selected.iterator(); it.hasNext();) { |
| Object object = it.next(); |
| if (object instanceof EObject) { |
| EObject item = (EObject) object; |
| EAttribute att = EmfUtil.getAttribute(item, attName); |
| if (att != null) { |
| String attValue; |
| Object obj = item.eGet(att); |
| if (obj == null) { |
| attValue = ""; //$NON-NLS-1$ |
| } else { |
| attValue = String.valueOf(obj); |
| } |
| List<EObject> list = map.get(attValue); |
| if (list == null) { |
| list = new ArrayList<>(); |
| map.put(attValue, list); |
| } |
| list.add(item); |
| } |
| } |
| } |
| return map; |
| } |
| |
| public String getAttName() { |
| return attName; |
| } |
| |
| public void setAttributeName(String attName) { |
| this.attName = attName; |
| } |
| |
| static protected void applyEmptyOption(Collection<EObject> marked, String attName, EmptyFilterOption emptyFilterOption) { |
| switch (emptyFilterOption) { |
| case EXCLUDE: |
| for (Iterator<?> it = marked.iterator(); it.hasNext();) { |
| EObject eObject = (EObject) it.next(); |
| if (E.isEmpty(EmfUtil.getAttributeValue(eObject, attName))) { |
| it.remove(); |
| } |
| } |
| break; |
| case ONLY: |
| for (Iterator<?> it = marked.iterator(); it.hasNext();) { |
| EObject eObject = (EObject) it.next(); |
| if (E.notEmpty(EmfUtil.getAttributeValue(eObject, attName))) { |
| it.remove(); |
| } |
| } |
| break; |
| case INCLUDE: |
| default: |
| break; |
| } |
| } |
| } |