Revision 46052

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/CreateChartPanelFunction.java
1
package org.gvsig.expressionevaluator.impl.function.programming;
2

  
3
import java.awt.Dimension;
4
import java.awt.Graphics2D;
5
import java.awt.image.BufferedImage;
6
import javax.json.JsonArray;
7
import javax.json.JsonObject;
8
import javax.json.JsonValue;
9
import org.apache.commons.lang3.Range;
10
import org.apache.commons.lang3.StringUtils;
11
import org.gvsig.expressionevaluator.Function;
12
import org.gvsig.expressionevaluator.Interpreter;
13
import org.gvsig.expressionevaluator.spi.AbstractFunction;
14
import org.gvsig.expressionevaluator.spi.JsonUtils;
15
import org.jfree.chart.ChartFactory;
16
import org.jfree.chart.ChartPanel;
17
import org.jfree.chart.ChartUtilities;
18
import org.jfree.chart.JFreeChart;
19
import org.jfree.chart.plot.PlotOrientation;
20
import org.jfree.data.category.DefaultCategoryDataset;
21

  
22
public class CreateChartPanelFunction extends AbstractFunction {
23

  
24
    public CreateChartPanelFunction() {
25
        super(
26
            Function.GROUP_PROGRAMMING, 
27
            "CREATE_CHARTPANEL", 
28
            Range.is(1),
29
            "",
30
            "CREATE_CHARTPANEL"+"({{string}})",
31
            null,
32
            "ChartPanel",
33
            false
34
        );
35
    }
36
    
37
    @Override
38
    public boolean allowConstantFolding() {
39
        return false;
40
    }    
41
    
42
    @Override
43
    public Object call(Interpreter interpreter, final Object[] args) throws Exception {
44
        Object obj = getObject(args, 0);
45
        if( obj == null ) {
46
            return null;
47
            //throw new ExpressionRuntimeException("Null is not valid in "+FUNCTION_GETITEM+" function.");
48
        }
49
        
50
        if( !(obj instanceof JsonObject )) {
51
            obj = JsonUtils.toJsonObject(obj);
52
        }
53
        
54
        JsonObject jsonobj = ((JsonObject)obj);
55
        ChartPanel graph = createGraph(jsonobj);
56
        return graph;
57
        
58
    }
59
    
60

  
61
    public ChartPanel createGraph(JsonObject json) {
62
        String chartType = json.getString("chartType").toLowerCase();
63
        switch(chartType){
64
            case "barchart": {
65
                JsonArray datasetJson = json.getJsonArray("dataset");
66
                DefaultCategoryDataset ds = new DefaultCategoryDataset();
67
                for (JsonValue jsonValue : datasetJson) {
68
                    JsonArray element = (JsonArray) jsonValue;
69
                    double value = element.getJsonNumber(0).doubleValue();
70
                    String field1 = element.getString(1, null);
71
                    String field2 = element.getString(2, null);
72
                    ds.addValue(value, field1, field2);
73
                }
74
                JFreeChart barChart = ChartFactory.createBarChart(
75
                            json.getString("title", ""),
76
                            json.getString("categoryAxisLabel",""),
77
                            json.getString("valueAxisLabel",""),
78
                            ds,
79
                            StringUtils.equalsIgnoreCase(json.getString("orientation",null),"HORIZONTAL")? PlotOrientation.HORIZONTAL:PlotOrientation.VERTICAL,
80
                            json.getBoolean("legend", true),
81
                            false,
82
                            false);
83
		
84
                ChartPanel chartPanel = new ChartPanel(barChart);
85
                chartPanel.setPreferredSize(new Dimension( json.getInt("witdh",360) , json.getInt("height",200) ));
86
                return chartPanel;
87
            }
88
            default: 
89
                throw new IllegalArgumentException("Unknown chart type:" + chartType);
90
                
91
                
92
        }
93
    }
94

  
95
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/function/programming/CreateChartFunction.java
1
package org.gvsig.expressionevaluator.impl.function.programming;
2

  
3
import java.awt.Dimension;
4
import java.awt.Graphics2D;
5
import java.awt.Image;
6
import java.awt.image.BufferedImage;
7
import javax.json.JsonArray;
8
import javax.json.JsonObject;
9
import javax.json.JsonValue;
10
import org.apache.commons.lang3.Range;
11
import org.apache.commons.lang3.StringUtils;
12
import org.gvsig.expressionevaluator.Function;
13
import org.gvsig.expressionevaluator.Interpreter;
14
import org.gvsig.expressionevaluator.spi.AbstractFunction;
15
import org.gvsig.expressionevaluator.spi.JsonUtils;
16
import org.gvsig.tools.swing.api.SimpleImage;
17
import org.gvsig.tools.swing.api.ToolsSwingLocator;
18
import org.jfree.chart.ChartFactory;
19
import org.jfree.chart.ChartPanel;
20
import org.jfree.chart.JFreeChart;
21
import org.jfree.chart.plot.PlotOrientation;
22
import org.jfree.data.category.DefaultCategoryDataset;
23

  
24
public class CreateChartFunction extends AbstractFunction {
25

  
26
    public CreateChartFunction() {
27
        super(
28
            Function.GROUP_PROGRAMMING, 
29
            "CREATE_CHART", 
30
            Range.is(1),
31
            "",
32
            "CREATE_CHART"+"({{string}})",
33
            null,
34
            "SimpleImage",
35
            false
36
        );
37
    }
38
    
39
    @Override
40
    public boolean allowConstantFolding() {
41
        return false;
42
    }    
43
    
44
    @Override
45
    public Object call(Interpreter interpreter, final Object[] args) throws Exception {
46
        Object obj = getObject(args, 0);
47
        if( obj == null ) {
48
            return null;
49
            //throw new ExpressionRuntimeException("Null is not valid in "+FUNCTION_GETITEM+" function.");
50
        }
51
        
52
        if( !(obj instanceof JsonObject )) {
53
            obj = JsonUtils.toJsonObject(obj);
54
        }
55
        
56
        JsonObject jsonobj = ((JsonObject)obj);
57
        SimpleImage graph = ToolsSwingLocator.getToolsSwingManager().createSimpleImage(createGraph(jsonobj));
58
        return graph;
59
        
60
    }
61
    
62

  
63
    public Image createGraph(JsonObject json) {
64
        String chartType = json.getString("chartType").toLowerCase();
65
        switch(chartType){
66
            case "barchart": {
67
                JsonArray datasetJson = json.getJsonArray("dataset");
68
                DefaultCategoryDataset ds = new DefaultCategoryDataset();
69
                for (JsonValue jsonValue : datasetJson) {
70
                    JsonArray element = (JsonArray) jsonValue;
71
                    double value = element.getJsonNumber(0).doubleValue();
72
                    String field1 = element.getString(1, null);
73
                    String field2 = element.getString(2, null);
74
                    ds.addValue(value, field1, field2);
75
                }
76
                JFreeChart barChart = ChartFactory.createBarChart(
77
                            json.getString("title", ""),
78
                            json.getString("categoryAxisLabel",""),
79
                            json.getString("valueAxisLabel",""),
80
                            ds,
81
                            StringUtils.equalsIgnoreCase(json.getString("orientation",null),"HORIZONTAL")? PlotOrientation.HORIZONTAL:PlotOrientation.VERTICAL,
82
                            json.getBoolean("legend", true),
83
                            false,
84
                            false);
85
		
86
                ChartPanel chartPanel = new ChartPanel(barChart);
87
                chartPanel.setPreferredSize(new Dimension( json.getInt("witdh",360) , json.getInt("height",200) ));
88
		Dimension d = chartPanel.getSize();
89
		BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
90
		Graphics2D g2d = image.createGraphics();
91
		chartPanel.print( g2d );
92
		g2d.dispose();
93
                return image;
94
            }
95
            default: 
96
                throw new IllegalArgumentException("Unknown chart type:" + chartType);
97
                
98
                
99
        }
100
    }
101

  
102
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/pom.xml
56 56
          <scope>test</scope>
57 57
        </dependency>
58 58
        <dependency>
59
            <groupId>org.jfree</groupId>
60
            <artifactId>jfreechart</artifactId>
61
            <version>1.0.14</version>
62
            <scope>compile</scope>
63
        </dependency>
64
        <dependency>
59 65
            <groupId>net.sf.cssbox</groupId>
60 66
            <artifactId>cssbox</artifactId>
61 67
            <version>5.0.0</version>
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/src/main/java/org/gvsig/fmap/dal/swing/impl/actions/GraphAction.java
1
package org.gvsig.fmap.dal.swing.impl.actions;
2

  
3
import java.awt.Dimension;
4
import java.awt.event.ActionEvent;
5
import java.util.ArrayList;
6
import java.util.List;
7
import javax.json.JsonArray;
8
import javax.json.JsonObject;
9
import javax.json.JsonValue;
10
import javax.swing.AbstractAction;
11
import javax.swing.Action;
12
import javax.swing.event.ListSelectionEvent;
13
import javax.swing.event.ListSelectionListener;
14
import org.apache.commons.lang3.StringUtils;
15
import org.gvsig.expressionevaluator.Expression;
16
import org.gvsig.featureform.swing.JFeaturesForm;
17
import org.gvsig.featureform.swing.impl.DefaultJFeaturesForm;
18
import org.gvsig.fmap.dal.DataStore;
19
import org.gvsig.fmap.dal.feature.Feature;
20
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
21
import org.gvsig.fmap.dal.feature.FeatureQuery;
22
import org.gvsig.fmap.dal.feature.FeatureQueryOrder;
23
import org.gvsig.fmap.dal.feature.FeatureSet;
24
import org.gvsig.fmap.dal.feature.FeatureStore;
25
import org.gvsig.fmap.dal.swing.AbstractDALActionFactory;
26
import org.gvsig.fmap.dal.swing.DALSwingLocator;
27
import org.gvsig.fmap.dal.swing.DataSwingManager;
28
import org.gvsig.fmap.dal.swing.searchpanel.FeatureStoreSearchPanel;
29
import org.gvsig.tools.ToolsLocator;
30
import org.gvsig.tools.i18n.I18nManager;
31
import org.gvsig.tools.swing.api.ToolsSwingLocator;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34
import org.gvsig.fmap.dal.swing.DALActionFactory;
35
import org.gvsig.fmap.dal.swing.DALActionFactory.DALActionContext;
36
import org.gvsig.fmap.dal.swing.impl.searchpanel.DefaultSearchPanel;
37
import org.gvsig.fmap.dal.swing.impl.searchpanel.DefaultSearchPanel.SearchActionContext;
38
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
39
import org.jfree.chart.ChartFactory;
40
import org.jfree.chart.ChartPanel;
41
import org.jfree.chart.JFreeChart;
42
import org.jfree.chart.plot.PlotOrientation;
43
import org.jfree.data.category.DefaultCategoryDataset;
44

  
45
/**
46
 *
47
 * @author jjdelcerro
48
 */
49
@SuppressWarnings("UseSpecificCatch")
50
public class GraphAction 
51
        extends AbstractAction 
52
        implements ListSelectionListener
53
    {
54
    
55
    private class svDefaultCategoryDataset extends DefaultCategoryDataset {
56

  
57
        public svDefaultCategoryDataset() {
58
            
59
        }
60
    }
61
    
62
    public static class GraphActionFactory extends AbstractDALActionFactory {
63

  
64
        public static final String ACTION_NAME = "Graph";
65
        
66
        public GraphActionFactory() {
67
            super(ACTION_NAME);
68
        }
69

  
70
        @Override
71
        public Action createAction(DALActionContext context) {
72
            return new GraphAction(context);
73
        }
74
        
75
        
76
        
77
//        public static void selfRegister() {
78
//            DataSwingManager dalSwingManager = DALSwingLocator.getSwingManager();
79
//            dalSwingManager.registerFeatureStoreSearchAction(new ShowFormActionFactory());
80
//            String[][] iconNames = new String[][]{
81
//                new String[]{"dalswing", "search-action-showform"}
82
//            };
83
//            IconTheme theme = ToolsSwingLocator.getIconThemeManager().getCurrent();
84
//            for (String[] icon : iconNames) {
85
//                URL url = ShowFormAction.class.getResource(icon[1] + ".png");
86
//                theme.registerDefault("DALSwing", icon[0], icon[1], null, url);
87
//            }
88
//        }
89

  
90
        @Override
91
        public boolean isApplicable(Object... args) {
92
            return false; // args[0] instanceof SearchActionContext;
93
        }
94
        
95
    }
96

  
97

  
98
    private static final Logger LOGGER = LoggerFactory.getLogger(ShowFormAction.class);
99
    
100
    private final DALActionContext context;
101
    private boolean showFormSingleElement;
102

  
103
    public GraphAction(DALActionContext context) {
104
        this.context = context;
105
        I18nManager i18n = ToolsLocator.getI18nManager();
106
        this.putValue(
107
                Action.ACTION_COMMAND_KEY, 
108
                GraphActionFactory.ACTION_NAME
109
        );
110
        this.putValue(
111
                Action.SHORT_DESCRIPTION, 
112
                i18n.getTranslation("_Show_graph")
113
        );
114
        this.putValue(
115
                Action.SMALL_ICON, 
116
                ToolsSwingLocator.getIconThemeManager().getCurrent().get("chart")
117
        );
118
        try {
119
            this.showFormSingleElement = true;
120
            DataStore store = this.context.getStore();
121
            if( !(store instanceof FeatureStore) ) {
122
                return;
123
            }
124
            FeatureStore featureStore = (FeatureStore) store;
125
            FeatureAttributeDescriptor[] pks = featureStore.getDefaultFeatureType().getPrimaryKey();
126
            if (pks == null || pks.length < 1) {
127
                this.showFormSingleElement = false;
128
            }
129
        } catch (Exception ex) {
130
        }        
131
    }
132
    
133
    @Override
134
    public void actionPerformed(ActionEvent e) {
135
        try {
136
            this.setEnabled(false);
137
            DataStore store = this.context.getStore();
138
            if( !(store instanceof FeatureStore) ) {
139
                return ;
140
            }
141
            FeatureStore featureStore = (FeatureStore) store;
142
            FeatureQuery query = this.context.getQuery();
143
            
144
            svDefaultCategoryDataset dataset = new svDefaultCategoryDataset();
145
            FeatureSet features = featureStore.getFeatureSet(query);
146

  
147
            Iterable<FeatureQueryOrder.FeatureQueryOrderMember> orderMembers = query.getOrder().members();
148
            ArrayList<String> fields = new ArrayList<>();
149
            for (FeatureQueryOrder.FeatureQueryOrderMember orderMember : orderMembers) {
150
                fields.add(orderMember.getAttributeName());
151
            }
152
            if (fields.size()<2) {
153
                return;
154
            }
155
            
156
            fields.add((String) this.context.getQuery().getAggregateFunctions().keySet().toArray()[0]);
157
            
158
            String field1 = fields.get(0);
159
            String field2 = fields.get(1);
160
            String fieldValue = fields.get(2);
161
            
162
            for (Feature feature : features) {
163
                Object value = feature.get(fieldValue);
164
                if (value instanceof Number) {
165
                    String valueField1;
166
                    String valueField2;
167
                    if(feature.getType().getAttributeDescriptor(field1)!=null) {
168
                        valueField1 = feature.getLabelOfValue(field1);
169
                    } else {
170
                        valueField1 = feature.get(field1).toString();
171
                    }
172
                    if(feature.getType().getAttributeDescriptor(field2)!=null) {
173
                        valueField2 = feature.getLabelOfValue(field2);
174
                    } else {
175
                        valueField2 = feature.get(field1).toString();
176
                    }
177
                    
178
                    dataset.addValue((Number) value, valueField1, valueField2);
179
                }
180
            }
181
            
182
            JFreeChart barChart = ChartFactory.createBarChart(
183
                    field1 + " " + field2,
184
                    field2,
185
                    fieldValue,
186
                    dataset,
187
                    PlotOrientation.VERTICAL,
188
                    true,
189
                    true,
190
                    false);
191
            ChartPanel chartPanel = new ChartPanel(barChart);
192
            chartPanel.setPreferredSize(new Dimension( 360 , 200 ));
193
            ToolsSwingLocator.getWindowManager().showWindow(chartPanel, "title", WindowManager.MODE.DIALOG);
194
            
195
            
196
        } catch (Exception ex) {
197
            LOGGER.warn("Can't show form", ex);
198
        } finally {
199
            this.setEnabled(true);
200
        }
201
    }
202
    
203
    @Override
204
    public void valueChanged(ListSelectionEvent e) {
205
        if (e.getValueIsAdjusting()) {
206
            return;
207
        }
208
        if (this.context.getSelectedsCount()== 0) {
209
            this.setEnabled(true);
210
            return;
211
        }
212
        this.setEnabled(showFormSingleElement);
213
    }
214
    
215
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.swing/org.gvsig.fmap.dal.swing.impl/pom.xml
175 175
            <artifactId>org.gvsig.fmap.dal.file.shp</artifactId>
176 176
            <scope>runtime</scope>
177 177
        </dependency>
178
        <dependency>
179
            <groupId>org.jfree</groupId>
180
            <artifactId>jfreechart</artifactId>
181
            <version>1.0.14</version>
182
            <scope>compile</scope>
183
        </dependency>
178 184
    </dependencies>
179 185

  
180 186
</project>

Also available in: Unified diff