/** 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.highchart.editors.sections; import it.eng.spagobi.studio.highchart.model.bo.Drill; import it.eng.spagobi.studio.highchart.model.bo.HighChart; import it.eng.spagobi.studio.highchart.model.bo.Param; import it.eng.spagobi.studio.highchart.utils.ImageDescriptors; import it.eng.spagobi.studio.highchart.utils.SWTUtils; import java.util.Iterator; import java.util.Vector; 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.graphics.Color; import org.eclipse.swt.graphics.Image; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; 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.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DrillSection extends AbstractSection { private static Logger logger = LoggerFactory.getLogger(DrillSection.class); Text documentText; Button insertButton; Button saveButton; Button deleteButton; Text nameText; Combo categoryCombo; Text valueText; Table parsTable; private static final String ABSOLUTE = "Absolute"; public DrillSection(HighChart highChart) { super(highChart); } public void drawSection(final FormToolkit toolkit, final ScrolledForm form, int cols) { super.drawSection(toolkit, form, cols); logger.debug("IN"); section.setText("Drill"); section.setDescription("Select drill options"); Drill drill = highChart.getDrill(); section.setClient(composite); documentText = SWTUtils.drawText(toolkit, composite, drill.getDocument(), "Document label:"); documentText.setLayoutData(SWTUtils.getGridDataSpan(1, GridData.FILL_HORIZONTAL)); documentText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { editor.setIsDirty(true); String value = documentText.getText(); highChart.getDrill().setDocument(value); } }); // Parameters Composite paramComposite = toolkit.createComposite(composite); GridLayout gla = new GridLayout(); gla.numColumns = 6; paramComposite.setLayout(gla); paramComposite.setLayoutData(SWTUtils.getGridDataSpan(2, GridData.FILL_HORIZONTAL)); // three buttons insertButton = toolkit.createButton(paramComposite, "", SWT.PUSH); Image insertImage = ImageDescriptors.getAddIcon().createImage(); insertButton.setImage(insertImage); insertButton.setEnabled(true); saveButton = toolkit.createButton(paramComposite, "", SWT.PUSH); Image saveImage = ImageDescriptors.getSaveIcon().createImage(); saveButton.setImage(saveImage); saveButton.setEnabled(false); deleteButton = toolkit.createButton(paramComposite, "", SWT.PUSH); Image deleteImage = ImageDescriptors.getEraseIcon().createImage(); deleteButton.setImage(deleteImage); deleteButton.setEnabled(false); // the table parsTable = new Table (paramComposite, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL); parsTable.setLinesVisible (true); parsTable.setHeaderVisible (true); GridData g=new GridData(GridData.FILL_BOTH); g.horizontalSpan=3; g.verticalSpan=4; g.grabExcessHorizontalSpace=true; g.grabExcessVerticalSpace=true; g.heightHint = 200; g.widthHint = 400; parsTable.setLayoutData(g); String[] titles = {" Name ", " Type ", " Value "}; for (int i=0; i<titles.length; i++) { TableColumn column = new TableColumn (parsTable, SWT.NONE); column.setText (titles [i]); } if(drill.getParamList().getParams()!=null){ Vector<Param> params = drill.getParamList().getParams(); for (Iterator iterator = params.iterator(); iterator.hasNext();) { Param param = (Param) iterator.next(); TableItem item = new TableItem (parsTable, SWT.NONE); if(param.getName()!=null) item.setText(0, param.getName()); if(param.getType()!=null) item.setText(1, param.getType()); if(param.getValue()!=null) item.setText(2, param.getValue()); } for (int i=0; i<titles.length; i++) { parsTable.getColumn (i).pack (); } } nameText = SWTUtils.drawText(toolkit, paramComposite, "", "Name: "); nameText.setLayoutData(SWTUtils.getGridDataSpan(2, GridData.FILL_HORIZONTAL)); nameText.setEnabled(false); nameText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); categoryCombo= SWTUtils.drawCombo(paramComposite,new String[]{"", "CATEGORY", "SERIE", "ABSOLUTE", "RELATIVE"}, null, "Category: "); categoryCombo.setLayoutData(SWTUtils.getGridDataSpan(2, GridData.FILL_HORIZONTAL)); categoryCombo.setEnabled(false); valueText = SWTUtils.drawText(toolkit, paramComposite, "", "Value: "); valueText.setLayoutData(SWTUtils.getGridDataSpan(2, GridData.FILL_HORIZONTAL)); valueText.setEnabled(false); valueText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); addButtonListeners(drill); logger.debug("OUT"); } public void addButtonListeners(final Drill drill){ insertButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { editor.setIsDirty(true); // ADD button: 1) remove selection from table 2)disable cancel, enable save, 3) enable fields parsTable.setSelection(-1); insertButton.setEnabled(false); deleteButton.setEnabled(false); saveButton.setEnabled(true); nameText.setText(""); nameText.setEnabled(true); nameText.setBackground(new Color(composite.getDisplay(), new RGB(255,255,255))); categoryCombo.select(0); categoryCombo.setEnabled(true); valueText.setText(""); valueText.setEnabled(false); valueText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); } } ); deleteButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { editor.setIsDirty(true); // delete button: 1) remove item2) remove selection from table 3)disable cancel, disable save, enable insert, 3) disable fields int index = parsTable.getSelectionIndex(); TableItem toremove = parsTable.getItem(index); String name = toremove.getText(0); Vector<Param> params = drill.getParamList().getParams(); int indexTRoRemove = searchOnVectorParams(drill, name); params.remove(indexTRoRemove); parsTable.remove(indexTRoRemove); parsTable.setSelection(-1); insertButton.setEnabled(true); deleteButton.setEnabled(false); saveButton.setEnabled(false); nameText.setText(""); nameText.setEnabled(false); nameText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); categoryCombo.select(0); categoryCombo.setEnabled(false); valueText.setText(""); valueText.setEnabled(false); valueText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); } } ); saveButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { editor.setIsDirty(true); // save button: 1) check name is not existing and category is not empty, 2) check if something selected , 3) save new item and new param or update existing one // check name String name = nameText.getText(); String category = categoryCombo.getItem(categoryCombo.getSelectionIndex()); String value = valueText.getText(); // is tu update or insert int tableIndex = parsTable.getSelectionIndex(); Vector<Param> params = drill.getParamList().getParams(); if(tableIndex == -1){ //insert: check not already existing int indexfound = searchOnVectorParams(drill, name); if(indexfound != -1){ MessageDialog.openWarning(composite.getShell(), "Warning", "Name "+name+" already present."); return; } if(category.equals("")){ MessageDialog.openWarning(composite.getShell(), "Warning", "Select a category"); return; } //can insert Param param = new Param(); param.setName(name); param.setType(category); if(valueText.isEnabled()) param.setValue(value); drill.getParamList().getParams().add(param); TableItem item = new TableItem (parsTable, SWT.NONE); item.setText(0, name); item.setText(1, category); if(valueText.isEnabled()) item.setText(2, value); parsTable.redraw(); } else{ // update TableItem selecteditem = parsTable.getItem(parsTable.getSelectionIndex()); String nameSelected = selecteditem.getText(0); int indexParam = searchOnVectorParams(drill, nameSelected); Param param = drill.getParamList().getParams().get(indexParam); int indexNewParam = searchOnVectorParams(drill, name); // check new Name does not exist if(indexNewParam != -1 && indexNewParam != indexParam){ MessageDialog.openWarning(composite.getShell(), "Warning", "Name "+name+" already present."); return; } if(category.equals("")){ MessageDialog.openWarning(composite.getShell(), "Warning", "Select a category"); return; } param.setName(name); param.setType(category); if(valueText.isEnabled())param.setValue(value); else param.setValue(null); selecteditem.setText(0,name); selecteditem.setText(1,category); if(valueText.isEnabled()) selecteditem.setText(2,value); else selecteditem.setText(2,""); parsTable.redraw(); } // enable insert, disable delete, disable selection parsTable.setSelection(-1); insertButton.setEnabled(true); deleteButton.setEnabled(false); saveButton.setEnabled(false); nameText.setEnabled(false); nameText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); categoryCombo.select(0); categoryCombo.setEnabled(false); valueText.setText(""); valueText.setEnabled(false); valueText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); } } ); // Add listener that show details of parameter selected parsTable.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { TableItem tableItem = parsTable.getItem(parsTable.getSelectionIndex()); String name = tableItem.getText(0); String category = tableItem.getText(1); String value = tableItem.getText(2); nameText.setText(name); nameText.setEnabled(true); nameText.setBackground(new Color(composite.getDisplay(), new RGB(255,255,255))); categoryCombo.select(categoryCombo.indexOf(category)); categoryCombo.setEnabled(true); if(category.equalsIgnoreCase(ABSOLUTE)){ valueText.setText(value); valueText.setEnabled(true); valueText.setBackground(new Color(composite.getDisplay(), new RGB(255,255,255))); } else { valueText.setEnabled(false); valueText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); } saveButton.setEnabled(true); deleteButton.setEnabled(true); insertButton.setEnabled(true); parsTable.redraw(); } }); categoryCombo.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { String selected = categoryCombo.getItem(categoryCombo.getSelectionIndex()); if(selected.equals(ABSOLUTE)){ valueText.setEnabled(true); valueText.setBackground(new Color(composite.getDisplay(), new RGB(255,255,255))); } else{ valueText.setEnabled(false); valueText.setBackground(new Color(composite.getDisplay(), new RGB(200,200,200))); } } } ); } public int searchOnVectorParams(Drill drill, String name){ Vector<Param> params = drill.getParamList().getParams(); int indexTRoRemove = -1; for (Iterator iterator = params.iterator(); iterator.hasNext() && indexTRoRemove == -1;) { Param param = (Param) iterator.next(); if(param.getName().equals(name)){ indexTRoRemove = params.indexOf(param); } } return indexTRoRemove; } }