/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.screens.datamodeller.client.widgets.advanceddomain.annotationwizard;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.common.client.api.ErrorCallback;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.kie.workbench.common.screens.datamodeller.client.resources.i18n.Constants;
import org.kie.workbench.common.services.datamodeller.core.Annotation;
import org.kie.workbench.common.services.datamodeller.core.AnnotationDefinition;
import org.kie.workbench.common.services.datamodeller.core.AnnotationValuePairDefinition;
import org.kie.workbench.common.services.datamodeller.core.ElementType;
import org.kie.workbench.common.services.datamodeller.core.impl.AnnotationImpl;
import org.kie.workbench.common.services.shared.project.KieProject;
import org.uberfire.client.callbacks.Callback;
import org.uberfire.ext.widgets.core.client.wizards.AbstractWizard;
import org.uberfire.ext.widgets.core.client.wizards.WizardPage;
@Dependent
public class CreateAnnotationWizard extends AbstractWizard {
private List<WizardPage> pages = new ArrayList<WizardPage>();
private SearchAnnotationPage searchAnnotationPage;
private SyncBeanManager iocManager;
private Callback<Annotation> onCloseCallback;
private KieProject project;
private AnnotationDefinition annotationDefinition = null;
private ElementType target = ElementType.FIELD;
@Inject
public CreateAnnotationWizard( SearchAnnotationPage searchAnnotationPage,
SyncBeanManager iocManager ) {
this.searchAnnotationPage = searchAnnotationPage;
this.iocManager = iocManager;
}
@PostConstruct
protected void init() {
pages.add( searchAnnotationPage );
searchAnnotationPage.addSearchAnnotationHandler( new SearchAnnotationPageView.SearchAnnotationHandler() {
@Override
public void onSearchClassChanged() {
doOnSearchClassChanged();
}
@Override
public void onAnnotationDefinitionChange( AnnotationDefinition annotationDefinition ) {
updateValuePairPages( annotationDefinition );
}
} );
}
public void init( KieProject project, ElementType target ) {
this.project = project;
this.target = target;
searchAnnotationPage.init( project, target );
clearCurrentValuePairEditorPages();
}
@Override
public List<WizardPage> getPages() {
return pages;
}
@Override
public Widget getPageWidget( int pageNumber ) {
return pages.get( pageNumber ).asWidget();
}
@Override
public String getTitle() {
return Constants.INSTANCE.advanced_domain_wizard_title();
}
@Override
public int getPreferredHeight() {
return 350;
}
@Override
public int getPreferredWidth() {
return 700;
}
@Override
public void isComplete( final Callback<Boolean> callback ) {
callback.callback( true );
//only when all pages are complete we can say the wizard is complete.
for ( WizardPage page : this.pages ) {
page.isComplete( new Callback<Boolean>() {
@Override
public void callback( final Boolean result ) {
if ( Boolean.FALSE.equals( result ) ) {
callback.callback( false );
}
}
} );
}
}
public void onCloseCallback( final Callback<Annotation> callback ) {
this.onCloseCallback = callback;
}
@Override
public void complete() {
super.complete();
doComplete();
}
@Override
public void close() {
super.close();
clearCurrentValuePairEditorPages();
invokeOnCloseCallback( null );
}
private void doComplete() {
Annotation annotation = null;
if ( annotationDefinition != null ) {
annotation = new AnnotationImpl( annotationDefinition );
if ( !annotationDefinition.isMarker() ) {
for ( ValuePairEditorPage valuePairEditor : filterValuePairEditorPages() ) {
if ( valuePairEditor.getCurrentValue() != null ) {
annotation.setValue( valuePairEditor.getValuePairDefinition().getName(), valuePairEditor.getCurrentValue() );
}
}
}
}
clearCurrentValuePairEditorPages();
invokeOnCloseCallback( annotation );
}
private void doOnSearchClassChanged() {
if ( annotationDefinition != null || pages.size() > 1 ) {
annotationDefinition = null;
clearCurrentValuePairEditorPages();
super.start();
Scheduler.get().scheduleDeferred( new Command() {
@Override
public void execute() {
searchAnnotationPage.requestFocus();
}
} );
}
}
private void updateValuePairPages( AnnotationDefinition annotationDefinition ) {
clearCurrentValuePairEditorPages();
pages.clear();
pages.add( searchAnnotationPage );
this.annotationDefinition = annotationDefinition;
if ( annotationDefinition != null ) {
for ( AnnotationValuePairDefinition valuePairDefinition : annotationDefinition.getValuePairs() ) {
pages.add( createValuePairEditorPage( valuePairDefinition ) );
}
}
super.start();
}
private ValuePairEditorPage createValuePairEditorPage( AnnotationValuePairDefinition valuePairDefinition ) {
final ValuePairEditorPage valuePairEditorPage = iocManager.lookupBean( ValuePairEditorPage.class ).getInstance();
valuePairEditorPage.init( annotationDefinition, valuePairDefinition, target, project );
return valuePairEditorPage;
}
private void clearCurrentValuePairEditorPages() {
List<ValuePairEditorPage> editorPages = filterValuePairEditorPages();
int valuePairEditors = editorPages.size();
for ( WizardPage page : editorPages ) {
pages.remove( page );
}
for ( int i = 0; i < valuePairEditors; i++ ) {
ValuePairEditorPage valuePairEditorPage = editorPages.remove( 0 );
iocManager.destroyBean( valuePairEditorPage );
}
}
private void invokeOnCloseCallback( Annotation annotation ) {
if ( onCloseCallback != null ) {
onCloseCallback.callback( annotation );
}
}
private List<ValuePairEditorPage> filterValuePairEditorPages() {
List<ValuePairEditorPage> result = new ArrayList<ValuePairEditorPage>( pages.size() );
for ( WizardPage page : pages ) {
if ( page instanceof ValuePairEditorPage ) {
result.add( ( ValuePairEditorPage ) page );
}
}
return result;
}
public static class CreateAnnotationWizardErrorCallback implements ErrorCallback<Message> {
public CreateAnnotationWizardErrorCallback( ) {
}
@Override
public boolean error( Message message, Throwable throwable ) {
Window.alert( "Unexpected error encountered : " + throwable.getMessage() );
return false;
}
}
}