/*
* 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.
*
* 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.guvnor.organizationalunit.manager.client.editor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import org.guvnor.organizationalunit.manager.client.resources.i18n.OrganizationalUnitManagerConstants;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.repositories.Repository;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.ListBox;
import org.uberfire.ext.widgets.common.client.common.BusyPopup;
/**
* The Organizational Unit Manager View implementation
*/
@ApplicationScoped
public class OrganizationalUnitManagerViewImpl extends Composite implements OrganizationalUnitManagerView {
interface OrganizationalUnitManagerViewBinder
extends
UiBinder<Widget, OrganizationalUnitManagerViewImpl> {
}
private static final Comparator<OrganizationalUnit> ORGANIZATIONAL_UNIT_COMPARATOR = new Comparator<OrganizationalUnit>() {
@Override
public int compare( final OrganizationalUnit o1,
final OrganizationalUnit o2 ) {
return o1.getName().toLowerCase().compareTo( o2.getName().toLowerCase() );
}
};
private static final Comparator<Repository> REPOSITORY_COMPARATOR = new Comparator<Repository>() {
@Override
public int compare( final Repository o1,
final Repository o2 ) {
return o1.getAlias().toLowerCase().compareTo( o2.getAlias().toLowerCase() );
}
};
private static OrganizationalUnitManagerViewBinder uiBinder = GWT.create( OrganizationalUnitManagerViewBinder.class );
@UiField
ListBox lstOrganizationalUnits;
@UiField
ListBox lstOrganizationalUnitRepositories;
@UiField
ListBox lstAvailableRepositories;
@UiField
Button btnAddOrganizationalUnit;
@UiField
Button btnEditOrganizationalUnit;
@UiField
Button btnDeleteOrganizationalUnit;
@UiField
Button btnAddRepository;
@UiField
Button btnRemoveRepository;
private OrganizationalUnitManagerPresenter presenter;
private List<OrganizationalUnit> sortedOrganizationalUnits = new ArrayList<OrganizationalUnit>();
private List<Repository> sortedOrganizationalUnitRepositories = new ArrayList<Repository>();
private List<Repository> sortedAvailableRepositories = new ArrayList<Repository>();
public OrganizationalUnitManagerViewImpl() {
initWidget( uiBinder.createAndBindUi( this ) );
lstOrganizationalUnits.addChangeHandler( new ChangeHandler() {
@Override
public void onChange( final ChangeEvent event ) {
final int selectedOrganizationalUnitIndex = lstOrganizationalUnits.getSelectedIndex();
if ( selectedOrganizationalUnitIndex == -1 ) {
return;
}
if ( sortedOrganizationalUnits.isEmpty() ) {
return;
}
final OrganizationalUnit selectedOrganizationalUnit = sortedOrganizationalUnits.get( selectedOrganizationalUnitIndex );
presenter.organizationalUnitSelected( selectedOrganizationalUnit );
btnAddRepository.setEnabled( false );
btnRemoveRepository.setEnabled( false );
}
} );
lstOrganizationalUnitRepositories.addChangeHandler( new ChangeHandler() {
@Override
public void onChange( final ChangeEvent event ) {
btnRemoveRepository.setEnabled( true );
}
} );
lstAvailableRepositories.addChangeHandler( new ChangeHandler() {
@Override
public void onChange( final ChangeEvent event ) {
btnAddRepository.setEnabled( true );
}
} );
}
@Override
public void init( final OrganizationalUnitManagerPresenter presenter ) {
this.presenter = presenter;
}
@Override
public void reset() {
sortedOrganizationalUnits.clear();
sortedOrganizationalUnitRepositories.clear();
sortedAvailableRepositories.clear();
lstOrganizationalUnits.clear();
lstOrganizationalUnitRepositories.clear();
lstAvailableRepositories.clear();
btnAddRepository.setEnabled( false );
btnRemoveRepository.setEnabled( false );
btnDeleteOrganizationalUnit.setEnabled( false );
btnEditOrganizationalUnit.setEnabled( false );
}
@Override
public void setOrganizationalUnits( final Collection<OrganizationalUnit> organizationalUnits ) {
final int selectedOrganizationalUnitIndex = lstOrganizationalUnits.getSelectedIndex();
final OrganizationalUnit selectedOrganizationalUnit = ( selectedOrganizationalUnitIndex < 0 ? null : sortedOrganizationalUnits.get( selectedOrganizationalUnitIndex ) );
lstOrganizationalUnits.clear();
sortedOrganizationalUnits.clear();
if ( !( organizationalUnits == null || organizationalUnits.isEmpty() ) ) {
lstOrganizationalUnits.setEnabled( true );
sortedOrganizationalUnits = sortOrganizationalUnits( organizationalUnits );
for ( OrganizationalUnit organizationalUnit : sortedOrganizationalUnits ) {
lstOrganizationalUnits.addItem( getOrganizationalUnitDisplayName( organizationalUnit ) );
}
} else {
lstOrganizationalUnits.setEnabled( false );
lstOrganizationalUnits.addItem( OrganizationalUnitManagerConstants.INSTANCE.NoOrganizationalUnitsDefined() );
}
if ( sortedOrganizationalUnits.contains( selectedOrganizationalUnit ) ) {
lstOrganizationalUnits.setSelectedIndex( sortedOrganizationalUnits.indexOf( selectedOrganizationalUnit ) );
presenter.organizationalUnitSelected( selectedOrganizationalUnit );
} else {
lstOrganizationalUnitRepositories.clear();
lstOrganizationalUnitRepositories.setEnabled( false );
lstOrganizationalUnitRepositories.addItem( OrganizationalUnitManagerConstants.INSTANCE.NoOrganizationalUnitSelected() );
lstAvailableRepositories.clear();
lstAvailableRepositories.setEnabled( false );
lstAvailableRepositories.addItem( OrganizationalUnitManagerConstants.INSTANCE.NoOrganizationalUnitSelected() );
btnDeleteOrganizationalUnit.setEnabled( false );
btnEditOrganizationalUnit.setEnabled( false );
}
}
private String getOrganizationalUnitDisplayName( final OrganizationalUnit organizationalUnit ) {
final StringBuilder sb = new StringBuilder( organizationalUnit.getName() );
if ( !( organizationalUnit.getOwner() == null || organizationalUnit.getOwner().isEmpty() ) ) {
sb.append( " : " ).append( organizationalUnit.getOwner() );
}
return sb.toString();
}
private List<OrganizationalUnit> sortOrganizationalUnits( final Collection<OrganizationalUnit> organizationalUnits ) {
final List<OrganizationalUnit> sortedOrganizationalUnits = new ArrayList<OrganizationalUnit>();
sortedOrganizationalUnits.addAll( organizationalUnits );
Collections.sort( sortedOrganizationalUnits,
ORGANIZATIONAL_UNIT_COMPARATOR );
return sortedOrganizationalUnits;
}
@Override
public void setOrganizationalUnitRepositories( final Collection<Repository> repositories,
final Collection<Repository> availableRepositories ) {
lstOrganizationalUnitRepositories.clear();
sortedOrganizationalUnitRepositories.clear();
if ( !( repositories == null || repositories.isEmpty() ) ) {
lstOrganizationalUnitRepositories.setEnabled( true );
sortedOrganizationalUnitRepositories = sortRepositories( repositories );
for ( Repository repository : sortedOrganizationalUnitRepositories ) {
lstOrganizationalUnitRepositories.addItem( repository.getAlias() );
}
} else {
lstOrganizationalUnitRepositories.setEnabled( false );
lstOrganizationalUnitRepositories.addItem( OrganizationalUnitManagerConstants.INSTANCE.NoRepositoriesDefined() );
}
lstAvailableRepositories.clear();
sortedAvailableRepositories.clear();
sortedAvailableRepositories.addAll( availableRepositories );
sortedAvailableRepositories.removeAll( sortedOrganizationalUnitRepositories );
if ( !( sortedAvailableRepositories == null || sortedAvailableRepositories.isEmpty() ) ) {
lstAvailableRepositories.setEnabled( true );
for ( Repository repo : sortedAvailableRepositories ) {
lstAvailableRepositories.addItem( repo.getAlias() );
}
} else {
lstAvailableRepositories.setEnabled( false );
lstAvailableRepositories.addItem( OrganizationalUnitManagerConstants.INSTANCE.NoRepositoriesAvailable() );
}
}
private List<Repository> sortRepositories( final Collection<Repository> repositories ) {
final List<Repository> sortedRepositories = new ArrayList<Repository>();
sortedRepositories.addAll( repositories );
Collections.sort( sortedRepositories,
REPOSITORY_COMPARATOR );
return sortedRepositories;
}
@Override
public void addOrganizationalUnit( final OrganizationalUnit newOrganizationalUnit ) {
final Collection<OrganizationalUnit> existingOrganizationalUnits = new ArrayList<OrganizationalUnit>( sortedOrganizationalUnits );
existingOrganizationalUnits.add( newOrganizationalUnit );
setOrganizationalUnits( existingOrganizationalUnits );
}
@Override
public void deleteOrganizationalUnit( final OrganizationalUnit organizationalUnit ) {
//Deselect selected Organizational Units as we've deleted it. This
//forces the view to correctly update to show nothing is selected!
for ( int i = 0; i < lstOrganizationalUnits.getItemCount(); i++ ) {
lstOrganizationalUnits.setItemSelected( i,
false );
}
final Collection<OrganizationalUnit> existingOrganizationalUnits = new ArrayList<OrganizationalUnit>( sortedOrganizationalUnits );
existingOrganizationalUnits.remove( organizationalUnit );
setOrganizationalUnits( existingOrganizationalUnits );
}
@Override
public void showBusyIndicator( final String message ) {
BusyPopup.showMessage( message );
}
@Override
public void hideBusyIndicator() {
BusyPopup.close();
}
@Override
public void setAddOrganizationalUnitEnabled(boolean enabled) {
btnAddOrganizationalUnit.setEnabled(enabled);
}
@Override
public void setEditOrganizationalUnitEnabled(boolean enabled) {
btnEditOrganizationalUnit.setEnabled(enabled);
btnAddRepository.setEnabled(enabled);
btnRemoveRepository.setEnabled(enabled);
}
@Override
public void setDeleteOrganizationalUnitEnabled(boolean enabled) {
btnDeleteOrganizationalUnit.setEnabled(enabled);
}
@UiHandler("btnAddOrganizationalUnit")
public void onClickAddOrganizationalUnitButton( final ClickEvent event ) {
presenter.addNewOrganizationalUnit();
}
@UiHandler("btnDeleteOrganizationalUnit")
public void onClickDeleteOrganizationalUnitButton( final ClickEvent event ) {
final int selectedOrganizationalUnitIndex = lstOrganizationalUnits.getSelectedIndex();
if ( selectedOrganizationalUnitIndex < 0 ) {
return;
}
final OrganizationalUnit organizationalUnit = sortedOrganizationalUnits.get( selectedOrganizationalUnitIndex );
if ( Window.confirm( OrganizationalUnitManagerConstants.INSTANCE.ConfirmOrganizationalUnitDeletion0( organizationalUnit.getName() ) ) ) {
presenter.deleteOrganizationalUnit( organizationalUnit );
}
}
@UiHandler("btnEditOrganizationalUnit")
public void onClickEditOrganizationalUnitButton( final ClickEvent event ) {
final int selectedOrganizationalUnitIndex = lstOrganizationalUnits.getSelectedIndex();
if ( selectedOrganizationalUnitIndex < 0 ) {
return;
}
final OrganizationalUnit organizationalUnit = sortedOrganizationalUnits.get( selectedOrganizationalUnitIndex );
presenter.editOrganizationalUnit( organizationalUnit );
}
@UiHandler("btnAddRepository")
public void onClickAddRepositoryButton( final ClickEvent event ) {
final int selectedOrganizationalUnitIndex = lstOrganizationalUnits.getSelectedIndex();
final OrganizationalUnit selectedOrganizationalUnit = ( selectedOrganizationalUnitIndex < 0 ? null : sortedOrganizationalUnits.get( selectedOrganizationalUnitIndex ) );
if ( selectedOrganizationalUnit == null ) {
return;
}
final int selectedRepositoryIndex = lstAvailableRepositories.getSelectedIndex();
final Repository selectedRepository = ( selectedRepositoryIndex < 0 ? null : sortedAvailableRepositories.get( selectedRepositoryIndex ) );
if ( selectedRepository == null ) {
return;
}
presenter.addOrganizationalUnitRepository( selectedOrganizationalUnit,
selectedRepository );
}
@UiHandler("btnRemoveRepository")
public void onClickRemoveRepositoryButton( final ClickEvent event ) {
final int selectedOrganizationalUnitIndex = lstOrganizationalUnits.getSelectedIndex();
final OrganizationalUnit selectedOrganizationalUnit = ( selectedOrganizationalUnitIndex < 0 ? null : sortedOrganizationalUnits.get( selectedOrganizationalUnitIndex ) );
if ( selectedOrganizationalUnit == null ) {
return;
}
final int selectedRepositoryIndex = lstOrganizationalUnitRepositories.getSelectedIndex();
final Repository selectedRepository = ( selectedRepositoryIndex < 0 ? null : sortedOrganizationalUnitRepositories.get( selectedRepositoryIndex ) );
if ( selectedRepository == null ) {
return;
}
presenter.removeOrganizationalUnitRepository( selectedOrganizationalUnit,
selectedRepository );
}
}