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.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.DocumentReadOnlyException; import org.docear.plugin.pdfutilities.pdf.PdfAnnotationImporter; import org.docear.plugin.pdfutilities.pdf.PdfFileFilter; import org.docear.plugin.pdfutilities.pdf.ReadOnlyExceptionWarningHandler; 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 org.freeplane.plugin.workspace.URIUtils; import de.intarsys.pdf.cos.COSRuntimeException; 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 = URIUtils.resolveURI(URIUtils.getAbsoluteURI(event.getNode().getMap()), newUri); if(newAbsoluteUri == null) { return; } File file = URIUtils.getFile(newAbsoluteUri); if(new PdfFileFilter().accept(file)) { AnnotationModel model = AnnotationController.getModel(event.getNode(), false); if(model == null){ model = new AnnotationModel(0); model.setSource(newAbsoluteUri); model.setAnnotationType(AnnotationType.PDF_FILE); AnnotationController.setModel(event.getNode(), model); } } else { event.getNode().removeExtension(AnnotationModel.class); } } catch(Exception e){ LogUtils.warn(e); //DOCEAR - remove model if exists? } } 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 { ReadOnlyExceptionWarningHandler warningHandler = new ReadOnlyExceptionWarningHandler(); warningHandler.prepare(); while(warningHandler.retry()) { try { new PdfAnnotationImporter().renameAnnotation(annotation, event.getNewValue().toString()); System.gc(); warningHandler.consume(); } catch (DocumentReadOnlyException e) { if(warningHandler.skip()) { break; } warningHandler.showDialog(URIUtils.getFile(annotation.getSource())); } } } 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().getMapViewManager().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 (COSRuntimeException e) { LogUtils.severe("DocearRenameAnnotationListener COSRuntimeException at Target("+node.getText()+"): ", e); //$NON-NLS-1$ //$NON-NLS-2$ } } } } }