/**
SpagoBI, the Open Source Business Intelligence suite
Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at http://mozilla.org/MPL/2.0/.
**/
package it.eng.spagobi.studio.extchart.editors.pages.editorComponent;
import it.eng.spagobi.studio.extchart.editors.ExtChartEditor;
import it.eng.spagobi.studio.extchart.editors.properties.PropertiesFactory;
import it.eng.spagobi.studio.extchart.editors.properties.series.SeriesProperties;
import it.eng.spagobi.studio.extchart.model.bo.Axes;
import it.eng.spagobi.studio.extchart.model.bo.ExtChart;
import it.eng.spagobi.studio.extchart.model.bo.Series;
import it.eng.spagobi.studio.extchart.utils.ExtChartConstants;
import it.eng.spagobi.studio.extchart.utils.ExtChartUtils;
import it.eng.spagobi.studio.extchart.utils.ImageDescriptors;
import it.eng.spagobi.studio.extchart.utils.SWTUtils;
import it.eng.spagobi.studio.extchart.utils.SerieTableItemContent;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.slf4j.LoggerFactory;
public class SeriesPanel {
Vector<Series> series;
Group group;
HashMap<Integer, Button> deleteButtons;
HashMap<Integer, Button> customButtons;
ExtChartEditor editor;
Table seriesTable;
public final static int INFO=0;
public final static int CAT_AXE=1;
public final static int AXES=2;
public final static int CUSTOMIZE=3;
public final static int DELETE=4;
private static org.slf4j.Logger logger = LoggerFactory.getLogger(SeriesPanel.class);
public SeriesPanel(Composite parent, int style, Vector<Series> series) {
this.series = series;
group = new Group(parent, style);
group.setLayout(SWTUtils.makeGridLayout(1));
//group.setLayout(new FillLayout());
}
public void drawSerieComposite(){
logger.debug("IN");
FormToolkit toolkit = SWTUtils.createFormToolkit(group.getParent());
seriesTable = new Table (group, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);
seriesTable.setLinesVisible (true);
seriesTable.setHeaderVisible (true);
GridData dataOrder = new GridData(SWT.FILL, SWT.FILL, true, true);
dataOrder.heightHint = 150;
dataOrder.widthHint=250;
seriesTable.setLayoutData(dataOrder);
String[] titles = {" Serie Info ", " Category Axe ", " Value Axe ", " Customize ", " Delete "};
for (int i=0; i<titles.length; i++) {
TableColumn column = new TableColumn (seriesTable, SWT.NONE);
column.setText (titles [i]);
}
for (Iterator iterator = series.iterator(); iterator.hasNext();) {
Series serie = (Series) iterator.next();
TableItem item = new TableItem (seriesTable, SWT.NONE);
SerieTableItemContent serieTableItemContent = new SerieTableItemContent();
serieTableItemContent.setSerie(serie);
item.setData(serieTableItemContent);
createButtons(seriesTable, item, serie, serieTableItemContent);
item.setText(INFO, serie.getyFieldList());
item.setText(CAT_AXE, serie.getxField() != null ? serie.getxField() : "");
}
for (int i=0; i<titles.length; i++) {
seriesTable.getColumn (i).pack ();
}
logger.debug("Set drop function");
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
DropTarget target = new DropTarget(seriesTable, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT);
target.setTransfer(types);
target.addDropListener(new DropTargetAdapter() {
public void dragEnter(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT) {
event.detail = (event.operations & DND.DROP_COPY) != 0 ? DND.DROP_COPY : DND.DROP_NONE;
}
// Allow dropping text only
for (int i = 0, n = event.dataTypes.length; i < n; i++) {
if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
event.currentDataType = event.dataTypes[i];
}
}
}
public void dragOver(DropTargetEvent event) {
event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
}
public void drop(DropTargetEvent event) {
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
// Get the dropped data aaa
ExtChart extChart = editor.getExtChart();
DropTarget target = (DropTarget) event.widget;
Table table = (Table) target.getControl();
String data = (String) event.data;
logger.debug("recieved from drop "+data);
DraggedObject draggedObject = DraggedObject.fromString(data);
// check there are only numeric type
boolean onlyNumeric = checkOnlyNumeric(draggedObject, group.getDisplay());
if(onlyNumeric){
Series newSerie= new Series();
// map dragged info to serie, if single raw ask user if is x or y information, if multiple put to fieldList
if(draggedObject.getSize() > 0){
logger.debug("More field selected: put field List");
newSerie.setyFieldList(draggedObject.toFieldString());
}
else{
// ask user if it is an x or y information
// String val = draggedObject.getFirstElement();
// new FieldXYPopup(seriesTable.getDisplay(), newSerie, val).drawXYPopup();
}
logger.debug("update model adding new Serie");
Axes xAxe = ExtChartUtils.getXAxe(extChart);
newSerie.setxField(xAxe != null && xAxe.getFields() != null ? xAxe.getFields() : "");
String serieType = null;
try{
serieType = ExtChartUtils.getSerieTypeFromChartType(extChart.getType());
logger.debug("Serie type default for chart type is "+serieType);
}
catch (Exception e) {
logger.warn("could not find default serie type, check congfiguration");
return;
}
newSerie.setType(serieType);
extChart.getSeriesList().getSeries().add(newSerie);
logger.debug("update table");
// Create a new item in the table to hold the dropped data
TableItem item = new TableItem(table, SWT.NONE);
SerieTableItemContent serieTableItemContent = new SerieTableItemContent();
serieTableItemContent.setSerie(newSerie);
item.setData(serieTableItemContent);
//item.setText(new String[] { data });
//item.setText(INFO, data);
item.setText(INFO, draggedObject.toFieldString());
item.setText(CAT_AXE, newSerie.getxField() != null ? newSerie.getxField() : "");
createButtons(table, item, newSerie, serieTableItemContent);
editor.setIsDirty(true);
}
else{
logger.debug("Series not added");
}
table.redraw();
}
}
});
logger.debug("fix table height");
// if (group.getLayout() == null) { // <---
// seriesTable.setSize(200,300);
// } else {
// seriesTable.setLayoutData(new GridData(200, 300));
//
// }
//seriesTable.pack();
logger.debug("OUT");
}
/**
* Check only numric types can be dropped on serie
*/
boolean checkOnlyNumeric(DraggedObject draggedObject, Display display){
logger.debug("IN");
boolean onlyNumeric = true;
for (Iterator iterator = draggedObject.getIndexTypeSelected().keySet().iterator(); iterator.hasNext();) {
Integer key = (Integer) iterator.next();
System.out.println(Double.class.getName());
String type = draggedObject.getIndexTypeSelected().get(key);
if(type.equalsIgnoreCase(Double.class.getName())
||
type.equalsIgnoreCase(Integer.class.getName())
||
type.equalsIgnoreCase(Float.class.getName())
||
type.equalsIgnoreCase(Long.class.getName())
||
type.equalsIgnoreCase(Short.class.getName())
||
type.equalsIgnoreCase(BigDecimal.class.getName())
)
{
logger.debug("Numeric type: "+type);
}
else{
logger.debug("found also not numeric type "+type);
onlyNumeric = false;
MessageDialog.openWarning(display.getActiveShell(), "Warning", "Column of type "+type+" cannot be a serie: only numeric types");
break;
}
}
logger.debug("OUT");
return onlyNumeric;
}
void createButtons(final Table seriesTable, final TableItem item, final Series serie, SerieTableItemContent serieTableItemContent){
logger.debug("IN");
logger.debug("draw customize button");
TableEditor tableEditor = new TableEditor(seriesTable);
String[] positions =new String[]{"", "left", "right", "bottom", "top"};
final CCombo positionCombo = SWTUtils.drawCCombo(seriesTable, positions, serie.getAxis(), "Axis: ");
serieTableItemContent.setPositionCombo(positionCombo);
positionCombo.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
String position = positionCombo.getItem(positionCombo.getSelectionIndex());
ExtChart extChart = editor.getExtChart();
// check Numeric axis at this position really exist otherwise throw warning
Axes returned = ExtChartUtils.getAxeFromPositionAndType(extChart, ExtChartConstants.AXE_TYPE_NUMERIC, position);
if(returned != null || position.equals("")){
editor.setIsDirty(true);
logger.debug("selected axe at position: "+position);
serie.setAxis(position);
}
else{
MessageDialog.openWarning(seriesTable.getShell(), "Warning", "Could not find a numeric axe on position "+position);
int previousIndex = positionCombo.indexOf(serie.getAxis() != null ? serie.getAxis() : "");
positionCombo.select(previousIndex);
}
// update axes
//ExtChartUtils.updateAxesField(extChart, "Numeric", serie.getyFieldList(), position);
}
});
// tableEditor.minimumWidth = positionCombo.getSize().x;
// tableEditor.horizontalAlignment = SWT.LEFT;
tableEditor.grabHorizontal = true;
tableEditor.setEditor(positionCombo, item, AXES);
tableEditor = new TableEditor(seriesTable);
Image customImage = ImageDescriptors.getEditIcon().createImage();
final Button buttonCus = new Button(seriesTable, SWT.PUSH);
serieTableItemContent.setCustomButton(buttonCus);
buttonCus.setImage(customImage);
buttonCus.pack();
tableEditor.minimumWidth = buttonCus.getSize().x;
tableEditor.horizontalAlignment = SWT.LEFT;
tableEditor.setEditor(buttonCus, item, CUSTOMIZE);
buttonCus.addListener(SWT.Selection,
new Listener() {
public void handleEvent(Event event) {
// open edit window
logger.debug("Open serie edit cell");
ExtChart chart = editor.getExtChart();
String type = chart.getType();
logger.debug("Series properties for type "+type);
SeriesProperties seriesProperties = PropertiesFactory.getSeriesProperties(type, editor, serie, seriesTable.getShell());
seriesProperties.setTitle("Define serie properties: ");
seriesProperties.drawProperties();
seriesProperties.drawButtons();
seriesProperties.getDialog().setSize(300,500);
seriesProperties.showPopup();
}
}
);
// delete
logger.debug("draw delete button");
tableEditor = new TableEditor(seriesTable);
Image deleteImage = ImageDescriptors.getEraseIcon().createImage();
final Button buttonDel = new Button(seriesTable, SWT.PUSH);
serieTableItemContent.setDeleteButton(buttonDel);
buttonDel.setImage(deleteImage);
buttonDel.pack();
tableEditor.minimumWidth = buttonDel.getSize().x;
tableEditor.horizontalAlignment = SWT.LEFT;
tableEditor.setEditor(buttonDel, item, DELETE);
buttonDel.addListener(SWT.Selection,
new Listener() {
public void handleEvent(Event event) {
//delete table item
ExtChart extChart = editor.getExtChart();
Object serieO = item.getData();
SerieTableItemContent serieTableItemContent = (SerieTableItemContent)serieO;
editor.setIsDirty(true);
Series serie = serieTableItemContent.getSerie();
// delete serie from model
int index = seriesTable.indexOf(item);
logger.debug("remove row"+item.getText(INFO)+ " at index "+index);
seriesTable.remove(index);
buttonDel.dispose();
buttonCus.dispose();
positionCombo.dispose();
extChart.getSeriesList().getSeries().remove(serie);
logger.debug("row removed");
}
}
);
logger.debug("OUT");
}
public void deleteItems(){
logger.debug("IN");
TableItem[] items = seriesTable.getItems();
for (int i = 0; i < items.length; i++) {
TableItem it = items[i];
SerieTableItemContent serieTableItemContent = (SerieTableItemContent)it.getData();
if(serieTableItemContent.getCustomButton() != null)
serieTableItemContent.getCustomButton().dispose();
if(serieTableItemContent.getDeleteButton() != null)
serieTableItemContent.getDeleteButton().dispose();
if(serieTableItemContent.getPositionCombo() != null)
serieTableItemContent.getPositionCombo().dispose();
}
logger.debug("OUT");
}
public void deleteAllSeries(){
logger.debug("IN");
ExtChart extChart = editor.getExtChart();
extChart.getSeriesList().setSeries(null);
deleteItems();
seriesTable.removeAll();
seriesTable.redraw();
logger.debug("OUT");
}
public ExtChartEditor getEditor() {
return editor;
}
public void setEditor(ExtChartEditor editor) {
this.editor = editor;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public Table getSeriesTable() {
return seriesTable;
}
public void setSeriesTable(Table seriesTable) {
this.seriesTable = seriesTable;
}
}