Ticket #2307: dnd-visual-indication-templates.patch
File dnd-visual-indication-templates.patch, 17.7 KB (added by deni, 15 years ago) |
---|
-
TabularUnified src/main/java/org/sophie2/base/scene/helpers/ElementHelper.java
### Eclipse Workspace Patch 1.0 #P org.sophie2.base.scene
279 279 public void touch() { 280 280 getEffectiveTransform(); 281 281 getVisibleArea(); 282 getElement().effects().get(); 282 283 drawContent((Graphics2D)null); 283 284 } 284 285 -
TabularUnified src/main/java/org/sophie2/main/app/commons/page/RootPageView.java
#P org.sophie2.main.app.commons
72 72 * 73 73 * @return The property. 74 74 */ 75 public AutoProperty< PartPageView> mainPartView() {76 class mainPartView extends AutoProperty< PartPageView> {75 public AutoProperty<MainPageView> mainPartView() { 76 class mainPartView extends AutoProperty<MainPageView> { 77 77 78 78 @Override 79 protected PartPageView compute() {79 protected MainPageView compute() { 80 80 if (getLastValue() == null) { 81 return AppViewUtil.getView(RootPageView.this, getAccess(), PartPageView.class);81 return AppViewUtil.getView(RootPageView.this, getAccess(), MainPageView.class); 82 82 } 83 83 return getLastValue(); 84 84 } -
TabularUnified src/main/java/org/sophie2/main/app/commons/page/MainPageView.java
3 3 import java.util.Arrays; 4 4 import java.util.List; 5 5 6 import org.sophie2.base.commons.util.ImmColor; 6 7 import org.sophie2.base.commons.util.position.ImmArea; 7 8 import org.sophie2.base.commons.util.position.ImmPoint; 8 9 import org.sophie2.base.commons.util.position.ImmRect; 9 10 import org.sophie2.base.model.book.PageLinkTriggers; 11 import org.sophie2.base.model.book.frame.BoundMode; 10 12 import org.sophie2.base.model.book.links.LinkTrigger; 11 13 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 12 14 import org.sophie2.base.scene.effects.ClipEffect; 13 15 import org.sophie2.base.scene.impl.DefaultCompositeSceneElement; 16 import org.sophie2.base.scene.impl.DefaultShapeSceneElement; 17 import org.sophie2.base.scene.interfaces.SceneElement; 18 import org.sophie2.core.prolib.impl.AutoProperty; 19 import org.sophie2.core.prolib.interfaces.Prop; 20 import org.sophie2.core.prolib.interfaces.RwProp; 21 import org.sophie2.main.app.commons.frame.ContentManipulationView; 14 22 15 23 /** 16 24 * A view for all page elements. … … 46 54 protected List<LinkTrigger> getLinkTriggers() { 47 55 return Arrays.<LinkTrigger>asList(PageLinkTriggers.values()); 48 56 } 57 58 @Override 59 protected void setupSceneElements(List<SceneElement> res) { 60 if (!ImmColor.TRANSPARENT.equals(dndVisualIndicationColor().get())) { 61 res.add(dndVisualIndicationElement().get()); 62 } 63 64 super.setupSceneElements(res); 65 } 66 67 public RwProp<ImmColor> dndVisualIndicationColor() { 68 return getBean().makeValueProp("dndVisualIndicationColor", ImmColor.class, ImmColor.TRANSPARENT); 69 } 70 71 public RwProp<ImmRect> dndVisualIndicationRect() { 72 return getBean().makeValueProp("dndVisualIndicationRect", ImmRect.class, ImmRect.ZERO_RECT); 73 } 74 75 private Prop<SceneElement> dndVisualIndicationElement() { 76 class dndVisualIndicationElement extends AutoProperty<SceneElement> { 77 78 @Override 79 protected SceneElement compute() { 80 return new DefaultShapeSceneElement() { 81 82 @Override 83 protected void setupDynamic() { 84 shape().set(new ImmArea(dndVisualIndicationRect().get())); 85 86 filling().set(dndVisualIndicationColor().get()); 87 } 88 }; 89 } 90 91 } 92 return getBean().makeProp(dndVisualIndicationElement.class); 93 } 94 49 95 } -
TabularUnified src/main/java/org/sophie2/main/app/commons/frame/FrameViewLogic.java
1 1 package org.sophie2.main.app.commons.frame; 2 2 3 import org.sophie2.base.commons.util.ImmColor; 3 4 import org.sophie2.base.commons.util.position.ImmPoint; 4 5 import org.sophie2.base.dnd.DndTransferable; 5 6 import org.sophie2.base.dnd.SophieDragDropHandler; … … 12 13 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 13 14 import org.sophie2.base.model.resources.r4.changes.AutoAction; 14 15 import org.sophie2.base.model.resources.r4.changes.ResourceChanger; 16 import org.sophie2.base.visual.interaction.InputEventR3; 15 17 import org.sophie2.core.mvc.EventFilterBuilder; 16 18 import org.sophie2.core.mvc.OperationDef; 17 19 import org.sophie2.core.mvc.SortKey; 18 20 import org.sophie2.core.mvc.events.EventR3; 19 21 import org.sophie2.main.app.commons.book.BookView; 22 import org.sophie2.main.app.commons.page.MainPageView; 20 23 import org.sophie2.main.dnd.dnddata.ResourceRefData; 21 24 22 25 /** … … 25 28 * @author tanya 26 29 */ 27 30 public enum FrameViewLogic implements OperationDef { 31 32 /** 33 * Removes the DnD visual indication of a frame. 34 */ 35 // TODO: should handle a DRAG_ENTER event (which will be created soon) 36 ON_MOUSE_EXITED_FRAME { 28 37 38 public void defineFilter(EventFilterBuilder filter) { 39 filter.setSourceClass(FrameView.class); 40 filter.setEventId(InputEventR3.MOUSE_EXITED); 41 } 42 43 public boolean handle(EventR3 event) { 44 FrameView frameView = event.getSource(FrameView.class); 45 46 frameView.dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 47 48 System.out.println("<><><><><>"); 49 50 return false; 51 } 52 }, 53 29 54 /** 55 * Removes the DnD visual indication of a page. 56 */ 57 // TODO: should handle a DRAG_ENTER event (which will be created soon) 58 // TODO: maybe move somewhere else? 59 ON_MOUSE_EXITED { 60 61 public void defineFilter(EventFilterBuilder filter) { 62 filter.setSourceClass(MainPageView.class); 63 filter.setEventId(InputEventR3.MOUSE_EXITED); 64 } 65 66 public boolean handle(EventR3 event) { 67 MainPageView pageView = event.getSource(MainPageView.class); 68 69 pageView.dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 70 71 return false; 72 } 73 }, 74 75 /** 30 76 * Handles dropping images over the padding of frame. For now, if handles events 31 77 * only if {@link ResourceRefData} is transferred. 32 78 */ -
TabularUnified src/main/java/org/sophie2/main/app/commons/page/ScenePageLogic.java
232 232 } 233 233 }, 234 234 235 /** 236 * Handles pre-importing on data in drag'n'drop operation. Defines whether 237 * the transferred {@link DndData} can be imported. Responsible for 238 * {@link SophieDragDropHandler#dragOver}. 239 */ 240 ON_DND_PRE_IMPORT { 235 // /** 236 // * Handles pre-importing on data in drag'n'drop operation. Defines whether 237 // * the transferred {@link DndData} can be imported. Responsible for 238 // * {@link SophieDragDropHandler#dragOver}. 239 // */ 240 // ON_DND_PRE_IMPORT { 241 // 242 // public void defineFilter(EventFilterBuilder filter) { 243 // filter.setSourceClass(PageWorkArea.class); 244 // filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT); 245 // } 246 // 247 // @SuppressWarnings("unchecked") 248 // public boolean handle(EventR3 event) { 249 // 250 // SophieLog.info(event); 251 // 252 // PageWorkArea pwa = event.getSource(PageWorkArea.class); 253 // 254 // BookDocView bookDocView = pwa.findParentElement(BookDocView.class); 255 // if (bookDocView != null) { 256 // BookViewOptions viewOptions = bookDocView.bookView().get().getViewOptions(); 257 // 258 // // Forbid drop over books in preview mode. 259 // if (!viewOptions.isPreviewMode()) { 260 // 261 // DndPreImport preImport = event.getEventParam( 262 // SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 263 // DndPreImport.class); 264 // 265 // preImport.setImportable(ResourceRefData.class, ResourceRevisionData.class, 266 // RtfData.class, ImageData.class, StringData.class, FileListData.class, 267 // TemplateRefData.class); 268 // } 269 // } 270 // return true; 271 // } 272 // }, 241 273 242 public void defineFilter(EventFilterBuilder filter) {243 filter.setSourceClass(PageWorkArea.class);244 filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT);245 }246 247 @SuppressWarnings("unchecked")248 public boolean handle(EventR3 event) {249 250 SophieLog.info(event);251 252 PageWorkArea pwa = event.getSource(PageWorkArea.class);253 254 BookDocView bookDocView = pwa.findParentElement(BookDocView.class);255 if (bookDocView != null) {256 BookViewOptions viewOptions = bookDocView.bookView().get().getViewOptions();257 258 // Forbid drop over books in preview mode.259 if (!viewOptions.isPreviewMode()) {260 261 DndPreImport preImport = event.getEventParam(262 SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX,263 DndPreImport.class);264 265 preImport.setImportable(ResourceRefData.class, ResourceRevisionData.class,266 RtfData.class, ImageData.class, StringData.class, FileListData.class,267 TemplateRefData.class);268 }269 }270 return true;271 }272 },273 274 274 /** 275 275 * Returns the swing focus to the scene after closing a hud. 276 276 */ -
TabularUnified src/main/java/org/sophie2/main/app/commons/frame/FrameView.java
37 37 import org.sophie2.base.scene.impl.DefaultShapeSceneElement; 38 38 import org.sophie2.base.scene.impl.DefaultTextSceneElement; 39 39 import org.sophie2.base.scene.interfaces.Scene; 40 import org.sophie2.base.scene.interfaces.SceneEffect; 40 41 import org.sophie2.base.scene.interfaces.SceneElement; 41 42 import org.sophie2.base.scene.model.LineStyle; 42 43 import org.sophie2.base.scene.model.SceneTextRun; … … 155 156 if (!getViewOptions().isPreviewMode()) { 156 157 res.add(resizeArea().get()); 157 158 } 159 160 if (!ImmColor.TRANSPARENT.equals(dndVisualIndicationColor().get())) { 161 res.add(dndVisualIndicationElement().get()); 162 } 158 163 159 164 super.setupSceneElements(res); 160 165 } … … 183 188 shadowOpacity)); 184 189 185 190 element.effects().add(shadow); 186 187 } 188 191 } 189 192 } 190 193 191 194 } 192 195 196 public RwProp<ImmColor> dndVisualIndicationColor() { 197 return getBean().makeValueProp("dndVisualIndicationColor", ImmColor.class, ImmColor.TRANSPARENT); 198 } 199 200 public RwProp<BoundMode> dndVisualIndicationBoundMode() { 201 return getBean().makeValueProp("dndVisualIndicationBoundMode", BoundMode.class, BoundMode.CONTENT); 202 } 203 204 private Prop<SceneElement> dndVisualIndicationElement() { 205 class dndVisualIndicationElement extends AutoProperty<SceneElement> { 206 207 @Override 208 protected SceneElement compute() { 209 return new DefaultShapeSceneElement() { 210 211 @Override 212 protected void setupDynamic() { 213 ImmRect rect = getLocalRect(dndVisualIndicationBoundMode().get()); 214 shape().set(new ImmArea(rect)); 215 216 filling().set(dndVisualIndicationColor().get()); 217 } 218 }; 219 } 220 221 } 222 return getBean().makeProp(dndVisualIndicationElement.class); 223 } 224 193 225 /** 194 226 * The scene element representing the frame border (the actual border). 195 227 * -
TabularUnified src/main/java/org/sophie2/base/dnd/SophieDragDropHandler.java
#P org.sophie2.base.dnd
157 157 */ 158 158 public void setImportable(Class<? extends DndData>... supported) { 159 159 160 this.importable = false;161 162 160 for (Class<? extends DndData> dndData : supported) { 163 161 164 162 if (getTransferable().isDndDataSupported(dndData)) { -
TabularUnified src/main/java/org/sophie2/main/app/layout/right/library/LibraryTabLogic.java
#P org.sophie2.main.app.layout
2 2 3 3 import javax.swing.JComponent; 4 4 5 import org.sophie2.base.commons.util.ImmColor; 5 6 import org.sophie2.base.commons.util.ImmList; 6 7 import org.sophie2.base.commons.util.NaiveImmList; 7 8 import org.sophie2.base.commons.util.position.ImmPoint; 9 import org.sophie2.base.commons.util.position.ImmRect; 8 10 import org.sophie2.base.dialogs.DialogManager; 9 11 import org.sophie2.base.dnd.DndTransferable; 10 12 import org.sophie2.base.dnd.SophieDragDropHandler; 11 13 import org.sophie2.base.dnd.SophieTransferable; 12 14 import org.sophie2.base.dnd.SophieDragDropHandler.DndExport; 13 15 import org.sophie2.base.dnd.SophieDragDropHandler.DndImport; 16 import org.sophie2.base.dnd.SophieDragDropHandler.DndPreImport; 14 17 import org.sophie2.base.layout.model.ListPalette; 15 18 import org.sophie2.base.model.book.BookH; 16 19 import org.sophie2.base.model.book.FrameH; 17 20 import org.sophie2.base.model.book.PageH; 21 import org.sophie2.base.model.book.frame.BoundMode; 18 22 import org.sophie2.base.model.book.frame.FrameR4; 19 23 import org.sophie2.base.model.book.interfaces.CompositeElement; 20 24 import org.sophie2.base.model.book.resource.r4.BookR4; … … 39 43 import org.sophie2.main.app.commons.app.AppMainWindow; 40 44 import org.sophie2.main.app.commons.book.BookDocView; 41 45 import org.sophie2.main.app.commons.frame.FrameView; 46 import org.sophie2.main.app.commons.page.MainPageView; 42 47 import org.sophie2.main.app.commons.page.PageWorkArea; 43 48 import org.sophie2.main.app.commons.page.RootPageView; 44 49 import org.sophie2.main.app.commons.util.AppViewUtil; … … 195 200 return true; 196 201 } 197 202 }, 203 204 /** 205 * Handles pre-importing (dragging) a template over a {@link FrameView}. 206 * Adds the appropriate visual indications to the frame view. 207 */ 208 ON_FRAME_TEMPLATE_PRE_IMPORT { 198 209 210 public void defineFilter(EventFilterBuilder filter) { 211 filter.setSourceClass(FrameView.class); 212 filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT); 213 } 214 215 @SuppressWarnings("unchecked") 216 public boolean handle(EventR3 event) { 217 DndPreImport preImport = event.getEventParam( 218 SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 219 DndPreImport.class); 220 221 FrameView frameView = event.getSource(FrameView.class); 222 if (frameView.getViewOptions().isPreviewMode()) { 223 return false; 224 } 225 226 preImport.setImportable(TemplateRefData.class); 227 if (!preImport.getImportable()) { 228 return false; 229 } 230 231 // TODO: consider creating FrameTemplateData and PageTemplateData instead of this check 232 TemplateRefData data = preImport.getTransferable().getDndData(TemplateRefData.class); 233 BookH book = AppViewUtil.getCurrentBook(frameView); 234 if (!TemplateUtil.isFrameTemplate(book, data.getTemplateRef())) { 235 return false; 236 } 237 238 frameView.dndVisualIndicationBoundMode().set(BoundMode.OUT_BORDER); 239 frameView.dndVisualIndicationColor().set(new ImmColor(1.0f, 0.68f, 0.68f, 0.5f)); 240 241 return true; 242 } 243 }, 244 199 245 /** 200 246 * Handles the dropping a frame template over a {@link FrameView}. 201 247 * Applies the template to the view's model. … … 249 295 250 296 }.register(frameAccess); 251 297 298 source.dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 299 252 300 return true; 253 301 } 254 302 … … 445 493 return true; 446 494 } 447 495 }, 496 497 /** 498 * Handles pre-importing (dragging) a template over a {@link RootPageView}. 499 * Adds the appropriate visual indications to the page view. 500 */ 501 ON_PAGE_TEMPLATE_PRE_IMPORT { 448 502 503 public void defineFilter(EventFilterBuilder filter) { 504 filter.setSourceClass(RootPageView.class); 505 filter.setEventId(SophieDragDropHandler.TransferEventIds.DND_PRE_IMPORT); 506 } 507 508 @SuppressWarnings("unchecked") 509 public boolean handle(EventR3 event) { 510 DndPreImport preImport = event.getEventParam( 511 SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 512 DndPreImport.class); 513 514 RootPageView pageView = event.getSource(RootPageView.class); 515 if (pageView.getViewOptions().isPreviewMode()) { 516 return false; 517 } 518 519 preImport.setImportable(TemplateRefData.class); 520 if (!preImport.getImportable()) { 521 return false; 522 } 523 524 // TODO: consider creating FrameTemplateData and PageTemplateData instead of this check 525 TemplateRefData data = preImport.getTransferable().getDndData(TemplateRefData.class); 526 BookH book = AppViewUtil.getCurrentBook(pageView); 527 if (!TemplateUtil.isPageTemplate(book, data.getTemplateRef())) { 528 return false; 529 } 530 531 MainPageView mainPageView = pageView.mainPartView().get(); 532 mainPageView.dndVisualIndicationColor().set(new ImmColor(1.0f, 0.68f, 0.68f, 0.5f)); 533 534 ImmRect rect = new ImmRect(ImmPoint.ZERO, book.getPageSize()); 535 mainPageView.dndVisualIndicationRect().set(rect); 536 537 return true; 538 } 539 }, 540 449 541 /** 450 542 * Handles dropping a page template over the {@link RootPageView}. 451 543 * Applies the template to the view's model. … … 474 566 DndTransferable transferable = dndImport.getTransferable(); 475 567 476 568 BookH book = source.getBookView().model().get(); 569 570 source.mainPartView().get().dndVisualIndicationColor().set(ImmColor.TRANSPARENT); 477 571 return TemplateUtil.applyPageTemplate(transferable, source.model().get(), book); 478 572 } 479 573 },