Ticket #2307: dnd-visual-indication-templates.patch

File dnd-visual-indication-templates.patch, 17.7 KB (added by deni, 15 years ago)
  • TabularUnified src/main/java/org/sophie2/base/scene/helpers/ElementHelper.java

    ### Eclipse Workspace Patch 1.0
    #P org.sophie2.base.scene
     
    279279        public void touch() { 
    280280                getEffectiveTransform(); 
    281281                getVisibleArea(); 
     282                getElement().effects().get(); 
    282283                drawContent((Graphics2D)null); 
    283284        } 
    284285 
    
          
  • TabularUnified src/main/java/org/sophie2/main/app/commons/page/RootPageView.java

    #P org.sophie2.main.app.commons
     
    7272         *  
    7373         * @return The property. 
    7474         */ 
    75         public AutoProperty<PartPageView> mainPartView() { 
    76                 class mainPartView extends AutoProperty<PartPageView> { 
     75        public AutoProperty<MainPageView> mainPartView() { 
     76                class mainPartView extends AutoProperty<MainPageView> { 
    7777 
    7878                        @Override 
    79                         protected PartPageView compute() { 
     79                        protected MainPageView compute() { 
    8080                                if (getLastValue() == null) { 
    81                                         return AppViewUtil.getView(RootPageView.this, getAccess(), PartPageView.class); 
     81                                        return AppViewUtil.getView(RootPageView.this, getAccess(), MainPageView.class); 
    8282                                } 
    8383                                return getLastValue(); 
    8484                        } 
    
          
  • TabularUnified src/main/java/org/sophie2/main/app/commons/page/MainPageView.java

     
    33import java.util.Arrays; 
    44import java.util.List; 
    55 
     6import org.sophie2.base.commons.util.ImmColor; 
    67import org.sophie2.base.commons.util.position.ImmArea; 
    78import org.sophie2.base.commons.util.position.ImmPoint; 
    89import org.sophie2.base.commons.util.position.ImmRect; 
    910import org.sophie2.base.model.book.PageLinkTriggers; 
     11import org.sophie2.base.model.book.frame.BoundMode; 
    1012import org.sophie2.base.model.book.links.LinkTrigger; 
    1113import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
    1214import org.sophie2.base.scene.effects.ClipEffect; 
    1315import org.sophie2.base.scene.impl.DefaultCompositeSceneElement; 
     16import org.sophie2.base.scene.impl.DefaultShapeSceneElement; 
     17import org.sophie2.base.scene.interfaces.SceneElement; 
     18import org.sophie2.core.prolib.impl.AutoProperty; 
     19import org.sophie2.core.prolib.interfaces.Prop; 
     20import org.sophie2.core.prolib.interfaces.RwProp; 
     21import org.sophie2.main.app.commons.frame.ContentManipulationView; 
    1422 
    1523/** 
    1624 * A view for all page elements. 
     
    4654        protected List<LinkTrigger> getLinkTriggers() { 
    4755                 return Arrays.<LinkTrigger>asList(PageLinkTriggers.values()); 
    4856        } 
     57         
     58        @Override 
     59        protected void setupSceneElements(List<SceneElement> res) {              
     60                if (!ImmColor.TRANSPARENT.equals(dndVisualIndicationColor().get())) { 
     61                        res.add(dndVisualIndicationElement().get()); 
     62                } 
     63 
     64                super.setupSceneElements(res); 
     65        } 
     66         
     67        public RwProp<ImmColor> dndVisualIndicationColor() { 
     68                return getBean().makeValueProp("dndVisualIndicationColor", ImmColor.class, ImmColor.TRANSPARENT); 
     69        } 
     70         
     71        public RwProp<ImmRect> dndVisualIndicationRect() { 
     72                return getBean().makeValueProp("dndVisualIndicationRect", ImmRect.class, ImmRect.ZERO_RECT); 
     73        } 
     74         
     75        private Prop<SceneElement> dndVisualIndicationElement() { 
     76                class dndVisualIndicationElement extends AutoProperty<SceneElement> { 
     77 
     78                        @Override 
     79                        protected SceneElement compute() { 
     80                                return new DefaultShapeSceneElement() { 
     81                                         
     82                                        @Override 
     83                                        protected void setupDynamic() { 
     84                                                shape().set(new ImmArea(dndVisualIndicationRect().get())); 
     85                                                 
     86                                                filling().set(dndVisualIndicationColor().get()); 
     87                                        } 
     88                                }; 
     89                        } 
     90 
     91                }                
     92                return getBean().makeProp(dndVisualIndicationElement.class); 
     93        } 
     94         
    4995} 
    
          
  • TabularUnified src/main/java/org/sophie2/main/app/commons/frame/FrameViewLogic.java

     
    11package org.sophie2.main.app.commons.frame; 
    22 
     3import org.sophie2.base.commons.util.ImmColor; 
    34import org.sophie2.base.commons.util.position.ImmPoint; 
    45import org.sophie2.base.dnd.DndTransferable; 
    56import org.sophie2.base.dnd.SophieDragDropHandler; 
     
    1213import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
    1314import org.sophie2.base.model.resources.r4.changes.AutoAction; 
    1415import org.sophie2.base.model.resources.r4.changes.ResourceChanger; 
     16import org.sophie2.base.visual.interaction.InputEventR3; 
    1517import org.sophie2.core.mvc.EventFilterBuilder; 
    1618import org.sophie2.core.mvc.OperationDef; 
    1719import org.sophie2.core.mvc.SortKey; 
    1820import org.sophie2.core.mvc.events.EventR3; 
    1921import org.sophie2.main.app.commons.book.BookView; 
     22import org.sophie2.main.app.commons.page.MainPageView; 
    2023import org.sophie2.main.dnd.dnddata.ResourceRefData; 
    2124 
    2225/** 
     
    2528 * @author tanya 
    2629 */ 
    2730public enum FrameViewLogic implements OperationDef { 
     31         
     32        /** 
     33         * Removes the DnD visual indication of a frame. 
     34         */ 
     35        // TODO: should handle a DRAG_ENTER event (which will be created soon) 
     36        ON_MOUSE_EXITED_FRAME { 
    2837 
     38                public void defineFilter(EventFilterBuilder filter) { 
     39                        filter.setSourceClass(FrameView.class); 
     40                        filter.setEventId(InputEventR3.MOUSE_EXITED); 
     41                } 
     42 
     43                public boolean handle(EventR3 event) { 
     44                        FrameView frameView = event.getSource(FrameView.class); 
     45                         
     46                        frameView.dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 
     47                         
     48                        System.out.println("<><><><><>"); 
     49                         
     50                        return false; 
     51                }                
     52        }, 
     53         
    2954        /** 
     55         * Removes the DnD visual indication of a page. 
     56         */ 
     57        // TODO: should handle a DRAG_ENTER event (which will be created soon) 
     58        // TODO: maybe move somewhere else? 
     59        ON_MOUSE_EXITED { 
     60 
     61                public void defineFilter(EventFilterBuilder filter) { 
     62                        filter.setSourceClass(MainPageView.class); 
     63                        filter.setEventId(InputEventR3.MOUSE_EXITED); 
     64                } 
     65 
     66                public boolean handle(EventR3 event) { 
     67                        MainPageView pageView = event.getSource(MainPageView.class); 
     68                         
     69                        pageView.dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 
     70                         
     71                        return false; 
     72                }                
     73        }, 
     74 
     75        /** 
    3076         * Handles dropping images over the padding of frame. For now, if handles events  
    3177         * only if {@link ResourceRefData} is transferred. 
    3278         */ 
    
          
  • TabularUnified src/main/java/org/sophie2/main/app/commons/page/ScenePageLogic.java

     
    232232                } 
    233233        }, 
    234234 
    235         /** 
    236          * Handles pre-importing on data in drag'n'drop operation. Defines whether 
    237          * the transferred {@link DndData} can be imported. Responsible for 
    238          * {@link SophieDragDropHandler#dragOver}. 
    239          */ 
    240         ON_DND_PRE_IMPORT { 
     235//      /** 
     236//       * Handles pre-importing on data in drag'n'drop operation. Defines whether 
     237//       * the transferred {@link DndData} can be imported. Responsible for 
     238//       * {@link SophieDragDropHandler#dragOver}. 
     239//       */ 
     240//      ON_DND_PRE_IMPORT { 
     241// 
     242//              public void defineFilter(EventFilterBuilder filter) { 
     243//                      filter.setSourceClass(PageWorkArea.class); 
     244//                      filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT); 
     245//              } 
     246// 
     247//              @SuppressWarnings("unchecked") 
     248//              public boolean handle(EventR3 event) { 
     249// 
     250//                      SophieLog.info(event); 
     251// 
     252//                      PageWorkArea pwa = event.getSource(PageWorkArea.class); 
     253// 
     254//                      BookDocView bookDocView = pwa.findParentElement(BookDocView.class); 
     255//                      if (bookDocView != null) { 
     256//                              BookViewOptions viewOptions = bookDocView.bookView().get().getViewOptions(); 
     257//                               
     258//                              // Forbid drop over books in preview mode. 
     259//                              if (!viewOptions.isPreviewMode()) { 
     260// 
     261//                                      DndPreImport preImport = event.getEventParam( 
     262//                                                      SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 
     263//                                                      DndPreImport.class); 
     264// 
     265//                                      preImport.setImportable(ResourceRefData.class, ResourceRevisionData.class, 
     266//                                                      RtfData.class, ImageData.class, StringData.class, FileListData.class, 
     267//                                                      TemplateRefData.class); 
     268//                              } 
     269//                      } 
     270//                      return true; 
     271//              } 
     272//      }, 
    241273 
    242                 public void defineFilter(EventFilterBuilder filter) { 
    243                         filter.setSourceClass(PageWorkArea.class); 
    244                         filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT); 
    245                 } 
    246  
    247                 @SuppressWarnings("unchecked") 
    248                 public boolean handle(EventR3 event) { 
    249  
    250                         SophieLog.info(event); 
    251  
    252                         PageWorkArea pwa = event.getSource(PageWorkArea.class); 
    253  
    254                         BookDocView bookDocView = pwa.findParentElement(BookDocView.class); 
    255                         if (bookDocView != null) { 
    256                                 BookViewOptions viewOptions = bookDocView.bookView().get().getViewOptions(); 
    257                                  
    258                                 // Forbid drop over books in preview mode. 
    259                                 if (!viewOptions.isPreviewMode()) { 
    260  
    261                                         DndPreImport preImport = event.getEventParam( 
    262                                                         SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 
    263                                                         DndPreImport.class); 
    264  
    265                                         preImport.setImportable(ResourceRefData.class, ResourceRevisionData.class, 
    266                                                         RtfData.class, ImageData.class, StringData.class, FileListData.class, 
    267                                                         TemplateRefData.class); 
    268                                 } 
    269                         } 
    270                         return true; 
    271                 } 
    272         }, 
    273  
    274274        /** 
    275275         * Returns the swing focus to the scene after closing a hud.  
    276276         */ 
    
          
  • TabularUnified src/main/java/org/sophie2/main/app/commons/frame/FrameView.java

     
    3737import org.sophie2.base.scene.impl.DefaultShapeSceneElement; 
    3838import org.sophie2.base.scene.impl.DefaultTextSceneElement; 
    3939import org.sophie2.base.scene.interfaces.Scene; 
     40import org.sophie2.base.scene.interfaces.SceneEffect; 
    4041import org.sophie2.base.scene.interfaces.SceneElement; 
    4142import org.sophie2.base.scene.model.LineStyle; 
    4243import org.sophie2.base.scene.model.SceneTextRun; 
     
    155156                if (!getViewOptions().isPreviewMode()) { 
    156157                        res.add(resizeArea().get()); 
    157158                } 
     159                 
     160                if (!ImmColor.TRANSPARENT.equals(dndVisualIndicationColor().get())) { 
     161                        res.add(dndVisualIndicationElement().get()); 
     162                } 
    158163 
    159164                super.setupSceneElements(res); 
    160165        } 
     
    183188                                                                shadowOpacity)); 
    184189                                 
    185190                                element.effects().add(shadow); 
    186                                  
    187                         }  
    188                          
     191                        }                
    189192                } 
    190193                 
    191194        } 
    192195         
     196        public RwProp<ImmColor> dndVisualIndicationColor() { 
     197                return getBean().makeValueProp("dndVisualIndicationColor", ImmColor.class, ImmColor.TRANSPARENT); 
     198        } 
     199         
     200        public RwProp<BoundMode> dndVisualIndicationBoundMode() { 
     201                return getBean().makeValueProp("dndVisualIndicationBoundMode", BoundMode.class, BoundMode.CONTENT); 
     202        } 
     203         
     204        private Prop<SceneElement> dndVisualIndicationElement() { 
     205                class dndVisualIndicationElement extends AutoProperty<SceneElement> { 
     206 
     207                        @Override 
     208                        protected SceneElement compute() { 
     209                                return new DefaultShapeSceneElement() { 
     210                                         
     211                                        @Override 
     212                                        protected void setupDynamic() { 
     213                                                ImmRect rect = getLocalRect(dndVisualIndicationBoundMode().get()); 
     214                                                shape().set(new ImmArea(rect)); 
     215                                                 
     216                                                filling().set(dndVisualIndicationColor().get()); 
     217                                        } 
     218                                }; 
     219                        } 
     220 
     221                }                
     222                return getBean().makeProp(dndVisualIndicationElement.class); 
     223        } 
     224         
    193225        /** 
    194226         * The scene element representing the frame border (the actual border). 
    195227         *  
    
          
  • TabularUnified src/main/java/org/sophie2/base/dnd/SophieDragDropHandler.java

    #P org.sophie2.base.dnd
     
    157157                 */ 
    158158                public void setImportable(Class<? extends DndData>... supported) { 
    159159 
    160                         this.importable = false; 
    161  
    162160                        for (Class<? extends DndData> dndData : supported) { 
    163161 
    164162                                if (getTransferable().isDndDataSupported(dndData)) { 
    
          
  • TabularUnified src/main/java/org/sophie2/main/app/layout/right/library/LibraryTabLogic.java

    #P org.sophie2.main.app.layout
     
    22 
    33import javax.swing.JComponent; 
    44 
     5import org.sophie2.base.commons.util.ImmColor; 
    56import org.sophie2.base.commons.util.ImmList; 
    67import org.sophie2.base.commons.util.NaiveImmList; 
    78import org.sophie2.base.commons.util.position.ImmPoint; 
     9import org.sophie2.base.commons.util.position.ImmRect; 
    810import org.sophie2.base.dialogs.DialogManager; 
    911import org.sophie2.base.dnd.DndTransferable; 
    1012import org.sophie2.base.dnd.SophieDragDropHandler; 
    1113import org.sophie2.base.dnd.SophieTransferable; 
    1214import org.sophie2.base.dnd.SophieDragDropHandler.DndExport; 
    1315import org.sophie2.base.dnd.SophieDragDropHandler.DndImport; 
     16import org.sophie2.base.dnd.SophieDragDropHandler.DndPreImport; 
    1417import org.sophie2.base.layout.model.ListPalette; 
    1518import org.sophie2.base.model.book.BookH; 
    1619import org.sophie2.base.model.book.FrameH; 
    1720import org.sophie2.base.model.book.PageH; 
     21import org.sophie2.base.model.book.frame.BoundMode; 
    1822import org.sophie2.base.model.book.frame.FrameR4; 
    1923import org.sophie2.base.model.book.interfaces.CompositeElement; 
    2024import org.sophie2.base.model.book.resource.r4.BookR4; 
     
    3943import org.sophie2.main.app.commons.app.AppMainWindow; 
    4044import org.sophie2.main.app.commons.book.BookDocView; 
    4145import org.sophie2.main.app.commons.frame.FrameView; 
     46import org.sophie2.main.app.commons.page.MainPageView; 
    4247import org.sophie2.main.app.commons.page.PageWorkArea; 
    4348import org.sophie2.main.app.commons.page.RootPageView; 
    4449import org.sophie2.main.app.commons.util.AppViewUtil; 
     
    195200                        return true; 
    196201                } 
    197202        }, 
     203         
     204        /** 
     205         * Handles pre-importing (dragging) a template over a {@link FrameView}. 
     206         * Adds the appropriate visual indications to the frame view. 
     207         */ 
     208        ON_FRAME_TEMPLATE_PRE_IMPORT { 
    198209 
     210                public void defineFilter(EventFilterBuilder filter) { 
     211                        filter.setSourceClass(FrameView.class); 
     212                        filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT); 
     213                } 
     214 
     215                @SuppressWarnings("unchecked") 
     216                public boolean handle(EventR3 event) { 
     217                        DndPreImport preImport = event.getEventParam( 
     218                                        SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 
     219                                        DndPreImport.class); 
     220                         
     221                        FrameView frameView = event.getSource(FrameView.class); 
     222                        if (frameView.getViewOptions().isPreviewMode()) { 
     223                                return false; 
     224                        } 
     225                         
     226                        preImport.setImportable(TemplateRefData.class); 
     227                        if (!preImport.getImportable()) { 
     228                                return false; 
     229                        } 
     230                         
     231                        // TODO: consider creating FrameTemplateData and PageTemplateData instead of this check 
     232                        TemplateRefData data = preImport.getTransferable().getDndData(TemplateRefData.class); 
     233                        BookH book = AppViewUtil.getCurrentBook(frameView); 
     234                        if (!TemplateUtil.isFrameTemplate(book, data.getTemplateRef())) { 
     235                                return false; 
     236                        } 
     237                         
     238                        frameView.dndVisualIndicationBoundMode().set(BoundMode.OUT_BORDER); 
     239                        frameView.dndVisualIndicationColor().set(new ImmColor(1.0f, 0.68f, 0.68f, 0.5f)); 
     240                                                                 
     241                        return true; 
     242                } 
     243        }, 
     244 
    199245        /** 
    200246         * Handles the dropping a frame template over a {@link FrameView}. 
    201247         * Applies the template to the view's model. 
     
    249295 
    250296                        }.register(frameAccess); 
    251297 
     298                        source.dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 
     299                         
    252300                        return true; 
    253301                } 
    254302 
     
    445493                        return true; 
    446494                } 
    447495        }, 
     496         
     497        /** 
     498         * Handles pre-importing (dragging) a template over a {@link RootPageView}. 
     499         * Adds the appropriate visual indications to the page view. 
     500         */ 
     501        ON_PAGE_TEMPLATE_PRE_IMPORT { 
    448502 
     503                public void defineFilter(EventFilterBuilder filter) { 
     504                        filter.setSourceClass(RootPageView.class); 
     505                        filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT); 
     506                } 
     507 
     508                @SuppressWarnings("unchecked") 
     509                public boolean handle(EventR3 event) { 
     510                        DndPreImport preImport = event.getEventParam( 
     511                                        SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 
     512                                        DndPreImport.class); 
     513                         
     514                        RootPageView pageView = event.getSource(RootPageView.class); 
     515                        if (pageView.getViewOptions().isPreviewMode()) { 
     516                                return false; 
     517                        } 
     518                         
     519                        preImport.setImportable(TemplateRefData.class); 
     520                        if (!preImport.getImportable()) { 
     521                                return false; 
     522                        } 
     523                         
     524                        // TODO: consider creating FrameTemplateData and PageTemplateData instead of this check 
     525                        TemplateRefData data = preImport.getTransferable().getDndData(TemplateRefData.class); 
     526                        BookH book = AppViewUtil.getCurrentBook(pageView); 
     527                        if (!TemplateUtil.isPageTemplate(book, data.getTemplateRef())) { 
     528                                return false; 
     529                        } 
     530                         
     531                        MainPageView mainPageView = pageView.mainPartView().get(); 
     532                        mainPageView.dndVisualIndicationColor().set(new ImmColor(1.0f, 0.68f, 0.68f, 0.5f)); 
     533                         
     534                        ImmRect rect = new ImmRect(ImmPoint.ZERO, book.getPageSize());                   
     535                        mainPageView.dndVisualIndicationRect().set(rect); 
     536                         
     537                        return true; 
     538                } 
     539        }, 
     540 
    449541        /** 
    450542         * Handles dropping a page template over the {@link RootPageView}. 
    451543         * Applies the template to the view's model. 
     
    474566                        DndTransferable transferable = dndImport.getTransferable(); 
    475567 
    476568                        BookH book = source.getBookView().model().get(); 
     569                         
     570                        source.mainPartView().get().dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 
    477571                        return TemplateUtil.applyPageTemplate(transferable, source.model().get(), book); 
    478572                } 
    479573        },