/** 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.documentcomposition.views; import it.eng.spagobi.studio.documentcomposition.Activator; import it.eng.spagobi.studio.documentcomposition.editors.DocumentCompositionEditor; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.Document; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.DocumentComposition; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.Parameter; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.bo.ModelBO; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.bo.ParameterBO; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.metadata.MetadataDocument; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.metadata.MetadataParameter; import it.eng.spagobi.studio.documentcomposition.util.DocCompUtilities; import it.eng.spagobi.studio.documentcomposition.util.DocumentsContainedHandler; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Vector; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; 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.Composite; import org.eclipse.swt.widgets.Control; 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.IEditorPart; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.ViewPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DocumentParametersView extends ViewPart { private DocumentComposition documentComp; Composite client; Table table; private static Logger logger = LoggerFactory.getLogger(DocumentParametersView.class); public static final int ID=0; public static final int LABEL=1; public static final int TYPE=2; public static final int URLNAME=3; public static final int DEFAULT_VALUE=4; public static final int ADD=4; public void init(IViewSite site) throws PartInitException { // TODO Auto-generated method stub super.init(site); //documentComp= (new ModelBO()).getModel(); } public void viewSelectedProperties() { } public void createPartControl(Composite parent) { logger.debug("IN"); FormToolkit toolkit = new FormToolkit(parent.getDisplay()); // Lets make a layout for the first section of the screen GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.marginWidth = 2; layout.marginHeight = 2; // Creating the Screen Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR); section.setText("Parameters of selected document: select a row to edit default value"); //$NON-NLS-1$ client = toolkit.createComposite(section, SWT.WRAP); layout = new GridLayout(); layout.numColumns = 1; layout.marginWidth = 2; layout.marginHeight = 2; client.setLayout(layout); Button buttonRefresh=new Button(client, SWT.PUSH); buttonRefresh.setText("Refresh Metadata on active server"); buttonRefresh.addListener(SWT.Selection, getMetadataResfreshListener(client)); table = new Table (client, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK); table.setLinesVisible (true); table.setHeaderVisible (true); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.heightHint = 200; table.setLayoutData(data); String[] titles = {"Use as Input Parameter"," Label ", " Type "," UrlName ", " Default Value (Editable) "}; for (int i=0; i<titles.length; i++) { TableColumn column = new TableColumn (table, SWT.NONE); column.setText (titles [i]); } for (int i=0; i<titles.length; i++) { table.getColumn (i).pack (); } final TableEditor editor = new TableEditor(table); // table.addListener(SWT.Selection, new Listener() { // public void handleEvent(Event e) { // TableItem item = (TableItem)e.item; // if(item != null){ // String selType = e.detail == SWT.CHECK ? "Checked" : "Selected"; // if(selType != null && selType.equals("Checked")){ // String columnName = item.getText(); //// Column col = ColumnBO.getColumnByName(geoDocument, columnName); //// col.setChoosenForTemplate(item.getChecked()); //// setIsDirty(true); // } // } // } // }); // Add selection listener, could be a selection or a check event table.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { ModelBO modelBO = new ModelBO(); final TableItem item = (TableItem)e.item; if(item == null) return; if(SWT.CHECK == e.detail){ IEditorPart editorPart=DocCompUtilities.getEditorReference(DocCompUtilities.DOCUMENT_COMPOSITION_EDITOR_ID); if(editorPart!=null) ((DocumentCompositionEditor)editorPart).setIsDirty(true); boolean checked = item.getChecked(); ParameterBO parameterBO = new ParameterBO(); // if checked == true is going to be selected, if checked == false is going to be deselected try{ //String parameterId = item.getText(ID); DocumentComposition docComposition=Activator.getDefault().getDocumentComposition(); String documentLabel = item.getData().toString(); // add parameter to model if(checked){ Document document = docComposition.retrieveDocumentFromDocumentLabel(documentLabel); Vector<Parameter> vectPars = document.getParameters().getParameter(); // if it is selected add it to document! String parameterLabel = item.getText(LABEL); String parameterUrl = item.getText(URLNAME); String parameterType = item.getText(TYPE); String defaultValue = item.getText(DEFAULT_VALUE); Parameter parameter = new Parameter(docComposition); parameter.setDefaultVal(defaultValue); parameter.setSbiParLabel(parameterUrl); parameter.setType("IN"); // devo mettere il navigation name???? if(vectPars == null){ vectPars = new Vector<Parameter>(); } vectPars.add(parameter); document.getParameters().setParameter(vectPars); int i = 0; } else // remove parameter from model if not associated with a navigation { String parameterUrl = item.getText(URLNAME); // get parameter ID from template if(parameterUrl == null) { logger.error("parameter url not found"); return; } Parameter par = parameterBO.getInputParameterByDocumentLabelAndParameterLabel(docComposition, documentLabel, parameterUrl); if(par == null) return; String navigationId = par.getId(); // check parameter not used! I must check all documentCOmposition Navigation assuring the id is not used String navigation = parameterBO.isParameterUsedInNavigation(docComposition, navigationId); if(navigation != null){ // if used in navigation cannot remove MessageDialog.openWarning(table.getShell(), "Warning", "Cannot remove parameter from template; " + navigation); item.setChecked(true); } else{ // if not used can remove boolean deleted = parameterBO.deleteParameterById(docComposition, navigationId); } } modelBO.saveModel(docComposition); } catch (Exception ex) { logger.error("Error in treating parameter", ex); } } else // This is selection Mode { // Clean up any previous editor control Control oldEditor = editor.getEditor(); if (oldEditor != null) oldEditor.dispose(); // The control that will be the editor must be a child of the Table Text newEditor = new Text(table, SWT.NONE); newEditor.setText(item.getText(DEFAULT_VALUE)); newEditor.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent me) { Text text = (Text)editor.getEditor(); try{ editor.getItem().setText(DEFAULT_VALUE, text.getText()); String documentLabel = item.getData().toString(); String label = item.getText(LABEL); String urlName = item.getText(URLNAME); DocumentComposition docComposition=Activator.getDefault().getDocumentComposition(); Vector<Parameter> vectPars = docComposition.retrieveParametersVectorFromDocumentLabel(documentLabel); String defaultVal = editor.getItem().getText(DEFAULT_VALUE); // get the parameter to insert the value for (Iterator iterator = vectPars.iterator(); iterator.hasNext();) { Parameter parameter = (Parameter) iterator.next(); if(parameter.getSbiParLabel().equals(urlName)){ parameter.setDefaultVal(defaultVal); } } IEditorPart editorPart=DocCompUtilities.getEditorReference(DocCompUtilities.DOCUMENT_COMPOSITION_EDITOR_ID); if(editorPart!=null) ((DocumentCompositionEditor)editorPart).setIsDirty(true); } catch (Exception e) { logger.warn("error in modifying default value"); } } }); newEditor.selectAll(); newEditor.setFocus(); editor.setEditor(newEditor, item, DEFAULT_VALUE); } } }); client.pack(); toolkit.paintBordersFor(client); section.setClient(client); viewSelectedProperties(); setTableVisible(false); logger.debug("OUT"); } public void reloadParametersProperties(MetadataDocument metadataDocument){ logger.debug("IN"); table.removeAll(); if(metadataDocument!=null){ DocumentComposition docComposition=Activator.getDefault().getDocumentComposition(); // check if I can find a default value, these are also all selected! Map<String, String> defaults = new HashMap<String, String>(); try{ String label = metadataDocument.getLabel(); Vector<Parameter> vectPars = docComposition.retrieveParametersVectorFromDocumentLabel(label); // fill the map with default values if(vectPars != null){ for (Iterator iterator = vectPars.iterator(); iterator.hasNext();) { Parameter parameter = (Parameter) iterator.next(); defaults.put(parameter.getSbiParLabel(), parameter.getDefaultVal()); } } } catch (Exception e) { // exception proof cause next to release! logger.error("Error in recovering default value"); } Vector<MetadataParameter> parameters=metadataDocument.getMetadataParameters(); if(parameters!=null){ for (Iterator iterator = parameters.iterator(); iterator.hasNext();) { MetadataParameter metadataParameter = (MetadataParameter) iterator.next(); TableItem item = new TableItem (table, SWT.NONE); // put as data the label f the document item.setData(metadataDocument.getLabel()); //item.setText (ID, metadataParameter.getId()!=null ? metadataParameter.getId().toString() : ""); item.setText (ID, ""); item.setText (LABEL, metadataParameter.getLabel()!=null ? metadataParameter.getLabel() : ""); item.setText (TYPE, metadataParameter.getType()!=null ? metadataParameter.getType() : ""); item.setText (URLNAME, metadataParameter.getUrlName()!=null ? metadataParameter.getUrlName() : ""); // try searching for a default value String def = defaults.get(metadataParameter.getUrlName()); item.setText (DEFAULT_VALUE, def != null ? def : ""); item.setBackground(DEFAULT_VALUE, new Color(item.getDisplay(), new RGB(220,220,245))); // if value is inside the map means it is selected! if(defaults.containsKey(metadataParameter.getUrlName())){ item.setChecked(true); } else { item.setChecked(false); } } } } client.layout(); client.redraw(); setTableVisible(true); logger.debug("OUT"); } public Listener getMetadataResfreshListener(final Composite client){ logger.debug("IN"); Listener refreshListener = new Listener() { public void handleEvent(Event event) { new DocumentsContainedHandler().refreshMetadataOfContainedDocuments(client); } }; logger.debug("OUT"); return refreshListener; } @Override public IViewSite getViewSite() { // TODO Auto-generated method stub return super.getViewSite(); } @Override public void init(IViewSite site, IMemento memento) throws PartInitException { // TODO Auto-generated method stub super.init(site, memento); } @Override public void saveState(IMemento memento) { // TODO Auto-generated method stub super.saveState(memento); } @Override protected void setContentDescription(String description) { // TODO Auto-generated method stub super.setContentDescription(description); } @Override public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) { // TODO Auto-generated method stub super.setInitializationData(cfig, propertyName, data); } @Override protected void setPartName(String partName) { // TODO Auto-generated method stub super.setPartName(partName); } public DocumentComposition getDocumentComp() { return documentComp; } public void setDocumentComp(DocumentComposition documentComp) { this.documentComp = documentComp; } public Table getTable() { return table; } public void setTable(Table table) { this.table = table; } public Composite getClient() { return client; } public void setClient(Composite client) { this.client = client; } @Override public void setFocus() { // TODO Auto-generated method stub } public void cleanParameters(){ table.removeAll(); } public void setTableVisible(boolean visible){ table.setVisible(visible); } public boolean isTableVisible(){ return table.isVisible(); } }