/**
* Copyright (c) 2014 - 2017 Frank Appel
* 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
*
* Contributors:
* Frank Appel - initial API and implementation
*/
package com.codeaffine.eclipse.swt.widget.navigationbar;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import com.codeaffine.util.Disposable;
public class NavigationBarFactory implements Disposable {
private final ActionControlImageAdapter imageProvider;
private final List<NavigationItemModel> models;
private final List<NavigationItem> items;
public NavigationBarFactory( ImageProvider imageProvider ) {
this.imageProvider = new ActionControlImageAdapter( imageProvider );
this.models = new ArrayList<>();
this.items = new ArrayList<>();
}
public NavigationBarFactory with( NavigationItemModel model, NavigationItemController controller, String iconName ) {
models.add( model );
items.add( new NavigationItem( imageProvider, model, controller, iconName ) );
return this;
}
public Control create( Composite parent ) {
Composite result = createComposite( parent );
createItems( result );
registerLayoutTrigger( result );
return result;
}
@Override
public void dispose() {
imageProvider.dispose();
}
ImageProvider getImageProvider() {
return imageProvider;
}
private static Composite createComposite( Composite parent ) {
Composite result = new Composite( parent, SWT.NONE );
RowLayout layout = new RowLayout();
layout.marginLeft = 0;
layout.marginTop = 0;
layout.marginRight = 0;
layout.marginBottom = 0;
layout.center = true;
layout.wrap = false;
result.setLayout( layout );
return result;
}
private void createItems( Composite parent ) {
items.forEach( item -> createItem( parent, item ) );
items.clear();
}
private void createItem( Composite parent, NavigationItem item ) {
item.createControl( parent );
if( !isLastItem( item ) ) {
createSeparator( parent );
}
}
private boolean isLastItem( NavigationItem item ) {
return items.indexOf( item ) == items.size() - 1;
}
private static void createSeparator( Composite navigation ) {
Label separator = new Label( navigation, SWT.NONE );
separator.setText( " > " );
}
private void registerLayoutTrigger( Composite control ) {
models.forEach( register( createLayoutTrigger( control ) ) );
models.clear();
}
private static Consumer<? super NavigationItemModel> register( Runnable layoutTrigger ) {
return model -> model.addSelectionChangedListener( layoutTrigger );
}
private static Runnable createLayoutTrigger( Composite control ) {
return () -> control.getDisplay().syncExec( () -> control.layout() );
}
}