/**
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.chart.editors;
import it.eng.spagobi.studio.chart.editors.model.chart.DialChartModel;
import it.eng.spagobi.studio.chart.utils.Interval;
import java.util.Iterator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
/**
*
* @author gavardi
*
* Thios class has method for the Interval Informations form creation
*/
public class IntervalsInformationEditor {
Section sectionIntervals=null;
Composite sectionClientIntervals=null;
final Button newIntervalButton;
final Table intervalsTable;
final Label intervalLabelLabel;
final Text intervalLabelText;
final Label intervalMinLabel;
final Spinner intervalMinText;
final Label intervalMaxLabel;
final Spinner intervalMaxText;
Composite innerSection;
final Label intervalColorLabel;
final Button intervalColorButton;
final Button buttonRem;
public static final int ORDER=0;
public static final int LABEL=1;
public static final int MIN=2;
public static final int MAX=3;
public static final int COLOR=4;
public IntervalsInformationEditor(final DialChartModel dialModel, FormToolkit toolkit, final ScrolledForm form) {
sectionIntervals= toolkit.createSection(form.getBody(),
Section.DESCRIPTION|Section.TITLE_BAR|Section.TWISTIE);
sectionClientIntervals=toolkit.createComposite(sectionIntervals);
TableWrapData td = new TableWrapData(TableWrapData.FILL);
sectionIntervals.setLayoutData(td);
sectionIntervals.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
form.reflow(true);
}
});
boolean isThermomether=dialModel.getSubType().equalsIgnoreCase("thermomether") ? true : false;
sectionIntervals.setText("Series Intervals");
sectionIntervals.setDescription("Set all the intervals ");
GridLayout gridLayout=new GridLayout();
gridLayout.numColumns=2;
sectionClientIntervals.setLayout(gridLayout);
newIntervalButton=new Button(sectionClientIntervals, SWT.PUSH);
newIntervalButton.setText("Add");
newIntervalButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
newIntervalButton.setToolTipText("Add new Interval");
buttonRem = new Button(sectionClientIntervals, SWT.PUSH);
buttonRem.setToolTipText("Remove (can remove only the last inserted)");
buttonRem.setText("Cancel");
buttonRem.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
buttonRem.setEnabled(false);
buttonRem.pack();
intervalsTable = new Table (sectionClientIntervals, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);
intervalsTable.setLinesVisible (true);
intervalsTable.setHeaderVisible (true);
GridData g=new GridData(GridData.FILL_BOTH);
g.horizontalSpan=2;
g.verticalSpan=2;
g.grabExcessHorizontalSpace=true;
g.grabExcessVerticalSpace=true;
g.heightHint = 150;
g.widthHint = 400;
intervalsTable.setLayoutData(g);
intervalsTable.setToolTipText("intervals added");
String[] titles = {"Order", " Name ", " Min "," Max "," Color "};
for (int i=0; i<titles.length; i++) {
TableColumn column = new TableColumn (intervalsTable, SWT.NONE);
column.setText (titles [i]);
column.setWidth(100);
}
int i=0;
if(dialModel.getIntervals()!=null){
for (Iterator iterator = dialModel.getIntervals().iterator(); iterator.hasNext();) {
Interval interval = (Interval) iterator.next();
TableItem item = new TableItem (intervalsTable, SWT.NONE);
item.setText(ORDER, Integer.valueOf(i).toString());
item.setText(LABEL, interval.getLabel()!=null ? interval.getLabel() : "");
item.setText(MIN, interval.getMin()!=null ? interval.getMin().toString() : "");
item.setText(MAX, interval.getMax()!=null ? interval.getMax().toString() : "");
item.setText(COLOR, interval.getColor()!=null ? ChartEditor.convertRGBToHexadecimal(interval.getColor()) : "");
if(interval.getColor()!=null){
Color color=new Color(item.getDisplay(),interval.getColor());
item.setBackground(COLOR, color);
}
i++;
}
} //close if map is not null
intervalsTable.redraw();
// Add Button Listener
Listener addListener = new Listener() {
public void handleEvent(Event event) {
dialModel.getEditor().setIsDirty(true);
// Add a new Interval: put it in kiew
int size=dialModel.getIntervals().size();
String label=intervalLabelText.getText()!=null ? intervalLabelText.getText() : "";
String min=intervalMinText.getText()!=null ? intervalMinText.getText() : "";
String max=intervalMaxText.getText()!=null ? intervalMaxText.getText() : "";
// if it is a thermofmether special case for LABELS
boolean isThermomether=dialModel.getSubType().equalsIgnoreCase(DialChartModel.THERMOMETHER) ? true : false;
if(isThermomether){
int sizeD=dialModel.getIntervals().size();
if(sizeD==0)label="normal";
else if(sizeD==1)label="warning";
else if(sizeD==2)label="critical";
}
if(isThermomether && dialModel.getIntervals().size()==3){
MessageDialog.openWarning(intervalsTable.getShell(), "Warning", "A thermomether cannot have more than three intervals");
}
else{
Interval interval=new Interval();
interval.setLabel(label);
try{
double newMin = intervalMinText.getSelection()/ Math.pow(10, intervalMinText.getDigits());
interval.setMin(Double.valueOf(newMin));
}
catch (Exception e) {
}
try{
double newMax = intervalMaxText.getSelection()/ Math.pow(10, intervalMaxText.getDigits());
interval.setMax(Double.valueOf(newMax));
}
catch (Exception e) {
}
TableItem item=new TableItem(intervalsTable, SWT.NONE);
RGB rgb=null;
if(intervalColorLabel.getBackground().getRGB()!=null){
rgb=intervalColorLabel.getBackground().getRGB();
Color color=new Color(item.getDisplay(),rgb);
item.setBackground(COLOR,color);
item.setText(COLOR,ChartEditor.convertRGBToHexadecimal(rgb));
}
if(rgb!=null) interval.setColor(rgb);
item.setText(ORDER, (new Integer(size)).toString());
item.setText(LABEL, label);
item.setText(MIN, min);
item.setText(MAX, max);
dialModel.getIntervals().add(size,interval);
}
}
};
newIntervalButton.addListener(SWT.Selection, addListener);
intervalLabelLabel=new Label(sectionClientIntervals,SWT.NULL);
intervalLabelLabel.setText("label");
intervalLabelText=new Text(sectionClientIntervals, SWT.BORDER);;
intervalLabelText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
intervalLabelText.setToolTipText("Label of the interval to add");
intervalLabelText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
dialModel.getEditor().setIsDirty(true);
String newLabel = intervalLabelText.getText();
int selection = intervalsTable.getSelectionIndex();
if(selection!=-1){
TableItem item=intervalsTable.getItem(selection);
Interval intervalSelected=dialModel.getIntervals().get(selection);
if(newLabel!=null){
if(intervalSelected!=null)
{
intervalSelected.setLabel(newLabel);
}
item.setText(LABEL,newLabel);
}
}
}
});
if(isThermomether){
intervalLabelText.setVisible(false);
intervalLabelLabel.setVisible(false);
}
intervalMinLabel=new Label(sectionClientIntervals,SWT.NULL);
intervalMinLabel.setText("min");
intervalMinText=new Spinner(sectionClientIntervals, SWT.BORDER);
intervalMinText.setToolTipText("Minimum value of the interval");
intervalMinText.setMaximum(1000000);
intervalMinText.setMinimum(-1000000);
intervalMinText.setDigits(1);
intervalMinText.setSelection(00);
//intervalMinText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
intervalMinText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
dialModel.getEditor().setIsDirty(true);
double newMin = intervalMinText.getSelection()/ Math.pow(10, intervalMinText.getDigits());
Double newMinD=null;
try{
newMinD=Double.valueOf(newMin);
}
catch (Exception e) {
newMinD=new Double(0.0);
}
int selection = intervalsTable.getSelectionIndex();
if(selection!=-1){
TableItem item=intervalsTable.getItem(selection);
Interval intervalSelected=dialModel.getIntervals().get(selection);
if(intervalSelected!=null)
{
intervalSelected.setMin(newMinD);
item.setText(MIN, newMinD.toString());
}
}
}
});
intervalMaxLabel=new Label(sectionClientIntervals,SWT.NULL);
intervalMaxLabel.setText("max");
intervalMaxText=new Spinner(sectionClientIntervals, SWT.BORDER);;
//intervalMaxText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
intervalMaxText.setToolTipText("Maximum value of the interval");
intervalMaxText.setMaximum(1000000);
intervalMaxText.setMinimum(-1000000);
intervalMaxText.setDigits(1);
intervalMaxText.setSelection(00);
intervalMaxText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
dialModel.getEditor().setIsDirty(true);
double newMax = intervalMaxText.getSelection()/ Math.pow(10, intervalMaxText.getDigits());
Double newMaxD=null;
try{
newMaxD=Double.valueOf(newMax);
}
catch (Exception e) {
newMaxD=new Double(0.0);
}
int selection = intervalsTable.getSelectionIndex();
if(selection!=-1){
TableItem item=intervalsTable.getItem(selection);
Interval intervalSelected=dialModel.getIntervals().get(selection);
if(intervalSelected!=null)
{
intervalSelected.setMax(newMaxD);
item.setText(MAX, newMaxD.toString());
}
}
}
});
innerSection = toolkit.createComposite(sectionClientIntervals);
intervalColorLabel=new Label(sectionClientIntervals,SWT.BORDER);
intervalColorLabel.setText("color");
intervalColorLabel.setToolTipText("Color of the interval");
intervalColorButton= new Button(innerSection, SWT.PUSH);
final Color color = new org.eclipse.swt.graphics.Color(sectionClientIntervals.getDisplay(), new RGB(255,255,255));
GridLayout colorGd = new GridLayout();
colorGd.numColumns = 2;
colorGd.marginHeight = 0;
colorGd.marginBottom = 0;
innerSection.setLayout(colorGd);
intervalColorLabel.setText(" ");
intervalColorLabel.setBackground(color);
intervalColorButton.setText("Color...");
final Shell parentShell = sectionClientIntervals.getShell();
intervalColorButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
dialModel.getEditor().setIsDirty(true);
final Shell centerShell = new Shell(parentShell, SWT.NO_TRIM);
centerShell.setLocation(
(parentShell.getSize().x - ChartEditor.COLORDIALOG_WIDTH) / 2,
(parentShell.getSize().y - ChartEditor.COLORDIALOG_HEIGHT) / 2);
ColorDialog colorDg = new ColorDialog(centerShell,
SWT.APPLICATION_MODAL);
colorDg.setRGB(intervalColorLabel.getBackground().getRGB());
colorDg.setText("Choose a color");
RGB rgb = colorDg.open();
//final Map<String, SeriePersonalization> parsMap=model.getSeriesPersonalizationHashMap();
if (rgb != null) {
// Dispose the old color, create the
// new one, and set into the label
color.dispose();
Color newColor = new Color(parentShell.getDisplay(), rgb);
intervalColorLabel.setBackground(newColor);
String newHexadecimal = ChartEditor.convertRGBToHexadecimal(rgb);
int selection = intervalsTable.getSelectionIndex();
//get ParSelected
if(selection!=-1){
TableItem item=intervalsTable.getItem(selection);
item.setBackground(COLOR,new Color(item.getDisplay(),ChartEditor.convertHexadecimalToRGB(newHexadecimal)));
item.setText(COLOR,newHexadecimal);
Interval interval=dialModel.getIntervals().get(selection);
interval.setColor(ChartEditor.convertHexadecimalToRGB(newHexadecimal));
intervalsTable.redraw();
}
}
//centerShell.pack();
centerShell.dispose();
}
});
// Add listener that show details of parameter selected
intervalsTable.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event e) {
// get par selected
int selection = intervalsTable.getSelectionIndex();
if(selection!=-1){
TableItem item=intervalsTable.getItem(selection);
Interval intervalSelected=dialModel.getIntervals().get(selection);
// put the default value
String label=intervalSelected.getLabel()!=null ? intervalSelected.getLabel() : "";
intervalLabelText.setText(label);
String min;
if(intervalSelected.getMin()!=null){
min=intervalSelected.getMin().toString();
}
else{
min="";
}
int indexPoint=min.indexOf('.');
if(indexPoint!=-1){
min=ChartEditorUtils.removeChar(min, '.');
}
Integer minI=null;
try{
minI=Integer.valueOf(min);
}
catch (Exception e2) {
minI=Integer.valueOf(00);
}
intervalMinText.setSelection(minI);
String max;
if(intervalSelected.getMax()!=null){
max=intervalSelected.getMax().toString();
}
else{
max="";
}
int indexP=max.indexOf('.');
if(indexP!=-1){
max=ChartEditorUtils.removeChar(max, '.');
}
Integer maxI=null;
try{
maxI=Integer.valueOf(max);
}
catch (Exception e2) {
maxI=Integer.valueOf(00);
}
intervalMaxText.setSelection(maxI);
if(intervalSelected.getColor()!=null){
Color newColor = new Color(parentShell.getDisplay(), intervalSelected.getColor());
intervalColorLabel.setBackground(newColor);
}
else
{
intervalColorLabel.setBackground(null);
}
}
if(selection==dialModel.getIntervals().size()-1){
buttonRem.setEnabled(true);
}
else{
buttonRem.setEnabled(false);
}
}
});
// Add Button Listener
Listener cancelListener = new Listener() {
public void handleEvent(Event event) {
dialModel.getEditor().setIsDirty(true);
int index=intervalsTable.getSelectionIndex();
if(index!=-1 && index==dialModel.getIntervals().size()-1){
TableItem item=intervalsTable.getItem(index);
//can erase only the last
dialModel.getIntervals().remove(index);
intervalsTable.remove(index);
intervalLabelText.setText("");
intervalMinText.setSelection(00);
intervalMaxText.setSelection(00);
intervalColorLabel.setBackground(null);
buttonRem.setEnabled(false);
}
}
};
buttonRem.addListener(SWT.Selection, cancelListener);
sectionIntervals.setClient(sectionClientIntervals);
}
public void setVisible(boolean visible){
sectionIntervals.setVisible(visible);
}
public boolean isVisible(){
if(sectionIntervals.isVisible())return true;
else return false;
}
public void eraseComposite(){
intervalsTable.removeAll();
intervalsTable.redraw();
intervalColorLabel.setBackground(null);
intervalLabelText.setText("");
intervalMaxText.setSelection(00);
intervalMinText.setSelection(00);
buttonRem.setEnabled(false);
}
public void refillFieldsIntervalsInformation(final DialChartModel dialmodel, final ChartEditor editor, FormToolkit toolkit, final ScrolledForm form){
final boolean isThermomether=dialmodel.getSubType().equalsIgnoreCase("thermomether") ? true : false;
if(dialmodel.getIntervals()!=null){
for (int j = 0; j < dialmodel.getIntervals().size(); j++) {
Interval interval= (Interval) dialmodel.getIntervals().get(j);
TableItem item=intervalsTable.getItem(j);
item.setText(ORDER, Integer.valueOf(j).toString());
item.setText(LABEL, interval.getLabel()!=null ? interval.getLabel() : "");
item.setText(MIN, interval.getMin()!=null ? interval.getMin().toString() : "");
item.setText(MAX, interval.getMax()!=null ? interval.getMax().toString() : "");
item.setText(COLOR, interval.getColor()!=null ? ChartEditor.convertRGBToHexadecimal(interval.getColor()) : "");
if(interval.getColor()!=null){
Color color=new Color(item.getDisplay(),interval.getColor());
item.setBackground(COLOR, color);
}
}
if(isThermomether){
intervalLabelText.setVisible(false);
intervalLabelLabel.setVisible(false);
}
else{
intervalLabelText.setVisible(true);
intervalLabelLabel.setVisible(true);
}
intervalsTable.redraw();
}
}
}