/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.xmind.ui.mindmap.ICategoryAnalyzation;
import org.xmind.ui.mindmap.ICategoryManager;
public class CategoryAnalyzation implements ICategoryAnalyzation {
private static final Object[] EMPTY_ARRAY = new Object[0];
private Object[] elements;
private CategoryManager manager;
private Map<String, List<Object>> map = null;
private String mainCategory = null;
/* package */CategoryAnalyzation(Object[] elements, CategoryManager manager) {
this.elements = elements;
this.manager = manager;
}
public Object[] getElements() {
return elements;
}
public boolean isEmpty() {
return ICategoryManager.NO_CATEGORY.equals(getMainCategory());
}
public String getMainCategory() {
checkAnalyze();
return mainCategory;
}
public int size() {
return elements.length;
}
private void checkAnalyze() {
if (mainCategory == null || map == null)
analyze();
}
private void analyze() {
String[] categories = manager.getAllCategories();
for (Object o : elements) {
String t = getCategory(o, categories);
if (t == null)
t = ICategoryManager.UNKNOWN_CATEGORY;
if (mainCategory == null) {
mainCategory = t;
} else if (!ICategoryManager.MULTIPLE_CATEGORIES
.equals(mainCategory)
&& !mainCategory.equals(t)) {
mainCategory = ICategoryManager.MULTIPLE_CATEGORIES;
}
if (map == null) {
map = new HashMap<String, List<Object>>();
}
List<Object> list = map.get(t);
if (list == null) {
list = new ArrayList<Object>();
map.put(t, list);
}
list.add(o);
}
if (mainCategory == null) {
mainCategory = ICategoryManager.NO_CATEGORY;
}
if (map == null) {
map = Collections.emptyMap();
}
}
private String getCategory(Object o, String[] categories) {
for (String category : categories) {
if (manager.belongsToCategory(o, category))
return category;
}
return null;
}
public String[] getMultipleCategories() {
checkAnalyze();
Set<String> categories = map.keySet();
return categories.toArray(new String[categories.size()]);
}
public Object[] getElementsByCategory(String type) {
checkAnalyze();
List<Object> list = map.get(type);
if (list == null)
return EMPTY_ARRAY;
return list.toArray();
}
public int getNumElementsByCategory(String type) {
checkAnalyze();
List<Object> list = map.get(type);
return list == null ? 0 : list.size();
}
public boolean isMultiple() {
return ICategoryManager.MULTIPLE_CATEGORIES.equals(getMainCategory());
}
}