Ticket #1968: 1968_im_fi_ stefan.patch
File 1968_im_fi_ stefan.patch, 47.1 KB (added by stefan, 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
20 20 import org.sophie2.base.scene.interfaces.Scene; 21 21 import org.sophie2.base.skins.SkinElementId; 22 22 import org.sophie2.base.visual.skins.VisualElementDef; 23 import org.sophie2.main.app.commons.PageAreaMouseCapture; 23 24 import org.sophie2.main.app.commons.frame.FrameView; 24 25 import org.sophie2.main.app.commons.page.PageWorkArea; 25 26 import org.sophie2.main.app.halos.common.AppHaloUtil; … … 48 49 final FrameH frame = frameView.model().get(); 49 50 final double oldAngle = frame.getRotationAngle(); 50 51 51 PageWorkArea pwa = AppHaloUtil.getWorkArea(this);52 final PageWorkArea pwa = AppHaloUtil.getWorkArea(this); 52 53 final Scene scene = pwa.scene().get(); 53 54 final ImmMatrix sceneToParent = SceneHelper.getElementToSceneTransform(scene, 54 55 frameView.parent().get().sceneElement().get()).inverse(); … … 68 69 final ImmPoint oldControl = sceneToParent.transform(controlInScene); 69 70 70 71 final SceneVisual sceneVisual = pwa.sceneVisual().get(); 71 sceneVisual.wantedViewRect().set(sceneVisual. actualViewRect().get());72 sceneVisual.wantedViewRect().set(sceneVisual.lastViewRect().get()); 72 73 73 return new MouseCapture(0, 0, e) {74 return new PageAreaMouseCapture(0, 0, e) { 74 75 75 76 @Override 76 77 public void shouldMove(int newX, int newY) { … … 85 86 } 86 87 87 88 @Override 88 public void released() {89 public void onReleased() { 89 90 final Double angle = frame.getRotationAngle(); 90 91 setAngle(angle, true); 91 92 sceneVisual.wantedViewRect().set(null); … … 144 145 145 146 } 146 147 148 @Override 149 public PageWorkArea getWorkArea() { 150 return pwa; 151 } 152 147 153 }; 148 154 } 149 155 -
modules/org.sophie2.base.commons/src/main/java/org/sophie2/base/commons/util/position/ImmRect.java
348 348 public boolean contains(ImmPoint point) { 349 349 return this.toRectangle().contains(point.toPoint()); 350 350 } 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 } 351 369 } -
modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/PageAreaMouseCapture.java
1 package org.sophie2.main.app.commons; 2 3 import java.awt.event.MouseEvent; 4 5 import org.sophie2.base.commons.gui.MouseCapture; 6 import org.sophie2.main.app.commons.page.PageWorkArea; 7 8 /** 9 * Modified {@link MouseCapture} for {@link PageWorkArea}. 10 * 11 * @author tanya 12 */ 13 public 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
1 package org.sophie2.base.layout.model; 2 3 import java.awt.BorderLayout; 4 5 import javax.swing.JDesktopPane; 6 import javax.swing.JFrame; 7 import javax.swing.JInternalFrame; 8 import javax.swing.JLayeredPane; 9 10 /** 11 * Demo for demonstrating the usage of {@link CustomLayout}. 12 * @author tanya 13 */ 14 public 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
16 16 import org.sophie2.base.skins.SkinElementId; 17 17 import org.sophie2.base.visual.skins.VisualElementDef; 18 18 import org.sophie2.extra.func.annotations.view.StickyView; 19 import org.sophie2.main.app.commons.PageAreaMouseCapture; 19 20 import org.sophie2.main.app.commons.page.PageWorkArea; 20 21 import org.sophie2.main.app.halos.page.element.PageElementMoveHaloButton; 21 22 … … 34 35 // lock the view rect, so that we don't have auto-scrolls while moving. 35 36 final PageWorkArea workArea = workArea().get(); 36 37 final SceneVisual sv = workArea.sceneVisual().get(); 37 sv.wantedViewRect().set(sv. actualViewRect().get());38 sv.wantedViewRect().set(sv.lastViewRect().get()); 38 39 39 40 StickyView stickyView = findParentElement(StickyHaloMenu.class).stickyView().get(); 40 41 final TimePos time = stickyView.getTime(); … … 47 48 workArea.getSel().getEditScope().sceneElement().get()).inverse(); 48 49 final ImmPoint zero = sceneToParent.transform(ImmPoint.ZERO); 49 50 50 MouseCapture result = new MouseCapture(0, 0, e) {51 MouseCapture result = new PageAreaMouseCapture(0, 0, e) { 51 52 52 53 private void releaseAction(final LocationChannel locationChannel) { 53 54 final ImmPoint newlocation = … … 80 81 } 81 82 82 83 @Override 83 public void released() {84 public void onReleased() { 84 85 sv.wantedViewRect().set(null); 85 86 releaseAction(channel); 86 87 87 } 88 88 89 89 @Override 90 90 public void shouldMove(final int newX, final int newY) { 91 91 moveAction(channel, newX, newY); 92 92 } 93 94 @Override 95 public PageWorkArea getWorkArea() { 96 return workArea; 97 } 93 98 }; 94 99 95 100 return result; -
modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/interfaces/Scene.java
1 1 package org.sophie2.base.scene.interfaces; 2 2 3 3 import org.sophie2.base.commons.util.ImmColor; 4 import org.sophie2.base.commons.util.position.ImmRect; 4 5 import org.sophie2.base.scene.helpers.SceneHelper; 5 6 import org.sophie2.core.prolib.impl.BaseProObject; 6 7 import org.sophie2.core.prolib.interfaces.Prop; … … 35 36 * @return property 36 37 */ 37 38 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 39 47 /** 40 48 * The background color of the scene. This is the infinite area that is 41 49 * 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
443 443 return component; 444 444 } 445 445 446 public Prop<ImmRect> actualViewRect() {446 public RwProp<ImmRect> lastViewRect() { 447 447 return getBean().makeValueProp("actualViewRect", ImmRect.class, 448 448 ImmRect.ZERO_RECT); 449 449 } … … 471 471 472 472 public RwProp<ImmRect> minimalViewRect() { 473 473 return getBean().makeValueProp("minimalViewRect", ImmRect.class, null); 474 } 474 } 475 475 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 // } 479 485 } 480 486 481 487 /** -
modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/BaseSceneVisual.java
1 1 package org.sophie2.base.scene; 2 2 3 import java.awt. Dimension;3 import java.awt.Container; 4 4 import java.util.List; 5 5 6 6 import javax.swing.JComponent; 7 import javax.swing.JScrollPane; 7 8 8 9 import org.sophie2.base.commons.util.OSUtil; 10 import org.sophie2.base.commons.util.position.ImmPoint; 9 11 import org.sophie2.base.commons.util.position.ImmRect; 12 import org.sophie2.base.commons.util.position.ImmSize; 10 13 import org.sophie2.base.dnd.SophieDragDropHandler; 11 14 import org.sophie2.base.scene.helpers.ElementHelper; 12 15 import org.sophie2.base.scene.helpers.SceneHelper; … … 71 74 72 75 private static final int DEFAULT_PADDING_L = 18; 73 76 private static final int DEFAULT_PADDING_R = 18; 74 private static final int DEFAULT_PADDING_T = 4 8;77 private static final int DEFAULT_PADDING_T = 42; 75 78 private static final int DEFAULT_PADDING_B = 18; 76 79 77 80 public RwProp<ImmRect> wantedViewRect() { 78 81 return getBean().makeValueProp("wantedViewRect", ImmRect.class, null); 79 82 } 80 83 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 89 84 @Own 90 85 public RwProp<Scene> scene() { 91 86 return getBean().makeValueProp("scene", Scene.class); 92 87 } 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 } 93 97 94 98 public Prop<JComponent> swingComponent() { 95 99 class swingComponent extends ResourceProperty<JComponent> { 96 100 @Override 97 101 protected JComponent create() { 98 102 JComponent res = createSwingComponent(); 103 res.setLayout(null); 104 99 105 SwingEventAdapter.registerComponent(res, 100 106 BaseSceneVisual.this, null, res); 101 107 … … 112 118 113 119 @Override 114 120 protected void setup(JComponent res) { 115 Dimension size = actualViewRect().get().getSize().toDimension(); 116 res.setSize(size); 117 res.setPreferredSize(size); 118 res.setLayout(null); 121 ImmRect bound = SceneHelper.getBoundingRect(scene().get(), 122 scene().get().rootElement().get()); 123 ImmSize preferredSize = new ImmSize(bound.getWidth() + DEFAULT_PADDING_R + DEFAULT_PADDING_L, 124 bound.getHeight() + DEFAULT_PADDING_B + DEFAULT_PADDING_T); 125 126 res.setPreferredSize(preferredSize.toDimension()); 119 127 res.revalidate(); 128 res.repaint(); 120 129 } 121 130 122 131 @SuppressWarnings("unused") … … 157 166 return getBean().makeProp(swingComponent.class); 158 167 } 159 168 169 170 160 171 /** 161 172 * A view rectangle, if it can not be determined automatically (such as, 162 173 * when no scene is set). 163 174 */ 164 175 protected static final ImmRect DEFAULT_VIEW_RECT = 165 176 new ImmRect(0, 0, 256, 256); 166 167 public Prop<ImmRect> actualViewRect() { 168 class actualViewRect extends AutoProperty<ImmRect> { 177 178 public RwProp<ImmRect> actualViewRect(){ 179 return getBean().makeValueProp("actualViewRect", ImmRect.class, ImmRect.ZERO_RECT); 180 } 181 182 public RwProp<ImmRect> lastViewRect(){ 183 return getBean().makeValueProp("lastViewRect", ImmRect.class, ImmRect.ZERO_RECT); 184 } 185 186 public Prop<ImmRect> minimalViewRect() { 187 class minimalViewRect extends AutoProperty<ImmRect> { 169 188 170 189 @Override 171 190 protected ImmRect compute() { … … 177 196 && scene().get().rootElement().get() != null) { 178 197 ImmRect bound = SceneHelper.getBoundingRect(scene().get(), 179 198 scene().get().rootElement().get()); 199 res = bound; 200 180 201 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); 202 res.getX() - DEFAULT_PADDING_L, 203 res.getY() - DEFAULT_PADDING_T, 204 res.getWidth() + DEFAULT_PADDING_R + DEFAULT_PADDING_L, 205 res.getHeight() + DEFAULT_PADDING_B + DEFAULT_PADDING_T); 206 207 ImmRect centeringRect = scene().get().centeringRect().get(); 208 209 if (!centeringRect.equals(ImmRect.ZERO_RECT)) { 210 ImmPoint centerPoint = new ImmPoint(centeringRect.getWidth()/2, 211 centeringRect.getHeight()/2); 212 ImmRect toUnite = ImmRect.create(centerPoint, viewportSize().get()); 213 res = res.union(toUnite); 214 } else { 215 ImmRect toUnite = new ImmRect(ImmPoint.ZERO, viewportSize().get()); 216 res = res.union(toUnite); 217 } 185 218 } else { 186 219 // can not determine... 187 220 // just make something... 188 221 res = DEFAULT_VIEW_RECT; 189 222 } 190 191 // Center the actualRect on the minimalViewRect192 // wantedViewRect is set by halo mouse tracking to limit the rect,193 // so do nothing if wantedViewRect is not null194 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 212 223 assert res != null; 213 224 return res; 214 225 } 215 226 } 216 217 return getBean().makeProp(actualViewRect.class); 227 return getBean().makeProp(minimalViewRect.class); 218 228 } 219 229 220 230 /** 221 231 * Override this to provide logic for the creation of the Swing Component 222 232 * of this {@link SceneVisual}. … … 229 239 protected boolean computeVisible() { 230 240 return true; 231 241 } 242 243 /** 244 * Finds possible {@link JScrollPane} parent, to a specific depth 245 * @param res 246 * The starting component. 247 * @param depth 248 * The depth to which we search 249 * @return nearest {@link JScrollPane} parent, null if not. 250 */ 251 public static JScrollPane findParentScrollPane(JComponent res, int depth) { 252 Container component = res; 253 int i = 0; 254 255 while (i < depth && component != null) { 256 257 if (component instanceof JScrollPane) { 258 return (JScrollPane) component; 259 } 260 261 component = component.getParent(); 262 ++i; 263 } 264 265 return null; 266 } 232 267 } -
modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/helpers/SceneHelper.java
248 248 SophieLog.trace("sceneToSwing: sceneRect=" + sceneRect); 249 249 assert sceneRect != null; 250 250 // only translation... 251 ImmRect viewRect = visual. actualViewRect().get();251 ImmRect viewRect = visual.lastViewRect().get(); 252 252 assert viewRect != null; 253 253 SophieLog.trace("sceneToSwing: viewRect=" + viewRect); 254 254 ImmRect res = Position.translate(sceneRect, -viewRect.getX(), -viewRect … … 271 271 SophieLog.trace("sceneToSwing: sceneRect=" + scenePoint); 272 272 assert scenePoint != null; 273 273 // only translation... 274 ImmRect viewRect = visual. actualViewRect().get();274 ImmRect viewRect = visual.lastViewRect().get(); 275 275 assert viewRect != null; 276 276 SophieLog.trace("sceneToSwing: viewRect=" + viewRect); 277 277 ImmPoint res = scenePoint.translate(-viewRect.getX(), -viewRect.getY()); … … 291 291 */ 292 292 public static ImmRect swingToScene(SceneVisual visual, ImmRect swingRect) { 293 293 // only translation... 294 ImmRect viewRect = visual. actualViewRect().get();294 ImmRect viewRect = visual.lastViewRect().get(); 295 295 return Position.translate(swingRect, viewRect.getX(), viewRect.getY()); 296 296 } 297 297 … … 306 306 */ 307 307 public static ImmPoint swingToScene(SceneVisual visual, ImmPoint swingPoint) { 308 308 // only translation... 309 ImmRect viewRect = visual. actualViewRect().get();309 ImmRect viewRect = visual.lastViewRect().get(); 310 310 assert viewRect != null; 311 311 return swingPoint.translate(viewRect.getX(), viewRect.getY()); 312 312 } -
modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/model/CustomLayout.java
1 package org.sophie2.base.layout.model; 2 3 import java.awt.BorderLayout; 4 import java.awt.Component; 5 import java.awt.Container; 6 import java.awt.Dimension; 7 import java.awt.LayoutManager2; 8 import java.io.Serializable; 9 10 import javax.swing.JDesktopPane; 11 import 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 */ 26 public 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
1 1 package org.sophie2.main.app.commons.page; 2 2 3 import java.awt.BorderLayout; 3 4 import java.util.ArrayList; 4 5 import java.util.List; 5 6 … … 10 11 import org.sophie2.base.commons.util.ImmColor; 11 12 import org.sophie2.base.commons.util.position.ImmArea; 12 13 import org.sophie2.base.commons.util.position.ImmMatrix; 14 import org.sophie2.base.commons.util.position.ImmPoint; 13 15 import org.sophie2.base.commons.util.position.ImmRect; 16 import org.sophie2.base.commons.util.position.ImmSize; 17 import org.sophie2.base.layout.model.CustomLayout; 14 18 import org.sophie2.base.model.book.PageH; 15 19 import org.sophie2.base.scene.SceneVisual; 16 20 import org.sophie2.base.scene.effects.ColorEffect; … … 152 156 @Override 153 157 protected Scene compute() { 154 158 assert getLastValue() == null; 159 155 160 return new BaseScene() { 156 161 157 162 @Override 158 163 protected void setupScene() { 159 164 rootElement().set(rootSceneElement().get()); 165 166 ImmPoint pageLocation = ImmPoint.ZERO; 167 float zoom = bookView().get().getViewOptions().getZoom(); 168 ImmSize pageSize = bookView().get().model().get().getPageSize(); 169 pageSize = new ImmSize(pageSize.getWidth() * zoom, pageSize.getHeight() * zoom); 170 ImmRect centeringRect = new ImmRect(pageLocation, pageSize); 171 172 centeringRect().set(centeringRect); 173 160 174 topEventSource().set(PageWorkArea.this); 161 175 } 162 176 }; … … 208 222 @Override 209 223 protected void setup(JDesktopPane res) { 210 224 225 res.setLayout(new CustomLayout(new BorderLayout())); 226 211 227 JComponent sceneComp = sceneVisual().get().swingComponent().get(); 212 228 213 229 sceneComp.setLocation(0, 0); 214 230 SophieLog.debug("PageWorkArea.layeredPage: sceneComp:" + sceneComp); 215 231 216 232 res.removeAll(); 217 res.add(sceneComp, JLayeredPane.DEFAULT_LAYER); 233 res.setLayer(sceneComp, JLayeredPane.DEFAULT_LAYER); 234 235 res.add(sceneComp, BorderLayout.CENTER); 218 236 219 237 res.revalidate(); 220 238 res.repaint(); 221 239 } 222 240 223 // TODO (r4) reimplement the page-work-area centering224 241 @SuppressWarnings("unused") 225 242 @Setup 226 243 protected void setupActualSize(JLayeredPane res) { 227 228 // grab the value to set up the property sync229 ImmRect actualCache = sceneVisual().get().actualViewRect().get();230 231 244 JDesktopPane desktopPane = swingComponent().get(); 232 245 desktopPane.revalidate(); 233 246 desktopPane.repaint(); … … 427 440 } 428 441 return getBean().makeProp(selectionRisenElement.class); 429 442 } 443 444 /** 445 * Property which have True or False value depending on whether mouse capture event is started or not. 446 * <b>true</b> if mouse capture is on, <b>false</b> otherwise. 447 * 448 * @return property 449 */ 450 public RwProp<Boolean> scrollsLocked() { 451 return getBean().makeValueProp("scrollsLocked", Boolean.class, Boolean.FALSE); 452 } 430 453 } 454 No newline at end of file -
modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/page/resize/PageResizeHaloButton.java
22 22 import org.sophie2.base.visual.skins.SkinPartDef; 23 23 import org.sophie2.base.visual.skins.VisualElementDef; 24 24 import org.sophie2.core.prolib.interfaces.Prop; 25 import org.sophie2.main.app.commons.PageAreaMouseCapture; 25 26 import org.sophie2.main.app.commons.page.PageWorkArea; 26 27 import org.sophie2.main.app.halos.common.AppHaloUtil; 27 28 … … 49 50 50 51 @Override 51 52 protected MouseCapture captureClick(MouseEvent e) { 52 PageWorkArea pwa = AppHaloUtil.getWorkArea(PageResizeHaloButton.this);53 final PageWorkArea pwa = AppHaloUtil.getWorkArea(PageResizeHaloButton.this); 53 54 54 55 if(pwa !=null ){ 55 56 56 57 final SceneVisual sv = pwa.sceneVisual().get(); 57 sv.wantedViewRect().set(sv. actualViewRect().get());58 sv.wantedViewRect().set(sv.lastViewRect().get()); 58 59 59 60 final BookH book = pwa.bookView().get().model().get(); 60 61 … … 63 64 final ImmMatrix transf = SceneHelper.getElementToSceneTransform(pwa.scene().get(), pwa.rootSceneElement().get()); 64 65 65 66 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(), 67 68 e) { 68 69 69 70 @Override 70 public void released() {71 public void onReleased() { 71 72 sv.wantedViewRect().set(null); 72 73 73 74 74 new AutoAction("Set page size", true) { 75 75 76 76 @Override … … 112 112 }.register(book.getAccess()); 113 113 } 114 114 115 @Override 116 public PageWorkArea getWorkArea() { 117 return pwa; 118 } 119 115 120 }; 116 121 } 117 122 return null; -
modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/page/ScenePageLogic.java
4 4 import java.util.ArrayList; 5 5 import java.util.List; 6 6 7 import org.sophie2.base.commons.gui.MouseCapture;8 7 import org.sophie2.base.commons.util.position.ImmArea; 9 8 import org.sophie2.base.commons.util.position.ImmMatrix; 10 9 import org.sophie2.base.commons.util.position.ImmPoint; … … 25 24 import org.sophie2.core.mvc.LogicR3; 26 25 import org.sophie2.core.mvc.OperationDef; 27 26 import org.sophie2.core.mvc.events.EventR3; 27 import org.sophie2.main.app.commons.PageAreaMouseCapture; 28 28 import org.sophie2.main.app.commons.app.AppMainWindow; 29 29 import org.sophie2.main.app.commons.book.BookDocView; 30 30 import org.sophie2.main.app.commons.element.ElementView; … … 120 120 121 121 MouseEvent cause = event.getCausingEvent(EventR3.class).getCausingEvent( 122 122 MouseEvent.class); 123 new MouseCapture(0, 0, cause) {123 new PageAreaMouseCapture(0, 0, cause) { 124 124 125 125 @Override 126 public void released() {126 public void onReleased() { 127 127 pwa.selectionArea().set(ImmArea.EMPTY); 128 128 } 129 129 … … 159 159 pwa.getSel().select(toSelect, false); 160 160 } 161 161 } 162 163 @Override 164 public PageWorkArea getWorkArea() { 165 return pwa; 166 } 162 167 }; 163 168 return true; 164 169 } -
modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/app/AppMainWindow.java
14 14 import org.sophie2.base.commons.util.position.ImmRect; 15 15 import org.sophie2.base.halos.HaloMenu; 16 16 import org.sophie2.base.layout.impl.DefaultMainWindow; 17 import org.sophie2.base.layout.model.CustomLayout; 17 18 import org.sophie2.base.layout.model.DocView; 18 19 import org.sophie2.base.media.MediaComposite; 19 20 import org.sophie2.base.media.MediaUtil; … … 211 212 if (hm.visible().get()) { 212 213 for (JComponent c : hm.swingComponents().get()) { 213 214 214 res.add(c, JLayeredPane.PALETTE_LAYER); 215 res.setLayer(c, JLayeredPane.PALETTE_LAYER); 216 res.add(c, CustomLayout.CUSTOM); 217 215 218 } 216 219 } 217 220 } … … 235 238 } 236 239 PageWorkArea workArea = bookDocView.workArea().get(); 237 240 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()) { 244 242 245 bounds = bounds.union(SceneHelper.swingToScene( 246 workArea.sceneVisual().get(), hm.activeBounds().get())); 247 } 243 JDesktopPane res = workArea.swingComponent().get(); 248 244 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); 251 254 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 } 255 260 } 256 257 261 } 258 262 return getBean().makeProp(haloSync.class); 259 263 } -
modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/frame/FrameLogic.java
2 2 3 3 import java.awt.event.MouseEvent; 4 4 5 import org.sophie2.base.commons.gui.MouseCapture;6 5 import org.sophie2.base.commons.util.position.ImmMatrix; 7 6 import org.sophie2.base.commons.util.position.ImmPoint; 8 7 import org.sophie2.base.commons.util.position.ImmSize; … … 25 24 import org.sophie2.core.mvc.EventFilterBuilder; 26 25 import org.sophie2.core.mvc.OperationDef; 27 26 import org.sophie2.core.mvc.events.EventR3; 27 import org.sophie2.main.app.commons.PageAreaMouseCapture; 28 28 import org.sophie2.main.app.commons.element.ElementView; 29 29 import org.sophie2.main.app.commons.element.ResizeAreaSceneElement.ResizeSubAreaElement; 30 30 import org.sophie2.main.app.commons.page.PageWorkArea; … … 56 56 final ElementView elementView = event.getSource(ElementView.class); 57 57 final ResourceAccess access = elementView.getAccess(); 58 58 59 PageWorkArea pwa = elementView.getPwa();59 final PageWorkArea pwa = elementView.getPwa(); 60 60 Mode sizeTemplateMode = ResizableElement.KEY_SIZE.getMode(access); 61 61 Mode locTemplateMode = MemberElement.KEY_LOCATION.getMode(access); 62 62 … … 77 77 // lock the view rect, so that we don't have auto-scrolls while moving. 78 78 final SceneVisual sv = pwa.sceneVisual().get(); 79 79 sv.wantedViewRect().set(sv.actualViewRect().get()); 80 80 81 81 MouseEvent cause = event.getCausingEvent(EventR3.class).getCausingEvent( 82 82 MouseEvent.class); 83 83 84 new MouseCapture(0, 0, cause) {84 new PageAreaMouseCapture(0, 0, cause) { 85 85 @Override 86 public void released() {86 public void onReleased() { 87 87 AutoAction.registerEndChange(access, "Resize frame finished."); 88 88 89 sv.wantedViewRect().set(null); 89 90 } 90 91 … … 92 93 final ImmPoint newLocationInPage, final ImmSize newSize) { 93 94 TimePos time = elementView.getTime(); 94 95 final LocationChannel newChannel = oldChannel.setValue(time, newLocationInPage); 95 new AutoAction("Frame resize", false) {96 new AutoAction("Frame resize", true) { 96 97 @Override 97 98 public void performAuto() { 98 99 ResourceChanger ch = getChanger(); … … 156 157 157 158 } 158 159 } 160 161 @Override 162 public PageWorkArea getWorkArea() { 163 return pwa; 164 } 159 165 }; 160 166 161 167 return true; -
modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/impl/BaseScene.java
1 1 package org.sophie2.base.scene.impl; 2 2 3 3 import org.sophie2.base.commons.util.ImmColor; 4 import org.sophie2.base.commons.util.position.ImmRect; 4 5 import org.sophie2.base.scene.interfaces.Scene; 5 6 import org.sophie2.base.scene.interfaces.SceneElement; 6 7 import org.sophie2.core.prolib.impl.ResourceProperty; … … 20 21 } 21 22 22 23 @Override 24 public RwProp<ImmRect> centeringRect() { 25 return getBean().makeValueProp("centeringRect", ImmRect.class, ImmRect.ZERO_RECT); 26 } 27 28 @Override 23 29 public RwProp<ImmColor> backgroundColor() { 24 30 return getBean().makeValueProp("backgroundColor", ImmColor.class, 25 31 ImmColor.GRAY); -
modules/org.sophie2.main.scene.simple/src/main/java/org/sophie2/main/scene/simple/SimpleSceneVisual.java
5 5 6 6 import javax.swing.JComponent; 7 7 import javax.swing.JPanel; 8 import javax.swing.JScrollPane; 8 9 9 10 import org.sophie2.base.commons.util.position.ImmRect; 11 import org.sophie2.base.commons.util.position.ImmSize; 10 12 import org.sophie2.base.scene.BaseSceneVisual; 11 13 import org.sophie2.base.scene.SceneVisual; 12 14 import org.sophie2.base.scene.helpers.SceneHelper; … … 16 18 /** 17 19 * Simple scene implementation. 18 20 * 19 * @author milo, peko, nenko, mira, gogov 21 * @author milo, peko, nenko, mira, gogov, tanya, stefan 20 22 */ 21 23 @SkinElementId("main.scene.simple.simple-scene-visual") 22 24 public class SimpleSceneVisual extends BaseSceneVisual { … … 37 39 private static final long serialVersionUID = 4801814966438437503L; 38 40 39 41 private long lastPaintTime = System.currentTimeMillis(); 40 42 43 private static final int OFFSET = 2; 44 41 45 @Override 42 46 protected void paintComponent(Graphics graphics) { 43 47 … … 53 57 SophieLog.trace("paintComponent: parent=" + getParent()); 54 58 55 59 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(); 57 75 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()); 60 96 SophieLog.debug("paintComponent: total paint time=" 61 97 + (System.currentTimeMillis() - startTime)); 98 62 99 } 63 100 } 64 101 } -
modules/org.sophie2.main.scene.sprites/src/main/java/org/sophie2/main/scene/sprites/SpritesSceneVisual.java
52 52 SophieLog.trace("paintComponent: parent=" + getParent()); 53 53 54 54 Graphics2D g2d = (Graphics2D) graphics.create(); 55 ImmRect visRect = actualViewRect().get();55 ImmRect visRect = lastViewRect().get(); 56 56 57 57 SceneHelper.paintSprite(g2d, visRect, scene().get()); 58 58 -
modules/org.sophie2.dev/src/main/java/org/sophie2/dev/author/FakeAuthorMain.java
114 114 SophieLog.setMinLevel("org.sophie2.base.commons.util", LogLevel.DEBUG); 115 115 SophieLog.setMinLevel("org.sophie2.base.model.resources.r4.model", LogLevel.DEBUG); 116 116 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.main.app.commons.frame", LogLevel.DEBUG); 117 120 118 121 assert System.getProperty(SophieEditions.PROP_ID) == null : 119 122 "You have set edition in fake mode?" ; -
modules/org.sophie2.base.scene/src/main/java/org/sophie2/base/scene/SceneVisual.java
32 32 * @return property 33 33 */ 34 34 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 54 36 /** 55 37 * The swing component displaying the scene. 56 38 * … … 72 54 * 73 55 * @return property 74 56 */ 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(); 76 73 } -
modules/org.sophie2.main.scene.jogl/src/main/java/org/sophie2/main/scene/jogl/JoglSceneVisual.java
64 64 public void display(GLAutoDrawable drawable) { 65 65 final GL2 gl = drawable.getGL().getGL2(); 66 66 67 SceneHelper.paint(gl, actualViewRect().get(), scene().get());67 SceneHelper.paint(gl, lastViewRect().get(), scene().get()); 68 68 } 69 69 70 70 public void reshape(GLAutoDrawable drawable, -
modules/org.sophie2.main.app.commons/src/main/java/org/sophie2/main/app/commons/app/DocumentsLogic.java
4 4 import org.sophie2.base.layout.impl.DefaultDocView; 5 5 import org.sophie2.base.model.resources.r4.ResourceRefR4; 6 6 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 7 import org.sophie2.core.logging.SophieLog;8 7 import org.sophie2.core.modularity.SortKey; 9 8 import org.sophie2.core.mvc.EventFilterBuilder; 10 9 import org.sophie2.core.mvc.EventParams; … … 128 127 129 128 return true; 130 129 } 131 132 },133 134 135 /**136 * Handles resizing of the window by the user. Should center the page in the137 * 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 153 130 }; 154 131 155 132 /** -
modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/frame/MainTitleBarHalo.java
45 45 import org.sophie2.core.prolib.interfaces.RwProp; 46 46 import org.sophie2.core.prolib.list.ComposingProList; 47 47 import org.sophie2.core.prolib.list.ProList; 48 import org.sophie2.main.app.commons.PageAreaMouseCapture; 48 49 import org.sophie2.main.app.commons.element.ElementView; 49 50 import org.sophie2.main.app.commons.element.GroupView; 50 51 import org.sophie2.main.app.commons.frame.FrameView; … … 253 254 */ 254 255 protected MouseCapture captureClick(MouseEvent e) { 255 256 257 final PageWorkArea pwa = workArea().get(); 258 256 259 // 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()); 259 262 260 263 // get the selected frame locations before start moving 261 264 ResourceRefList frameRefs = ResourceRefList.EMPTY; … … 289 292 290 293 291 294 //TODO: rewrite --milo 292 MouseCapture result = newMouseCapture(0, 0, e) {295 PageAreaMouseCapture result = new PageAreaMouseCapture(0, 0, e) { 293 296 294 297 private void releasedAction( 295 298 final ImmList<ImmPoint> oldPositions, … … 304 307 private void moveAction( 305 308 ImmList<ImmPoint> oldPositions, 306 309 ResourceRefList refs, ImmList<TimePos> times, final int newX, final int newY) { 307 310 308 311 if (currentPage().get() == null) { 309 312 return; 310 313 } … … 333 336 } 334 337 335 338 @Override 336 public void released() {339 public void onReleased() { 337 340 sv.wantedViewRect().set(null); 338 341 releasedAction(finalOldLocations, finalFrameRefs, finalTimes); 339 342 } … … 341 344 @Override 342 345 public void shouldMove(final int newX, final int newY) { 343 346 moveAction(finalOldLocations, finalFrameRefs, finalTimes, newX, newY); 347 } 344 348 349 @Override 350 public PageWorkArea getWorkArea() { 351 return pwa; 345 352 } 346 353 }; 347 354 return result;