/******************************************************************************* * Copyright (c) 2014 EclipseSource and others. * 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: * EclipseSource - initial API and implementation ******************************************************************************/ package com.eclipsesource.tabris.passepartout.internal; import static com.eclipsesource.tabris.passepartout.internal.Clauses.whenNull; import static com.eclipsesource.tabris.passepartout.internal.UIEnvironmentFactory.createEnvironment; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Widget; import com.eclipsesource.tabris.passepartout.Instruction; import com.eclipsesource.tabris.passepartout.Resource; import com.eclipsesource.tabris.passepartout.Rule; import com.eclipsesource.tabris.passepartout.UIEnvironment; import com.eclipsesource.tabris.passepartout.internal.instruction.BackgroundImageInstruction; import com.eclipsesource.tabris.passepartout.internal.instruction.BackgroundInstruction; import com.eclipsesource.tabris.passepartout.internal.instruction.FontInstruction; import com.eclipsesource.tabris.passepartout.internal.instruction.ForegroundInstruction; import com.eclipsesource.tabris.passepartout.internal.instruction.ImageInstruction; public class ResourceImpl implements Resource, Listener { private final List<Rule> rules; private Widget[] widgets; public ResourceImpl( Rule... rules ) { whenNull( rules ).throwIllegalArgument( "Rules must not be null" ); this.rules = new ArrayList<Rule>(); for( Rule rule : rules ) { whenNull( rule ).throwIllegalArgument( "Rule must not be null" ); this.rules.add( rule ); } } @Override public void bindTo( Widget... widgets ) { whenNull( widgets ).throwIllegalArgument( "Widgets must not be null" ); this.widgets = widgets; addResizeListener(); apply(); } private void addResizeListener() { Widget widget = widgets[ 0 ]; whenNull( widget ).throwIllegalArgument( "Widget must not be null" ); if( widget instanceof Control ) { Control control = ( Control )widget; if( control.getParent() != null ) { control.getParent().addListener( SWT.Resize, this ); } else { control.getShell().addListener( SWT.Resize, this ); } } else { Shell activeShell = widget.getDisplay().getShells()[ 0 ]; activeShell.addListener( SWT.Resize, this ); } } @Override public void handleEvent( Event event ) { apply(); } private void apply() { for( Widget widget : widgets ) { whenNull( widget ).throwIllegalArgument( "Widget must not be null" ); if( !widget.isDisposed() ) { UIEnvironment environment = createEnvironment( widget ); InstructionExtractor extractor = new InstructionExtractor( environment ); List<Instruction> instructions = extractor.extract( rules ); applyInstructions( widget, instructions ); } } } private void applyInstructions( Widget widget, List<Instruction> instructions ) { for( Instruction instruction : instructions ) { if( widget instanceof Control ) { applyInstruction( ( Control )widget, instruction ); } else if( widget instanceof Item ) { applyInstruction( ( Item )widget, instruction ); } } } private void applyInstruction( Control control, Instruction instruction ) { if( instruction instanceof FontInstruction ) { control.setFont( ( ( FontInstruction )instruction ).getFont() ); } else if( instruction instanceof ForegroundInstruction ) { control.setForeground( ( ( ForegroundInstruction )instruction ).getColor() ); } else if( instruction instanceof BackgroundInstruction ) { control.setBackground( ( ( BackgroundInstruction )instruction ).getColor() ); } else if( instruction instanceof ImageInstruction ) { applyImageOnControl( control, ( ( ImageInstruction )instruction ).getImage() ); } else if( instruction instanceof BackgroundImageInstruction ) { control.setBackgroundImage( ( ( BackgroundImageInstruction )instruction ).getImage() ); } } private void applyImageOnControl( Control control, Image image ) { if( control instanceof Label ) { ( ( Label )control ).setImage( image ); } else if( control instanceof Button ) { ( ( Button )control ).setImage( image ); } } private void applyInstruction( Item item, Instruction instruction ) { if( instruction instanceof ImageInstruction ) { item.setImage( ( ( ImageInstruction )instruction ).getImage() ); } } }