/** 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.CrossNavigationBO; import it.eng.spagobi.studio.geo.editors.model.bo.HierarchyBO; import it.eng.spagobi.studio.geo.editors.model.bo.LevelBO; import it.eng.spagobi.studio.geo.editors.model.bo.LinkBO; import it.eng.spagobi.studio.geo.editors.model.geo.CrossNavigation; import it.eng.spagobi.studio.geo.editors.model.geo.GEODocument; import it.eng.spagobi.studio.geo.editors.model.geo.Hierarchies; import it.eng.spagobi.studio.geo.editors.model.geo.Hierarchy; import it.eng.spagobi.studio.geo.editors.model.geo.Level; import it.eng.spagobi.studio.geo.editors.model.geo.Link; import it.eng.spagobi.studio.geo.editors.model.geo.LinkParam; 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.custom.TableEditor; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; 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.plugin.AbstractUIPlugin; public class CrossNavigationDesigner { private GEOEditor editor=null; private Composite mainComposite; private GEODocument geoDocument; private Vector<TableEditor> tableEditors = new Vector<TableEditor>(); Button addParameter=null; Button detail=null; Button erase=null; 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 CrossNavigationDesigner(Composite _composite, GEOEditor _editor, GEODocument _geoDocument) { super(); mainComposite= _composite; editor = _editor; geoDocument = _geoDocument; } public void createCrossnavigationTable(final Composite sectionClient, FormToolkit toolkit){ GridData gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan =2; gd.verticalAlignment=SWT.TOP; gd.widthHint= 700; gd.minimumWidth=600; gd.grabExcessHorizontalSpace=true; gd.heightHint=150; final Composite crossNavGroup = new Composite(sectionClient, SWT.RESIZE ); crossNavGroup.setLayoutData(gd); crossNavGroup.setLayout(sectionClient.getLayout()); final Table crossNavTable = toolkit.createTable(crossNavGroup, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan =2; gd.verticalAlignment=SWT.TOP; gd.widthHint= 500; gd.minimumWidth=400; gd.grabExcessHorizontalSpace=true; gd.heightHint=130; crossNavTable.setLayoutData(gd); crossNavTable.setLinesVisible(true); crossNavTable.setHeaderVisible(true); String[] titles = { " Hierarchy "," Level ", " ", " ", " "}; for (int i = 0; i < titles.length; i++) { TableColumn column = new TableColumn(crossNavTable, SWT.NONE); column.setText(titles[i]); } // look up for crossNavigation stored in geodocument final CrossNavigation crossNavigation = CrossNavigationBO.getCrossNavigation(geoDocument); if (crossNavigation != null && crossNavigation.getLinks() != null) { for(int i=0; i<crossNavigation.getLinks().size(); i++){ TableItem item = new TableItem(crossNavTable, SWT.TRANSPARENT); createTableItemRow(item, crossNavTable, crossNavigation.getLinks().elementAt(i)); } } for (int i = 0; i < titles.length; i++) { crossNavTable.getColumn(i).pack(); } // resize the row height using a MeasureItem listener crossNavTable.addListener(SWT.MeasureItem, new Listener() { public void handleEvent(Event event) { // height cannot be per row so simply set event.height = 23; } }); RowLayout layout = new RowLayout(); // Optionally set layout fields. layout.wrap = false; layout.marginWidth=10; layout.fill=true; layout.spacing=20; Composite addComp = toolkit.createComposite(sectionClient, SWT.NONE | SWT.FILL); // Set the layout into the composite. addComp.setLayout(layout); Label labelForAdd = toolkit.createLabel(addComp, "Click here to add a new link"); Button addNewLine = new Button(addComp, SWT.PUSH); Image addImage = addIcon.createImage(); addNewLine.setImage(addImage); addNewLine.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { Hierarchies hierarchies=HierarchyBO.getAllHierarchies(geoDocument); if(hierarchies == null || hierarchies.getHierarchy() == null){ MessageDialog.openWarning(sectionClient.getShell(), "Warning", "No hierarchies defined"); }else{ TableItem item = new TableItem(crossNavTable, SWT.NONE); createTableItemRow(item, crossNavTable, null); getEditor().setIsDirty(true); crossNavTable.redraw(); } } }); addNewLine.pack(); addNewLine.setToolTipText("Add new link"); crossNavTable.pack(); crossNavTable.redraw(); sectionClient.redraw(); } private void createOptionalShell(Composite sectionClient, final Link link){ Vector<LinkParam>params = link.getParam(); //LinkBO.getLinkParam(link, param); final Shell dialog = new Shell (mainComposite.getDisplay(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); dialog.setText("Optional Parameter"); FormLayout formLayout = new FormLayout (); formLayout.marginWidth = 10; formLayout.marginHeight = 10; formLayout.spacing = 10; dialog.setLayout (formLayout); Label label = new Label (dialog, SWT.RIGHT); label.setText ("Parameter Name:"); FormData data = new FormData (); data.width = 100; label.setLayoutData (data); Button cancel = new Button (dialog, SWT.PUSH); cancel.setText ("Cancel"); data = new FormData (); data.width = 60; data.right = new FormAttachment (100, 0); data.bottom = new FormAttachment (100, 0); cancel.setLayoutData (data); cancel.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { // System.out.println("User cancelled dialog"); dialog.close (); } }); final Text text = new Text (dialog, SWT.BORDER); data = new FormData (); data.width = 200; data.left = new FormAttachment (label, 0, SWT.DEFAULT); data.right = new FormAttachment (100, 0); data.top = new FormAttachment (label, 0, SWT.CENTER); text.setLayoutData (data); //type data = new FormData (); data.width = 100; data.top = new FormAttachment(text, 5); Label labelType = new Label (dialog, SWT.RIGHT); labelType.setText ("Parameter Type:"); labelType.setLayoutData (data); final Combo textType = new Combo (dialog, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); textType.add("absolute"); textType.add("relative"); data = new FormData (); data.width = 200; data.left = new FormAttachment (labelType, 0, SWT.DEFAULT); data.right = new FormAttachment (100, 0); data.top = new FormAttachment (labelType, 0, SWT.CENTER); textType.setLayoutData (data); //value data = new FormData (); data.width = 100; data.top = new FormAttachment(textType, 5); Label labelValue = new Label (dialog, SWT.RIGHT); labelValue.setText ("Parameter Value:"); labelValue.setLayoutData (data); final Text textValue = new Text (dialog, SWT.BORDER); data = new FormData (); data.width = 200; data.left = new FormAttachment (labelValue, 0, SWT.DEFAULT); data.right = new FormAttachment (100, 0); data.top = new FormAttachment (labelValue, 0, SWT.CENTER); textValue.setLayoutData (data); //value data = new FormData (); data.width = 100; data.top = new FormAttachment(textValue, 5); Label labelScope = new Label (dialog, SWT.RIGHT); labelScope.setText ("Parameter Scope:"); labelScope.setLayoutData (data); final Text textScope = new Text (dialog, SWT.BORDER); data = new FormData (); data.width = 200; data.left = new FormAttachment (labelScope, 0, SWT.DEFAULT); data.right = new FormAttachment (100, 0); data.top = new FormAttachment (labelScope, 0, SWT.CENTER); data.bottom = new FormAttachment (cancel, 0, SWT.DEFAULT); textScope.setLayoutData (data); Button ok = new Button (dialog, SWT.PUSH); ok.setText ("Finish"); data = new FormData (); data.width = 60; data.right = new FormAttachment (cancel, 0, SWT.DEFAULT); data.bottom = new FormAttachment (100, 0); ok.setLayoutData (data); ok.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { //create tree item String type = textType.getText(); String name = text.getText(); String scope =textScope.getText(); String value = textValue.getText(); LinkParam param = new LinkParam(); param.setName(name); param.setScope(scope); param.setType(type); param.setValue(value); LinkBO.addParamToLink(geoDocument, link, param); editor.setIsDirty(true); dialog.close (); } }); Button more = new Button (dialog, SWT.PUSH); more.setText ("Add more"); data = new FormData (); data.width = 60; data.right = new FormAttachment (ok, 0, SWT.DEFAULT); data.bottom = new FormAttachment (100, 0); more.setLayoutData (data); more.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { //create tree item String type = textType.getText(); String name = text.getText(); String scope =textScope.getText(); String value = textValue.getText(); LinkParam param = new LinkParam(); param.setName(name); param.setScope(scope); param.setType(type); param.setValue(value); LinkBO.addParamToLink(geoDocument, link, param); editor.setIsDirty(true); createOptionalShell(dialog.getParent(), link); dialog.close (); } }); dialog.setDefaultButton (ok); dialog.pack (); dialog.open (); } private void createTableItemRow(TableItem item, final Table crossNavTable, Link link){ final TableEditor editor1 = new TableEditor(crossNavTable); final Combo hierarchiesCombo = createHierachiesCombo(crossNavTable); if(link != null){ String hierarchySel = link.getHierarchy(); for (int k = 0; k < hierarchiesCombo.getItemCount(); k++) { String text = hierarchiesCombo.getItem(k); if (hierarchySel.equals(text)) { hierarchiesCombo.select(k); } } hierarchiesCombo.setData(link.getId()); hierarchiesCombo.setEnabled(false); } editor1.minimumWidth = hierarchiesCombo.getBounds().x; editor1.horizontalAlignment = SWT.CENTER; editor1.grabHorizontal = true; editor1.minimumHeight = hierarchiesCombo.getBounds().y; editor1.verticalAlignment = SWT.CENTER; editor1.grabVertical = true; editor1.setEditor(hierarchiesCombo, item, 0); editor1.layout(); final TableEditor editor2 = new TableEditor(crossNavTable); final Combo levelCombo = createLevelsCombo(crossNavTable, hierarchiesCombo.getText()); boolean isThereLink=false; if(link != null){ String levelSel = link.getLevel(); for (int k = 0; k < levelCombo.getItemCount(); k++) { String text = levelCombo.getItem(k); if (levelSel.equals(text)) { levelCombo.select(k); } } levelCombo.setData(link.getId()); isThereLink=true; } editor2.minimumWidth = levelCombo.getBounds().x; editor2.horizontalAlignment = SWT.CENTER; editor2.grabHorizontal = true; editor2.minimumHeight = levelCombo.getBounds().y; editor2.verticalAlignment = SWT.CENTER; editor2.grabVertical = true; editor2.setEditor(levelCombo, item, 1); hierarchiesCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { String hierarchySelected = ((Combo)e.widget).getText(); recreateLevelsCombo(crossNavTable,levelCombo, hierarchySelected); Integer idLink=null; // modifying hiearchi combo can only update, but to insert one must also define level if(hierarchiesCombo.getData()!=null){ idLink=(Integer)hierarchiesCombo.getData(); Link link = LinkBO.getLinkByHierarchyAndLevel(geoDocument,idLink); if (link == null) { // link = LinkBO.setNewLink(geoDocument, hierarchiesCombo.getText(), levelCombo.getText()); } // should not be null // TODO update } hierarchiesCombo.setEnabled(false); getEditor().setIsDirty(true); crossNavTable.redraw(); } public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); /* Listener listener = new Listener() { public void handleEvent(Event e) { if(e.type == SWT.KeyDown){ if(hierarchiesCombo.getItemCount()==0){ createHierachiesCombo(crossNavTable); } } } }; hierarchiesCombo.addListener(SWT.KeyDown, listener);*/ levelCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { // lets see if there is already an Id assigned Integer idLink=null; if(hierarchiesCombo.getData()!=null){ idLink=(Integer)hierarchiesCombo.getData(); } Link link = LinkBO.getLinkByHierarchyAndLevel(geoDocument, idLink); // if link is new if (link == null) { link = LinkBO.setNewLink(geoDocument, hierarchiesCombo.getText(), levelCombo.getText()); hierarchiesCombo.setData(link.getId()); levelCombo.setData(link.getId()); } else{ // if link is not new update LinkBO.updateExisting(geoDocument, idLink, levelCombo.getText()); } getEditor().setIsDirty(true); addParameter.setEnabled(true); detail.setEnabled(true); erase.setEnabled(true); } public void widgetDefaultSelected(SelectionEvent e) { // TODO Auto-generated method stub } }); final TableEditor editor4 = new TableEditor(crossNavTable); addParameter = new Button(crossNavTable, SWT.PUSH); addParameter.setSize(paramsIcon.createImage().getBounds().width, paramsIcon.createImage().getBounds().height); addParameter.setImage(paramsIcon.createImage()); if(!isThereLink)addParameter.setEnabled(false); addParameter.setToolTipText("Add parameters"); editor4.minimumWidth = addParameter.getBounds().x; editor4.horizontalAlignment = SWT.CENTER; editor4.grabHorizontal = true; editor4.minimumHeight = addParameter.getBounds().y; editor4.verticalAlignment = SWT.TOP; editor4.grabVertical = true; editor4.setEditor(addParameter, item, 2); addParameter.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { Integer idLink=null; if(hierarchiesCombo.getData()!=null){ idLink=(Integer)hierarchiesCombo.getData(); } Link link = LinkBO.getLinkByHierarchyAndLevel(geoDocument,idLink); if (link == null) { link = LinkBO.setNewLink(geoDocument, hierarchiesCombo.getText(), levelCombo.getText()); } createOptionalShell(crossNavTable.getParent(), link); } }); addParameter.pack(); final TableEditor editor5 = new TableEditor(crossNavTable); detail = new Button(crossNavTable, SWT.PUSH); detail.setSize(detailIcon.createImage().getBounds().width, detailIcon.createImage().getBounds().height); detail.setImage(detailIcon.createImage()); if(!isThereLink)detail.setEnabled(false); detail.setToolTipText("View detail"); editor5.minimumWidth = detail.getBounds().x; editor5.horizontalAlignment = SWT.CENTER; editor5.grabHorizontal = true; editor5.minimumHeight = detail.getBounds().y; editor5.verticalAlignment = SWT.TOP; editor5.grabVertical = true; editor5.setEditor(detail, item, 3); detail.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { Integer idLink=null; if(hierarchiesCombo.getData()!=null){ idLink=(Integer)hierarchiesCombo.getData(); } Link link = LinkBO.getLinkByHierarchyAndLevel(geoDocument,idLink); if (link != null) { createDetailShell(crossNavTable.getParent(), link); } } }); final TableEditor editor6 = new TableEditor(crossNavTable); erase = new Button(crossNavTable, SWT.PUSH); erase.setSize(eraseIcon.createImage().getBounds().width, eraseIcon.createImage().getBounds().height); erase.setImage(eraseIcon.createImage()); if(!isThereLink)erase.setEnabled(false); erase.setToolTipText("Delete link"); editor6.minimumWidth = erase.getBounds().x; editor6.horizontalAlignment = SWT.CENTER; editor6.grabHorizontal = true; editor6.minimumHeight = erase.getBounds().y; editor6.verticalAlignment = SWT.TOP; editor6.grabVertical = true; editor6.setEditor(erase, item, 4); erase.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { Integer idLink=null; if(hierarchiesCombo.getData()!=null){ idLink=(Integer)hierarchiesCombo.getData(); } Link link = LinkBO.getLinkByHierarchyAndLevel(geoDocument,idLink); TableItem item = crossNavTable.getItem(new Point(hierarchiesCombo.getBounds().x, hierarchiesCombo.getBounds().y)); if (link != null) { LinkBO.deleteLink(geoDocument, hierarchiesCombo.getText(), levelCombo.getText()); getEditor().setIsDirty(true); } Control old1 = editor1.getEditor(); if (old1 != null) old1.dispose(); Control old2 = editor2.getEditor(); if (old2 != null) old2.dispose(); Control old4 = editor4.getEditor(); if (old4 != null) old4.dispose(); Control old5 = editor5.getEditor(); if (old5 != null) old5.dispose(); Control old6 = editor6.getEditor(); if (old6 != null) old6.dispose(); item.dispose(); crossNavTable.layout(true); crossNavTable.redraw(); } }); } private void createDetailShell(Composite sectionClient, final Link link){ Vector<LinkParam>params = link.getParam(); final Shell dialog = new Shell (mainComposite.getDisplay(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); dialog.setText("Optional Parameters"); FormLayout formLayout = new FormLayout (); formLayout.marginWidth = 10; formLayout.marginHeight = 10; formLayout.spacing = 10; dialog.setLayout (formLayout); final Table paramsTable = new Table(dialog, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION); paramsTable.setLinesVisible(true); paramsTable.setHeaderVisible(true); String[] titles = { " Name ", " Type ", " Scope ", " Value "}; for (int i = 0; i < titles.length; i++) { TableColumn column = new TableColumn(paramsTable, SWT.NONE); column.setText(titles[i]); } if(params != null){ for(int i = 0; i < params.size(); i++){ TableItem item = new TableItem(paramsTable, SWT.NONE); item.setText(0, params.elementAt(i).getName()!=null ? params.elementAt(i).getName() : ""); item.setText(1, params.elementAt(i).getType() !=null ? params.elementAt(i).getType() : ""); item.setText(2, params.elementAt(i).getScope() != null ? params.elementAt(i).getScope() : ""); item.setText(3, params.elementAt(i).getValue()!=null ? params.elementAt(i).getValue() : ""); } } for (int i = 0; i < titles.length; i++) { paramsTable.getColumn(i).pack(); } paramsTable.addListener(SWT.MouseDown, new Listener() { public void handleEvent(Event event) { if (event.button == 3) { createMenu(dialog, paramsTable, link); } } }); paramsTable.redraw(); FormData data = new FormData (); data.width = 300; paramsTable.setLayoutData (data); Button cancel = new Button (dialog, SWT.PUSH); cancel.setText ("Close"); data = new FormData (); data.width = 40; data.top = new FormAttachment(paramsTable, 5); data.right = new FormAttachment (100, 0); cancel.setLayoutData (data); cancel.addSelectionListener (new SelectionAdapter () { public void widgetSelected (SelectionEvent e) { // System.out.println("User cancelled dialog"); dialog.close (); } }); dialog.setDefaultButton (cancel); dialog.pack (); dialog.open (); } private void createMenu(final Shell dialog,final Table table, final Link link){ Menu menu = new Menu (dialog, 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(); //delete parameter LinkBO.deleteLinkParam(link, sel[0].getText()); sel[0].dispose(); table.redraw(); } }); table.setMenu(menu); } private Combo createHierachiesCombo(Table crossNavTable){ Combo hierCombo = new Combo(crossNavTable, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); Hierarchies hierarchies=HierarchyBO.getAllHierarchies(geoDocument); if(hierarchies != null && hierarchies.getHierarchy() != null){ for(int i=0; i< hierarchies.getHierarchy().size(); i++){ Hierarchy hier = hierarchies.getHierarchy().elementAt(i); String name = hier.getName(); hierCombo.add(name); } } return hierCombo; } private Combo createLevelsCombo(Table crossNavTable, String hierarchyName){ Combo levelCombo = new Combo(crossNavTable, SWT.SIMPLE | SWT.DROP_DOWN | SWT.READ_ONLY); if(hierarchyName != null && !hierarchyName.equals("")){ Vector<Level> levels=LevelBO.getLevelsByHierarchyName(geoDocument, hierarchyName); if(levels != null){ for(int i=0; i< levels.size(); i++){ Level level = levels.elementAt(i); String name = level.getName(); levelCombo.add(name); } } } return levelCombo; } private void recreateLevelsCombo(Table crossNavTable,Combo levelCombo, String hierarchyName){ levelCombo.removeAll(); if(hierarchyName != null && !hierarchyName.equals("")){ Vector<Level> levels=LevelBO.getLevelsByHierarchyName(geoDocument, hierarchyName); if(levels != null){ for(int i=0; i< levels.size(); i++){ Level level = levels.elementAt(i); String name = level.getName(); levelCombo.add(name); } } } } 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; } public Vector<TableEditor> getTableEditors() { return tableEditors; } public void setTableEditors(Vector<TableEditor> tableEditors) { this.tableEditors = tableEditors; } }