Ticket #1968: 1968_im_fi_ stefan_2.patch

File 1968_im_fi_ stefan_2.patch, 49.2 KB (added by stefan, 9 years ago)
  • modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/frame/rotate/FrameRotateHaloButton.java

    ### Eclipse Workspace Patch 1.0
    #P sophie
     
    2121import org.sophie2.base.skins.Message; 
    2222import org.sophie2.base.skins.SkinElementId; 
    2323import org.sophie2.base.visual.skins.VisualElementDef; 
     24import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2425import org.sophie2.main.app.commons.frame.FrameView; 
    2526import org.sophie2.main.app.commons.page.PageWorkArea; 
    2627import org.sophie2.main.app.halos.common.AppHaloUtil; 
     
    6364                final FrameH frame = frameView.model().get(); 
    6465                final double oldAngle = frame.getRotationAngle(); 
    6566 
    66                 PageWorkArea pwa = AppHaloUtil.getWorkArea(this); 
     67                final PageWorkArea pwa = AppHaloUtil.getWorkArea(this); 
    6768                final Scene scene = pwa.scene().get(); 
    6869                final ImmMatrix sceneToParent = SceneHelper.getElementToSceneTransform(scene, 
    6970                                frameView.parent().get().sceneElement().get()).inverse(); 
     
    8384                final ImmPoint oldControl = sceneToParent.transform(controlInScene); 
    8485 
    8586                final SceneVisual sceneVisual = pwa.sceneVisual().get(); 
    86                 sceneVisual.wantedViewRect().set(sceneVisual.actualViewRect().get()); 
     87                sceneVisual.wantedViewRect().set(sceneVisual.lastViewRect().get()); 
    8788                 
    88                 return new MouseCapture(0, 0, e) { 
     89                return new PageAreaMouseCapture(0, 0, e) { 
    8990 
    9091                        @Override 
    9192                        public void shouldMove(int newX, int newY) { 
     
    100101                        } 
    101102 
    102103                        @Override 
    103                         public void released() { 
     104                        public void onReleased() { 
    104105                                final Double angle = frame.getRotationAngle(); 
    105106                                setAngle(angle, true); 
    106107                                sceneVisual.wantedViewRect().set(null); 
     
    159160 
    160161                        } 
    161162 
     163                        @Override 
     164                        public PageWorkArea getWorkArea() { 
     165                                return pwa; 
     166                        } 
     167 
    162168                }; 
    163169        } 
    164170 
  • modules/org.sophie2.base.commons/src/main/java/org/sophie2/base/commons/util/position/ImmRect.java

     
    348348        public boolean contains(ImmPoint point) { 
    349349                return this.toRectangle().contains(point.toPoint()); 
    350350        } 
     351         
     352        /** 
     353                 * Creates rectangle by given point and size. The given point is the center 
     354                 * point for the rectangle. The size is the size of the rectangle. 
     355                 *  
     356                 * @param centerPoint 
     357                 *            The center of the rectangle. 
     358                 * @param size 
     359                 *            The size of the rectangle. 
     360                 * @return New rectangle. 
     361                 */ 
     362                public static ImmRect create(ImmPoint centerPoint, ImmSize size) { 
     363                        ImmPoint topLeft = new ImmPoint(centerPoint.getX() - size.getWidth()/2,  
     364                                        centerPoint.getY() - size.getHeight()/2); 
     365                        ImmRect res = new ImmRect(topLeft, size); 
     366                         
     367                        return res; 
     368                } 
    351369} 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/PageAreaMouseCapture.java

     
     1package org.sophie2.main.app.commons; 
     2 
     3import java.awt.event.MouseEvent; 
     4 
     5import org.sophie2.base.commons.gui.MouseCapture; 
     6import org.sophie2.main.app.commons.page.PageWorkArea; 
     7 
     8/** 
     9 * Modified {@link MouseCapture} for {@link PageWorkArea}. 
     10 *  
     11 * @author tanya 
     12 */ 
     13public abstract class PageAreaMouseCapture extends MouseCapture { 
     14 
     15        /** 
     16         * Initiates capture.   
     17         * @param initCompX The current X coordinate of the component. 
     18         * @param initCompY The current Y coordinate of the component. 
     19         * @param e The mouse event initiating the capture. 
     20         */ 
     21        public PageAreaMouseCapture(int initCompX, int initCompY, MouseEvent e) { 
     22                super(initCompX, initCompY, e); 
     23                getWorkArea().scrollsLocked().set(Boolean.TRUE); 
     24        } 
     25         
     26        @Override 
     27        final public void released() { 
     28                onReleased(); 
     29                getWorkArea().scrollsLocked().set(Boolean.FALSE); 
     30        } 
     31         
     32        /** 
     33         * Called when the user has released the mouse button. Should be overrided and called in the {@link #released()}. 
     34         */ 
     35        public abstract void onReleased(); 
     36         
     37        /** 
     38         * Returns the {@link PageWorkArea} over which the {@link MouseCapture} is performed. 
     39         *  
     40         * @return {@link PageWorkArea} 
     41         */ 
     42        public abstract PageWorkArea getWorkArea(); 
     43} 
     44 No newline at end of file 
  • modules/org.sophie2.base.layout/src/test/java/org/sophie2/base/layout/model/LayoutDemo.java

     
     1package org.sophie2.base.layout.model; 
     2 
     3import java.awt.BorderLayout; 
     4 
     5import javax.swing.JDesktopPane; 
     6import javax.swing.JFrame; 
     7import javax.swing.JInternalFrame; 
     8import javax.swing.JLayeredPane; 
     9 
     10/** 
     11 * Demo for demonstrating the usage of {@link CustomLayout}. 
     12 * @author tanya 
     13 */ 
     14public class LayoutDemo { 
     15 
     16        /** 
     17         * Constructor that creates {@link JFrame}, adds a {@link JDesktopPane} with 
     18         * {@link CustomLayout} and set different layers to be with different 
     19         * layouts. 
     20         */ 
     21        public LayoutDemo() { 
     22                 
     23                JFrame frame = new JFrame(); 
     24                frame.setSize(300, 300); 
     25                frame.setVisible(true); 
     26                 
     27                JDesktopPane pane = new JDesktopPane(); 
     28                 
     29                frame.setContentPane(pane); 
     30                pane.setLayout(new CustomLayout(new BorderLayout())); 
     31                 
     32                JInternalFrame frame1 = new JInternalFrame(); 
     33                frame1.setLocation(10, 10); 
     34                frame1.setSize(90, 90); 
     35                frame1.setVisible(true); 
     36                 
     37                pane.setLayer(frame1, JLayeredPane.DEFAULT_LAYER); 
     38                 
     39                pane.add(frame1, BorderLayout.CENTER); 
     40                 
     41                JInternalFrame frame2 = new JInternalFrame(); 
     42                frame2.setLocation(110, 110); 
     43                frame2.setSize(90, 90); 
     44                frame2.setVisible(true); 
     45                 
     46                pane.setLayer(frame2, JLayeredPane.PALETTE_LAYER); 
     47                 
     48                pane.add(frame2, CustomLayout.CUSTOM); 
     49        } 
     50         
     51        /** 
     52         * The main method. 
     53         * @param args 
     54         */ 
     55        public static void main(String args[]) { 
     56                new LayoutDemo(); 
     57        } 
     58} 
     59 
  • modules/org.sophie2.extra.func.annotations/src/main/java/org/sophie2/extra/func/annotations/view/halos/StickyMoveHaloButton.java

     
    1717import org.sophie2.base.skins.SkinElementId; 
    1818import org.sophie2.base.visual.skins.VisualElementDef; 
    1919import org.sophie2.extra.func.annotations.view.StickyView; 
     20import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2021import org.sophie2.main.app.commons.page.PageWorkArea; 
    2122import org.sophie2.main.app.halos.page.element.PageElementMoveHaloButton; 
    2223 
     
    4950                // lock the view rect, so that we don't have auto-scrolls while moving. 
    5051                final PageWorkArea workArea = workArea().get(); 
    5152                final SceneVisual sv = workArea.sceneVisual().get(); 
    52                 sv.wantedViewRect().set(sv.actualViewRect().get()); 
     53                sv.wantedViewRect().set(sv.lastViewRect().get()); 
    5354 
    5455                StickyView stickyView = findParentElement(StickyHaloMenu.class).stickyView().get();  
    5556                final TimePos time = stickyView.getTime();   
     
    6263                                workArea.getSel().getEditScope().sceneElement().get()).inverse();  
    6364                final ImmPoint zero = sceneToParent.transform(ImmPoint.ZERO);  
    6465 
    65                 MouseCapture result = new MouseCapture(0, 0, e) { 
     66                MouseCapture result = new PageAreaMouseCapture(0, 0, e) { 
    6667 
    6768                        private void releaseAction(final LocationChannel locationChannel) { 
    6869                                final ImmPoint newlocation =  
     
    9596                        } 
    9697 
    9798                        @Override 
    98                         public void released() { 
     99                        public void onReleased() { 
    99100                                sv.wantedViewRect().set(null); 
    100101                                releaseAction(channel); 
    101  
    102102                        } 
    103103 
    104104                        @Override 
    105105                        public void shouldMove(final int newX, final int newY) { 
    106106                                moveAction(channel, newX, newY); 
    107107                        } 
     108 
     109                        @Override 
     110                        public PageWorkArea getWorkArea() { 
     111                                return workArea; 
     112                        } 
    108113                }; 
    109114 
    110115                return result; 
  • modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/interfaces/Scene.java

     
    11package org.sophie2.base.scene.interfaces; 
    22 
    33import org.sophie2.base.commons.util.ImmColor; 
     4import org.sophie2.base.commons.util.position.ImmRect; 
    45import org.sophie2.base.scene.helpers.SceneHelper; 
    56import org.sophie2.core.prolib.impl.BaseProObject; 
    67import org.sophie2.core.prolib.interfaces.Prop; 
     
    3536         * @return property 
    3637         */ 
    3738        public abstract Prop<? extends SceneElement> rootElement(); 
    38  
     39         
     40        /** 
     41         * The rectangle over which the actual view rectangle will be centered. 
     42         *  
     43         * @return property 
     44         */ 
     45        public abstract RwProp<ImmRect> centeringRect(); 
     46         
    3947        /** 
    4048         * The background color of the scene. This is the infinite area that is 
    4149         * outside of any object. Note that, you should usually use elements that 
  • modules/org.sophie2.base.scene/src/test/java/org/sophie2/base/scene/SceneDemo.java

     
    443443                        return component; 
    444444                } 
    445445 
    446                 public Prop<ImmRect> actualViewRect() { 
     446                public RwProp<ImmRect> lastViewRect() { 
    447447                        return getBean().makeValueProp("actualViewRect", ImmRect.class, 
    448448                                        ImmRect.ZERO_RECT); 
    449449                } 
     
    471471 
    472472                public RwProp<ImmRect> minimalViewRect() {  
    473473                        return getBean().makeValueProp("minimalViewRect", ImmRect.class, null);  
    474                 }  
     474                } 
    475475 
    476                 public RwProp<ImmRect> actualViewRectCache() {  
    477                         return getBean().makeValueProp("actualViewRectCache", ImmRect.class, null);  
    478                 }  
     476                public RwProp<ImmRect> actualViewRect() { 
     477//                      return getBean().makeValueProp("halosBoundSize", ImmRect.class, ImmRect.ZERO_RECT); 
     478                        return null; 
     479                } 
     480 
     481//              public RwProp<ImmRect> lastViewRect() { 
     482//                      // TODO Auto-generated method stub 
     483//                      return null; 
     484//              }  
    479485        } 
    480486 
    481487        /** 
  • modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/BaseSceneVisual.java

     
    11package org.sophie2.base.scene; 
    22 
    3 import java.awt.Dimension; 
     3import java.awt.Container; 
    44import java.util.List; 
    55 
    66import javax.swing.JComponent; 
     7import javax.swing.JScrollPane; 
    78 
    89import org.sophie2.base.commons.util.OSUtil; 
     10import org.sophie2.base.commons.util.position.ImmPoint; 
    911import org.sophie2.base.commons.util.position.ImmRect; 
     12import org.sophie2.base.commons.util.position.ImmSize; 
    1013import org.sophie2.base.dnd.SophieDragDropHandler; 
    1114import org.sophie2.base.scene.helpers.ElementHelper; 
    1215import org.sophie2.base.scene.helpers.SceneHelper; 
     
    6972                SELECT_PREVIOUS_BOOK; 
    7073        } 
    7174 
    72         private static final int DEFAULT_PADDING_L = 18; 
    73         private static final int DEFAULT_PADDING_R = 18; 
    74         private static final int DEFAULT_PADDING_T = 48; 
    75         private static final int DEFAULT_PADDING_B = 18; 
    76  
     75        /** 
     76         * Default padding of the left side. 
     77         */ 
     78        public static final int DEFAULT_PADDING_L = 18; 
     79        /** 
     80         * Default padding of the right side. 
     81         */ 
     82        public static final int DEFAULT_PADDING_R = 18; 
     83        /** 
     84         * Default padding of the top side. 
     85         */ 
     86        public static final int DEFAULT_PADDING_T = 42; 
     87        /** 
     88         * Default padding of the bottom side. 
     89         */ 
     90        public static final int DEFAULT_PADDING_B = 18; 
     91         
    7792        public RwProp<ImmRect> wantedViewRect() { 
    7893                return getBean().makeValueProp("wantedViewRect", ImmRect.class, null); 
    7994        } 
    8095 
    81         public RwProp<ImmRect> minimalViewRect() {  
    82                 return getBean().makeValueProp("minimalViewRect", ImmRect.class, null);  
    83         }  
    84  
    85         public RwProp<ImmRect> actualViewRectCache() {  
    86                 return getBean().makeValueProp("actualViewRectCache", ImmRect.class, null);  
    87         }  
    88  
    8996        @Own 
    9097        public RwProp<Scene> scene() { 
    9198                return getBean().makeValueProp("scene", Scene.class); 
    9299        } 
     100         
     101        /** 
     102         * The size of the component where the scene is painted. This is the size which will be used for centering into it. 
     103         *  
     104         * @return The property. 
     105         */ 
     106        public RwProp<ImmSize> viewportSize() { 
     107                return getBean().makeValueProp("viewportSize", ImmSize.class, ImmSize.ZERO); 
     108        } 
    93109 
    94110        public Prop<JComponent> swingComponent() { 
    95111                class swingComponent extends ResourceProperty<JComponent> { 
    96112                        @Override 
    97113                        protected JComponent create() { 
    98114                                JComponent res = createSwingComponent(); 
     115                                res.setLayout(null); 
     116 
    99117                                SwingEventAdapter.registerComponent(res, 
    100118                                                BaseSceneVisual.this, null, res); 
    101119 
     
    112130 
    113131                        @Override 
    114132                        protected void setup(JComponent res) { 
    115                                 Dimension size = actualViewRect().get().getSize().toDimension(); 
    116                                 res.setSize(size); 
    117                                 res.setPreferredSize(size); 
    118                                 res.setLayout(null); 
     133                                ImmRect bound = SceneHelper.getBoundingRect(scene().get(), 
     134                                                        scene().get().rootElement().get()); 
     135                                ImmSize preferredSize = new ImmSize(bound.getWidth() + DEFAULT_PADDING_R + DEFAULT_PADDING_L, bound.getHeight() 
     136                                                + DEFAULT_PADDING_B + DEFAULT_PADDING_T); 
     137                                res.setPreferredSize(preferredSize.toDimension()); 
    119138                                res.revalidate(); 
     139                                res.repaint(); 
    120140                        } 
    121141 
    122142                        @SuppressWarnings("unused") 
     
    157177                return getBean().makeProp(swingComponent.class); 
    158178        } 
    159179 
     180         
     181         
    160182        /** 
    161183         * A view rectangle, if it can not be determined automatically (such as, 
    162184         * when no scene is set). 
    163185         */ 
    164186        protected static final ImmRect DEFAULT_VIEW_RECT = 
    165187                new ImmRect(0, 0, 256, 256); 
    166  
    167         public Prop<ImmRect> actualViewRect() { 
    168                 class actualViewRect extends AutoProperty<ImmRect> { 
     188         
     189        public RwProp<ImmRect> actualViewRect(){ 
     190                return getBean().makeValueProp("actualViewRect", ImmRect.class, ImmRect.ZERO_RECT); 
     191        } 
     192         
     193        public RwProp<ImmRect> lastViewRect(){ 
     194                return getBean().makeValueProp("lastViewRect", ImmRect.class, ImmRect.ZERO_RECT); 
     195        } 
     196         
     197        public Prop<ImmRect> minimalViewRect() { 
     198                class minimalViewRect extends AutoProperty<ImmRect> { 
    169199 
    170200                        @Override 
    171201                        protected ImmRect compute() { 
     
    177207                                                && scene().get().rootElement().get() != null) { 
    178208                                        ImmRect bound = SceneHelper.getBoundingRect(scene().get(), 
    179209                                                        scene().get().rootElement().get()); 
     210                                        res = bound; 
     211                                                 
    180212                                        res = new ImmRect( 
    181                                                         bound.getX() - DEFAULT_PADDING_L,  
    182                                                         bound.getY() - DEFAULT_PADDING_T,  
    183                                                         bound.getWidth() + DEFAULT_PADDING_R + DEFAULT_PADDING_L,  
    184                                                         bound.getHeight() + DEFAULT_PADDING_B + DEFAULT_PADDING_T); 
     213                                        res.getX() - DEFAULT_PADDING_L,  
     214                                        res.getY() - DEFAULT_PADDING_T,  
     215                                        res.getWidth() + DEFAULT_PADDING_R + DEFAULT_PADDING_L,  
     216                                        res.getHeight() + DEFAULT_PADDING_B + DEFAULT_PADDING_T); 
     217 
     218                                        ImmRect centeringRect = scene().get().centeringRect().get(); 
     219 
     220                                        if (!centeringRect.equals(ImmRect.ZERO_RECT)) { 
     221                                                ImmPoint centerPoint = new ImmPoint(centeringRect.getWidth()/2, 
     222                                                                centeringRect.getHeight()/2); 
     223                                                ImmRect toUnite = ImmRect.create(centerPoint, viewportSize().get()); 
     224                                                res = res.union(toUnite); 
     225                                        } else { 
     226                                                ImmRect toUnite = new ImmRect(ImmPoint.ZERO, viewportSize().get()); 
     227                                                res = res.union(toUnite); 
     228                                        } 
    185229                                } else { 
    186230                                        // can not determine... 
    187231                                        // just make something... 
    188232                                        res = DEFAULT_VIEW_RECT; 
    189233                                } 
    190  
    191                                 // Center the actualRect on the minimalViewRect  
    192                                 // wantedViewRect is set by halo mouse tracking to limit the rect,   
    193                                 // so do nothing if wantedViewRect is not null  
    194                                 if (wantedViewRect().get() == null) {  
    195                                         ImmRect myMinimalViewRect = minimalViewRect().get();  
    196                                         if (myMinimalViewRect != null) {  
    197                                                 float xOffset = 
    198                                                         Math.max((myMinimalViewRect.getWidth() - res.getWidth()) / 2, 0);  
    199                                                 float yOffset = 
    200                                                         Math.max((myMinimalViewRect.getHeight() - res.getHeight()) / 2, 0);  
    201                                                 res = new ImmRect(res.getX() - xOffset,  
    202                                                                 res.getY() - yOffset,  
    203                                                                 Math.max(res.getWidth(), myMinimalViewRect.getWidth()),  
    204                                                                 Math.max(res.getHeight(), myMinimalViewRect.getHeight()));  
    205                                         }  
    206  
    207                                         if (!res.equals(actualViewRectCache().get())) {  
    208                                                 actualViewRectCache().set(res);  
    209                                         }  
    210                                 } 
    211  
    212234                                assert res != null; 
    213235                                return res; 
    214236                        } 
    215237                } 
    216  
    217                 return getBean().makeProp(actualViewRect.class); 
     238                return getBean().makeProp(minimalViewRect.class); 
    218239        } 
    219  
     240         
    220241        /** 
    221242         * Override this to provide logic for the creation of the Swing Component 
    222243         * of this {@link SceneVisual}. 
     
    229250        protected boolean computeVisible() { 
    230251                return true; 
    231252        } 
     253         
     254        /** 
     255         *  Finds possible {@link JScrollPane} parent, to a specific depth  
     256         * @param res 
     257         *                      The starting component. 
     258         * @param depth 
     259         *                      The depth to which we search 
     260         * @return nearest {@link JScrollPane} parent, null if not. 
     261         */ 
     262        public static JScrollPane findParentScrollPane(JComponent res, int depth) { 
     263                Container component = res; 
     264                int i = 0; 
     265                 
     266                while (i < depth && component != null) { 
     267                         
     268                        if (component instanceof JScrollPane) { 
     269                                return (JScrollPane) component; 
     270                        }  
     271                         
     272                        component = component.getParent(); 
     273                        ++i; 
     274                } 
     275                 
     276                return null; 
     277        } 
    232278} 
  • modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/helpers/SceneHelper.java

     
    248248                SophieLog.trace("sceneToSwing: sceneRect=" + sceneRect); 
    249249                assert sceneRect != null; 
    250250                // only translation... 
    251                 ImmRect viewRect = visual.actualViewRect().get(); 
     251                ImmRect viewRect = visual.lastViewRect().get(); 
    252252                assert viewRect != null; 
    253253                SophieLog.trace("sceneToSwing: viewRect=" + viewRect); 
    254254                ImmRect res = Position.translate(sceneRect, -viewRect.getX(), -viewRect 
     
    271271                SophieLog.trace("sceneToSwing: sceneRect=" + scenePoint); 
    272272                assert scenePoint != null; 
    273273                // only translation... 
    274                 ImmRect viewRect = visual.actualViewRect().get(); 
     274                ImmRect viewRect = visual.lastViewRect().get(); 
    275275                assert viewRect != null; 
    276276                SophieLog.trace("sceneToSwing: viewRect=" + viewRect); 
    277277                ImmPoint res = scenePoint.translate(-viewRect.getX(), -viewRect.getY()); 
     
    291291         */ 
    292292        public static ImmRect swingToScene(SceneVisual visual, ImmRect swingRect) { 
    293293                // only translation... 
    294                 ImmRect viewRect = visual.actualViewRect().get(); 
     294                ImmRect viewRect = visual.lastViewRect().get(); 
    295295                return Position.translate(swingRect, viewRect.getX(), viewRect.getY()); 
    296296        } 
    297297 
     
    306306         */ 
    307307        public static ImmPoint swingToScene(SceneVisual visual, ImmPoint swingPoint) { 
    308308                // only translation... 
    309                 ImmRect viewRect = visual.actualViewRect().get(); 
     309                ImmRect viewRect = visual.lastViewRect().get(); 
    310310                assert viewRect != null; 
    311311                return swingPoint.translate(viewRect.getX(), viewRect.getY()); 
    312312        } 
  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/model/CustomLayout.java

     
     1package org.sophie2.base.layout.model; 
     2 
     3import java.awt.BorderLayout; 
     4import java.awt.Component; 
     5import java.awt.Container; 
     6import java.awt.Dimension; 
     7import java.awt.LayoutManager2; 
     8import java.io.Serializable; 
     9 
     10import javax.swing.JDesktopPane; 
     11import javax.swing.JLayeredPane; 
     12 
     13/** 
     14 * LayoutManager that supports adding of components with different layouts - null 
     15 * and some specific layout. An object is created with a specific 
     16 * {@link LayoutManager2}. When different components are added, they can be with 
     17 * constraint - CustomLayout.CUSTOM. This means that for laying out of these 
     18 * components will be used null layout. For all other components added, it will 
     19 * be used the given layout manager. This layout manager can be used for example 
     20 * for {@link JDesktopPane}. For example, components at 
     21 * {@link JLayeredPane#DEFAULT_LAYER} can be with {@link BorderLayout} and the 
     22 * components at {@link JLayeredPane#PALETTE_LAYER} to be with null layout. 
     23 *  
     24 * @author tanya 
     25 */ 
     26public class CustomLayout implements LayoutManager2, Serializable { 
     27 
     28        /** 
     29         * Used for serialization. 
     30         */ 
     31        private static final long serialVersionUID = 810513263396699528L; 
     32 
     33        private LayoutManager2 layoutManager; 
     34         
     35        /** 
     36         * The constraint for the objects which we want to be with null layout. 
     37         */ 
     38        public static final String CUSTOM   = "Custom"; 
     39         
     40        /** 
     41         * Constructs an object with another layout manager. The components added 
     42         * will be with null layout or will be added according 
     43         *  
     44         * @param manager 
     45         *            The manager which will be responsible for how the components 
     46         *            will be added and how will be laid out. 
     47         */ 
     48        public CustomLayout(LayoutManager2 manager) { 
     49                this.layoutManager = manager; 
     50        } 
     51         
     52        public void addLayoutComponent(Component comp, Object constraints) { 
     53                if (constraints != CUSTOM && this.layoutManager != null) { 
     54                        this.layoutManager.addLayoutComponent(comp, constraints); 
     55                } 
     56        } 
     57 
     58        public float getLayoutAlignmentX(Container target) { 
     59                if (this.layoutManager != null) { 
     60                        return this.layoutManager.getLayoutAlignmentX(target); 
     61                } 
     62 
     63                return 0f; 
     64        } 
     65 
     66        public float getLayoutAlignmentY(Container target) { 
     67                if (this.layoutManager != null) { 
     68                        return this.layoutManager.getLayoutAlignmentY(target); 
     69                } 
     70                 
     71                return 0f; 
     72        } 
     73 
     74        public void invalidateLayout(Container target) { 
     75                if (this.layoutManager != null) { 
     76                        this.layoutManager.invalidateLayout(target); 
     77                } 
     78        } 
     79 
     80        public Dimension maximumLayoutSize(Container target) { 
     81                if (this.layoutManager != null) { 
     82                        return this.layoutManager.maximumLayoutSize(target); 
     83                } 
     84                 
     85                return null; 
     86        } 
     87 
     88        public void addLayoutComponent(String name, Component comp) { 
     89                if (this.layoutManager != null) { 
     90                        this.layoutManager.addLayoutComponent(name, comp); 
     91                } 
     92        } 
     93 
     94        public void layoutContainer(Container parent) { 
     95                if (this.layoutManager != null) { 
     96                        this.layoutManager.layoutContainer(parent); 
     97                } 
     98        } 
     99 
     100        public Dimension minimumLayoutSize(Container parent) { 
     101                if (this.layoutManager != null) { 
     102                        return this.layoutManager.minimumLayoutSize(parent); 
     103                } 
     104                 
     105                return null; 
     106        } 
     107 
     108        public Dimension preferredLayoutSize(Container parent) { 
     109                if (this.layoutManager != null) { 
     110                        return this.layoutManager.preferredLayoutSize(parent); 
     111                } 
     112                 
     113                return null; 
     114        } 
     115 
     116        public void removeLayoutComponent(Component comp) { 
     117                if (this.layoutManager != null) { 
     118                        this.layoutManager.removeLayoutComponent(comp); 
     119                } 
     120        } 
     121} 
     122 No newline at end of file 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/page/PageWorkArea.java

     
    11package org.sophie2.main.app.commons.page; 
    22 
     3import java.awt.BorderLayout; 
    34import java.util.ArrayList; 
    45import java.util.List; 
    56 
     
    1011import org.sophie2.base.commons.util.ImmColor; 
    1112import org.sophie2.base.commons.util.position.ImmArea; 
    1213import org.sophie2.base.commons.util.position.ImmMatrix; 
     14import org.sophie2.base.commons.util.position.ImmPoint; 
    1315import org.sophie2.base.commons.util.position.ImmRect; 
     16import org.sophie2.base.commons.util.position.ImmSize; 
     17import org.sophie2.base.layout.model.CustomLayout; 
     18import org.sophie2.base.layout.model.DocView; 
    1419import org.sophie2.base.model.book.PageH; 
    1520import org.sophie2.base.scene.SceneVisual; 
    1621import org.sophie2.base.scene.effects.ColorEffect; 
     
    3136import org.sophie2.core.prolib.impl.ResourceProperty; 
    3237import org.sophie2.core.prolib.interfaces.Prop; 
    3338import org.sophie2.core.prolib.interfaces.RwProp; 
     39import org.sophie2.main.app.commons.app.AppMainWindow; 
    3440import org.sophie2.main.app.commons.book.BookDocView; 
    3541import org.sophie2.main.app.commons.book.BookView; 
    3642import org.sophie2.main.app.commons.element.ElementView; 
     43import org.sophie2.main.app.commons.util.AppViewUtil; 
    3744 
    3845/** 
    3946 * A view, displaying the content on a page. It is responsible for selection and 
     
    4451 */ 
    4552@VisualElementDef(parent = BookDocView.class, sortKey = "kkk-page-work-area") 
    4653public class PageWorkArea extends BaseVisualElement { 
    47  
     54        /** 
     55         * Default horizontal padding. 
     56         */ 
     57        public static final int PADDING_HORIZONTAL = 48; 
     58         
     59        /** 
     60         * Default padding of the top side. 
     61         */ 
     62        public static final int PADDING_VERTICAL = 62; 
     63         
    4864        /** 
    4965         * The <code>BookView</code> of the book this PageWorkArea shows. 
    5066         *  
     
    152168                        @Override 
    153169                        protected Scene compute() { 
    154170                                assert getLastValue() == null; 
     171                                 
    155172                                return new BaseScene() { 
    156173 
    157174                                        @Override 
    158175                                        protected void setupScene() { 
    159176                                                rootElement().set(rootSceneElement().get()); 
     177 
     178                                                boolean isDesktopBook = !(bookView().get().getViewOptions().isShowControls());  
     179                                                if (!isDesktopBook) { 
     180                                                        ImmPoint pageLocation = ImmPoint.ZERO; 
     181                                                        float zoom = bookView().get().getViewOptions().getZoom(); 
     182                                                        ImmSize pageSize = bookView().get().model().get().getPageSize(); 
     183                                                        pageSize = new ImmSize(pageSize.getWidth() * zoom, pageSize.getHeight() * zoom); 
     184                                                        ImmRect centeringRect = new ImmRect(pageLocation, pageSize); 
     185 
     186                                                        centeringRect().set(centeringRect); 
     187                                                } 
     188 
    160189                                                topEventSource().set(PageWorkArea.this); 
    161190                                        } 
    162191                                }; 
     
    208237                        @Override 
    209238                        protected void setup(JDesktopPane res) { 
    210239                         
     240                                res.setLayout(new CustomLayout(new BorderLayout())); 
     241                                 
    211242                                JComponent sceneComp = sceneVisual().get().swingComponent().get(); 
    212243 
    213244                                sceneComp.setLocation(0, 0); 
    214245                                SophieLog.debug("PageWorkArea.layeredPage: sceneComp:" + sceneComp); 
    215246 
    216247                                res.removeAll(); 
    217                                 res.add(sceneComp, JLayeredPane.DEFAULT_LAYER); 
     248                                res.setLayer(sceneComp, JLayeredPane.DEFAULT_LAYER); 
     249                                 
     250                                res.add(sceneComp, BorderLayout.CENTER); 
    218251 
    219252                                res.revalidate(); 
    220253                                res.repaint(); 
    221254                        } 
    222255 
    223                         // TODO (r4) reimplement the page-work-area centering 
    224256                        @SuppressWarnings("unused") 
    225257                        @Setup 
    226258                        protected void setupActualSize(JLayeredPane res) { 
    227  
    228                                 // grab the value to set up the property sync 
    229                                 ImmRect actualCache = sceneVisual().get().actualViewRect().get(); 
    230  
    231259                                JDesktopPane desktopPane = swingComponent().get(); 
     260                                AppMainWindow appMainWindow = AppViewUtil.findMainWindow(PageWorkArea.this); 
     261                                DocView parentBookView = findParentElement(BookDocView.class); 
     262                                if (appMainWindow != null && appMainWindow.desktopDocument().get() == parentBookView) { 
     263                                        ImmRect bound = SceneHelper.getBoundingRect(scene().get(), scene().get().rootElement().get()); 
     264                                        ImmSize prefSize = new ImmSize(bound.getWidth() + PADDING_HORIZONTAL, bound.getHeight() 
     265                                                        + PADDING_VERTICAL); 
     266                                        desktopPane.setPreferredSize(prefSize.toDimension()); 
     267                                } 
    232268                                desktopPane.revalidate(); 
    233269                                desktopPane.repaint(); 
    234270                        } 
     
    427463                } 
    428464                return getBean().makeProp(selectionRisenElement.class); 
    429465        } 
     466         
     467        /** 
     468         * Property which have True or False value depending on whether mouse capture event is started or not. 
     469         * <b>true</b> if mouse capture is on, <b>false</b> otherwise. 
     470         *  
     471         * @return property 
     472         */ 
     473        public RwProp<Boolean> scrollsLocked() { 
     474                return getBean().makeValueProp("scrollsLocked", Boolean.class, Boolean.FALSE);   
     475        } 
    430476} 
     477 No newline at end of file 
  • modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/page/resize/PageResizeHaloButton.java

     
    2323import org.sophie2.base.visual.skins.SkinPartDef; 
    2424import org.sophie2.base.visual.skins.VisualElementDef; 
    2525import org.sophie2.core.prolib.interfaces.Prop; 
     26import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2627import org.sophie2.main.app.commons.page.PageWorkArea; 
    2728import org.sophie2.main.app.halos.common.AppHaloUtil; 
    2829 
     
    6566 
    6667        @Override 
    6768        protected MouseCapture captureClick(MouseEvent e) { 
    68                 PageWorkArea pwa = AppHaloUtil.getWorkArea(PageResizeHaloButton.this); 
     69                final PageWorkArea pwa = AppHaloUtil.getWorkArea(PageResizeHaloButton.this); 
    6970 
    7071                if(pwa !=null ){ 
    7172 
    7273                        final SceneVisual sv = pwa.sceneVisual().get(); 
    73                         sv.wantedViewRect().set(sv.actualViewRect().get()); 
     74                        sv.wantedViewRect().set(sv.lastViewRect().get()); 
    7475 
    7576                        final BookH book = pwa.bookView().get().model().get(); 
    7677 
     
    7980                        final ImmMatrix transf = SceneHelper.getElementToSceneTransform(pwa.scene().get(), pwa.rootSceneElement().get()); 
    8081 
    8182                        ImmVector resizedSize = transf.transform(v); 
    82                         return new MouseCapture((int) resizedSize.getPointX(), (int) resizedSize.getPointY(), 
     83                        return new PageAreaMouseCapture((int) resizedSize.getPointX(), (int) resizedSize.getPointY(), 
    8384                                        e) { 
    8485 
    8586                                @Override 
    86                                 public void released() { 
     87                                public void onReleased() { 
    8788                                        sv.wantedViewRect().set(null); 
    8889 
    89  
    9090                                        new AutoAction(Message.create(SET_PAGE_SIZE), true) { 
    9191 
    9292                                                @Override 
     
    128128                                        }.register(book.getAccess()); 
    129129                                } 
    130130 
     131                                @Override 
     132                                public PageWorkArea getWorkArea() { 
     133                                        return pwa; 
     134                                } 
     135 
    131136                        }; 
    132137                } 
    133138                return null; 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/page/ScenePageLogic.java

     
    44import java.util.ArrayList; 
    55import java.util.List; 
    66 
    7 import org.sophie2.base.commons.gui.MouseCapture; 
    87import org.sophie2.base.commons.util.position.ImmArea; 
    98import org.sophie2.base.commons.util.position.ImmMatrix; 
    109import org.sophie2.base.commons.util.position.ImmPoint; 
     
    2524import org.sophie2.core.mvc.LogicR3; 
    2625import org.sophie2.core.mvc.OperationDef; 
    2726import org.sophie2.core.mvc.events.EventR3; 
     27import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2828import org.sophie2.main.app.commons.app.AppMainWindow; 
    2929import org.sophie2.main.app.commons.book.BookDocView; 
    3030import org.sophie2.main.app.commons.element.ElementView; 
     
    120120 
    121121                        MouseEvent cause = event.getCausingEvent(EventR3.class).getCausingEvent( 
    122122                                        MouseEvent.class); 
    123                         new MouseCapture(0, 0, cause) { 
     123                        new PageAreaMouseCapture(0, 0, cause) { 
    124124 
    125125                                @Override 
    126                                 public void released() { 
     126                                public void onReleased() { 
    127127                                        pwa.selectionArea().set(ImmArea.EMPTY); 
    128128                                } 
    129129 
     
    159159                                                                pwa.getSel().select(toSelect, false); 
    160160                                                        } 
    161161                                } 
     162 
     163                                @Override 
     164                                public PageWorkArea getWorkArea() { 
     165                                        return pwa; 
     166                                } 
    162167                        }; 
    163168                        return true; 
    164169                } 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/app/AppMainWindow.java

     
    1414import org.sophie2.base.commons.util.position.ImmRect; 
    1515import org.sophie2.base.halos.HaloMenu; 
    1616import org.sophie2.base.layout.impl.DefaultMainWindow; 
     17import org.sophie2.base.layout.model.CustomLayout; 
    1718import org.sophie2.base.layout.model.DocView; 
    1819import org.sophie2.base.media.MediaComposite; 
    1920import org.sophie2.base.media.MediaUtil; 
     
    211212                                        if (hm.visible().get()) { 
    212213                                                for (JComponent c : hm.swingComponents().get()) { 
    213214 
    214                                                         res.add(c, JLayeredPane.PALETTE_LAYER); 
     215                                                        res.setLayer(c, JLayeredPane.PALETTE_LAYER); 
     216                                                        res.add(c, CustomLayout.CUSTOM); 
     217                                                         
    215218                                                } 
    216219                                        } 
    217220                                } 
     
    235238                                } 
    236239                                PageWorkArea workArea = bookDocView.workArea().get(); 
    237240 
    238                                 JDesktopPane res = workArea.swingComponent().get();  
    239  
    240                                 // The scene bounds 
    241                                 ImmRect bounds = workArea.sceneVisual().get().actualViewRect().get(); 
    242                                 // The bounds of visible huds 
    243                                 for (HaloMenu hm : haloMenus().get()) { 
     241                                if (!workArea.scrollsLocked().get()) { 
    244242 
    245                                         bounds = bounds.union(SceneHelper.swingToScene( 
    246                                                         workArea.sceneVisual().get(), hm.activeBounds().get())); 
    247                                 } 
     243                                        JDesktopPane res = workArea.swingComponent().get();  
    248244 
    249                                 bounds = SceneHelper.sceneToSwing(workArea.sceneVisual().get(), bounds); 
    250                                 Dimension d = bounds.getSize().toDimension(); 
     245                                        // The scene bounds 
     246                                        ImmRect bounds = workArea.sceneVisual().get().minimalViewRect().get(); 
     247                                        // The bounds of visible huds 
     248                                        for (HaloMenu hm : haloMenus().get()) { 
     249                                                bounds = bounds.union(SceneHelper.swingToScene( 
     250                                                                workArea.sceneVisual().get(), hm.activeBounds().get())); 
     251                                        } 
     252                                        bounds = SceneHelper.sceneToSwing(workArea.sceneVisual() 
     253                                                        .get(), bounds); 
    251254 
    252                                 res.setPreferredSize(d); 
    253                                 res.setSize(d); 
    254                                 res.revalidate(); 
     255                                        Dimension dim = bounds.getSize().toDimension(); 
     256                                        workArea.sceneVisual().get().actualViewRect().set( 
     257                                                        new ImmRect(workArea.sceneVisual().get().minimalViewRect().get().getX(),  
     258                                                                        workArea.sceneVisual().get().minimalViewRect().get().getY(), dim.width, dim.height)); 
     259                                } 
    255260                        } 
    256  
    257261                } 
    258262                return getBean().makeProp(haloSync.class); 
    259263        } 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/frame/FrameLogic.java

     
    22 
    33import java.awt.event.MouseEvent; 
    44 
    5 import org.sophie2.base.commons.gui.MouseCapture; 
    65import org.sophie2.base.commons.util.position.ImmMatrix; 
    76import org.sophie2.base.commons.util.position.ImmPoint; 
    87import org.sophie2.base.commons.util.position.ImmSize; 
     
    2625import org.sophie2.core.mvc.EventFilterBuilder; 
    2726import org.sophie2.core.mvc.OperationDef; 
    2827import org.sophie2.core.mvc.events.EventR3; 
     28import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2929import org.sophie2.main.app.commons.element.ElementView; 
    3030import org.sophie2.main.app.commons.element.ResizeAreaSceneElement.ResizeSubAreaElement; 
    3131import org.sophie2.main.app.commons.page.PageWorkArea; 
     
    5757                        final ElementView elementView = event.getSource(ElementView.class); 
    5858                        final ResourceAccess access = elementView.getAccess(); 
    5959 
    60                         PageWorkArea pwa = elementView.getPwa(); 
     60                        final PageWorkArea pwa = elementView.getPwa(); 
    6161                        Mode sizeTemplateMode = ResizableElement.KEY_SIZE.getMode(access); 
    6262                        Mode locTemplateMode = MemberElement.KEY_LOCATION.getMode(access); 
    6363 
     
    7878                        // lock the view rect, so that we don't have auto-scrolls while moving. 
    7979                        final SceneVisual sv = pwa.sceneVisual().get(); 
    8080                        sv.wantedViewRect().set(sv.actualViewRect().get()); 
    81  
     81                         
    8282                        MouseEvent cause = event.getCausingEvent(EventR3.class).getCausingEvent( 
    8383                                        MouseEvent.class); 
    8484 
    85                         new MouseCapture(0, 0, cause) { 
     85                        new PageAreaMouseCapture(0, 0, cause) { 
    8686                                @Override 
    87                                 public void released() { 
     87                                public void onReleased() { 
    8888                                        AutoAction.registerEndChange(access, Message.create(RESIZE_FRAME_FINISHED)); 
     89 
    8990                                        sv.wantedViewRect().set(null); 
    9091                                } 
    9192 
     
    9394                                                final ImmPoint newLocationInPage, final ImmSize newSize) { 
    9495                                        TimePos time = elementView.getTime(); 
    9596                                        final LocationChannel newChannel = oldChannel.setValue(time, newLocationInPage); 
     97 
    9698                                        new AutoAction(Message.create(FRAME_RESIZE), false) { 
    9799                                                @Override 
    98100                                                public void performAuto() { 
     
    157159 
    158160                                        } 
    159161                                } 
     162 
     163                                @Override 
     164                                public PageWorkArea getWorkArea() { 
     165                                        return pwa; 
     166                                } 
    160167                        }; 
    161168 
    162169                        return true; 
  • modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/impl/BaseScene.java

     
    11package org.sophie2.base.scene.impl; 
    22 
    33import org.sophie2.base.commons.util.ImmColor; 
     4import org.sophie2.base.commons.util.position.ImmRect; 
    45import org.sophie2.base.scene.interfaces.Scene; 
    56import org.sophie2.base.scene.interfaces.SceneElement; 
    67import org.sophie2.core.prolib.impl.ResourceProperty; 
     
    2021        } 
    2122 
    2223        @Override 
     24        public RwProp<ImmRect> centeringRect() { 
     25                return getBean().makeValueProp("centeringRect", ImmRect.class, ImmRect.ZERO_RECT); 
     26        } 
     27         
     28        @Override 
    2329        public RwProp<ImmColor> backgroundColor() { 
    2430                return getBean().makeValueProp("backgroundColor", ImmColor.class, 
    2531                                ImmColor.GRAY); 
  • modules/org.sophie2.main.scene.simple/src/main/java/org/sophie2/main/scene/simple/SimpleSceneVisual.java

     
    55 
    66import javax.swing.JComponent; 
    77import javax.swing.JPanel; 
     8import javax.swing.JScrollPane; 
    89 
    910import org.sophie2.base.commons.util.position.ImmRect; 
     11import org.sophie2.base.commons.util.position.ImmSize; 
    1012import org.sophie2.base.scene.BaseSceneVisual; 
    1113import org.sophie2.base.scene.SceneVisual; 
    1214import org.sophie2.base.scene.helpers.SceneHelper; 
     
    1618/** 
    1719 * Simple scene implementation. 
    1820 *  
    19  * @author milo, peko, nenko, mira, gogov 
     21 * @author milo, peko, nenko, mira, gogov, tanya, stefan 
    2022 */ 
    2123@SkinElementId("main.scene.simple.simple-scene-visual") 
    2224public class SimpleSceneVisual extends BaseSceneVisual { 
     
    3739                private static final long serialVersionUID = 4801814966438437503L; 
    3840 
    3941                private long lastPaintTime = System.currentTimeMillis(); 
    40  
     42                 
     43                private static final int OFFSET = 2; 
     44                 
    4145                @Override 
    4246                protected void paintComponent(Graphics graphics) { 
    4347 
     
    5357                        SophieLog.trace("paintComponent: parent=" + getParent()); 
    5458 
    5559                        Graphics2D g2d = (Graphics2D) graphics.create(); 
    56                         ImmRect visRect = actualViewRect().get(); 
     60                        //Centering the actual view rectangle. 
     61                         
     62                        SophieLog.debugf("\n%s\n\t%s\n\t\t%s\n\t\t\t%s", 
     63                                        this.getParent().getParent().getParent().toString(), 
     64                                        this.getParent().getParent().toString(), 
     65                                        this.getParent().toString(), this.toString()); 
     66                         
     67                        JScrollPane container = findParentScrollPane(this, 6); 
     68                         
     69                        if (container != null) { 
     70                                viewportSize().set(new ImmSize(container.getWidth(), container.getHeight())); 
     71                        } 
     72                         
     73                        ImmRect actRect = actualViewRect().get(); 
     74                        ImmRect lstRect = lastViewRect().get(); 
    5775 
    58                         SceneHelper.paint(g2d, visRect, scene().get()); 
    59  
     76                        if (container != null) { 
     77                                if (!lstRect.equals(actRect)) { 
     78                                        if (lstRect.getY() > actRect.getY()) {                   
     79                                                container.getVerticalScrollBar().setValue(0); 
     80                                        } else if (lstRect.getHeight() + OFFSET + lstRect.getY() < actRect.getHeight() + actRect.getY() 
     81                                                        && lstRect.getY() <= actRect.getY()) { 
     82                                                container.getVerticalScrollBar().setValue(container.getVerticalScrollBar().getMaximum()); 
     83                                        } 
     84                                         
     85                                        if (lstRect.getX() > actRect.getX()) { 
     86                                                container.getHorizontalScrollBar().setValue(0);                                          
     87                                        } else if (lstRect.getWidth() + OFFSET + lstRect.getX() < actRect.getWidth() + actRect.getX() 
     88                                                        && lstRect.getX() <= actRect.getX()) { 
     89                                                container.getHorizontalScrollBar().setValue(container.getHorizontalScrollBar().getMaximum()); 
     90                                        } 
     91                                } 
     92                        } 
     93                         
     94                        lastViewRect().set(actualViewRect().get()); 
     95                        SceneHelper.paint(g2d, actualViewRect().get(), scene().get()); 
    6096                        SophieLog.debug("paintComponent: total paint time=" 
    6197                                        + (System.currentTimeMillis() - startTime)); 
     98                         
    6299                } 
    63100        } 
    64101} 
  • modules/org.sophie2.main.scene.sprites/src/main/java/org/sophie2/main/scene/sprites/SpritesSceneVisual.java

     
    5252                        SophieLog.trace("paintComponent: parent=" + getParent()); 
    5353 
    5454                        Graphics2D g2d = (Graphics2D) graphics.create(); 
    55                         ImmRect visRect = actualViewRect().get(); 
     55                        ImmRect visRect = lastViewRect().get(); 
    5656                         
    5757                        SceneHelper.paintSprite(g2d, visRect, scene().get()); 
    5858 
  • modules/org.sophie2.dev/src/main/java/org/sophie2/dev/author/FakeAuthorMain.java

     
    114114                SophieLog.setMinLevel("org.sophie2.base.commons.util", LogLevel.DEBUG); 
    115115                SophieLog.setMinLevel("org.sophie2.base.model.resources.r4.model", LogLevel.DEBUG); 
    116116                SophieLog.setMinLevel("org.sophie2.main.app.commons.book", LogLevel.DEBUG); 
     117                SophieLog.setMinLevel("org.sophie2.base.scene.BaseSceneVisual", LogLevel.DEBUG); 
     118//              SophieLog.setMinLevel("org.sophie2.main.scene.simple.SimpleSceneVisual", LogLevel.DEBUG); 
     119                SophieLog.setMinLevel("org.sophie2.base.layout.impl.DesktopManager", LogLevel.DEBUG); 
     120                 
     121                SophieLog.setMinLevel("org.sophie2.main.app.commons.frame", LogLevel.DEBUG); 
    117122                 
    118123                assert System.getProperty(SophieEditions.PROP_ID) == null : 
    119124                        "You have set edition in fake mode?" ; 
  • modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/SceneVisual.java

     
    3232         * @return property 
    3333         */ 
    3434        RwProp<ImmRect> wantedViewRect(); 
    35  
    36         /**  
    37          * The smallest rectangle this scene should have.  
    38          *   
    39          * Use this to tell the scene it should be larger than its components, for example,  
    40          * to fill out a window.  
    41          *   
    42          * @return property  
    43          */  
    44         RwProp<ImmRect> minimalViewRect();  
    45  
    46         /**  
    47          * Last known value of the actual view rect, so PageWorkArea can listen for changes  
    48          *   
    49          * Only set this value when it has actually changed  
    50          *   
    51          * @return property  
    52          */  
    53         RwProp<ImmRect> actualViewRectCache();  
     35         
    5436        /** 
    5537         * The swing component displaying the scene. 
    5638         *  
     
    7254         *  
    7355         * @return property 
    7456         */ 
    75         Prop<ImmRect> actualViewRect(); 
     57        RwProp<ImmRect> lastViewRect(); 
     58         
     59        /** 
     60         * Minimal part of the scene that will be displayed. 
     61         *  
     62         * @return property 
     63         */ 
     64        Prop<ImmRect> minimalViewRect(); 
     65 
     66        /** 
     67         * Contains what the dimension of the visible part of the scene should be if 
     68         * we want the visible part of the scene to surround the halos. 
     69         *  
     70         * @return property 
     71         */ 
     72        RwProp<ImmRect> actualViewRect(); 
    7673} 
  • modules/org.sophie2.main.scene.jogl/src/main/java/org/sophie2/main/scene/jogl/JoglSceneVisual.java

     
    6464                public void display(GLAutoDrawable drawable) { 
    6565                        final GL2 gl = drawable.getGL().getGL2(); 
    6666                         
    67                         SceneHelper.paint(gl, actualViewRect().get(),   scene().get()); 
     67                        SceneHelper.paint(gl, lastViewRect().get(),     scene().get()); 
    6868                } 
    6969                 
    7070                public void reshape(GLAutoDrawable drawable, 
  • modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/app/DocumentsLogic.java

     
    44import org.sophie2.base.layout.impl.DefaultDocView; 
    55import org.sophie2.base.model.resources.r4.ResourceRefR4; 
    66import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
    7 import org.sophie2.core.logging.SophieLog; 
    87import org.sophie2.core.modularity.SortKey; 
    98import org.sophie2.core.mvc.EventFilterBuilder; 
    109import org.sophie2.core.mvc.EventParams; 
     
    128127                         
    129128                        return true; 
    130129                } 
    131                  
    132         }, 
    133  
    134          
    135         /** 
    136          * Handles resizing of the window by the user. Should center the page in the 
    137          * window. 
    138          */ 
    139         @SortKey("fff-document-resize") 
    140         ON_RESIZE { 
    141  
    142                 public void defineFilter(EventFilterBuilder filter) { 
    143                         filter.setEventId(DefaultDocView.EventIds.RESIZE); 
    144                         filter.setSourceClass(DefaultDocView.class); 
    145                 } 
    146  
    147                 public boolean handle(EventR3 event) { 
    148                         // FIXME (R4) Reimplement page centering. This might need to go down to the layout. 
    149                         SophieLog.warn("(R4) Reimplement page centering!"); 
    150                         return false; 
    151                 } 
    152  
    153130        }; 
    154131         
    155132        /** 
  • modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/frame/MainTitleBarHalo.java

     
    4646import org.sophie2.core.prolib.interfaces.RwProp; 
    4747import org.sophie2.core.prolib.list.ComposingProList; 
    4848import org.sophie2.core.prolib.list.ProList; 
     49import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    4950import org.sophie2.main.app.commons.element.ElementView; 
    5051import org.sophie2.main.app.commons.element.GroupView; 
    5152import org.sophie2.main.app.commons.frame.FrameView; 
     
    260261         */ 
    261262        protected MouseCapture captureClick(MouseEvent e) { 
    262263 
     264                final PageWorkArea pwa = workArea().get();  
     265 
    263266                // lock the view rect, so that we don't have auto-scrolls while moving. 
    264                 final SceneVisual sv = workArea().get().sceneVisual().get(); 
    265                 sv.wantedViewRect().set(sv.actualViewRect().get()); 
     267                final SceneVisual sv = pwa.sceneVisual().get(); 
     268                sv.wantedViewRect().set(sv.lastViewRect().get()); 
    266269 
    267270                // get the selected frame locations before start moving 
    268271                ResourceRefList frameRefs = ResourceRefList.EMPTY; 
     
    296299 
    297300 
    298301                //TODO: rewrite --milo 
    299                 MouseCapture result = new MouseCapture(0, 0, e) { 
     302                PageAreaMouseCapture result = new PageAreaMouseCapture(0, 0, e) { 
    300303 
    301304                        private void releasedAction( 
    302305                                        final ImmList<ImmPoint> oldPositions, 
     
    311314                        private void moveAction( 
    312315                                        ImmList<ImmPoint> oldPositions, 
    313316                                        ResourceRefList refs, ImmList<TimePos> times, final int newX, final int newY) { 
    314  
     317                                 
    315318                                if (currentPage().get() == null) { 
    316319                                        return; 
    317320                                } 
     
    340343                        } 
    341344 
    342345                        @Override 
    343                         public void released() { 
     346                        public void onReleased() { 
    344347                                sv.wantedViewRect().set(null); 
    345348                                releasedAction(finalOldLocations, finalFrameRefs, finalTimes); 
    346349                        } 
     
    348351                        @Override 
    349352                        public void shouldMove(final int newX, final int newY) { 
    350353                                moveAction(finalOldLocations, finalFrameRefs, finalTimes, newX, newY); 
     354                        } 
    351355 
     356                        @Override 
     357                        public PageWorkArea getWorkArea() { 
     358                                return pwa; 
    352359                        } 
    353360                }; 
    354361                return result;