/** 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.wizards.pages; import it.eng.spagobi.studio.documentcomposition.Activator; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.RefreshDocLinked; 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.MetadataDocumentComposition; import it.eng.spagobi.studio.documentcomposition.editors.model.documentcomposition.metadata.MetadataParameter; import it.eng.spagobi.studio.documentcomposition.wizards.SpagoBINavigationWizard; import it.eng.spagobi.studio.documentcomposition.wizards.pages.util.DestinationInfo; import java.util.HashMap; import java.util.Vector; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class NewNavigationWizardDestinDocPage extends WizardPage { Vector<Combo> destinationDocNameCombo; Vector<Combo> destinationInputParam ; Vector<Text> destinationInputParamDefaultValue ; private MetadataDocumentComposition metaDoc; String name = ""; String paramIn = ""; int destinCounter = 0; HashMap <String, String> docInfoUtil = new HashMap<String, String>(); private DestinationInfo destinationInfo; private Vector<DestinationInfo> destinationInfos; public NewNavigationWizardDestinDocPage() { super("New Document - Destination document"); setTitle("Insert Destination Document"); destinationInfos = new Vector<DestinationInfo>(); } public NewNavigationWizardDestinDocPage(String pageName) { super(pageName); setTitle("Insert Destination document"); destinationInfos = new Vector<DestinationInfo>(); } @Override public boolean isPageComplete() { boolean ret= super.isPageComplete(); for(int i = 0; i<destinCounter; i++){ int sel = destinationDocNameCombo.elementAt(destinCounter).getSelectionIndex(); String destin = destinationDocNameCombo.elementAt(destinCounter).getItem(sel); if ((destinationInputParam.elementAt(destinCounter).getText() == null || destinationInputParam.elementAt(destinCounter).getText().length() == 0) &&(sel ==-1 || destin == null )) { return false; } } return ret; } public void createControl(Composite parent) { destinationInfo = new DestinationInfo(); destinationDocNameCombo = new Vector<Combo>(); destinationInputParam = new Vector<Combo>(); destinationInputParamDefaultValue = new Vector<Text>(); final ScrolledComposite sc = new ScrolledComposite(parent, SWT.V_SCROLL ); final Composite composite = new Composite(sc, SWT.BORDER); sc.setContent(composite); composite.addListener(SWT.Show, new Listener() { public void handleEvent(Event event) { fillDestinationCombo(); } }); final GridLayout gl = new GridLayout(); int ncol = 2; gl.numColumns = ncol; composite.setLayout(gl); new Label(composite, SWT.NONE).setText("Destination document:"); destinationDocNameCombo.addElement(new Combo(composite, SWT.BORDER |SWT.READ_ONLY )); /////////////riempie documenti dest fillDestinationCombo(); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 1; destinationDocNameCombo.elementAt(destinCounter).setLayoutData(gd); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 1; gd.grabExcessHorizontalSpace = true; gd.minimumWidth =200; gd.widthHint = 250; new Label(composite, SWT.NONE).setText("Input parameter:"); destinationInputParam.addElement(new Combo(composite, SWT.BORDER | SWT.READ_ONLY)); destinationInputParam.elementAt(destinCounter).setLayoutData(gd); new Label(composite, SWT.NONE).setText("Default value:"); Text def = new Text(composite, SWT.BORDER); def.setText("%"); destinationInputParamDefaultValue.addElement(def); destinationInputParamDefaultValue.elementAt(destinCounter).setLayoutData(gd); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalSpan =2; final Button addButton = new Button(composite, SWT.PUSH) ; addButton.setText("Add destination"); addButton.setVisible(false); addButton.setLayoutData(gd); destinationInputParam.elementAt(destinCounter).addListener( SWT.FocusIn, new Listener() { public void handleEvent(Event event) { int numberOfDestinations = destinationDocNameCombo.elementAt(destinCounter).getItemCount(); //controlla se possibile aggiungere nuove destinazioni if(numberOfDestinations != 1){ addButton.setVisible(true); composite.redraw(); } } }); addButton.addListener( SWT.Selection, new Listener() { public void handleEvent(Event event) { //setPageComplete(false); if(destinationDocNameCombo.elementAt(destinCounter).getItemCount() ==1){ //messaggio di errore in dialog addButton.setVisible(false); final boolean[] result = new boolean[1]; Shell confirm = createErrorDialog(composite, result, 0); confirm.setText("Error"); confirm.setSize(300,100); confirm.open(); return; } destinationInfo = new DestinationInfo(); int sel = destinationDocNameCombo.elementAt(destinCounter).getSelectionIndex(); destinationInfo.setDocDestName(destinationDocNameCombo.elementAt(destinCounter).getItem(sel)); int selIn = destinationInputParam.elementAt(destinCounter).getSelectionIndex(); //destinationInfo.setParamDestName(destinationInputParam.elementAt(destinCounter).getItem(selIn)); String label = destinationInputParam.elementAt(destinCounter).getText(); String urlName= (String)destinationInputParam.elementAt(destinCounter).getData(label); destinationInfo.setParamDestName(urlName); destinationInfo.setParamDefaultValue(destinationInputParamDefaultValue.elementAt(destinCounter)); destinationInfos.add(destinationInfo); destinCounter++; GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL_HORIZONTAL; gridData.horizontalSpan = 1; gridData.widthHint = 250; new Label(composite, SWT.NONE).setText("Destination document:"); destinationDocNameCombo.addElement(new Combo(composite, SWT.BORDER |SWT.READ_ONLY )); /////////////riempie documenti dest fillDestinationCombo(); //destinationInputParam.elementAt(destinCounter).removeAll(); destinationDocNameCombo.elementAt(destinCounter).setLayoutData(gridData); destinationDocNameCombo.elementAt(destinCounter).setVisible(true); //crea una nuovo output text new Label(composite, SWT.NONE).setText("Input parameter:"); Combo newText =new Combo(composite, SWT.BORDER |SWT.READ_ONLY ); destinationInputParam.addElement(newText); newText.setLayoutData(gridData); new Label(composite, SWT.NONE).setText("Default value:"); Text def = new Text(composite, SWT.BORDER); def.setText("%"); destinationInputParamDefaultValue.addElement(def); destinationInputParamDefaultValue.elementAt(destinCounter).setLayoutData(gridData); destinationDocNameCombo.elementAt(destinCounter).addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { Combo selectedCombo = (Combo) event.widget; //ricavo dal vettore di combo la sua posizione int destinComboToRedraw = destinationDocNameCombo.indexOf(selectedCombo); //controlla se destinazione precedentem selezionata boolean canSelect = canSelectDestination(selectedCombo.getText(), destinComboToRedraw); if(!canSelect){ //messaggio di errore in dialog addButton.setVisible(false); selectedCombo.deselect((selectedCombo).getSelectionIndex()); final boolean[] result = new boolean[1]; Shell confirm = createErrorDialog(composite, result, 1); confirm.setText("Error"); confirm.setSize(300,100); confirm.open(); }else{ ParameterBO bo = new ParameterBO(); String docLab =docInfoUtil.get(destinationDocNameCombo.elementAt(destinCounter).getText()); boolean exists = bo.inputParameterExists(Activator.getDefault().getDocumentComposition(), docLab, selectedCombo.getText()); if(exists){ final boolean[] result = new boolean[1]; Shell confirm = createConfirmDialog(composite.getParent(), result, destinCounter); confirm.open(); }else{ int sel = destinationDocNameCombo.elementAt(destinCounter).getSelectionIndex(); if(sel != -1){ setPageComplete(true); name = destinationDocNameCombo.elementAt(destinCounter).getItem(sel); destinationInputParam.elementAt(destinComboToRedraw).removeAll(); fillDestinationParamCombo(name, destinComboToRedraw); destinationInputParam.elementAt(destinComboToRedraw).redraw(); } } } } }); composite.pack(false); composite.getParent().redraw(); } }); destinationDocNameCombo.elementAt(0).addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { boolean canSelect = canSelectDestination(destinationDocNameCombo.elementAt(0).getText(), 0); if(!canSelect){ //messaggio di errore in dialog final boolean[] result = new boolean[1]; Shell confirm = createErrorDialog(composite, result, 1); confirm.setText("Error"); confirm.setSize(300,100); confirm.open(); return; } // TODO Auto-generated method stub int sel = destinationDocNameCombo.elementAt(0).getSelectionIndex(); if(sel != -1){ name = destinationDocNameCombo.elementAt(0).getItem(sel); destinationInputParam.elementAt(0).removeAll(); fillDestinationParamCombo(name, 0); destinationInputParam.elementAt(0).redraw(); } } public void widgetSelected(SelectionEvent e) { //controlla se destinazione precedentem selezionata boolean canSelect = canSelectDestination(destinationDocNameCombo.elementAt(0).getText(), 0); if(!canSelect){ //messaggio di errore in dialog ((Combo)e.widget).deselect(((Combo)e.widget).getSelectionIndex()); final boolean[] result = new boolean[1]; Shell confirm = createErrorDialog(composite, result, 1); confirm.setText("Error"); confirm.setSize(300,100); confirm.open(); } int sel = destinationDocNameCombo.elementAt(0).getSelectionIndex(); if(sel != -1){ name = destinationDocNameCombo.elementAt(0).getItem(sel); //controlla se � possibile modificare destinazioni fillDestinationParamCombo(name, 0); destinationInputParam.elementAt(0).redraw(); } } }); destinationInputParam.elementAt(0).addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { setPageComplete(true); //aggiunge pulsante x add delle pagine addButton.setVisible(true); ParameterBO bo = new ParameterBO(); String docLab =docInfoUtil.get(destinationDocNameCombo.elementAt(0).getText()); // boolean exists = bo.inputParameterExists(Activator.getDefault().getDocumentComposition(), docLab, ((Combo)event.widget).getText()); // if(exists){ // // final boolean[] result = new boolean[1]; // Shell confirm = createConfirmDialog(composite.getParent(), result, 0); // confirm.open(); // }else{ paramIn = destinationInputParam.elementAt(0).getText(); // } composite.redraw(); } }); composite.pack(false); composite.redraw(); setControl(composite); setPageComplete(false); } private void fillDestinationCombo(){ metaDoc = Activator.getDefault().getMetadataDocumentComposition(); SpagoBINavigationWizard wizard = (SpagoBINavigationWizard)getWizard(); if(destinationDocNameCombo.elementAt(destinCounter).getItemCount() == 0){ if(metaDoc != null){ Vector docs = metaDoc.getMetadataDocuments(); if(docs != null){ for(int i=0; i<docs.size(); i++){ MetadataDocument doc = (MetadataDocument)docs.elementAt(i); String destName = doc.getName(); String destLabel = doc.getLabel(); if(doc.getMetadataParameters() != null && doc.getMetadataParameters().size()!=0){ String destinationName = doc.getName(); if(destinationName != null && !destinationName.equals("")){ destinationDocNameCombo.elementAt(destinCounter).add(destinationName); docInfoUtil.put(destName, destLabel); } } } } } } String master = wizard.getSelectedMaster(); //per ridisegnare combo if(master != null && !master.equals("")){ int posMaster =destinationDocNameCombo.elementAt(destinCounter).indexOf(master); if(posMaster != -1){ destinationDocNameCombo.elementAt(destinCounter).remove(posMaster); } } //rimuove anche destination precedentemente selezionata if(destinCounter != 0){ for(int i=1; i<=destinCounter; i++){ String destPrec = destinationDocNameCombo.elementAt(i-1).getText(); int posDestPrec =destinationDocNameCombo.elementAt(destinCounter).indexOf(destPrec); if(posDestPrec != -1){ destinationDocNameCombo.elementAt(destinCounter).remove(posDestPrec); } } } destinationDocNameCombo.elementAt(destinCounter).redraw(); } private void fillDestinationParamCombo(String destDoc, int destinComboToRedraw){ if(destinComboToRedraw == 0){ destinationInputParam.elementAt(destinComboToRedraw).removeAll(); } if(metaDoc != null){ Vector docs = metaDoc.getMetadataDocuments(); if(docs != null){ for(int i=0; i<docs.size(); i++){ MetadataDocument doc = (MetadataDocument)docs.elementAt(i); String docName = doc.getName(); if(docName != null && !docName.equals("") &&(docName.equals(destDoc))){ Vector params = doc.getMetadataParameters(); if(params != null){ for (int j =0; j<params.size(); j++){ MetadataParameter param = (MetadataParameter)params.elementAt(j); String label = param.getLabel(); destinationInputParam.elementAt(destinComboToRedraw).add(label); destinationInputParam.elementAt(destinComboToRedraw).setData(label, param.getUrlName()); } } } } } } } protected Shell createErrorDialog(Composite client, final boolean[] result, int messageType){ final Shell error = new Shell(client.getDisplay(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); error.setLayout(new GridLayout(3, false)); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; error.setSize(300, 100); Point pt = client.getDisplay().getCursorLocation (); error.setLocation (pt.x, pt.y); String message = "No more destination documents available."; if(messageType == 1){ message = "Destination already selected."; }else if(messageType == 2){ message = "Select a destination."; } new Label(error, SWT.NONE).setText(message); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalSpan = 3; final Button cancel = new Button(error, SWT.PUSH); cancel.setLayoutData(gd); cancel.setText("Cancel"); error.isReparentable(); Listener dialogListener = new Listener() { public void handleEvent(Event event) { result[0] = event.widget == cancel; error.notifyListeners(event.type, event); error.close(); } }; cancel.addListener(SWT.Selection, dialogListener); return error; } protected Shell createConfirmDialog(Composite client, final boolean[] result, int element){ final Shell confirm = new Shell(client.getDisplay(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.marginWidth = 6; layout.marginHeight = 6; confirm.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 3; confirm.setSize(400, 120); String message = "Warning! Another navigation uses the same destination parameter. \n This operation will modify both. \nContinue? "; Label label = new Label(confirm, SWT.NONE); label.setText(message); label.setLayoutData(gd); gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalSpan = 1; Point pt = client.getDisplay().getCursorLocation (); confirm.setLocation (pt.x, pt.y); final Button ok = new Button(confirm, SWT.PUSH); ok.setText("Confirm"); ok.setLayoutData(gd); Button cancel = new Button(confirm, SWT.PUSH); cancel.setText("Cancel"); cancel.setLayoutData(gd); confirm.isReparentable(); Listener dialogListener = new Listener() { public void handleEvent(Event event) { result[0] = event.widget == ok; confirm.notifyListeners(event.type, event); confirm.close(); } }; ok.addListener(SWT.Selection, dialogListener); cancel.addListener(SWT.Selection, dialogListener); return confirm; } private boolean canSelectDestination(String currentDest, int currentCombo){ boolean canSel = true; for(int i =0; i<destinationDocNameCombo.size(); i++){ if(i != currentCombo){ String prevDest = destinationDocNameCombo.elementAt(i).getText(); if(currentDest.equals(prevDest)){ canSel = false; } } } return canSel; } public Vector<DestinationInfo> getDestinationInfos() { return destinationInfos; } public void setDestinationInfos(Vector<DestinationInfo> destinationInfos) { this.destinationInfos = destinationInfos; } public DestinationInfo getDestinationInfo() { return destinationInfo; } public void setDestinationInfo(DestinationInfo destinationInfo) { this.destinationInfo = destinationInfo; } public Vector<Combo> getDestinationInputParam() { return destinationInputParam; } public Vector<Combo> getDestinationDocNameCombo() { return destinationDocNameCombo; } public int getDestinCounter() { return destinCounter; } public void setDestinCounter(int destinCounter) { this.destinCounter = destinCounter; } public Vector<Text> getDestinationInputParamDefaultValue() { return destinationInputParamDefaultValue; } public void setDestinationInputParamDefaultValue( Vector<Text> destinationInputParamDefaultValue) { this.destinationInputParamDefaultValue = destinationInputParamDefaultValue; } public HashMap<String, String> getDocInfoUtil() { return docInfoUtil; } public void setDocInfoUtil(HashMap<String, String> docInfoUtil) { this.docInfoUtil = docInfoUtil; } }