package org.docear.plugin.pdfutilities.listener;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import javax.swing.JOptionPane;
import org.docear.plugin.core.features.AnnotationID;
import org.docear.plugin.core.util.Tools;
import org.docear.plugin.pdfutilities.features.AnnotationModel;
import org.docear.plugin.pdfutilities.features.AnnotationNodeModel;
import org.docear.plugin.pdfutilities.features.IAnnotation.AnnotationType;
import org.docear.plugin.pdfutilities.map.AnnotationController;
import org.docear.plugin.pdfutilities.pdf.PdfAnnotationImporter;
import org.docear.plugin.pdfutilities.pdf.PdfFileFilter;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.map.INodeChangeListener;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import de.intarsys.pdf.cos.COSRuntimeException;
import de.intarsys.pdf.parser.COSLoadException;
public class PdfNodeChangeListener implements INodeChangeListener {
public void nodeChanged(org.freeplane.features.map.NodeChangeEvent event) {
if (event.getProperty().equals(NodeModel.HYPERLINK_CHANGED)) {
URI newUri = (URI) event.getNewValue();
if (newUri != null) {
try{
URI newAbsoluteUri = Tools.getAbsoluteUri(newUri, event.getNode().getMap());
File file = Tools.getFilefromUri(newAbsoluteUri);
if(new PdfFileFilter().accept(file)) {
AnnotationModel model = AnnotationController.getModel(event.getNode(), false);
if(model == null){
model = new AnnotationModel();
model.setAnnotationID(new AnnotationID(newAbsoluteUri, null));
model.setAnnotationType(AnnotationType.PDF_FILE);
AnnotationController.setModel(event.getNode(), model);
}
}
}
catch(Exception e){
LogUtils.warn(e);
}
}
else if(AnnotationController.getModel(event.getNode(), false) != null){
AnnotationController.setModel(event.getNode(), null);
}
}
else if(event.getProperty().equals(NodeModel.NODE_TEXT)){
NodeModel node = event.getNode();
AnnotationNodeModel annotation = AnnotationController.getAnnotationNodeModel(node);
if(annotation != null && annotation.getAnnotationType() != null && !annotation.getAnnotationType().equals(AnnotationType.PDF_FILE)){
try {
new PdfAnnotationImporter().renameAnnotation(annotation, event.getNewValue().toString());
System.gc();
} catch (IOException e) {
if(e.getMessage().equals("destination is read only")){ //$NON-NLS-1$
Object[] options = { TextUtils.getText("DocearRenameAnnotationListener.1"), TextUtils.getText("DocearRenameAnnotationListener.2"),TextUtils.getText("DocearRenameAnnotationListener.3") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
int result = JOptionPane.showOptionDialog(Controller.getCurrentController().getViewController().getComponent(node), TextUtils.getText("DocearRenameAnnotationListener.4"), TextUtils.getText("DocearRenameAnnotationListener.5"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); //$NON-NLS-1$ //$NON-NLS-2$
if( result == JOptionPane.OK_OPTION){
this.nodeChanged(event);
}
else if( result == JOptionPane.CANCEL_OPTION ){
//Controller.getCurrentModeController().rollback();
node.setText("" + event.getOldValue()); //$NON-NLS-1$
}
}
else{
LogUtils.severe("DocearRenameAnnotationListener IOException at Target("+node.getText()+"): ", e); //$NON-NLS-1$ //$NON-NLS-2$
}
} catch (COSLoadException e) {
LogUtils.severe("DocearRenameAnnotationListener COSLoadException at Target("+node.getText()+"): ", e); //$NON-NLS-1$ //$NON-NLS-2$
} catch (COSRuntimeException e) {
LogUtils.severe("DocearRenameAnnotationListener COSRuntimeException at Target("+node.getText()+"): ", e); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}
}