Ticket #2456: 2456-presentation-mode-im.patch

File 2456-presentation-mode-im.patch, 35.4 KB (added by deni, 15 years ago)
  • modules/org.sophie2.base.menus/src/main/java/org/sophie2/base/menus/MenuBar.java

    ### Eclipse Workspace Patch 1.0
    #P sophie
     
    44 
    55import org.sophie2.base.visual.BaseVisualElement; 
    66import org.sophie2.core.prolib.annot.Own; 
     7import org.sophie2.core.prolib.annot.Setup; 
    78import org.sophie2.core.prolib.impl.AutoListProperty; 
    89import org.sophie2.core.prolib.impl.ResourceProperty; 
    910import org.sophie2.core.prolib.interfaces.ListProp; 
     
    4041                        protected void setup(JMenuBar res) { 
    4142                                items().get(); // ensure this is available 
    4243                                res.setEnabled(true); 
    43                                 res.setVisible(true); 
    44                                  
    45                                  
     44 
    4645                                res.removeAll(); 
    4746                                for(MenuMember m : items().get()) { 
    4847                                        assert m != null : "cannot add a separator (marked by null) in a menu bar"; 
     
    5150                                res.repaint(); 
    5251                                 
    5352                        } 
     53                         
     54                        @Setup 
     55                        @SuppressWarnings("unused") 
     56                        public void setupVisibility(JMenuBar res) { 
     57                                res.setVisible(visible().get());                                 
     58                        } 
    5459                } 
    5560                return getBean().makeProp(swingMenuBar.class); 
    5661        } 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/AppMenuBar.java

     
    11package org.sophie2.main.app.menus; 
    22 
    33import org.sophie2.base.layout.model.MainWindow; 
     4import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
    45import org.sophie2.base.menus.MenuBar; 
    56import org.sophie2.base.skins.SkinElementId; 
    67import org.sophie2.base.visual.skins.RelatedChildren; 
    78import org.sophie2.base.visual.skins.VisualElementDef; 
    89import org.sophie2.core.prolib.interfaces.Prop; 
    910import org.sophie2.main.app.commons.app.AppMainWindow; 
     11import org.sophie2.main.app.commons.util.AppViewUtil; 
    1012import org.sophie2.main.app.menus.view.ViewMenu; 
    1113 
    1214/** 
     
    3133        public AppMenuBar() { 
    3234                getBean(); 
    3335        } 
     36         
     37        @Override 
     38        public boolean computeVisible() { 
     39                AppMainWindow mainWindow = AppViewUtil.findMainWindow(this); 
     40                return !ScreenMode.PRESENTATION.equals( 
     41                                mainWindow.mainWindowOptions().get().getScreenMode()); 
     42        } 
    3443 
    3544} 
  • modules/org.sophie2.main.media.natlib/src/main/java/org/sophie2/main/media/natlib/output/NativeAudioOutput.java

     
    8383        } 
    8484 
    8585        /** 
    86          * The curent state of the output. 
     86         * The current state of the output. 
    8787         */ 
    8888        protected State state = State.NEW; 
    8989        /** 
     
    198198                } 
    199199        } 
    200200 
     201        // the number of times the output has been started 
     202        private int count; 
     203         
    201204        public void start() { 
    202                 assert this.state == State.NEW : "Not new : " + this.state; 
    203                 this.state = State.STARTING; 
    204                 doInEdt(this.stepRunnable); 
     205                if (this.count == 0) { 
     206                        assert this.state == State.NEW : "Not new : " + this.state; 
     207                        this.state = State.STARTING; 
     208                        doInEdt(this.stepRunnable); 
     209                } 
     210                this.count++; 
    205211        } 
    206212 
    207213        public void stop() { 
    208                 this.state = State.STOPPING; 
     214                this.count--; 
     215                if (this.count == 0) { 
     216                        this.state = State.STOPPING; 
     217                } 
    209218        } 
    210219 
    211220        public void registerComposite(final MediaComposite media) { 
  • modules/org.sophie2.main.layout.mydoggy/src/main/java/org/sophie2/main/layout/mydoggy/MDAppletWindow.java

     
    1515import org.sophie2.base.commons.util.position.ImmSize; 
    1616import org.sophie2.base.layout.impl.DefaultMainWindow; 
    1717import org.sophie2.base.layout.model.MainWindow; 
    18 import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
    1918import org.sophie2.core.mvc.LogicR3; 
    2019import org.sophie2.core.mvc.events.EventR3; 
    2120import org.sophie2.core.prolib.annot.Setup; 
     
    112111                                                private static final long serialVersionUID = 1L; 
    113112 
    114113                                                public void actionPerformed(ActionEvent e) { 
    115                                                         // fire switch to normal mode 
    116114                                                        if (mainWindow().get().mainWindowOptions().get().isInFullscreen()) { 
    117115                                                                LogicR3.fire(new EventR3(mainWindow().get(), 
    118116                                                                                null, null, e, 
    119                                                                                 DefaultMainWindow.EventIds.SET_SCREEN_MODE, 
    120                                                                                 ScreenMode.NORMAL)); 
     117                                                                                DefaultMainWindow.EventIds.QUIT_SCREEN_MODE, 
     118                                                                                mainWindow().get().mainWindowOptions().get().getScreenMode())); 
    121119                                                        } 
    122120                                                } 
    123121 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/view/PresentationItem.java

     
     1package org.sophie2.main.app.menus.view; 
     2 
     3import java.awt.event.KeyEvent; 
     4 
     5import javax.swing.KeyStroke; 
     6 
     7import org.sophie2.base.commons.util.ImageUtil; 
     8import org.sophie2.base.commons.util.ImmImage; 
     9import org.sophie2.base.menus.MenuMember; 
     10import org.sophie2.base.skins.SkinElementId; 
     11import org.sophie2.base.visual.BaseVisualElement; 
     12import org.sophie2.base.visual.skins.ElementPartCreator; 
     13import org.sophie2.base.visual.skins.SkinPartDef; 
     14import org.sophie2.base.visual.skins.VisualElementDef; 
     15import org.sophie2.main.app.commons.util.AppViewUtil; 
     16import org.sophie2.main.app.menus.AppMenuItem; 
     17 
     18/** 
     19 * The <i>View -> Presentation Mode</i> menu item. 
     20 *  
     21 * @author deni 
     22 */ 
     23@SkinElementId("app.menus.view.presentation-menu-item") 
     24@VisualElementDef(parent=ViewMenu.class, sortKey="44-presentation-item") 
     25public class PresentationItem extends AppMenuItem { 
     26         
     27        @SuppressWarnings("unused") 
     28        @SkinPartDef 
     29        private static void defineSkin(ElementPartCreator part) { 
     30                part.add(BaseVisualElement.TITLE_PROP_ID, "Presentation Mode"); 
     31                part.add(BaseVisualElement.TOOL_TIP_PROP_ID, "Use Sophie in presentation mode"); 
     32                part.add(MenuMember.MNEMONIC_PROP_ID, KeyEvent.VK_P); 
     33                part.add(MenuMember.ACCELERATOR_PROP_ID, KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0)); 
     34                part.add(ICON_PROP_ID, ImageUtil.loadIcon("tick.png")); 
     35        } 
     36 
     37        @Override 
     38        protected boolean computeEnabled() { 
     39                return AppViewUtil.getCurrentBookView(this) != null; 
     40        } 
     41         
     42        @Override 
     43        protected ImmImage computeIcon() {               
     44                return null; 
     45        } 
     46} 
  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/model/Flap.java

     
    11package org.sophie2.base.layout.model; 
    22 
     3import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
    34import org.sophie2.base.visual.BaseVisualElement; 
    45import org.sophie2.base.visual.VisualProvider; 
    56import org.sophie2.core.prolib.annot.Own; 
     
    6061                } 
    6162                return getBean().makeProp(tabs.class); 
    6263        } 
     64         
     65        @Override 
     66        public boolean computeVisible() { 
     67                ScreenMode screenMode = parent().get().mainWindowOptions().get().getScreenMode(); 
     68                return !ScreenMode.PRESENTATION.equals(screenMode); 
     69        } 
    6370 
    6471} 
  • modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/BaseSceneVisual.java

     
    4242                } 
    4343                part.addInteraction("M_CONTROL TAB", EventIds.SELECT_NEXT_BOOK); 
    4444                part.addInteraction("M_CONTROL M_SHIFT TAB", EventIds.SELECT_PREVIOUS_BOOK); 
    45  
    4645        } 
    4746 
    4847        /** 
     
    111110                        } 
    112111 
    113112                        @Override 
    114                         protected void setup(JComponent res) { 
     113                        protected void setup(JComponent res) {                           
    115114                                Dimension size = actualViewRect().get().getSize().toDimension(); 
    116115                                res.setSize(size); 
    117116                                res.setPreferredSize(size); 
  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/model/TabBar.java

     
    11package org.sophie2.base.layout.model; 
    22 
     3import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
    34import org.sophie2.base.visual.BaseSwingVisualElement; 
    45import org.sophie2.core.prolib.interfaces.Prop; 
    56 
     
    2122                return getBean().makeParentProp(MainWindow.class); 
    2223        } 
    2324 
    24  
     25        @Override 
     26        public boolean computeVisible() { 
     27                ScreenMode screenMode = parent().get().mainWindowOptions().get().getScreenMode(); 
     28                return !ScreenMode.PRESENTATION.equals(screenMode); 
     29        } 
     30         
    2531} 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/page/NavigationLogic.java

     
     1package org.sophie2.main.app.commons.page; 
     2 
     3import org.sophie2.base.layout.model.MainWindow; 
     4import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
     5import org.sophie2.base.model.resources.r4.ResourceRefList; 
     6import org.sophie2.base.scene.BaseSceneVisual; 
     7import org.sophie2.base.visual.interaction.InputEventR3; 
     8import org.sophie2.base.visual.interaction.Key; 
     9import org.sophie2.core.mvc.EventFilterBuilder; 
     10import org.sophie2.core.mvc.OperationDef; 
     11import org.sophie2.core.mvc.events.EventR3; 
     12import org.sophie2.main.app.commons.book.BookView; 
     13import org.sophie2.main.app.commons.util.AppViewUtil; 
     14 
     15/** 
     16 * Handles events for navigating through the current book. 
     17 *  
     18 * @author deni 
     19 */ 
     20public enum NavigationLogic implements OperationDef { 
     21         
     22        /** 
     23         * Goes to the previous on pressing PageUp key. 
     24         */ 
     25        ON_PAGE_UP { 
     26                 
     27                public void defineFilter(EventFilterBuilder filter) { 
     28                        filter.setSourceClass(BaseSceneVisual.class); 
     29                        filter.setEventId(InputEventR3.KEY_PRESSED); 
     30                        filter.setEventParam(InputEventR3.KEY_PARAM_INDEX, Key.PAGE_UP); 
     31                } 
     32 
     33                @SuppressWarnings("synthetic-access") 
     34                public boolean handle(EventR3 event) { 
     35                        BaseSceneVisual visual = event.getSource(BaseSceneVisual.class); 
     36                        return goToPrevPage(visual); 
     37                }        
     38        }, 
     39         
     40        /** 
     41         * Goes to the next page on pressing PageDown key. 
     42         */ 
     43        ON_PAGE_DOWN { 
     44                 
     45                public void defineFilter(EventFilterBuilder filter) { 
     46                        filter.setSourceClass(BaseSceneVisual.class); 
     47                        filter.setEventId(InputEventR3.KEY_PRESSED); 
     48                        filter.setEventParam(InputEventR3.KEY_PARAM_INDEX, Key.PAGE_DOWN); 
     49                } 
     50 
     51                @SuppressWarnings("synthetic-access") 
     52                public boolean handle(EventR3 event) { 
     53                        BaseSceneVisual visual = event.getSource(BaseSceneVisual.class); 
     54                        return goToNextPage(visual); 
     55                }                
     56        }, 
     57         
     58        /** 
     59         * Goes to the previous page on pressing the left arrow 
     60         * if the current book is in presentation mode. 
     61         */ 
     62        ON_LEFT_ARROW { 
     63                 
     64                public void defineFilter(EventFilterBuilder filter) { 
     65                        filter.setSourceClass(BaseSceneVisual.class); 
     66                        filter.setEventId(InputEventR3.KEY_PRESSED); 
     67                        filter.setEventParam(InputEventR3.KEY_PARAM_INDEX, Key.LEFT); 
     68                } 
     69 
     70                @SuppressWarnings("synthetic-access") 
     71                public boolean handle(EventR3 event) { 
     72                        BaseSceneVisual visual = event.getSource(BaseSceneVisual.class); 
     73                        MainWindow window = AppViewUtil.findMainWindow(visual); 
     74                        ScreenMode screenMode = window.mainWindowOptions().get().getScreenMode(); 
     75                        if (screenMode != ScreenMode.PRESENTATION) { 
     76                                return false; 
     77                        } 
     78                        return goToPrevPage(visual); 
     79                }        
     80        }, 
     81         
     82        /** 
     83         * Goes to the next page on pressing the right arrow 
     84         * if the current book is in presentation mode. 
     85         */ 
     86        ON_RIGHT_ARROW { 
     87                 
     88                public void defineFilter(EventFilterBuilder filter) { 
     89                        filter.setSourceClass(BaseSceneVisual.class); 
     90                        filter.setEventId(InputEventR3.KEY_PRESSED); 
     91                        filter.setEventParam(InputEventR3.KEY_PARAM_INDEX, Key.RIGHT); 
     92                } 
     93 
     94                @SuppressWarnings("synthetic-access") 
     95                public boolean handle(EventR3 event) { 
     96                        BaseSceneVisual visual = event.getSource(BaseSceneVisual.class); 
     97                        MainWindow window = AppViewUtil.findMainWindow(visual); 
     98                        ScreenMode screenMode = window.mainWindowOptions().get().getScreenMode(); 
     99                        if (screenMode != ScreenMode.PRESENTATION) { 
     100                                return false; 
     101                        } 
     102                        return goToNextPage(visual); 
     103                }                
     104        }, 
     105         
     106        /** 
     107         * Goes to the next page on pressing  space 
     108         * if the current book is in presentation mode. 
     109         */ 
     110        ON_SPACE { 
     111                 
     112                public void defineFilter(EventFilterBuilder filter) { 
     113                        filter.setSourceClass(BaseSceneVisual.class); 
     114                        filter.setEventId(InputEventR3.KEY_PRESSED); 
     115                        filter.setEventParam(InputEventR3.KEY_PARAM_INDEX, Key.SPACE); 
     116                } 
     117 
     118                @SuppressWarnings("synthetic-access") 
     119                public boolean handle(EventR3 event) { 
     120                        BaseSceneVisual visual = event.getSource(BaseSceneVisual.class); 
     121                        MainWindow window = AppViewUtil.findMainWindow(visual); 
     122                        ScreenMode screenMode = window.mainWindowOptions().get().getScreenMode(); 
     123                        if (screenMode != ScreenMode.PRESENTATION) { 
     124                                return false; 
     125                        } 
     126                        return goToNextPage(visual); 
     127                }        
     128        }; 
     129         
     130        private static boolean goToPrevPage(BaseSceneVisual visual) {            
     131                BookView bookView = AppViewUtil.getCurrentBookView(visual); 
     132                if (bookView == null) { 
     133                        return false; 
     134                } 
     135                 
     136                int index = bookView.getCurPageIndex() - 1; 
     137                if (index < 0) { 
     138                        return false; 
     139                } 
     140                 
     141                ResourceRefList pages = bookView.model().get().getPages(); 
     142                bookView.goToPage(pages.get(index)); 
     143                 
     144                return true; 
     145        } 
     146         
     147        private static boolean goToNextPage(BaseSceneVisual visual) { 
     148                BookView bookView = AppViewUtil.getCurrentBookView(visual); 
     149                if (bookView == null) { 
     150                        return false; 
     151                } 
     152                 
     153                int index = bookView.getCurPageIndex() + 1;                      
     154                ResourceRefList pages = bookView.model().get().getPages(); 
     155                if (index >= pages.size()) { 
     156                        return false; 
     157                } 
     158                bookView.goToPage(pages.get(index)); 
     159                 
     160                return true; 
     161        } 
     162 
     163} 
  • modules/org.sophie2.main.layout.mydoggy/src/main/java/org/sophie2/main/layout/mydoggy/MDMainWindow.java

     
    424424                                this.helper.removeAll(); 
    425425 
    426426                                MainWindow mainWindow = mainWindow().get(); 
     427                                MainWindowOptions options = mainWindow.mainWindowOptions().get(); 
    427428 
    428                                 if (!mainWindow.mainWindowOptions().get().isSdi()) { 
     429                                if (options.isSdi() || ScreenMode.PRESENTATION.equals(options.getScreenMode())) { 
    429430 
     431                                        if (mainWindow.desktopDocument().get() != null) { 
     432                                                registerDesktopScrollPane( 
     433                                                                mainWindow.desktopDocument().get().swingComponent().get()); 
     434                                        } 
     435 
     436                                } else { 
     437                                         
    430438                                        if (mainWindow.tabBar().get() != null) { 
    431439                                                this.helper.add(mainWindow.tabBar().get().swingComponent().get(),  
    432440                                                                BorderLayout.NORTH); 
     
    435443                                        this.helper.add(desktopScrollPane().get(), BorderLayout.CENTER); 
    436444 
    437445                                        registerDesktopScrollPane(this.helper); 
    438                                 } else { 
    439  
    440                                         if (mainWindow.desktopDocument().get() != null) { 
    441                                                 registerDesktopScrollPane( 
    442                                                                 mainWindow.desktopDocument().get().swingComponent().get()); 
    443                                         } 
     446                                         
    444447                                } 
    445448                        } 
    446449 
     
    505508                                mw.mainWindowOptions().set( 
    506509                                                new MainWindowOptions(screenMode, WindowsState.CUSTOM)); 
    507510                        } 
     511                         
     512                        @SuppressWarnings("unused") 
     513                        @Setup 
     514                        protected void setupRootPaneStyle(Void res) { 
     515                                ScreenMode screenMode = mainWindow().get().mainWindowOptions().get().getScreenMode(); 
     516                                if (!ScreenMode.PRESENTATION.equals(screenMode)) { 
     517                                        toolWindowManager().get().setName(SKIN_ELEMENT_ID + "/root-panel"); 
     518                                } else { 
     519                                        toolWindowManager().get().setName(null); 
     520                                } 
     521                        } 
    508522 
    509523                        @SuppressWarnings("unused") 
    510524                        @Setup 
     
    665679         */ 
    666680        private void registerFlap(MDFlap mdFlap) { 
    667681                 
    668                 if (mdFlap == null) { 
     682                if (mdFlap == null || !mdFlap.visible().get()) { 
    669683                        // No flap, no tabs. 
     684                        toolWindowManager().get().unregisterAllToolWindow(); 
    670685                        return; 
    671686                } 
    672687                 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/view/ViewMenuLogic.java

     
    11package org.sophie2.main.app.menus.view; 
    22 
     3import java.awt.Dimension; 
     4import java.awt.Toolkit; 
     5 
     6import org.sophie2.base.commons.util.position.ImmPoint; 
     7import org.sophie2.base.commons.util.position.ImmRect; 
     8import org.sophie2.base.commons.util.position.ImmSize; 
     9import org.sophie2.base.layout.BaseLayoutModule; 
     10import org.sophie2.base.layout.LayoutEngine; 
    311import org.sophie2.base.layout.impl.DefaultMainWindow; 
     12import org.sophie2.base.layout.model.MainWindow; 
    413import org.sophie2.base.layout.model.MainWindowOptions; 
     14import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
    515import org.sophie2.base.menus.MenuItem; 
     16import org.sophie2.base.model.book.BookH; 
     17import org.sophie2.base.model.resources.r4.ResourceRefR4; 
     18import org.sophie2.base.scene.SceneVisual; 
    619import org.sophie2.core.modularity.SortKey; 
    720import org.sophie2.core.mvc.EventFilterBuilder; 
    821import org.sophie2.core.mvc.LogicR3; 
    922import org.sophie2.core.mvc.OperationDef; 
    1023import org.sophie2.core.mvc.events.EventR3; 
    1124import org.sophie2.main.app.commons.app.AppMainWindow; 
     25import org.sophie2.main.app.commons.book.BaseBookDocView; 
     26import org.sophie2.main.app.commons.book.BaseBookView; 
     27import org.sophie2.main.app.commons.book.BookDocView; 
     28import org.sophie2.main.app.commons.book.panels.NavigationPanel; 
    1229import org.sophie2.main.app.commons.util.AppViewUtil; 
    1330 
    1431/** 
     
    3451                        FullScreenItem source = event.getSource(FullScreenItem.class); 
    3552                        AppMainWindow mainWindow = AppViewUtil.findMainWindow(source); 
    3653 
    37                         if (!mainWindow.mainWindowOptions().get().isInFullscreen()) { 
    38  
     54                        ScreenMode screenMode = mainWindow.mainWindowOptions().get().getScreenMode(); 
     55                        if (!ScreenMode.FULLSCREEN.equals(screenMode)) { 
    3956                                return LogicR3.fire(mainWindow, null, null, null, 
    4057                                                DefaultMainWindow.EventIds.SET_SCREEN_MODE, 
    4158                                                MainWindowOptions.ScreenMode.FULLSCREEN); 
    4259                        } 
    4360 
    4461                        return LogicR3.fire(mainWindow, null, null, null, 
     62                                        DefaultMainWindow.EventIds.QUIT_SCREEN_MODE, 
     63                                        ScreenMode.FULLSCREEN); 
     64                } 
     65        }, 
     66         
     67        /** 
     68         * Handles a user request to go in presentation mode. Opens a new {@link MainWindow} 
     69         * showing the current book in preview mode as a desktop document. The new window has  
     70         * appropriate {@link MainWindowOptions}, but it is responsibility of the layout to actually 
     71         * display the presentation mode. 
     72         */ 
     73        @SortKey("rrt-set-presentation-mode") 
     74        ON_PRESENTATION_MODE { 
     75                public void defineFilter(EventFilterBuilder filter) { 
     76                        filter.setSourceClass(PresentationItem.class); 
     77                        filter.setEventId(MenuItem.EventIds.CLICKED); 
     78                } 
     79 
     80                public boolean handle(EventR3 event) { 
     81                        PresentationItem source = event.getSource(PresentationItem.class); 
     82                        BookH book = AppViewUtil.getCurrentBook(source); 
     83                         
     84                        AppMainWindow newWindow = new AppMainWindow(); 
     85                        BaseBookDocView bdw = new BookDocView(book.getAccess()); 
     86                         
     87                        // open in preview 
     88                        if (!bdw.bookView().get().getViewOptions().isPreviewMode()) { 
     89                                newWindow.documents().add(bdw); 
     90                                BaseBookDocView previewBdw = bdw.preview(); 
     91                                LogicR3.fire(bdw, previewBdw,   
     92                                                null, null, NavigationPanel.EventIds.OPEN_PREVIEW, false); 
     93                                ResourceRefR4 currentPage =  
     94                                        bdw.bookView().get().getCurrentPageView().model().get().getRef(); 
     95                                previewBdw.bookView().get().goToPage(currentPage.getThisChildRef()); 
     96                                 
     97                                bdw = previewBdw; 
     98                        } 
     99                        newWindow.desktopDocument().set(bdw); 
     100                         
     101                        // modify zoom 
     102                        ImmSize pageSize = book.getPageSize();                   
     103                        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     104                         
     105                        SceneVisual sv = bdw.workArea().get().sceneVisual().get(); 
     106                        sv.wantedViewRect().set(new ImmRect(ImmPoint.ZERO, new ImmSize(screenSize))); 
     107 
     108                        float widthRatio = screenSize.width / pageSize.getWidth(); 
     109                        float heigthRatio = screenSize.height / pageSize.getHeight(); 
     110                        float zoom = widthRatio < heigthRatio ? widthRatio : heigthRatio;                        
     111                        BaseBookView bookView = bdw.bookView().get(); 
     112                        bookView.setViewOptions(bookView.getViewOptions().modifyZoom(zoom)); 
     113                                                 
     114                        LayoutEngine engine = BaseLayoutModule.get().showDefaultEngine(); 
     115                        engine.mainWindows().add(newWindow); 
     116                         
     117                        // set desktop as current document 
     118                        boolean minimizedAll = LogicR3.fire(newWindow, null, null, null, 
     119                                        DefaultMainWindow.EventIds.ARRANGE_WINDOWS, 
     120                                        MainWindowOptions.WindowsState.ALL_MINIMIZED); 
     121                        assert minimizedAll : "Could not minimize all windows and set desktop document to current"; 
     122 
     123                        // change the screen mode 
     124                        boolean presentationModeOpened = LogicR3.fire(newWindow, null, null, null, 
    45125                                        DefaultMainWindow.EventIds.SET_SCREEN_MODE, 
    46                                         MainWindowOptions.ScreenMode.NORMAL); 
     126                                        MainWindowOptions.ScreenMode.PRESENTATION); 
     127                        assert presentationModeOpened : "Could not open presentation mode";      
     128                         
     129                        // request focus in window, so that navigation works 
     130                        bdw.workArea().get().sceneVisual().get().swingComponent().get().requestFocusInWindow(); 
     131                         
     132                        return true; 
    47133                } 
    48134        }, 
    49135 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/MainAppModule.java

     
    6262import org.sophie2.main.app.commons.links.LinkProcessorLogic; 
    6363import org.sophie2.main.app.commons.page.ExtraPageView; 
    6464import org.sophie2.main.app.commons.page.MainPageView; 
     65import org.sophie2.main.app.commons.page.NavigationLogic; 
    6566import org.sophie2.main.app.commons.page.PageWorkArea; 
    6667import org.sophie2.main.app.commons.page.RootPageView; 
    6768import org.sophie2.main.app.commons.page.ScenePageLogic; 
     
    212213                        SimpleOperation.fillExtensions(res, LinkProcessorLogic.class); 
    213214                        SimpleOperation.fillExtensions(res, MainWindowLogic.class); 
    214215                        SimpleOperation.fillExtensions(res, BookPanelLogic.class); 
     216                        SimpleOperation.fillExtensions(res, NavigationLogic.class); 
    215217                         
    216218                        SimpleOperation.fillExtensions(res, CreateTemplateDialog.DialogLogic.class); 
    217219                                                 
  • modules/org.sophie2.main.layout.mydoggy/src/main/java/org/sophie2/main/layout/mydoggy/MDFlap.java

     
    101101                } 
    102102                return getBean().makeProp(subElements.class); 
    103103        } 
     104         
     105        @Override 
     106        public boolean computeVisible() { 
     107                return model().get().visible().get(); 
     108        } 
    104109} 
  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/BaseLayoutModule.java

     
    5353        protected void defineExtensions(List<SophieExtension<?>> res) { 
    5454                SimpleOperation.fillExtensions(res, ListPaletteSeparatorLogic.class); 
    5555        } 
     56         
     57        private LayoutEngine defaultEngine = null;  
    5658 
    5759        /** 
    5860         * This method creates the default engine (from appropriate provider). 
     
    6264         *                      The created engine or null if none. 
    6365         */ 
    6466        public LayoutEngine showDefaultEngine() { 
    65                 VisualProvider visualProvider = 
    66                         BaseVisualModule.get().findProvider(LayoutEngine.class, null, null); 
    67                 if (visualProvider == null) { 
    68                         SophieLog.warn("Showing default engine failed. Cannot find provider for LayoutEngine"); 
    69                         return null; 
     67                if (this.defaultEngine == null) {                
     68                        VisualProvider visualProvider = 
     69                                BaseVisualModule.get().findProvider(LayoutEngine.class, null, null); 
     70                        if (visualProvider == null) { 
     71                                SophieLog.warn("Showing default engine failed. Cannot find provider for LayoutEngine"); 
     72                                return null; 
     73                        }                        
     74                        this.defaultEngine = visualProvider.create(LayoutEngine.class); 
    7075                } 
    71                 return visualProvider.create(LayoutEngine.class); 
     76                 
     77                return this.defaultEngine; 
    7278        } 
    7379} 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/page/ScenePageLogic.java

     
    128128                                @Override 
    129129                                public void released() { 
    130130                                        pwa.selectionArea().set(ImmArea.EMPTY); 
     131                                         
     132                                        // set the focus to the scene 
     133                                        pwa.sceneVisual().get().swingComponent().get().requestFocusInWindow(); 
    131134                                } 
    132135 
    133136                                @Override 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/book/BaseBookDocView.java

     
    1010import org.sophie2.base.commons.util.ImageUtil; 
    1111import org.sophie2.base.commons.util.ImmImage; 
    1212import org.sophie2.base.layout.model.DocView; 
     13import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
    1314import org.sophie2.base.media.AudioChunk; 
    1415import org.sophie2.base.media.MediaComposite; 
    1516import org.sophie2.base.media.TimePos; 
     
    3233import org.sophie2.main.app.commons.app.AppMainWindow; 
    3334import org.sophie2.main.app.commons.app.ResourceDocView; 
    3435import org.sophie2.main.app.commons.page.PageWorkArea; 
     36import org.sophie2.main.app.commons.util.AppViewUtil; 
    3537 
    3638/** 
    3739 * A {@link DocView} that displays a book. It contains a {@link BaseBookView} and its swing 
     
    232234 
    233235                                modelSwing.setLayout(new BorderLayout()); 
    234236 
    235                                 if (bookView().get().getViewOptions().isShowViewControls()) { 
     237                                AppMainWindow mainWindow = AppViewUtil.findMainWindow(bookView().get()); 
     238                                if (mainWindow == null) { 
     239                                        return null; 
     240                                } 
     241                                ScreenMode screenMode = mainWindow.mainWindowOptions().get().getScreenMode(); 
     242                                if (!ScreenMode.PRESENTATION.equals(screenMode) 
     243                                                && bookView().get().getViewOptions().isShowViewControls()) { 
    236244                                        modelSwing.add(viewOptionsScrollPane().get().swingComponent(), BorderLayout.NORTH); 
    237245                                        modelSwing.add(workAreaPane().get(), BorderLayout.CENTER); 
    238246                                } else { 
  • modules/org.sophie2.main.layout.mydoggy/src/main/java/org/sophie2/main/layout/mydoggy/MDFrameWindow.java

     
    2727import org.sophie2.base.layout.impl.DefaultMainWindow; 
    2828import org.sophie2.base.layout.model.MainWindow; 
    2929import org.sophie2.base.layout.model.MainWindowOptions; 
    30 import org.sophie2.base.layout.model.MainWindowOptions.ScreenMode; 
    3130import org.sophie2.base.skins.SkinUtil; 
    3231import org.sophie2.core.modularity.FileEntryManager; 
    3332import org.sophie2.core.mvc.LogicR3; 
     
    121120                                                        long currentTime = System.currentTimeMillis(); 
    122121 
    123122                                                        if (lastOpStart != null) { 
    124                                                                 if ((currentTime - lastOpStart) > LONG_OP_INTERVAL) { 
     123                                                                if ((currentTime - lastOpStart) > LONG_OP_INTERVAL 
     124                                                                                && gcf.isVisible()) { 
    125125                                                                        this.lastSetTime = lastOpStart; 
    126126                                                                        getDialog().setVisible(true); 
    127127                                                                } 
     
    153153                                        } 
    154154 
    155155                                        public void keyReleased(KeyEvent e) { 
     156                                                                                                 
     157                                                if (mainWindow().get() == null) { 
     158                                                        return; 
     159                                                } 
     160                                                MainWindowOptions windowOptions = mainWindow().get().mainWindowOptions().get(); 
     161                                                 
    156162                                                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { 
    157  
    158                                                         if (mainWindow().get() != null 
    159                                                                         && mainWindow().get().mainWindowOptions() 
    160                                                                                         .get().isInFullscreen()) { 
    161                                                                 LogicR3.fire( 
    162                                                                                                 mainWindow().get(), 
    163                                                                                                 null, 
    164                                                                                                 null, 
    165                                                                                                 null, 
    166                                                                                                 DefaultMainWindow.EventIds.SET_SCREEN_MODE, 
    167                                                                                                 MainWindowOptions.ScreenMode.NORMAL); 
     163                                                         
     164                                                        if (windowOptions.isInFullscreen()) { 
     165                                                                LogicR3.fire(mainWindow().get(), null, null, null, 
     166                                                                                DefaultMainWindow.EventIds.QUIT_SCREEN_MODE, 
     167                                                                                mainWindow().get().mainWindowOptions().get().getScreenMode()); 
    168168                                                        } 
    169169                                                } 
    170170                                        } 
     
    241241                                                private static final long serialVersionUID = 1L; 
    242242 
    243243                                                public void actionPerformed(ActionEvent e) { 
    244                                                         // fire switch to normal mode 
    245244                                                        if (mainWindow().get().mainWindowOptions().get().isInFullscreen()) { 
    246245                                                                LogicR3.fire(new EventR3( 
    247246                                                                                                mainWindow().get(), 
    248247                                                                                                null, 
    249248                                                                                                null, 
    250249                                                                                                e, 
    251                                                                                                 DefaultMainWindow.EventIds.SET_SCREEN_MODE, 
    252                                                                                                 ScreenMode.NORMAL)); 
     250                                                                                                DefaultMainWindow.EventIds.QUIT_SCREEN_MODE, 
     251                                                                                                mainWindow().get().mainWindowOptions().get().getScreenMode())); 
    253252                                                        } 
    254253                                                } 
    255254 
  • modules/org.sophie2.main.app.menus/src/main/java/org/sophie2/main/app/menus/view/ViewMenu.java

     
    2020 */ 
    2121@SkinElementId("app.menus.view-menu") 
    2222@VisualElementDef(parent=AppMenuBar.class, sortKey="da-view-menu") 
    23 @RelatedChildren({NormalModeItem.class, FullScreenItem.class}) 
     23@RelatedChildren({NormalModeItem.class, FullScreenItem.class, PresentationItem.class}) 
    2424public class ViewMenu extends AppMenu{ 
    2525 
    2626        @SuppressWarnings("unused") 
  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/impl/DefaultMainWindow.java

     
    4040                 */ 
    4141                @EventParams({ ScreenMode.class }) 
    4242                SET_SCREEN_MODE, 
     43                 
     44                /** 
     45                 * The user has requested to quit the current {@link ScreenMode}. 
     46                 */ 
     47                @EventParams({ ScreenMode.class }) 
     48                QUIT_SCREEN_MODE, 
    4349 
    4450                /** 
    4551                 * The user has requested to rearrange the open document windows. 
     
    5460                CLOSE; 
    5561 
    5662                /** 
    57                  * The index of the parameter for the {@link EventIds#SET_SCREEN_MODE} 
    58                  * and {@link EventIds#ARRANGE_WINDOWS} events. 
     63                 * The index of the parameter for the {@link EventIds#SET_SCREEN_MODE}, 
     64                 * {@link EventIds#QUIT_SCREEN_MODE} and {@link EventIds#ARRANGE_WINDOWS} events. 
    5965                 */ 
    6066                public static final int PARAM_INDEX = 0; 
    6167        } 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/app/MainWindowLogic.java

     
    44import java.util.List; 
    55 
    66import org.osgi.framework.BundleException; 
     7import org.sophie2.base.layout.BaseLayoutModule; 
     8import org.sophie2.base.layout.LayoutEngine; 
    79import org.sophie2.base.layout.impl.DefaultDocView; 
    810import org.sophie2.base.layout.impl.DefaultMainWindow; 
    911import org.sophie2.base.layout.model.DocView; 
     
    5860        }, 
    5961         
    6062        /** 
     63         * Handles a user request to quit fullscreen mode. 
     64         *  
     65         * @author deni 
     66         */ 
     67        @SortKey("uuu-close-fullscreen-mode") 
     68        ON_QUIT_FULLSCREEN_MODE { 
     69 
     70                public void defineFilter(EventFilterBuilder filter) { 
     71                        filter.setEventId(DefaultMainWindow.EventIds.QUIT_SCREEN_MODE); 
     72                        filter.setEventParam(DefaultMainWindow.EventIds.PARAM_INDEX, ScreenMode.FULLSCREEN); 
     73                        filter.setSourceClass(DefaultMainWindow.class); 
     74                } 
     75 
     76                public boolean handle(EventR3 event) { 
     77                        DefaultMainWindow mainWindow = event.getSource(DefaultMainWindow.class); 
     78                        return  LogicR3.fire(mainWindow, null, null, null, 
     79                                        DefaultMainWindow.EventIds.SET_SCREEN_MODE, 
     80                                        MainWindowOptions.ScreenMode.NORMAL); 
     81                } 
     82        }, 
     83         
     84        /** 
     85         * Handles a user request to quit presentation mode. 
     86         * In fact, closes the window in presentation mode. 
     87         *  
     88         * @author deni 
     89         */ 
     90        @SortKey("uuu-close-presentation-mode") 
     91        ON_QUIT_PRESENTATION_MODE { 
     92 
     93                public void defineFilter(EventFilterBuilder filter) { 
     94                        filter.setEventId(DefaultMainWindow.EventIds.QUIT_SCREEN_MODE); 
     95                        filter.setEventParam(DefaultMainWindow.EventIds.PARAM_INDEX, ScreenMode.PRESENTATION); 
     96                        filter.setSourceClass(DefaultMainWindow.class); 
     97                } 
     98 
     99                public boolean handle(EventR3 event) { 
     100                        DefaultMainWindow mainWindow = event.getSource(DefaultMainWindow.class); 
     101                         
     102                        LayoutEngine engine = BaseLayoutModule.get().showDefaultEngine(); 
     103                        engine.mainWindows().remove(engine.mainWindows().get().indexOf(mainWindow)); 
     104                         
     105                        System.out.println(engine.mainWindows().get().size()); 
     106                         
     107                        return true; 
     108                } 
     109        }, 
     110         
     111        /** 
    61112         * Handles a user request to rearrange the open windows. Sets the 
    62113         * appropriate {@link MainWindowOptions} to the {@link MainWindow}. Layout 
    63114         * is then responsible for the actual rearrangement.