package org.docear.plugin.pdfutilities.map;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import javax.swing.JOptionPane;
import org.docear.plugin.core.features.DocearMapModelController;
import org.docear.plugin.core.features.DocearMapModelExtension;
import org.docear.plugin.core.mindmap.MindmapUpdateController;
import org.docear.plugin.pdfutilities.features.ISplmmMapsConvertListener;
import org.docear.plugin.pdfutilities.features.SplmmMapsConvertEvent;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.url.mindmapmode.IMapConverter;
import org.freeplane.features.url.mindmapmode.MapConversionException;
public class MapConverter implements IMapConverter {
private final static HashSet<ISplmmMapsConvertListener> mapsConvertedListener = new HashSet<ISplmmMapsConvertListener>();
private final static HashSet<MapModel> mapsQuestionedInCurrentSession = new HashSet<MapModel>();
public static void addMapsConvertedListener(ISplmmMapsConvertListener listener) {
mapsConvertedListener.add(listener);
}
public static void removeMapsConvertedListener(ISplmmMapsConvertListener listener) {
mapsConvertedListener.remove(listener);
}
public static void fireConvertMapsEvent(MindmapUpdateController mindmapUpdateController) {
for (ISplmmMapsConvertListener listener : mapsConvertedListener) {
SplmmMapsConvertEvent event = new SplmmMapsConvertEvent(mindmapUpdateController);
listener.mapsConvert(event);
}
}
public static boolean convert(final List<MapModel> maps){
try{
if(maps == null || maps.size() <= 0) return false;
currentlyConverting = true;
MindmapUpdateController mindmapUpdateController = new MindmapUpdateController();
mindmapUpdateController.addMindmapUpdater(new AnnotationModelUpdater(TextUtils.getText("MapConverter.0"))); //$NON-NLS-1$
fireConvertMapsEvent(mindmapUpdateController);
//mindmapUpdateController.addMindmapUpdater(new MindmapLinkTypeUpdater("Converting hyperlinks...."));
if(!mindmapUpdateController.updateMindmapsInList(maps)){
for(MapModel map : maps){
DocearMapModelExtension docearMapModel = DocearMapModelController.getModel(map);
if(docearMapModel != null){
docearMapModel.setIncompatible(true);
}
else{
DocearMapModelController.setModelWithCurrentVersion(map).setIncompatible(true);
}
}
currentlyConverting = false;
return false;
}
currentlyConverting = false;
return true;
}
catch(Exception e){
LogUtils.warn(e);
currentlyConverting = false;
return false;
}
finally{
System.gc();
}
}
public static boolean currentlyConverting;
public void convert(NodeModel root) throws MapConversionException {
ArrayList<MapModel> maps = new ArrayList<MapModel>();
if(isAlreadyQuestioned(root.getMap())) {
return;
}
maps.add(root.getMap());
showConversionDialog(maps);
}
public boolean showConversionDialog(final List<MapModel> maps) {
boolean converted = false;
for(MapModel map : maps){
DocearMapModelExtension docearMapModel = DocearMapModelController.getModel(map);
if(docearMapModel == null){
DocearMapModelController.setModelWithCurrentVersion(map);
}
}
int result = UITools.showConfirmDialog(null, getMessage(maps), getTitle(maps), JOptionPane.OK_CANCEL_OPTION);
if(result == JOptionPane.OK_OPTION){
converted = convert(maps);
}
else{
for(MapModel map : maps){
DocearMapModelExtension docearMapModel = DocearMapModelController.getModel(map);
if(docearMapModel != null){
docearMapModel.setIncompatible(true);
}
else{
DocearMapModelController.setModelWithCurrentVersion(map).setIncompatible(true);
}
}
}
mapsQuestionedInCurrentSession.addAll(maps);
return converted;
}
private String getMessage(final List<MapModel> mapsToConvert){
if(mapsToConvert.size() > 1){
return mapsToConvert.size() + TextUtils.getText("DocearMapConverterListener.0")+TextUtils.getText("update_splmm_to_docear_explanation"); //$NON-NLS-1$ //$NON-NLS-2$
}
else if (mapsToConvert.size() == 1){
return mapsToConvert.get(0).getTitle() + TextUtils.getText("DocearMapConverterListener.2")+TextUtils.getText("update_splmm_to_docear_explanation"); //$NON-NLS-1$ //$NON-NLS-2$
}
return ""; //$NON-NLS-1$
}
private String getTitle(final List<MapModel> mapsToConvert){
if(mapsToConvert.size() > 1){
return mapsToConvert.size() + TextUtils.getText("DocearMapConverterListener.5"); //$NON-NLS-1$
}
else if (mapsToConvert.size() == 1){
return mapsToConvert.get(0).getTitle() + TextUtils.getText("DocearMapConverterListener.6"); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
private boolean isAlreadyQuestioned(MapModel map){
for(MapModel alreadyQuestioned : mapsQuestionedInCurrentSession){
if(alreadyQuestioned.getFile().equals(map.getFile())){
return true;
}
}
return false;
}
}