Ticket #1968: centered_pwa.patch

File centered_pwa.patch, 44.5 KB (added by tanya, 15 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
     
    2020import org.sophie2.base.scene.interfaces.Scene; 
    2121import org.sophie2.base.skins.SkinElementId; 
    2222import org.sophie2.base.visual.skins.VisualElementDef; 
     23import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2324import org.sophie2.main.app.commons.frame.FrameView; 
    2425import org.sophie2.main.app.commons.page.PageWorkArea; 
    2526import org.sophie2.main.app.halos.common.AppHaloUtil; 
     
    4849                final FrameH frame = frameView.model().get(); 
    4950                final double oldAngle = frame.getRotationAngle(); 
    5051 
    51                 PageWorkArea pwa = AppHaloUtil.getWorkArea(this); 
     52                final PageWorkArea pwa = AppHaloUtil.getWorkArea(this); 
    5253                final Scene scene = pwa.scene().get(); 
    5354                final ImmMatrix sceneToParent = SceneHelper.getElementToSceneTransform(scene, 
    5455                                frameView.parent().get().sceneElement().get()).inverse(); 
     
    6869                final ImmPoint oldControl = sceneToParent.transform(controlInScene); 
    6970 
    7071                final SceneVisual sceneVisual = pwa.sceneVisual().get(); 
    71                 sceneVisual.wantedViewRect().set(sceneVisual.actualViewRect().get()); 
     72                sceneVisual.wantedViewRect().set(sceneVisual.lastViewRect().get()); 
    7273                 
    73                 return new MouseCapture(0, 0, e) { 
     74                return new PageAreaMouseCapture(0, 0, e) { 
    7475 
    7576                        @Override 
    7677                        public void shouldMove(int newX, int newY) { 
     
    8586                        } 
    8687 
    8788                        @Override 
    88                         public void released() { 
     89                        public void onReleased() { 
    8990                                final Double angle = frame.getRotationAngle(); 
    9091                                setAngle(angle, true); 
    9192                                sceneVisual.wantedViewRect().set(null); 
     
    144145 
    145146                        } 
    146147 
     148                        @Override 
     149                        public PageWorkArea getWorkArea() { 
     150                                return pwa; 
     151                        } 
     152 
    147153                }; 
    148154        } 
    149155 
  • modules/org.sophie2.base.commons/src/main/java/org/sophie2/base/commons/util/position/ImmRect.java

     
    336336        public boolean contains(ImmRect other) { 
    337337                return this.toRectangle().contains(other.toRectangle()); 
    338338        } 
     339 
     340        /** 
     341         * Creates rectangle by given point and size. The given point is the center 
     342         * point for the rectangle. The size is the size of the rectangle. 
     343         *  
     344         * @param centerPoint 
     345         *            The center of the rectangle. 
     346         * @param size 
     347         *            The size of the rectangle. 
     348         * @return New rectangle. 
     349         */ 
     350        public static ImmRect create(ImmPoint centerPoint, ImmSize size) { 
     351                ImmPoint topLeft = new ImmPoint(centerPoint.getX() - size.getWidth()/2,  
     352                                centerPoint.getY() - size.getHeight()/2); 
     353                ImmRect res = new ImmRect(topLeft, size); 
     354                 
     355                return res; 
     356        } 
    339357} 
  • 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.halos/src/test/java/org/sophie2/base/halos/HalosDemo.java

     
    232232        } 
    233233 
    234234        /** 
    235          ??????* A demo implementation of the {@link ClickHaloButton}. 
     235         * A demo implementation of the {@link ClickHaloButton}. 
    236236         *  
    237237         * @author peko 
    238238         *  
  • 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

     
    1616import org.sophie2.base.skins.SkinElementId; 
    1717import org.sophie2.base.visual.skins.VisualElementDef; 
    1818import org.sophie2.extra.func.annotations.view.StickyView; 
     19import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    1920import org.sophie2.main.app.commons.page.PageWorkArea; 
    2021import org.sophie2.main.app.halos.page.element.PageElementMoveHaloButton; 
    2122 
     
    3435                // lock the view rect, so that we don't have auto-scrolls while moving. 
    3536                final PageWorkArea workArea = workArea().get(); 
    3637                final SceneVisual sv = workArea.sceneVisual().get(); 
    37                 sv.wantedViewRect().set(sv.actualViewRect().get()); 
     38                sv.wantedViewRect().set(sv.lastViewRect().get()); 
    3839 
    3940                StickyView stickyView = findParentElement(StickyHaloMenu.class).stickyView().get();  
    4041                final TimePos time = stickyView.getTime();   
     
    4748                                workArea.getSel().getEditScope().sceneElement().get()).inverse();  
    4849                final ImmPoint zero = sceneToParent.transform(ImmPoint.ZERO);  
    4950 
    50                 MouseCapture result = new MouseCapture(0, 0, e) { 
     51                MouseCapture result = new PageAreaMouseCapture(0, 0, e) { 
    5152 
    5253                        private void releaseAction(final LocationChannel locationChannel) { 
    5354                                final ImmPoint newlocation =  
     
    8081                        } 
    8182 
    8283                        @Override 
    83                         public void released() { 
     84                        public void onReleased() { 
    8485                                sv.wantedViewRect().set(null); 
    8586                                releaseAction(channel); 
    86  
    8787                        } 
    8888 
    8989                        @Override 
    9090                        public void shouldMove(final int newX, final int newY) { 
    9191                                moveAction(channel, newX, newY); 
    9292                        } 
     93 
     94                        @Override 
     95                        public PageWorkArea getWorkArea() { 
     96                                return workArea; 
     97                        } 
    9398                }; 
    9499 
    95100                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

     
    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; 
     
    7073        } 
    7174 
    7275        private static final int DEFAULT_PADDING_L = 18; 
    73         private static final int DEFAULT_PADDING_R = 18; 
     76        private static final int DEFAULT_PADDING_R = 30; 
    7477        private static final int DEFAULT_PADDING_T = 48; 
    7578        private static final int DEFAULT_PADDING_B = 18; 
    76  
     79         
    7780        public RwProp<ImmRect> wantedViewRect() { 
    7881                return getBean().makeValueProp("wantedViewRect", ImmRect.class, null); 
    7982        } 
    8083 
    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  
    8984        @Own 
    9085        public RwProp<Scene> scene() { 
    9186                return getBean().makeValueProp("scene", Scene.class); 
    9287        } 
     88         
     89        /** 
     90         * The size of the component where the scene is painted. This is the size which will be used for centering into it. 
     91         *  
     92         * @return The property. 
     93         */ 
     94        public RwProp<ImmSize> viewportSize() { 
     95                return getBean().makeValueProp("viewportSize", ImmSize.class, ImmSize.ZERO); 
     96        } 
    9397 
    9498        public Prop<JComponent> swingComponent() { 
    9599                class swingComponent extends ResourceProperty<JComponent> { 
     
    112116 
    113117                        @Override 
    114118                        protected void setup(JComponent res) { 
     119 
    115120                                Dimension size = actualViewRect().get().getSize().toDimension(); 
     121                                 
     122                                 
     123                                int vScrollWidth = 0; 
     124                                int hScrollHeight = 0; 
     125                                 
     126                                if (res.getParent() != null && 
     127                                                res.getParent().getParent() != null && 
     128                                                res.getParent().getParent().getParent() != null && 
     129                                                res.getParent().getParent().getParent() instanceof JScrollPane) { 
     130                                         
     131                                        if (res.getParent().getParent().getParent() instanceof JScrollPane) { 
     132                                                JScrollPane pane = (JScrollPane)(swingComponent().get().getParent().getParent().getParent()); 
     133                                                vScrollWidth = pane.getVerticalScrollBar().getWidth(); 
     134                                                hScrollHeight = pane.getHorizontalScrollBar().getHeight(); 
     135                                        } 
     136                                } 
     137                                 
     138                                int newWidth = size.width; 
     139                                int newHeight = size.height; 
     140                                 
     141                                if (size.getWidth() <= viewportSize().get().getWidth()  
     142                                                && size.getHeight() > viewportSize().get().getHeight()) { 
     143                                        newWidth -= hScrollHeight; 
     144                                } 
     145                                 
     146                                if (size.getWidth() > viewportSize().get().getWidth()  
     147                                                && size.getHeight() <= viewportSize().get().getHeight()) { 
     148                                        newHeight -= vScrollWidth; 
     149                                } 
     150 
     151                                size = new Dimension(newWidth, newHeight); 
     152                                                                 
     153                                minimalViewRect().get(); 
     154                                 
    116155                                res.setSize(size); 
    117156                                res.setPreferredSize(size); 
    118157                                res.setLayout(null); 
    119158                                res.revalidate(); 
     159                                res.repaint(); 
    120160                        } 
    121161 
    122162                        @SuppressWarnings("unused") 
     
    157197                return getBean().makeProp(swingComponent.class); 
    158198        } 
    159199 
     200         
     201         
    160202        /** 
    161203         * A view rectangle, if it can not be determined automatically (such as, 
    162204         * when no scene is set). 
    163205         */ 
    164206        protected static final ImmRect DEFAULT_VIEW_RECT = 
    165207                new ImmRect(0, 0, 256, 256); 
    166  
    167         public Prop<ImmRect> actualViewRect() { 
    168                 class actualViewRect extends AutoProperty<ImmRect> { 
     208         
     209        public RwProp<ImmRect> actualViewRect(){ 
     210                return getBean().makeValueProp("actualViewRect", ImmRect.class, ImmRect.ZERO_RECT); 
     211        } 
     212         
     213        public RwProp<ImmRect> lastViewRect(){ 
     214                return getBean().makeValueProp("lastViewRect", ImmRect.class, ImmRect.ZERO_RECT); 
     215        } 
     216         
     217        public Prop<ImmRect> minimalViewRect() { 
     218                class minimalViewRect extends AutoProperty<ImmRect> { 
    169219 
    170220                        @Override 
    171221                        protected ImmRect compute() { 
     
    177227                                                && scene().get().rootElement().get() != null) { 
    178228                                        ImmRect bound = SceneHelper.getBoundingRect(scene().get(), 
    179229                                                        scene().get().rootElement().get()); 
     230                                        res = bound; 
     231                         
     232                                                 
    180233                                        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); 
     234                                        res.getX() - DEFAULT_PADDING_L,  
     235                                        res.getY() - DEFAULT_PADDING_T,  
     236                                        res.getWidth() + DEFAULT_PADDING_R + DEFAULT_PADDING_L,  
     237                                        res.getHeight() + DEFAULT_PADDING_B + DEFAULT_PADDING_T); 
     238 
     239                                        ImmRect centeringRect = scene().get().centeringRect().get(); 
     240                                         
     241                                        if (!centeringRect.equals(ImmRect.ZERO_RECT)) { 
     242                                                ImmPoint centerPoint = new ImmPoint(centeringRect.getWidth()/2, 
     243                                                                centeringRect.getHeight()/2); 
     244                                                ImmRect toUnite = ImmRect.create(centerPoint, viewportSize().get()); 
     245                                                res = res.union(toUnite); 
     246                                        } else { 
     247                                                ImmRect toUnite = new ImmRect(ImmPoint.ZERO, viewportSize().get()); 
     248                                                res = res.union(toUnite); 
     249                                        } 
    185250                                } else { 
    186251                                        // can not determine... 
    187252                                        // just make something... 
    188253                                        res = DEFAULT_VIEW_RECT; 
    189254                                } 
    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  
    212255                                assert res != null; 
    213256                                return res; 
    214257                        } 
    215258                } 
    216  
    217                 return getBean().makeProp(actualViewRect.class); 
     259                return getBean().makeProp(minimalViewRect.class); 
    218260        } 
    219  
     261         
    220262        /** 
    221263         * Override this to provide logic for the creation of the Swing Component 
    222264         * of this {@link SceneVisual}. 
  • 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; 
     8 
     9import javax.swing.JDesktopPane; 
     10import javax.swing.JLayeredPane; 
     11 
     12/** 
     13 * LayoutManager that support adding of components with different layouts - null 
     14 * and some specific layout. An object is created with a specific 
     15 * {@link LayoutManager2}. When different components are added, they can be with 
     16 * constraint - CustomLayout.CUSTOM. This means that for layouting of these 
     17 * components will be used null layout. For all other components added, it will 
     18 * be used the given layout manager. This layout manager can be used for example 
     19 * for {@link JDesktopPane}. For example, components at 
     20 * {@link JLayeredPane#DEFAULT_LAYER} can be with {@link BorderLayout} and the 
     21 * components at {@link JLayeredPane#PALETTE_LAYER} to be with null layout. 
     22 *  
     23 * @author tanya 
     24 */ 
     25public class CustomLayout implements LayoutManager2,java.io.Serializable { 
     26 
     27        /** 
     28         * Used for serialization. 
     29         */ 
     30        private static final long serialVersionUID = 810513263396699528L; 
     31 
     32        private LayoutManager2 layoutManager; 
     33         
     34        /** 
     35         * The constraint for the objects which we want to be with null layout. 
     36         */ 
     37        public static final String CUSTOM   = "Custom"; 
     38         
     39        /** 
     40         * Constructs an object with another layout manager. The components added 
     41         * will be with null layout or will be added according 
     42         *  
     43         * @param manager 
     44         *            The manager which will be responsible for how the components 
     45         *            will be added and how will be layouted. 
     46         */ 
     47        public CustomLayout(LayoutManager2 manager) { 
     48                this.layoutManager = manager; 
     49        } 
     50         
     51        public void addLayoutComponent(Component comp, Object constraints) { 
     52                if (constraints != CUSTOM && this.layoutManager != null) { 
     53                        this.layoutManager.addLayoutComponent(comp, constraints); 
     54                } 
     55        } 
     56 
     57        public float getLayoutAlignmentX(Container target) { 
     58                if (this.layoutManager != null) { 
     59                        return this.layoutManager.getLayoutAlignmentX(target); 
     60                } 
     61 
     62                return 0f; 
     63        } 
     64 
     65        public float getLayoutAlignmentY(Container target) { 
     66                if (this.layoutManager != null) { 
     67                        return this.layoutManager.getLayoutAlignmentY(target); 
     68                } 
     69                 
     70                return 0f; 
     71        } 
     72 
     73        public void invalidateLayout(Container target) { 
     74                if (this.layoutManager != null) { 
     75                        this.layoutManager.invalidateLayout(target); 
     76                } 
     77        } 
     78 
     79        public Dimension maximumLayoutSize(Container target) { 
     80                if (this.layoutManager != null) { 
     81                        return this.layoutManager.maximumLayoutSize(target); 
     82                } 
     83                 
     84                return null; 
     85        } 
     86 
     87        public void addLayoutComponent(String name, Component comp) { 
     88                if (this.layoutManager != null) { 
     89                        this.layoutManager.addLayoutComponent(name, comp); 
     90                } 
     91        } 
     92 
     93        public void layoutContainer(Container parent) { 
     94                if (this.layoutManager != null) { 
     95                        this.layoutManager.layoutContainer(parent); 
     96                } 
     97        } 
     98 
     99        public Dimension minimumLayoutSize(Container parent) { 
     100                if (this.layoutManager != null) { 
     101                        return this.layoutManager.minimumLayoutSize(parent); 
     102                } 
     103                 
     104                return null; 
     105        } 
     106 
     107        public Dimension preferredLayoutSize(Container parent) { 
     108                if (this.layoutManager != null) { 
     109                        return this.layoutManager.preferredLayoutSize(parent); 
     110                } 
     111                 
     112                return null; 
     113        } 
     114 
     115        public void removeLayoutComponent(Component comp) { 
     116                if (this.layoutManager != null) { 
     117                        this.layoutManager.removeLayoutComponent(comp); 
     118                } 
     119        } 
     120} 
     121 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; 
    1418import org.sophie2.base.model.book.PageH; 
    1519import org.sophie2.base.scene.SceneVisual; 
    1620import org.sophie2.base.scene.effects.ColorEffect; 
     
    157161                                        @Override 
    158162                                        protected void setupScene() { 
    159163                                                rootElement().set(rootSceneElement().get()); 
     164                                                 
     165                                                ImmPoint pageLocation = ImmPoint.ZERO; 
     166                                                float zoom = bookView().get().getViewOptions().getZoom(); 
     167                                                ImmSize pageSize = bookView().get().model().get().getPageSize(); 
     168                                                pageSize = new ImmSize(pageSize.getWidth()*zoom, pageSize.getHeight()*zoom); 
     169                                                 
     170                                                ImmRect centeringRect = new ImmRect(pageLocation, pageSize); 
     171                                                 
     172                                                boolean isDesktopBook = !(bookView().get().getViewOptions().isShowControls()); 
     173                                                 
     174                                                if (!isDesktopBook) { 
     175                                                        centeringRect().set(centeringRect); 
     176                                                } 
     177                                                 
    160178                                                topEventSource().set(PageWorkArea.this); 
    161179                                        } 
    162180                                }; 
     
    208226                        @Override 
    209227                        protected void setup(JDesktopPane res) { 
    210228                         
     229                                res.setLayout(new CustomLayout(new BorderLayout())); 
     230                                 
    211231                                JComponent sceneComp = sceneVisual().get().swingComponent().get(); 
    212232 
    213233                                sceneComp.setLocation(0, 0); 
    214234                                SophieLog.debug("PageWorkArea.layeredPage: sceneComp:" + sceneComp); 
    215235 
    216236                                res.removeAll(); 
    217                                 res.add(sceneComp, JLayeredPane.DEFAULT_LAYER); 
     237                                res.setLayer(sceneComp, JLayeredPane.DEFAULT_LAYER); 
     238                                 
     239                                res.add(sceneComp, BorderLayout.CENTER); 
    218240 
    219241                                res.revalidate(); 
    220242                                res.repaint(); 
     
    224246                        @SuppressWarnings("unused") 
    225247                        @Setup 
    226248                        protected void setupActualSize(JLayeredPane res) { 
    227  
    228                                 // grab the value to set up the property sync 
    229                                 ImmRect actualCache = sceneVisual().get().actualViewRect().get(); 
    230  
    231249                                JDesktopPane desktopPane = swingComponent().get(); 
    232250                                desktopPane.revalidate(); 
    233251                                desktopPane.repaint(); 
     
    427445                } 
    428446                return getBean().makeProp(selectionRisenElement.class); 
    429447        } 
     448         
     449        /** 
     450         * Property which have True or False value depending on whether mouse capture event is started or not. 
     451         * <b>true</b> if mouse capture is on, <b>false</b> otherwise. 
     452         *  
     453         * @return property 
     454         */ 
     455        public RwProp<Boolean> scrollsLocked() { 
     456                return getBean().makeValueProp("scrollsLocked", Boolean.class, Boolean.FALSE);   
     457        } 
    430458} 
     459 No newline at end of file 
  • modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/page/resize/PageResizeHaloButton.java

     
    2222import org.sophie2.base.visual.skins.SkinPartDef; 
    2323import org.sophie2.base.visual.skins.VisualElementDef; 
    2424import org.sophie2.core.prolib.interfaces.Prop; 
     25import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2526import org.sophie2.main.app.commons.page.PageWorkArea; 
    2627import org.sophie2.main.app.halos.common.AppHaloUtil; 
    2728 
     
    4950 
    5051        @Override 
    5152        protected MouseCapture captureClick(MouseEvent e) { 
    52                 PageWorkArea pwa = AppHaloUtil.getWorkArea(PageResizeHaloButton.this); 
     53                final PageWorkArea pwa = AppHaloUtil.getWorkArea(PageResizeHaloButton.this); 
    5354 
    5455                if(pwa !=null ){ 
    5556 
    5657                        final SceneVisual sv = pwa.sceneVisual().get(); 
    57                         sv.wantedViewRect().set(sv.actualViewRect().get()); 
     58                        sv.wantedViewRect().set(sv.lastViewRect().get()); 
    5859 
    5960                        final BookH book = pwa.bookView().get().model().get(); 
    6061 
     
    6364                        final ImmMatrix transf = SceneHelper.getElementToSceneTransform(pwa.scene().get(), pwa.rootSceneElement().get()); 
    6465 
    6566                        ImmVector resizedSize = transf.transform(v); 
    66                         return new MouseCapture((int) resizedSize.getPointX(), (int) resizedSize.getPointY(), 
     67                        return new PageAreaMouseCapture((int) resizedSize.getPointX(), (int) resizedSize.getPointY(), 
    6768                                        e) { 
    6869 
    6970                                @Override 
    70                                 public void released() { 
     71                                public void onReleased() { 
    7172                                        sv.wantedViewRect().set(null); 
    7273 
    73  
    7474                                        new AutoAction("Set page size", true) { 
    7575 
    7676                                                @Override 
     
    112112                                        }.register(book.getAccess()); 
    113113                                } 
    114114 
     115                                @Override 
     116                                public PageWorkArea getWorkArea() { 
     117                                        return pwa; 
     118                                } 
     119 
    115120                        }; 
    116121                } 
    117122                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; 
     
    3130import org.sophie2.core.mvc.OperationDef; 
    3231import org.sophie2.core.mvc.SortKey; 
    3332import org.sophie2.core.mvc.events.EventR3; 
     33import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    3434import org.sophie2.main.app.commons.app.AppMainWindow; 
    3535import org.sophie2.main.app.commons.book.BookDocView; 
    3636import org.sophie2.main.app.commons.book.BookViewOptions; 
     
    130130 
    131131                        MouseEvent cause = event.getCausingEvent(EventR3.class).getCausingEvent( 
    132132                                        MouseEvent.class); 
    133                         new MouseCapture(0, 0, cause) { 
     133                        new PageAreaMouseCapture(0, 0, cause) { 
    134134 
    135135                                @Override 
    136                                 public void released() { 
     136                                public void onReleased() { 
    137137                                        pwa.selectionArea().set(ImmArea.EMPTY); 
    138138                                } 
    139139 
     
    169169                                                                pwa.getSel().select(toSelect, false); 
    170170                                                        } 
    171171                                } 
     172 
     173                                @Override 
     174                                public PageWorkArea getWorkArea() { 
     175                                        return pwa; 
     176                                } 
    172177                        }; 
    173178                        return true; 
    174179                } 
  • 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; 
     
    2423import org.sophie2.core.mvc.EventFilterBuilder; 
    2524import org.sophie2.core.mvc.OperationDef; 
    2625import org.sophie2.core.mvc.events.EventR3; 
     26import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    2727import org.sophie2.main.app.commons.element.ElementView; 
    2828import org.sophie2.main.app.commons.element.ResizeAreaSceneElement.ResizeSubAreaElement; 
    2929import org.sophie2.main.app.commons.page.PageWorkArea; 
     
    5555                        final ElementView elementView = event.getSource(ElementView.class); 
    5656                        final ResourceAccess access = elementView.getAccess(); 
    5757                 
    58                         PageWorkArea pwa = elementView.getPwa(); 
     58                        final PageWorkArea pwa = elementView.getPwa(); 
    5959                        Mode sizeTemplateMode = ResizableElement.KEY_SIZE.getMode(access); 
    6060                        Mode locTemplateMode = MemberElement.KEY_LOCATION.getMode(access); 
    6161 
     
    7575 
    7676                        // lock the view rect, so that we don't have auto-scrolls while moving. 
    7777                        final SceneVisual sv = pwa.sceneVisual().get(); 
    78                         sv.wantedViewRect().set(sv.actualViewRect().get()); 
     78                        sv.wantedViewRect().set(sv.lastViewRect().get()); 
    7979 
    8080                        MouseEvent cause = event.getCausingEvent(EventR3.class).getCausingEvent( 
    8181                                        MouseEvent.class); 
    8282 
    83                         new MouseCapture(0, 0, cause) { 
     83                        new PageAreaMouseCapture(0, 0, cause) { 
    8484 
    8585                                private void doResize(final LocationChannel oldChannel) { 
    8686                                        final ImmSize newSize = ResizableElement.KEY_SIZE.get(access); 
     
    100100                                } 
    101101                                 
    102102                                @Override 
    103                                 public void released() { 
     103                                public void onReleased() { 
    104104                                        doResize(channel); 
    105105                                        sv.wantedViewRect().set(null); 
    106106                                } 
     
    173173 
    174174                                        } 
    175175                                } 
     176 
     177                                @Override 
     178                                public PageWorkArea getWorkArea() { 
     179                                        return pwa; 
     180                                } 
    176181                        }; 
    177182 
    178183                        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

     
    11package org.sophie2.main.scene.simple; 
    22 
     3import java.awt.Container; 
    34import java.awt.Graphics; 
    45import java.awt.Graphics2D; 
    56 
    67import javax.swing.JComponent; 
    78import javax.swing.JPanel; 
     9import javax.swing.JScrollPane; 
    810 
    911import org.sophie2.base.commons.util.position.ImmRect; 
     12import org.sophie2.base.commons.util.position.ImmSize; 
    1013import org.sophie2.base.scene.BaseSceneVisual; 
    1114import org.sophie2.base.scene.SceneVisual; 
    1215import org.sophie2.base.scene.helpers.SceneHelper; 
     
    1619/** 
    1720 * Simple scene implementation. 
    1821 *  
    19  * @author milo, peko, nenko, mira, gogov 
     22 * @author milo, peko, nenko, mira, gogov, tanya 
    2023 */ 
    2124@SkinElementId("main.scene.simple.simple-scene-visual") 
    2225public class SimpleSceneVisual extends BaseSceneVisual { 
     
    3740                private static final long serialVersionUID = 4801814966438437503L; 
    3841 
    3942                private long lastPaintTime = System.currentTimeMillis(); 
    40  
     43                 
     44                private static final int OFFSET = 2; 
     45                 
    4146                @Override 
    4247                protected void paintComponent(Graphics graphics) { 
    4348 
     
    5358                        SophieLog.trace("paintComponent: parent=" + getParent()); 
    5459 
    5560                        Graphics2D g2d = (Graphics2D) graphics.create(); 
     61                        //Centering the actual view rectangle. 
     62                         
     63                        int w = this.getParent().getParent().getParent().getWidth(); 
     64                        int h = this.getParent().getParent().getParent().getHeight(); 
     65 
     66                         
     67                        viewportSize().set(new ImmSize(w, h)); 
    5668                        ImmRect visRect = actualViewRect().get(); 
    5769 
    5870                        SceneHelper.paint(g2d, visRect, scene().get()); 
    59  
     71                         
     72                        Container container = this.getParent().getParent().getParent(); 
     73                        if (container instanceof JScrollPane) { 
     74                                JScrollPane pane = (JScrollPane) container; 
     75                                 
     76                                if (!lastViewRect().get().equals(visRect)) { 
     77                                        if (lastViewRect().get().getY() > visRect.getY()) { 
     78                                                pane.getVerticalScrollBar().setValue(0);                                                 
     79                                        } else if (lastViewRect().get().getHeight() + OFFSET + lastViewRect().get().getY() < visRect.getHeight() + visRect.getY() 
     80                                                        && lastViewRect().get().getY() <= visRect.getY()) { 
     81                                                pane.getVerticalScrollBar().setValue(pane.getVerticalScrollBar().getMaximum()); 
     82                                        } 
     83                                         
     84                                        if (lastViewRect().get().getX() > visRect.getX()) { 
     85                                                pane.getHorizontalScrollBar().setValue(0);                                               
     86                                        } else if (lastViewRect().get().getWidth() + OFFSET + lastViewRect().get().getX() < visRect.getWidth() + visRect.getX() 
     87                                                        && lastViewRect().get().getX() <= visRect.getX()) { 
     88                                                pane.getHorizontalScrollBar().setValue(pane.getHorizontalScrollBar().getMaximum()); 
     89                                        } 
     90                                } 
     91                        } 
     92                         
     93                        lastViewRect().set(visRect); 
     94                         
    6095                        SophieLog.debug("paintComponent: total paint time=" 
    6196                                        + (System.currentTimeMillis() - startTime)); 
     97                         
    6298                } 
    6399        } 
    64100} 
  • 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.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.halos/src/main/java/org/sophie2/main/app/halos/frame/MainTitleBarHalo.java

     
    4545import org.sophie2.core.prolib.interfaces.RwProp; 
    4646import org.sophie2.core.prolib.list.ComposingProList; 
    4747import org.sophie2.core.prolib.list.ProList; 
     48import org.sophie2.main.app.commons.PageAreaMouseCapture; 
    4849import org.sophie2.main.app.commons.element.ElementView; 
    4950import org.sophie2.main.app.commons.element.GroupView; 
    5051import org.sophie2.main.app.commons.frame.FrameView; 
     
    253254         */ 
    254255        protected MouseCapture captureClick(MouseEvent e) { 
    255256 
     257                final PageWorkArea pwa = workArea().get();  
     258 
    256259                // lock the view rect, so that we don't have auto-scrolls while moving. 
    257                 final SceneVisual sv = workArea().get().sceneVisual().get(); 
    258                 sv.wantedViewRect().set(sv.actualViewRect().get()); 
     260                final SceneVisual sv = pwa.sceneVisual().get(); 
     261                sv.wantedViewRect().set(sv.lastViewRect().get()); 
    259262 
    260263                // get the selected frame locations before start moving 
    261264                ResourceRefList frameRefs = ResourceRefList.EMPTY; 
     
    289292                 
    290293                 
    291294                //TODO: rewrite --milo 
    292                 MouseCapture result = new MouseCapture(0, 0, e) { 
     295                MouseCapture result = new PageAreaMouseCapture(0, 0, e) { 
    293296                         
    294297                        private void releasedAction( 
    295298                                        final ImmList<ImmPoint> oldPositions, 
     
    341344                        } 
    342345                         
    343346                        @Override 
    344                         public void released() { 
     347                        public void onReleased() { 
    345348                                sv.wantedViewRect().set(null); 
    346349                                releasedAction(finalOldLocations, finalFrameRefs, finalTimes); 
    347350                        } 
     
    349352                        @Override 
    350353                        public void shouldMove(final int newX, final int newY) { 
    351354                                moveAction(finalOldLocations, finalFrameRefs, finalTimes, newX, newY); 
     355                        } 
    352356 
     357                        @Override 
     358                        public PageWorkArea getWorkArea() { 
     359                                return pwa; 
    353360                        } 
    354361                }; 
    355362                return result;