/* * Copyright 2015 Igor Maznitsa. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.igormaznitsa.nbmindmap.nb.editor; import com.igormaznitsa.mindmap.model.logger.Logger; import com.igormaznitsa.mindmap.model.logger.LoggerFactory; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import javax.annotation.Nullable; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.StyledDocument; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.netbeans.editor.GuardedDocument; import org.openide.awt.UndoRedo; import org.openide.cookies.EditCookie; import org.openide.cookies.EditorCookie; import org.openide.cookies.OpenCookie; import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.text.CloneableEditor; import org.openide.text.DataEditorSupport; import org.openide.windows.CloneableTopComponent; public class MMDEditorSupport extends DataEditorSupport implements OpenCookie, EditCookie, EditorCookie, EditorCookie.Observable, ChangeListener, Serializable { private static final long serialVersionUID = 3419821892803816299L; private final List<WeakReference<MMDGraphEditor>> listeners = new ArrayList<WeakReference<MMDGraphEditor>>(); private static final Logger LOGGER = LoggerFactory.getLogger(MMDEditorSupport.class); public MMDEditorSupport(final MMDDataObject obj) { super(obj, new MMDDataEnv(obj)); setMIMEType(MMDDataObject.MIME); } @Nullable public Project getProject() { return FileOwnerQuery.getOwner(getDataObject().getPrimaryFile()); } public File getProjectDirectory() { File result = null; final Project project = getProject(); if (project != null) { final FileObject projDir = project.getProjectDirectory(); if (projDir != null) { return FileUtil.toFile(projDir); } } return result; } @Override protected CloneableEditor createCloneableEditor() { final MMDGraphEditor editor = new MMDGraphEditor(this); this.listeners.add(new WeakReference<MMDGraphEditor>(editor)); return editor; } public String getDocumentText() { if (this.getDataObject().isValid()) { try { final StyledDocument doc = this.openDocument(); return doc.getText(0, doc.getLength()); } catch (Exception ex) { LOGGER.error("Can't get document text", ex); //NOI18N return null; } } else { LOGGER.warn("DataObject " + this.getDataObject() + " is not valid"); return null; } } @Override protected boolean asynchronousOpen() { return false; } @Override protected UndoRedo.Manager createUndoRedoManager() { final UndoRedo.Manager result = super.createUndoRedoManager(); result.addChangeListener(this); return result; } public void onEditorActivated() { } public org.openide.awt.UndoRedo getUndoRedoObject() { return super.getUndoRedo(); } @Override protected String messageHtmlName() { return super.messageHtmlName(); } @Override protected String messageName() { return super.messageName(); } @Override protected String messageToolTip() { return super.messageToolTip(); } public void replaceDocumentText(final String text) { try { final GuardedDocument doc = (GuardedDocument) this.openDocument(); doc.runAtomic(new Runnable() { @Override public void run() { try { doc.remove(0, doc.getLength()); doc.insertString(0, text, null); } catch (Exception ex) { LOGGER.error("Can't replace text", ex); //NOI18N } } }); } catch (Exception ex) { LOGGER.error("Can't open document to replace text", ex); //NOI18N } } @Override public void stateChanged(final ChangeEvent e) { for (final WeakReference<MMDGraphEditor> g : this.listeners) { final MMDGraphEditor ge = g.get(); if (ge != null) { ge.updateView(); } } } public void focusToPosition(final boolean enforceVisibilityOfTopic, final int[] positionPath) { final Enumeration<CloneableTopComponent> editors = this.allEditors.getComponents(); while (editors.hasMoreElements()) { final MMDGraphEditor editor = (MMDGraphEditor) editors.nextElement(); editor.focusToPath(enforceVisibilityOfTopic, positionPath); } } private static final class MMDDataEnv extends DataEditorSupport.Env { private static final long serialVersionUID = 6101101548072950629L; private final MMDDataObject dataObj; public MMDDataEnv(final MMDDataObject obj) { super(obj); this.dataObj = obj; } @Override protected FileObject getFile() { return this.dataObj.getPrimaryFile(); } @Override protected FileLock takeLock() throws IOException { return this.dataObj.getPrimaryEntry().takeLock(); } } @Override public void updateTitles() { super.updateTitles(); } }