Ticket #2314: scriptClosing.patch

File scriptClosing.patch, 4.5 KB (added by mira, 9 years ago)

implementation

  • src/main/java/org/sophie2/extra/func/scripting/logic/ScriptingLogic.java

    ### Eclipse Workspace Patch 1.0
    #P org.sophie2.extra.func.scripting
     
    77import java.io.IOException; 
    88import java.io.InputStreamReader; 
    99import java.io.Reader; 
     10import java.util.ArrayList; 
     11import java.util.List; 
    1012 
    1113import org.sophie2.base.dialogs.DialogManager; 
     14import org.sophie2.base.layout.model.DocView; 
    1215import org.sophie2.base.menus.MenuItem; 
    1316import org.sophie2.base.model.resources.r4.ResourceRefR4; 
    1417import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
     
    2528import org.sophie2.extra.func.scripting.view.ScriptResourcePreviewProvider.ScriptResourcePreview; 
    2629import org.sophie2.extra.func.scripting.view.ScriptResourcePreviewProvider.ScriptResourcePreview.OpenScriptButton; 
    2730import org.sophie2.main.app.commons.app.AppMainWindow; 
     31import org.sophie2.main.app.commons.app.DocumentsLogic; 
    2832import org.sophie2.main.app.commons.book.BookDocView; 
    2933import org.sophie2.main.app.commons.util.AppViewUtil; 
    3034import org.sophie2.main.dialogs.input.DialogUtils; 
     
    228232 
    229233                        return true; 
    230234                }                
     235        }, 
     236         
     237        /** 
     238         * When a book is closed by the DocumentsLogic checks if there are any  
     239         * opened script doc views to be closed also. 
     240         */ 
     241        @SortKey("mmm-close-script-documents") 
     242        ON_CLOSE_BOOK { 
     243 
     244                public void defineFilter(EventFilterBuilder filter) { 
     245                        filter.setSourceClass(DocumentsLogic.class); 
     246                        filter.setEventId(DocumentsLogic.EventIds.BOOK_CLOSED); 
     247                        filter.setTipClass(AppMainWindow.class); 
     248                } 
     249 
     250                public boolean handle(EventR3 event) { 
     251                        ResourceRefR4 bookRef = event.getEventParam(0, ResourceRefR4.class); 
     252                        AppMainWindow mainWindow = event.getTip(AppMainWindow.class); 
     253                         
     254                        List<DocView> closedDocs = new ArrayList<DocView>(); 
     255                        DocView current = mainWindow.currentDocument().get(); 
     256                        for (DocView docView : mainWindow.documents().get()) { 
     257                                if (docView instanceof ScriptDocView) { 
     258                                        ScriptDocView scriptView = (ScriptDocView) docView; 
     259                                        ResourceAccess scriptAccess = scriptView.getAccess(); 
     260                                        ResourceRefR4 scriptRef = scriptAccess.getRef(); 
     261                                        if (scriptRef.getLocation().startsWith(bookRef.getLocation())) { 
     262                                                closedDocs.add(scriptView); 
     263                                        } 
     264                                } 
     265                        } 
     266                        for (DocView toRemove : closedDocs) { 
     267                                mainWindow.documents().get().remove(toRemove); 
     268                        } 
     269                        if (closedDocs.contains(current)) { 
     270                                mainWindow.currentDocument().set(null); 
     271                        } 
     272                         
     273                        return true; 
     274                } 
    231275        }; 
    232276} 
  • src/main/java/org/sophie2/main/app/commons/app/DocumentsLogic.java

    #P org.sophie2.main.app.commons
     
    22 
    33import org.sophie2.base.dialogs.DialogManager; 
    44import org.sophie2.base.layout.impl.DefaultDocView; 
     5import org.sophie2.base.model.resources.r4.ResourceRefR4; 
     6import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
    57import org.sophie2.core.logging.SophieLog; 
    68import org.sophie2.core.mvc.EventFilterBuilder; 
     9import org.sophie2.core.mvc.EventParams; 
     10import org.sophie2.core.mvc.LogicR3; 
    711import org.sophie2.core.mvc.OperationDef; 
    812import org.sophie2.core.mvc.SortKey; 
    913import org.sophie2.core.mvc.events.EventR3; 
     
    112116                                        assert mainWindow.documents().get().contains(docView) : "Document not in list?"; 
    113117                                        mainWindow.documents().get().remove(docView); 
    114118                                        mainWindow.currentDocument().set(null); 
    115                                          
    116119                                } 
    117                                 docView.getAccess().close(); 
     120                                if (docView instanceof BookDocView) { 
     121                                        //We should close only the book accesses 
     122                                        ResourceAccess access = docView.getAccess(); 
     123                                        access.close(); 
     124                                        ResourceRefR4 bookRef = access.getRef(); 
     125                                        LogicR3.fire(this, null, mainWindow, event, EventIds.BOOK_CLOSED, bookRef); 
     126                                } 
    118127                        }        
    119128                         
    120129                        return true; 
    121130                } 
     131                 
    122132        }, 
    123133 
    124134         
     
    141151                } 
    142152 
    143153        }; 
     154         
     155        /** 
     156         * Notification of event triggered by action in this logic. 
     157         *  
     158         * @author mira 
     159         */ 
     160        public enum EventIds { 
     161                 
     162                /** 
     163                 * A book view has been closed.  
     164                 */ 
     165                @EventParams({ResourceRefR4.class}) 
     166                BOOK_CLOSED; 
     167                 
     168        } 
    144169}