Refactor: Move diagrams to org.scilab.modules.xcos.graph
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / graph / PaletteDiagram.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Antoine ELIAS
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.xcos.graph;
14
15 import java.io.File;
16
17 import org.scilab.modules.xcos.block.BasicBlock;
18 import org.scilab.modules.xcos.block.SplitBlock;
19 import org.scilab.modules.xcos.block.TextBlock;
20 import org.scilab.modules.xcos.link.BasicLink;
21 import org.scilab.modules.xcos.utils.BlockPositioning;
22 import org.scilab.modules.xcos.utils.ConfigXcosManager;
23 import org.scilab.modules.xcos.utils.XcosConstants;
24
25 import com.mxgraph.model.mxGeometry;
26
27
28 public class PaletteDiagram extends XcosDiagram {
29
30     private static int BLOCK_MAX_WIDTH  = (int) (XcosConstants.PALETTE_BLOCK_WIDTH * 0.8); //80% of the max size
31     private static int BLOCK_MAX_HEIGHT = (int) (XcosConstants.PALETTE_BLOCK_HEIGHT * 0.8); //80% of the max size
32     private String name;
33     private String fileName;
34     private double windowWidth = 0;
35
36     public PaletteDiagram() {
37         super();
38         
39         setCellsLocked(true);
40         setGridVisible(false);
41         setCellsDeletable(false);
42         setCellsEditable(false);
43         
44         undoManager.setEventsEnabled(false);
45     }
46
47     public boolean openDiagramAsPal(String diagramFileName) {
48         File theFile = new File(diagramFileName);
49
50         //int windowHeight = getAsComponent().getHeight();
51         
52         if (theFile.exists()) {
53             transformAndLoadFile(theFile, true);
54             setName(theFile.getName());
55             setFileName(theFile.getAbsolutePath());
56             getRubberBand().setEnabled(false);
57
58             /*change some diagram parameters*/
59             /*delete all links*/
60             for(int i = 0 ; i < getModel().getChildCount(getDefaultParent()) ; i++) {
61                 Object obj = getModel().getChildAt(getDefaultParent(), i); 
62                 if(obj instanceof BasicLink || obj instanceof SplitBlock || obj instanceof TextBlock) {
63                     getModel().remove(obj);
64                     i--;
65                 }
66             }
67             ConfigXcosManager.saveUserDefinedPalettes(diagramFileName);
68             return true;
69         }
70         return false;
71     }
72
73     public void updateDiagram(double newWidth) {
74         
75         if(newWidth == windowWidth) {
76             return;
77         }
78
79         int oldRowItem = (int) (newWidth / (XcosConstants.PALETTE_BLOCK_WIDTH + XcosConstants.PALETTE_HMARGIN));
80         int maxRowItem = (int) (windowWidth / (XcosConstants.PALETTE_BLOCK_WIDTH + XcosConstants.PALETTE_HMARGIN));
81         
82         //only compute for signifiant changes
83         if(oldRowItem == maxRowItem) {
84             return;
85         }
86
87         windowWidth = newWidth;
88         int blockCount = 0;
89
90         getModel().beginUpdate();
91         for(int i = 0 ; i < getModel().getChildCount(getDefaultParent()) ; i++) {
92             Object obj = getModel().getChildAt(getDefaultParent(), i); 
93             if(obj instanceof BasicBlock){
94                 BasicBlock block = (BasicBlock)obj;
95                 block.setGeometry(getNewBlockPosition(block.getGeometry(), blockCount));
96                 BlockPositioning.updateBlockView(block);
97                 blockCount++;
98             }
99         }
100         getModel().endUpdate();
101         refresh();
102         setModified(false);
103     }
104     
105     private mxGeometry getNewBlockPosition(mxGeometry geom, int blockCount) {
106         
107         int maxRowItem = (int) (windowWidth / (XcosConstants.PALETTE_BLOCK_WIDTH + XcosConstants.PALETTE_HMARGIN));
108         int row = blockCount % maxRowItem;
109         int col = blockCount / maxRowItem;
110         double x = geom.getX();
111         double y = geom.getY();
112         double w = geom.getWidth();
113         double h = geom.getHeight();
114         
115         if(geom.getWidth() > BLOCK_MAX_WIDTH || geom.getHeight() > BLOCK_MAX_HEIGHT) {
116             //update block size to fill "block area"
117             double ratio = Math.min(BLOCK_MAX_HEIGHT / h, BLOCK_MAX_WIDTH / w);
118             w *= ratio;
119             h *= ratio;
120         }
121         
122         x = row * (XcosConstants.PALETTE_BLOCK_WIDTH + XcosConstants.PALETTE_HMARGIN);
123         x += (XcosConstants.PALETTE_BLOCK_WIDTH - w) / 2;
124         y = col * (XcosConstants.PALETTE_BLOCK_HEIGHT + XcosConstants.PALETTE_VMARGIN);
125         y += (XcosConstants.PALETTE_BLOCK_HEIGHT - h) / 2;
126         
127         return new mxGeometry(x,y,w,h); 
128     }
129
130     public String getName() {
131         return name;
132     }
133
134     public void setName(String name) {
135         this.name = name;
136     }
137
138     public boolean isCellConnectable(Object cell) {
139         return false;
140     }
141
142     public void setFileName(String fileName) {
143         this.fileName = fileName;
144     }
145
146     public String getFileName() {
147         return fileName;
148     }
149
150 }