/*
* Copyright 2016 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.examples.client.wizard.pages.project;
import java.util.List;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Node;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Composite;
import org.jboss.errai.common.client.dom.Anchor;
import org.jboss.errai.common.client.dom.Button;
import org.jboss.errai.common.client.dom.TextInput;
import org.jboss.errai.ioc.client.api.ManagedInstance;
import org.jboss.errai.ui.shared.api.annotations.DataField;
import org.jboss.errai.ui.shared.api.annotations.EventHandler;
import org.jboss.errai.ui.shared.api.annotations.Templated;
import org.kie.workbench.common.screens.examples.model.ExampleProject;
@Dependent
@Templated
public class ProjectPageViewImpl extends Composite implements ProjectPageView {
@DataField
Element projects = DOM.createDiv();
@DataField("project-description")
Element projectDescription = DOM.createDiv();
@Inject
@DataField("tagInput")
TextInput tagInput;
@Inject
@DataField("searchButton")
Button searchButton;
@DataField("tagList")
Element tagList = DOM.createElement( "ul" );
@Inject
@DataField("clear")
Anchor clear;
@Inject
private ManagedInstance<ProjectItemView> projectItemViewInstance;
@Inject
private ManagedInstance<TagItemView> tagItemViewInstance;
private ProjectPage presenter;
@Override
public void init( final ProjectPage presenter ) {
this.presenter = presenter;
}
@Override
public void initialise() {
destroy();
}
@Override
public void setProjectsInRepository( final List<ExampleProject> projects ) {
this.projects.removeAllChildren();
for ( ExampleProject project : projects ) {
final ProjectItemView w = makeProjectWidget( project );
this.projects.appendChild( w.asWidget().getElement() );
}
}
@Override
public void destroy() {
projects.removeAllChildren();
tagInput.setValue( "" );
tagList.removeAllChildren();
}
private ProjectItemView makeProjectWidget( final ExampleProject project ) {
final ProjectItemView projectItemView = projectItemViewInstance.get();
projectItemView.setProject( project, presenter.isProjectSelected( project ) );
projectItemView.addValueChangeHandler( new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange( final ValueChangeEvent<Boolean> event ) {
final boolean selected = event.getValue();
if ( selected ) {
presenter.addProject( project );
} else {
presenter.removeProject( project );
}
}
} );
projectItemView.addMouseOverHandler( h -> {
final SafeHtmlBuilder shb = new SafeHtmlBuilder();
shb.appendEscaped( project.getDescription() );
projectDescription.setInnerSafeHtml( shb.toSafeHtml() );
} );
projectItemView.addMouseOutHandler( h -> {
projectDescription.setInnerSafeHtml( new SafeHtmlBuilder().toSafeHtml() );
} );
return projectItemView;
}
@EventHandler("searchButton")
private void onSearchButtonClicked( ClickEvent event ) {
createAndAddTag( false );
}
@EventHandler("tagInput")
private void onTagInputEnterPressed( KeyDownEvent event ) {
if ( event.getNativeKeyCode() == KeyCodes.KEY_ENTER ) {
createAndAddTag( true );
}
}
private void createAndAddTag( boolean setTagInputFocus ) {
if ( tagInput.getValue() != null && !tagInput.getValue().isEmpty() ) {
TagItemView tag = tagItemViewInstance.get();
tag.setName( tagInput.getValue() );
Node tagNode = tag.asWidget().getElement();
tag.addClickHandler( c -> {
tagList.removeChild( tagNode );
presenter.removeTag( tag.getName() );
} );
tagList.appendChild( tagNode );
presenter.addTag( tagInput.getValue() );
tagInput.setValue( "" );
if ( setTagInputFocus ) {
tagInput.focus();
}
}
}
@EventHandler("clear")
private void onClearClicked( ClickEvent event ) {
tagList.removeAllChildren();
presenter.removeAllTags();
}
}