/**
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.geo.editors;
import it.eng.spagobi.studio.geo.Activator;
import it.eng.spagobi.studio.geo.editors.model.bo.GuiSettingsBO;
import it.eng.spagobi.studio.geo.editors.model.bo.LabelBO;
import it.eng.spagobi.studio.geo.editors.model.geo.Format;
import it.eng.spagobi.studio.geo.editors.model.geo.GEODocument;
import it.eng.spagobi.studio.geo.editors.model.geo.GuiParam;
import it.eng.spagobi.studio.geo.editors.model.geo.GuiSettings;
import it.eng.spagobi.studio.geo.editors.model.geo.Label;
import it.eng.spagobi.studio.geo.editors.model.geo.Labels;
import it.eng.spagobi.studio.geo.editors.model.geo.Param;
import java.util.Vector;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
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.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
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.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.plugin.AbstractUIPlugin;
public class GuiSettingsLabelDesigner {
private GEOEditor editor=null;
private Composite mainComposite;
private GEODocument geoDocument;
private GuiSettings guiSettings;
public GuiSettings getGuiSettings() {
return guiSettings;
}
public void setGuiSettings(GuiSettings guiSettings) {
this.guiSettings = guiSettings;
}
final ImageDescriptor addIcon = AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/add.gif");
final ImageDescriptor paramsIcon = AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/linkParams.gif");
final ImageDescriptor eraseIcon = AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/erase.gif");
final ImageDescriptor detailIcon = AbstractUIPlugin
.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/detail.gif");
public GuiSettingsLabelDesigner(Composite _composite, GEOEditor _editor, GEODocument _geoDocument) {
super();
mainComposite= _composite;
editor = _editor;
geoDocument = _geoDocument;
}
public void createGuiSettingsLabels(final Composite sectionClient, FormToolkit toolkit, ScrolledForm form){
// look up for guisettings stored in geodocument
guiSettings = GuiSettingsBO.getGuiSettings(geoDocument);
createLabelsGroup(toolkit, form);
sectionClient.redraw();
}
private void createLabelsGroup(final FormToolkit toolkit, final ScrolledForm form){
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalSpan =4;
mainComposite.setLayoutData(gd);
final Button add = toolkit.createButton(mainComposite, "Add", SWT.PUSH);
add.setSize(addIcon.createImage().getBounds().width, addIcon.createImage().getBounds().height);
add.setImage(addIcon.createImage());
add.setToolTipText("Add label");
add.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
final Group guiGroup = new Group(mainComposite, SWT.FILL);
createLabelGroup(toolkit, guiGroup, null);
guiGroup.forceFocus();
guiGroup.layout();
guiGroup.redraw();
mainComposite.redraw();
form.reflow(true);
((Section)(mainComposite.getParent())).redraw();
}
});
add.setLayoutData(gd);
if (guiSettings != null && guiSettings.getLabels() != null && guiSettings.getLabels().getLabel() != null) {
Labels labels = guiSettings.getLabels();
if(labels != null && labels.getLabel() != null){
Vector<Label> labelV= labels.getLabel();
for(int i=0; i< labelV.size(); i++){
if(labelV.elementAt(i).getPosition() != null){
final Group guiGroup = new Group(mainComposite, SWT.FILL);
createLabelGroup(toolkit, guiGroup, labelV.elementAt(i));
}
}
}
}else{
final Group guiGroup = new Group(mainComposite, SWT.FILL);
createLabelGroup(toolkit, guiGroup, null);
}
}
private void createLabelGroup(FormToolkit toolkit,final Group guiGroup, Label label){
if(label == null){
label = LabelBO.setNewLabel(geoDocument);
}
Format format = label.getFormat();
if(format == null){
format = new Format();
label.setFormat(format);
}
RowLayout fillLayout = new RowLayout();
fillLayout.type = SWT.VERTICAL;
fillLayout.wrap=true;
guiGroup.setLayout(fillLayout);
final Label[] theLabel = {label};
final Button deleteLabel =toolkit.createButton(guiGroup, "Delete", SWT.PUSH);
deleteLabel.setSize(eraseIcon.createImage().getBounds().width, eraseIcon.createImage().getBounds().height);
deleteLabel.setImage(eraseIcon.createImage());
deleteLabel.setToolTipText("Delete label");
deleteLabel.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
Labels labels =guiSettings.getLabels();
labels.getLabel().remove(theLabel[0]);
guiGroup.dispose();
mainComposite.pack();
mainComposite.redraw();
//form.reflow(true);
((Section)(mainComposite.getParent())).redraw();
}
});
//flag position for this label
createPositionCheck(toolkit, guiGroup, label);
createText(toolkit, guiGroup, label);
createFormatInput(toolkit, guiGroup, label);
createParamsGroup(toolkit, guiGroup, label);
}
private void createParamsGroup(FormToolkit toolkit, Group guiGroup, final Label label){
Composite comp = toolkit.createComposite(guiGroup, SWT.NONE);
RowLayout rl = new RowLayout();
rl.fill=true;
rl.justify=true;
rl.spacing=5;
rl.marginLeft=5;
rl.marginTop=5;
comp.setLayout(rl);
final Table guiTable = toolkit.createTable(comp, SWT.MULTI | SWT.BORDER
| SWT.FULL_SELECTION);
guiTable.setLayout(guiGroup.getLayout());
guiTable.setLinesVisible(true);
guiTable.setHeaderVisible(true);
String[] titles = { "Parameter Name", "Value"};
for (int i = 0; i < titles.length; i++) {
TableColumn column = new TableColumn(guiTable, SWT.NONE);
column.setText(titles[i]);
}
if (label != null) {
Vector<GuiParam> params = label.getParams();
if(params != null){
for(int i=0; i< params.size(); i++){
GuiParam param = params.elementAt(i);
TableItem item = new TableItem(guiTable, SWT.TRANSPARENT);
createGUIRow(item, guiTable, param);
}
}
}
for (int i = 0; i < titles.length; i++) {
guiTable.getColumn(i).pack();
}
//rightClick --> menu
guiTable.addListener(SWT.MouseDown, new Listener () {
public void handleEvent (Event event) {
if (event.button==3){
createMenu(guiTable, label);
}
}
});
guiTable.redraw();
//form to add parameters
createInsertParamForm(label, toolkit, comp, guiTable);
}
private void createInsertParamForm(final Label label, FormToolkit toolkit, Composite group, final Table table){
FormLayout formLayout = new FormLayout ();
formLayout.marginWidth = 5;
formLayout.marginHeight = 5;
formLayout.spacing = 5;
Composite formComp = toolkit.createComposite(group, SWT.NONE);
formComp.setLayout (formLayout);
org.eclipse.swt.widgets.Label name = new org.eclipse.swt.widgets.Label (formComp, SWT.RIGHT);
name.setText ("Name:");
FormData data = new FormData ();
data.width = 40;
name.setLayoutData (data);
final Text text = new Text(formComp, SWT.BORDER);
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
}
});
data = new FormData ();
data.width = 80;
data.left = new FormAttachment (name, 0, SWT.DEFAULT);
data.right = new FormAttachment (100, 0);
text.setLayoutData (data);
formComp.setData(text.getText());
org.eclipse.swt.widgets.Label labelVal = new org.eclipse.swt.widgets.Label (formComp, SWT.RIGHT);
labelVal.setText ("Value:");
data = new FormData ();
data.width = 40;
data.top = new FormAttachment(text, 5);
labelVal.setLayoutData (data);
final Text textVal = toolkit.createText(formComp, "", SWT.BORDER);
data = new FormData ();
data.width = 80;
data.left = new FormAttachment (labelVal, 0, SWT.DEFAULT);
data.right = new FormAttachment (100, 0);
data.top = new FormAttachment (labelVal, 0, SWT.CENTER);
textVal.setLayoutData (data);
formComp.setData(textVal.getText());
Button ok = new Button (formComp, SWT.PUSH);
ok.setText ("Add");
data = new FormData ();
data.width = 40;
data.top = new FormAttachment(textVal, 5);
data.right = new FormAttachment (100, 0);
ok.setLayoutData (data);
ok.addSelectionListener (new SelectionAdapter () {
public void widgetSelected (SelectionEvent e) {
GuiParam param = new GuiParam();
param.setName(text.getText());
param.setValue(textVal.getText());
//add parameter to windows bean
if(label != null){
Vector params = label.getParams();
if(params != null){
params.add(param);
}else{
params = new Vector<Param>();
label.setParams(params);
params.add(param);
}
}
TableItem item = new TableItem(table, SWT.NONE);
createGUIRow(item, table, param);
//clean combo and text
text.setText("");
textVal.setText("");
text.redraw();
textVal.redraw();
editor.setIsDirty(true);
}
});
}
private void createGUIRow(TableItem item, final Table guiTable, GuiParam param){
if(param.getName() != null)
item.setText(0, param.getName());
if(param.getValue() != null )
item.setText(1, param.getValue());
guiTable.redraw();
}
private void createPositionCheck(FormToolkit toolkit, Group guiGroup, final Label label){
Composite posComp = toolkit.createComposite(guiGroup, SWT.NONE);
RowLayout rl = new RowLayout();
rl.fill=true;
rl.justify=true;
rl.spacing=5;
rl.marginLeft=5;
rl.marginTop=5;
posComp.setLayout(rl);
org.eclipse.swt.widgets.Label position = toolkit.createLabel(posComp, "Position:", SWT.BOLD);
createSinglePosition(toolkit, posComp, label, "header-left");
createSinglePosition(toolkit, posComp, label, "header-center");
createSinglePosition(toolkit, posComp, label, "header-right");
Composite posComp2 = toolkit.createComposite(guiGroup, SWT.NONE);
rl = new RowLayout();
rl.fill=true;
rl.justify=true;
rl.spacing=5;
rl.marginLeft=55;
rl.marginTop=5;
posComp2.setLayout(rl);
createSinglePosition(toolkit, posComp2, label, "footer-left");
createSinglePosition(toolkit, posComp2, label, "footer-center");
createSinglePosition(toolkit, posComp2, label, "footer-right");
}
private void createText(FormToolkit toolkit, Group guiGroup, final Label label){
Composite textComp = toolkit.createComposite(guiGroup, SWT.FILL);
RowLayout rl = new RowLayout();
rl.fill=true;
rl.wrap=true;
//rl.justify=true;
rl.spacing=5;
rl.marginLeft=5;
rl.marginTop=5;
textComp.setLayout(rl);
org.eclipse.swt.widgets.Label labelText = toolkit.createLabel(textComp, "Text:", SWT.RIGHT);
final Text text = toolkit.createText(textComp, "", SWT.BORDER);
text.setSize(20, 200);
if(label != null && label.getText() != null){
text.setText(label.getText());
}
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
label.setText(text.getText());
editor.setIsDirty(true);
}
});
if(label != null && label.getText() != null){
text.setText(label.getText());
text.redraw();
}
}
private void createSinglePosition(FormToolkit toolkit, Composite posComp, final Label label, String pos){
final Button btn = toolkit.createButton(posComp, pos, SWT.RADIO);
btn.addListener(SWT.Selection, new Listener () {
public void handleEvent (Event event) {
//add to label
if(!btn.getText().equals(label.getPosition())){
Label labelExistent = LabelBO.getLabelByPosition(geoDocument, btn.getText());
if(labelExistent == null){
label.setPosition(btn.getText());
}else{
MessageDialog.openError(mainComposite.getShell(), "Warning", "Label in the same position already exists.");
}
editor.setIsDirty(true);
}
}
});
if(label != null && label.getPosition() != null && label.getPosition().equalsIgnoreCase(pos)){
btn.setSelection(true);
btn.redraw();
}
}
private void createFormatInput(FormToolkit toolkit, Group guiGroup, final Label label){
Composite formComp = toolkit.createComposite(guiGroup, SWT.NONE);
RowLayout rl = new RowLayout();
rl.fill=true;
rl.justify=false;
rl.spacing=10;
rl.marginLeft=10;
rl.marginTop=10;
formComp.setLayout(rl);
org.eclipse.swt.widgets.Label formatlabel = toolkit.createLabel(formComp, "Format:", SWT.BOLD);
final Text day = toolkit.createText(formComp, "dd/MM/yyyy");
label.getFormat().setDay(day.getText());
final Text hour = toolkit.createText(formComp, "HH:mm");
label.getFormat().setHour(hour.getText());
hour.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
label.getFormat().setDay(day.getText());
label.getFormat().setHour(hour.getText());
}
});
if(label != null && label.getFormat().getDay() != null){
day.setText(label.getFormat().getDay());
day.redraw();
}
if(label != null && label.getFormat().getHour() != null){
hour.setText(label.getFormat().getHour());
hour.redraw();
}
}
private void createMenu(final Table table, final Label label){
Menu menu = new Menu (mainComposite.getShell(), SWT.POP_UP);
MenuItem menuItem = new MenuItem (menu, SWT.PUSH);
menuItem.setText ("Delete");
menuItem.addListener(SWT.Selection, new Listener () {
public void handleEvent (Event event) {
TableItem[] sel = table.getSelection();
if(sel[0] != null){
deleteItem(label, sel[0]);
}else{
MessageDialog.openWarning(mainComposite.getShell(), "Warning", "Please select an item to delete");
}
}
});
table.setMenu(menu);
}
private void deleteItem(Label label, TableItem item){
LabelBO.deleteParamByName(label, item.getText());
item.dispose();
editor.setIsDirty(true);
item.getParent().redraw();
}
public GEOEditor getEditor() {
return editor;
}
public void setEditor(GEOEditor editor) {
this.editor = editor;
}
public Composite getMainComposite() {
return mainComposite;
}
public void setMainComposite(Composite mainComposite) {
this.mainComposite = mainComposite;
}
public GEODocument getGeoDocument() {
return geoDocument;
}
public void setGeoDocument(GEODocument geoDocument) {
this.geoDocument = geoDocument;
}
}