Ticket #2311: page_reordering_visualization.patch
File page_reordering_visualization.patch, 20.7 KB (added by tanya, 15 years ago) |
---|
-
src/main/resources/lookandfeel_java6.xml
### Eclipse Workspace Patch 1.0 #P org.sophie2.main.skin.alternative
1910 1910 </style> 1911 1911 <bind style="pagePreviewThumbSelected" type="name" 1912 1912 key="main.view.layout.pages.page-preview-palette/pagePreviewThumbHolderSelected" /> 1913 1914 <!-- ================================= --> 1915 <!-- PAGE PREVIEW THUMB OVER --> 1916 <!-- ================================= --> 1917 <style id="thumbnailDragOver"> 1918 <insets top="0" left="0" bottom="0" right="0" /> 1919 <state value="ENABLED"> 1920 <imagePainter method="PanelBackground" 1921 path="/resources/PagePreviewPalette/page_preview_thumb_over_separator.png" 1922 sourceInsets="-100 0 -100 0" /> 1923 </state> 1924 </style> 1925 <bind style="thumbnailDragOver" type="name" 1926 key="main.view.layout.pages.page-preview-palette/thumbnailDragOver" /> 1913 1927 1914 1928 <!-- ================================= --> 1915 1929 <!-- PAGE PREVIEW PALETTE LIST --> -
src/main/resources/lookandfeel_java5.xml
1909 1909 <bind style="pagePreviewThumbSelected" type="name" key="main.view.layout.pages.page-preview-palette/pagePreviewThumbHolderSelected" /> 1910 1910 1911 1911 <!-- ================================= --> 1912 <!-- PAGE PREVIEW THUMB OVER --> 1913 <!-- ================================= --> 1914 <style id="thumbnailDragOver"> 1915 <insets top="0" left="0" bottom="0" right="0" /> 1916 <state value="ENABLED"> 1917 <imagePainter method="PanelBackground" 1918 path="/resources/PagePreviewPalette/page_preview_thumb_over_separator.png" 1919 sourceInsets="-100 0 -100 0" /> 1920 </state> 1921 </style> 1922 <bind style="thumbnailDragOver" type="name" 1923 key="main.view.layout.pages.page-preview-palette/thumbnailDragOver" /> 1924 1925 <!-- ================================= --> 1912 1926 <!-- PAGE PREVIEW PALETTE LIST --> 1913 1927 <!-- ================================= --> 1914 1928 <style id="pagePreviewPaletteList"> -
src/main/java/org/sophie2/main/app/layout/left/pages/PagePreviewPaletteLogic.java
Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: src/main/resources/resources/PagePreviewPalette/page_preview_thumb_over_separator.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream #P org.sophie2.main.app.layout
1 1 package org.sophie2.main.app.layout.left.pages; 2 2 3 import java.awt.Point; 3 4 import java.awt.Rectangle; 4 5 6 import javax.swing.JList; 7 8 import org.sophie2.base.commons.util.ImmList; 5 9 import org.sophie2.base.commons.util.position.ImmArea; 6 10 import org.sophie2.base.commons.util.position.ImmPoint; 7 11 import org.sophie2.base.commons.util.position.ImmRect; … … 12 16 import org.sophie2.base.dnd.SophieDragDropHandler.DndExport; 13 17 import org.sophie2.base.dnd.SophieDragDropHandler.DndPreImport; 14 18 import org.sophie2.base.layout.model.ListPalette; 19 import org.sophie2.base.layout.model.ListPaletteItem; 15 20 import org.sophie2.base.model.book.BookH; 16 21 import org.sophie2.base.model.resources.r4.ResourceRefR4; 17 22 import org.sophie2.base.model.resources.r4.resources.ResourceH; … … 150 155 }, 151 156 152 157 /** 153 * Handles pre-importing template data in drag'n'drop operation. 158 * Handles dropping a page template over the {@link PagePreviewPalette}. 159 * Applies the template to the page over which it was dropped or creates a new page 160 * if it was dropped over the blank space between page items. 154 161 */ 155 162 ON_DND_PRE_IMPORT_TEMPLATE { 156 163 … … 169 176 } 170 177 171 178 public boolean handle(EventR3 event) { 172 179 173 180 PagePreviewPalette palette = event.getSource(PagePreviewPalette.class); 174 181 BookView bookView = AppViewUtil.getCurrentBookView(palette); 175 182 if (bookView.getViewOptions().isPreviewMode()) { … … 238 245 /** 239 246 * Handles pre-importing a page in a drag'n'drop operation. 240 247 */ 241 ON_DND_P RE_IMPORT_PAGE{248 ON_DND_PAGE_REORDER { 242 249 243 250 public void defineFilter(EventFilterBuilder filter) { 244 251 filter.setSourceClass(PagePreviewPalette.class); … … 262 269 ImmPoint.class); 263 270 264 271 PagePreviewPalette palette = event.getSource(PagePreviewPalette.class); 265 finalint dropIndex = palette.mainComponent().get().locationToIndex(point.toPoint());272 int dropIndex = palette.mainComponent().get().locationToIndex(point.toPoint()); 266 273 267 274 BookH book = AppViewUtil.getCurrentBook(palette); 268 275 final int dragIndex = book.getIndexOf(data.getResourceRef()); … … 271 278 return false; 272 279 } 273 280 274 RootPageView pageView = palette.items().get().get(dropIndex).pageView().get(); 281 282 JList list = palette.mainComponent().get(); 283 284 Point dropPoint = point.toPoint(); 285 Rectangle dropRect = list.getCellBounds(dropIndex, dropIndex); 286 287 double dropPos = dropPoint.getY(); 288 double rectBegin = dropRect.getY(); 289 double rectEnd = dropRect.getY() + dropRect.getHeight(); 290 291 if (rectEnd - dropPos < dropPos - rectBegin) { 292 dropIndex++; 293 } 294 295 ImmList<PageItem> items = palette.items().get(); 296 297 PageItem dropItem = null; 298 if(dropIndex < items.size()) { 299 dropItem = items.get(dropIndex); 300 } 301 302 for (ListPaletteItem listItem : items) { 303 PageItem item = (PageItem) listItem; 304 305 item.setSkinIcon("/thumbnailHolder", false); 306 307 if (dropItem != null && dropItem.equals(item)) { 308 item.setSkinIcon("/thumbnailDragOver", true); 309 } else { 310 item.setSkinIcon("/thumbnailHolder", true); 311 } 312 } 313 314 if(dropItem == null) { 315 PageItem i = items.get(items.size() - 1); 316 i.setSkinIcon("/thumbnailDragOver", false); 317 } 318 319 palette.mainComponent().get().validate(); 320 palette.mainComponent().get().repaint(); 321 322 323 if (dragIndex < dropIndex) { 324 dropIndex--; 325 } 326 327 RootPageView pageView = items.get(dropIndex).pageView().get(); 275 328 PageReorderHandler handler = PageReorderHandler.get(); 276 329 handler.setView(pageView); 277 330 preImport.setHandler(handler); -
src/main/java/org/sophie2/main/app/layout/left/pages/PagePreviewPaletteCellRenderer.java
1 package org.sophie2.main.app.layout.left.pages;2 3 import java.awt.Color;4 import java.awt.Component;5 import java.awt.Graphics;6 import java.awt.Rectangle;7 8 import javax.swing.BorderFactory;9 import javax.swing.DefaultListCellRenderer;10 import javax.swing.JList;11 import javax.swing.JPanel;12 13 import org.sophie2.base.commons.util.position.ImmPoint;14 import org.sophie2.base.commons.util.position.ImmSize;15 import org.sophie2.base.commons.util.position.Position;16 import org.sophie2.base.media.TimePos;17 import org.sophie2.base.model.book.ElementH;18 import org.sophie2.base.model.book.frame.BoundMode;19 import org.sophie2.base.model.book.resource.r4.BookR4;20 import org.sophie2.base.model.resources.r4.ResourceRefR4;21 import org.sophie2.main.app.commons.page.RootPageView;22 23 / **24 * A cell renderer for custom page previewing.25 */26 public class PagePreviewPaletteCellRenderer extends DefaultListCellRenderer {27 private PagePreviewPalette pagePreviewPalette;28 29 /**30 * Required for serialization.31 */32 private static final long serialVersionUID = 3264356435643L;33 34 /**35 * Custom JPanel for drawing the page preview.36 */37 private static class PageThumbnail extends JPanel {38 /**39 * Required for serialization.40 */41 private static final long serialVersionUID = 1744645767234L;42 43 /**44 * The page view.45 */46 private final RootPageView page;47 48 /**49 * Homothety factor for the coordinates.50 */51 private final double k;52 53 /**54 * Constructor.55 *56 * @param pageView57 * The page view.58 * @param k59 * Homothety factor for the coordinates.60 */61 public PageThumbnail(final RootPageView pageView, final double k) {62 this.page = pageView;63 this.k = k;64 }65 66 /**67 * Override of the paint method, which takes cares for drawing the68 * frames.69 */70 @Override71 public void paint(final Graphics g) {72 super.paint(g);73 74 for (ElementH element : this.page.model().get().getChildElements(this.page.getTime())) {75 76 ResourceRefR4 pageToElementRef = this.page.model().get().getChildRef(element);77 78 TimePos localTime =79 this.page.model().get().getSubTime(pageToElementRef, this.page.getTime());80 81 ImmPoint location = element.getLocation(BoundMode.CONTENT, Position.TOP_LEFT, localTime);82 ImmSize size = element.getWrapSize();83 84 final Rectangle frameRect = new Rectangle(85 location.toPoint(), size.toDimension());86 final int x = (int) (frameRect.x * this.k);87 final int y = (int) (frameRect.y * this.k);88 final int width = (int) (frameRect.width * this.k);89 final int height = (int) (frameRect.height * this.k);90 91 g.setColor(Color.BLACK);92 g.drawRect(x, y, width, height);93 }94 }95 }96 97 /**98 * Constructs {@link PagePreviewPaletteCellRenderer} from given99 * {@link PagePreviewPalette}.100 *101 * @param pagePreviewPalette102 * the {@link PagePreviewPalette}103 */104 public PagePreviewPaletteCellRenderer(PagePreviewPalette pagePreviewPalette) {105 super();106 107 this.pagePreviewPalette = pagePreviewPalette;108 }109 110 @Override111 public Component getListCellRendererComponent(final JList list,112 final Object value, final int index, final boolean isSelected,113 final boolean cellHasFocus) {114 115 final int newWidth = list.getWidth();116 117 final PagePreviewPalette.PageItem pageItem = (PagePreviewPalette.PageItem) value;118 // TODO (R4) Reimplement:119 //Dimension pageDim = pageItem.pageView().get().getboundingRectangle().get().getSize().toDimension();120 final int pageWidth = (int) BookR4.DEFAULT_PAGE_SIZE.getWidth();121 final int pageHeight = (int) BookR4.DEFAULT_PAGE_SIZE.getHeight();122 final double k = (double) pageHeight / (double) pageWidth;123 final int newHeight = (int) (k * newWidth);124 125 list.setFixedCellHeight(newHeight);126 127 final double coef = newWidth128 / pageWidth;129 PageThumbnail pageThumbnail = new PageThumbnail(pageItem.pageView().get(),130 coef);131 132 if (isSelected) {133 pageThumbnail.setBorder(BorderFactory.createCompoundBorder(134 BorderFactory.createLineBorder(Color.red, 2), BorderFactory135 .createLoweredBevelBorder()));136 } else if (index == this.pagePreviewPalette.getDropIndex()) {137 pageThumbnail.setBorder(BorderFactory.createCompoundBorder(138 BorderFactory.createLineBorder(Color.yellow, 2),139 BorderFactory.createLoweredBevelBorder()));140 } else {141 pageThumbnail.setBorder(BorderFactory.createCompoundBorder(142 BorderFactory.createRaisedBevelBorder(), BorderFactory143 .createLoweredBevelBorder()));144 }145 146 return pageThumbnail;147 }148 }1 //package org.sophie2.main.app.layout.left.pages; 2 // 3 //import java.awt.Color; 4 //import java.awt.Component; 5 //import java.awt.Graphics; 6 //import java.awt.Rectangle; 7 // 8 //import javax.swing.BorderFactory; 9 //import javax.swing.DefaultListCellRenderer; 10 //import javax.swing.JList; 11 //import javax.swing.JPanel; 12 // 13 //import org.sophie2.base.commons.util.position.ImmPoint; 14 //import org.sophie2.base.commons.util.position.ImmSize; 15 //import org.sophie2.base.commons.util.position.Position; 16 //import org.sophie2.base.media.TimePos; 17 //import org.sophie2.base.model.book.ElementH; 18 //import org.sophie2.base.model.book.frame.BoundMode; 19 //import org.sophie2.base.model.book.resource.r4.BookR4; 20 //import org.sophie2.base.model.resources.r4.ResourceRefR4; 21 //import org.sophie2.main.app.commons.page.RootPageView; 22 // 23 ///** 24 // * A cell renderer for custom page previewing. 25 // */ 26 //public class PagePreviewPaletteCellRenderer extends DefaultListCellRenderer { 27 // private PagePreviewPalette pagePreviewPalette; 28 // 29 // /** 30 // * Required for serialization. 31 // */ 32 // private static final long serialVersionUID = 3264356435643L; 33 // 34 // /** 35 // * Custom JPanel for drawing the page preview. 36 // */ 37 // private static class PageThumbnail extends JPanel { 38 // /** 39 // * Required for serialization. 40 // */ 41 // private static final long serialVersionUID = 1744645767234L; 42 // 43 // /** 44 // * The page view. 45 // */ 46 // private final RootPageView page; 47 // 48 // /** 49 // * Homothety factor for the coordinates. 50 // */ 51 // private final double k; 52 // 53 // /** 54 // * Constructor. 55 // * 56 // * @param pageView 57 // * The page view. 58 // * @param k 59 // * Homothety factor for the coordinates. 60 // */ 61 // public PageThumbnail(final RootPageView pageView, final double k) { 62 // this.page = pageView; 63 // this.k = k; 64 // } 65 // 66 // /** 67 // * Override of the paint method, which takes cares for drawing the 68 // * frames. 69 // */ 70 // @Override 71 // public void paint(final Graphics g) { 72 // super.paint(g); 73 // 74 // for (ElementH element : this.page.model().get().getChildElements(this.page.getTime())) { 75 // 76 // ResourceRefR4 pageToElementRef = this.page.model().get().getChildRef(element); 77 // 78 // TimePos localTime = 79 // this.page.model().get().getSubTime(pageToElementRef, this.page.getTime()); 80 // 81 // ImmPoint location = element.getLocation(BoundMode.CONTENT, Position.TOP_LEFT, localTime); 82 // ImmSize size = element.getWrapSize(); 83 // 84 // final Rectangle frameRect = new Rectangle( 85 // location.toPoint(), size.toDimension()); 86 // final int x = (int) (frameRect.x * this.k); 87 // final int y = (int) (frameRect.y * this.k); 88 // final int width = (int) (frameRect.width * this.k); 89 // final int height = (int) (frameRect.height * this.k); 90 // 91 // g.setColor(Color.BLACK); 92 // g.drawRect(x, y, width, height); 93 // } 94 // } 95 // } 96 // 97 // /** 98 // * Constructs {@link PagePreviewPaletteCellRenderer} from given 99 // * {@link PagePreviewPalette}. 100 // * 101 // * @param pagePreviewPalette 102 // * the {@link PagePreviewPalette} 103 // */ 104 // public PagePreviewPaletteCellRenderer(PagePreviewPalette pagePreviewPalette) { 105 // super(); 106 // 107 // this.pagePreviewPalette = pagePreviewPalette; 108 // } 109 // 110 // @Override 111 // public Component getListCellRendererComponent(final JList list, 112 // final Object value, final int index, final boolean isSelected, 113 // final boolean cellHasFocus) { 114 // 115 // final int newWidth = list.getWidth(); 116 // 117 // final PagePreviewPalette.PageItem pageItem = (PagePreviewPalette.PageItem) value; 118 // // TODO (R4) Reimplement: 119 // //Dimension pageDim = pageItem.pageView().get().getboundingRectangle().get().getSize().toDimension(); 120 // final int pageWidth = (int) BookR4.DEFAULT_PAGE_SIZE.getWidth(); 121 // final int pageHeight = (int) BookR4.DEFAULT_PAGE_SIZE.getHeight(); 122 // final double k = (double) pageHeight / (double) pageWidth; 123 // final int newHeight = (int) (k * newWidth); 124 // 125 // list.setFixedCellHeight(newHeight); 126 // 127 // final double coef = newWidth 128 // / pageWidth; 129 // PageThumbnail pageThumbnail = new PageThumbnail(pageItem.pageView().get(), 130 // coef); 131 // 132 // if (isSelected) { 133 // pageThumbnail.setBorder(BorderFactory.createCompoundBorder( 134 // BorderFactory.createLineBorder(Color.red, 2), BorderFactory 135 // .createLoweredBevelBorder())); 136 // } else if (index == this.pagePreviewPalette.getDropIndex()) { 137 // pageThumbnail.setBorder(BorderFactory.createCompoundBorder( 138 // BorderFactory.createLineBorder(Color.yellow, 2), 139 // BorderFactory.createLoweredBevelBorder())); 140 // } else { 141 // pageThumbnail.setBorder(BorderFactory.createCompoundBorder( 142 // BorderFactory.createRaisedBevelBorder(), BorderFactory 143 // .createLoweredBevelBorder())); 144 // } 145 // 146 // return pageThumbnail; 147 // } 148 //} -
src/main/java/org/sophie2/main/app/layout/left/pages/PagePreviewPalette.java
1 1 package org.sophie2.main.app.layout.left.pages; 2 2 3 import java.awt.BorderLayout; 3 4 import java.awt.event.KeyEvent; 4 5 import java.util.HashMap; 5 6 import java.util.Map; … … 177 178 public PageItem(RootPageView pageView) { 178 179 getBean().init(pageView(), pageView); 179 180 this.result.setName(getElementId() + "/thumbnailHolder"); 181 this.rollOverPanelSouth.setName(getElementId() + "/thumbnailHolder"); 182 this.rollOverPanelNorth.setName(getElementId() + "/thumbnailHolder"); 180 183 } 181 184 182 185 private JPanel centerPanel = new JPanel(); … … 184 187 185 188 private PageThumbnail thumbnail = new PageThumbnail(); 186 189 190 /** 191 * These panel are used to be set at the north and at the south part of the result panel. 192 * When skinned, they play the role of separators. 193 */ 194 private JPanel rollOverPanelNorth = new JPanel(); 195 private JPanel rollOverPanelSouth = new JPanel(); 196 197 198 /** 199 * Used for skinning of the north and the south panels of the 200 * {@link PageItem}. 201 * 202 * @param name 203 * The name to be set for the skin. 204 * @param north 205 * Boolean parameter to indicate if north or south panel 206 * should be skinned. If <b>true</b> the north panel should 207 * be skinned, otherwise the south one. 208 */ 209 @SuppressWarnings("synthetic-access") 210 public void setSkinIcon(String name, Boolean north) { 211 if (north) { 212 this.rollOverPanelNorth.setName(getElementId() + name); 213 } else { 214 this.rollOverPanelSouth.setName(getElementId() + name); 215 } 216 } 217 187 218 @Override 188 219 public JPanel render() { 189 220 190 221 this.centerPanel.removeAll(); 191 222 this.result.removeAll(); 192 223 this.thumbnail.removeAll(); 224 this.rollOverPanelSouth.removeAll(); 225 this.rollOverPanelNorth.removeAll(); 193 226 194 227 BaseScene scene = new BaseScene(); 195 228 RootPageView pageView = pageView().get(); … … 208 241 this.centerPanel.add(this.thumbnail); 209 242 JLabel pageNumberLabel = new JLabel("" + pageNumber); 210 243 this.centerPanel.add(pageNumberLabel); 211 this.result.add(this.centerPanel); 244 this.result.setLayout(new BorderLayout()); 245 246 JPanel tmp = new JPanel(); 247 tmp.add(this.centerPanel); 248 this.result.add(tmp, BorderLayout.CENTER); 249 this.result.add(this.rollOverPanelSouth, BorderLayout.SOUTH); 250 this.result.add(this.rollOverPanelNorth, BorderLayout.NORTH); 212 251 } 213 252 } 214 253 return this.result; -
src/main/java/org/sophie2/main/app/layout/left/pages/PageReorderHandler.java
2 2 3 3 import org.sophie2.base.dnd.DndTransferable; 4 4 import org.sophie2.base.dnd.DropHandler; 5 import org.sophie2.base.layout.model.ListPaletteItem; 5 6 import org.sophie2.base.model.book.BookH; 6 7 import org.sophie2.base.model.resources.r4.ResourceRefList; 7 8 import org.sophie2.base.model.resources.r4.changes.AutoAction; 8 9 import org.sophie2.main.app.commons.element.ElementDropHandler; 9 10 import org.sophie2.main.app.commons.page.RootPageView; 11 import org.sophie2.main.app.layout.left.pages.PagePreviewPalette.PageItem; 10 12 import org.sophie2.main.dnd.dnddata.ResourceRefData; 11 13 12 14 /** … … 55 57 } 56 58 57 59 }.register(book.getAccess()); 60 61 PagePreviewPalette palette = getView().findNearestElement(null, PagePreviewPalette.class); 62 for (ListPaletteItem listItem : palette.items().get()) { 63 PageItem item = (PageItem) listItem; 64 item.setSkinIcon("/thumbnailHolder", false); 65 item.setSkinIcon("/thumbnailHolder", true); 66 } 67 } 68 69 @Override 70 public void handleExit() { 71 if (getView() != null) { 72 PagePreviewPalette palette = getView().findNearestElement(null, 73 PagePreviewPalette.class); 74 for (ListPaletteItem listItem : palette.items().get()) { 75 PageItem item = (PageItem) listItem; 76 item.setSkinIcon("/thumbnailHolder", false); 77 item.setSkinIcon("/thumbnailHolder", true); 78 } 79 } 58 80 } 59 81 }