/****************************************************************************** * Copyright (c) 2008 g-Eclipse consortium * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Initial development of the original code was made for * project g-Eclipse founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributor(s): * IT Research Division, NEC Laboratories Europe, NEC Europe Ltd. (http://www.it.neclab.eu) * - Harald Kornmayer (harald.kornmayer@it.neclab.eu) * *****************************************************************************/ package eu.geclipse.core.sla.ui.wizards; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; 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.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.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.core.sla.Extensions; import eu.geclipse.core.sla.ISLAService; import eu.geclipse.core.sla.model.SimpleTerm; import eu.geclipse.core.sla.model.SimpleTermModel; import eu.geclipse.core.sla.model.SltContainer; import eu.geclipse.core.sla.ui.dialogs.SlaTermInputDialog; import eu.geclipse.ui.dialogs.ProblemDialog; public class SLAQueryAddTermsPage extends WizardPage implements Listener { private final String ServiceTypes[] = { "http://www.it.neclab.eu/sla/service/Sudoku", "http://www.it.neclab.eu/sla/service/WebMail", "http://www.it.neclab.eu/sla/service/CardReader", "http://www.it.neclab.eu/sla/service/Wiki", "http://www.it.neclab.eu/sla/service/BigBangSimulation"}; //$NON-NLS-5$ SimpleTermModel model = new SimpleTermModel(); // widgets on this page Combo serviceType; List termList; ListViewer termViewer; Button addButton; Button editButton; Button removeButton; Button demoButton; Text termText; /** * Constructor for PlanePage. */ protected SLAQueryAddTermsPage( String pageName ) { super( pageName ); setTitle( "SLA Query terms" ); setDescription( "Specify the SLA term requirments to the service" ); } /** * @see IDialogPage#createControl(Composite) */ public void createControl( final Composite parent ) { // create the composite to hold the widgets GridData gData; Composite composite = new Composite( parent, SWT.NONE ); // create the desired layout for this wizard page GridLayout gl = new GridLayout(); int ncol = 3; gl.numColumns = ncol; composite.setLayout( gl ); Label serviceLabel = new Label( composite, SWT.NONE ); gData = new GridData( GridData.HORIZONTAL_ALIGN_END ); serviceLabel.setText( "Service Type" ); this.serviceType = new Combo( composite, SWT.NONE ); gData = new GridData( GridData.BEGINNING | GridData.FILL_HORIZONTAL ); gData.horizontalSpan = 2; this.serviceType.setLayoutData( gData ); this.serviceType.setItems( this.ServiceTypes ); this.serviceType.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { model.setServiceType( serviceType.getText() ); } } ); // create the widgets. If the appearance of the widget is different from // the // default, // create a GridData for it to set the alignment and define how much // space // it will occupy this.termList = new List( composite, SWT.BORDER | SWT.READ_ONLY ); gData = new GridData( GridData.FILL_BOTH ); this.termList.setLayoutData( gData ); this.termViewer = new ListViewer( this.termList ); this.termViewer.setContentProvider( new TermContentProvider() ); this.termViewer.setLabelProvider( new TermLabelProvider() ); this.termViewer.setInput( this.model ); this.termViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { IStructuredSelection selection = ( IStructuredSelection )event.getSelection(); SimpleTerm term = ( SimpleTerm )selection.getFirstElement(); termText.setText( term.getText() ); updateButtons(); } } ); Composite buttonComposite = new Composite( composite, SWT.NULL ); gData = new GridData( GridData.VERTICAL_ALIGN_BEGINNING ); gData.horizontalSpan = 1; buttonComposite.setLayoutData( gData ); GridLayout gLayout = new GridLayout( 1, false ); gLayout.marginHeight = 0; gLayout.marginWidth = 0; buttonComposite.setLayout( gLayout ); // add button this.addButton = new Button( buttonComposite, SWT.PUSH ); this.addButton.setText( "Add" ); gData = new GridData( GridData.FILL_HORIZONTAL ); this.addButton.setLayoutData( gData ); this.addButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { addTerm(); } } ); // edit button this.editButton = new Button( buttonComposite, SWT.PUSH ); this.editButton.setText( "Edit" ); gData = new GridData( GridData.FILL_HORIZONTAL ); this.editButton.setLayoutData( gData ); this.editButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( final SelectionEvent e ) { editTerm(); } } ); // remove button this.removeButton = new Button( buttonComposite, SWT.PUSH ); this.removeButton.setText( "Remove" ); gData = new GridData( GridData.FILL_HORIZONTAL ); this.removeButton.setLayoutData( gData ); this.removeButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { removeTerm(); } } ); // demo button this.demoButton = new Button( buttonComposite, SWT.PUSH ); this.demoButton.setText( "Demo" ); gData = new GridData( GridData.FILL_HORIZONTAL ); this.demoButton.setLayoutData( gData ); this.demoButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { demoTerms(); } } ); // add the text field to show the term request selected termText = new Text( composite, SWT.BORDER | SWT.MULTI ); gData = new GridData( GridData.FILL_BOTH ); termText.setLayoutData( gData ); termText.setEditable( false ); // set the composite as the control for this page setControl( composite ); setPageComplete( true ); this.updateButtons(); } private void updateButtons() { IStructuredSelection selection = ( IStructuredSelection )this.termViewer.getSelection(); Object element = selection.getFirstElement(); if( element == null ) { this.termText.setText( "" ); this.editButton.setEnabled( false ); this.removeButton.setEnabled( false ); } else { this.editButton.setEnabled( true ); this.removeButton.setEnabled( true ); } } public boolean canFlipToNextPage() { // no next page for this path through the wizard return true; } /* * Process the events: when the user has entered all information the wizard * can be finished */ public void handleEvent( Event e ) { } @Override public IWizardPage getNextPage() { try { ISLAService service = Extensions.getSlaServiceImpl(); // here we transform the Terms to the registration schema. String requirements = service.getRequirements( this.model ); Object[] queryResult = service.queryRegistry( requirements ); for( int i = 0; i < queryResult.length; i++ ) { ( ( SLAQueryWizard )this.getWizard() ).getSltModel() .addSlt( ( SltContainer )queryResult[ i ] ); } } catch( ProblemException e ) { ProblemDialog.openProblem( this.getShell(), "SLA service missing", "No implementation for ISLAService found", e ); this.getContainer().getShell().close(); } SLAQuerySLTselectionPage page = ( SLAQuerySLTselectionPage )this.getWizard() .getPage( "Select a SLT" ); page.onEnterPage(); return page; } void onEnterPage() { // Gets the model System.out.println( "load the data from model if neccessary" ); } private void addTerm() { SlaTermInputDialog dia1 = new SlaTermInputDialog( getShell(), null ); if( dia1.open() == Window.OK ) { this.model.addTerm( dia1.getValue() ); } this.termViewer.setInput( this.model ); updateButtons(); } private void editTerm() { IStructuredSelection selection = ( IStructuredSelection )this.termViewer.getSelection(); SimpleTerm element = ( SimpleTerm )selection.getFirstElement(); SlaTermInputDialog dia1 = new SlaTermInputDialog( getShell(), element ); if( dia1.open() == Window.OK ) { // and so??? } this.termViewer.setInput( this.model ); updateButtons(); } private void removeTerm() { IStructuredSelection selection = ( IStructuredSelection )this.termViewer.getSelection(); SimpleTerm element = ( SimpleTerm )selection.getFirstElement(); this.model.removeTerm( element.getName() ); this.termViewer.setInput( this.model ); this.updateButtons(); } protected void demoTerms() { this.model.addTerm( new SimpleTerm( "NumberAccounts", //$NON-NLS-1$ "http://www.it.neclab.eu/sla/terms/webmail/MaxNumAccounts", //$NON-NLS-1$ "integer", "100", "<=", "", "" ) ); this.model.addTerm( new SimpleTerm( "Availability", "http://www.it.neclab.eu/sla/terms/service/Availability", "float", "99.5", "<=", "", "" ) ); this.model.addTerm( new SimpleTerm( "ResponseTime", "http://www.it.neclab.eu/sla/terms/service/ResponseTime", "float", "", "", "50.", "<=" ) ); this.model.addTerm( new SimpleTerm( "Payment", "http://www.it.neclab.eu/sla/terms/service/Payment/Yen", "float", "", "", "1000.", "<" ) ); this.termViewer.setInput( this.model ); this.updateButtons(); } }