/******************************************************************************* * Copyright (c) 2017 itemis AG 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: * Matthias Wienand (itemis AG) - initial API and implementation * *******************************************************************************/ package org.eclipse.gef.mvc.tests.fx; import static org.junit.Assert.assertEquals; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.gef.common.adapt.AdapterKey; import org.eclipse.gef.geometry.planar.Dimension; import org.eclipse.gef.mvc.fx.MvcFxModule; import org.eclipse.gef.mvc.fx.domain.IDomain; import org.eclipse.gef.mvc.fx.parts.AbstractContentPart; import org.eclipse.gef.mvc.fx.parts.IContentPart; import org.eclipse.gef.mvc.fx.parts.IContentPartFactory; import org.eclipse.gef.mvc.fx.parts.IResizableContentPart; import org.eclipse.gef.mvc.fx.policies.ResizePolicy; import org.eclipse.gef.mvc.fx.viewer.IViewer; import org.eclipse.gef.mvc.tests.fx.rules.FXApplicationThreadRule; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.multibindings.MapBinder; import javafx.embed.swing.JFXPanel; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.layout.Region; public class ResizePolicyTests { static class DimensionPart extends AbstractContentPart<Region> implements IResizableContentPart<Region> { private Dimension size = new Dimension(0, 0); @Override protected Region doCreateVisual() { return new Region() { @Override protected double computeMinHeight(double width) { return 35; } @Override protected double computeMinWidth(double height) { return 45; } }; } @Override protected SetMultimap<? extends Object, String> doGetContentAnchorages() { return HashMultimap.create(); } @Override protected List<? extends Object> doGetContentChildren() { return Collections.emptyList(); } @Override protected void doRefreshVisual(Region visual) { visual.resize(size.width, size.height); } @Override public Dimension getContent() { return size; } @Override public Dimension getContentSize() { return size.getCopy(); } @Override public void setContentSize(Dimension totalSize) { size.setSize(totalSize); } } static class ResizePolicyTestsContentPartFactory implements IContentPartFactory { @Inject private Injector injector; @Override public IContentPart<? extends Node> createContentPart(Object content, Map<Object, Object> contextMap) { if (content instanceof Dimension) { return injector.getInstance(DimensionPart.class); } else { throw new IllegalArgumentException(content.getClass().toString()); } } } private ResizePolicy resizePolicy; @Inject private IDomain domain; /** * Ensure all tests are executed on the JavaFX application thread (and the * JavaFX toolkit is properly initialized). */ @Rule public FXApplicationThreadRule fxApplicationThreadRule = new FXApplicationThreadRule(); public ResizePolicy createResizePolicy() { // create injector Injector injector = Guice.createInjector(new MvcFxModule() { @Override protected void bindAbstractContentPartAdapters(MapBinder<AdapterKey<?>, Object> adapterMapBinder) { super.bindAbstractContentPartAdapters(adapterMapBinder); adapterMapBinder.addBinding(AdapterKey.defaultRole()).to(ResizePolicy.class); } protected void bindIContentPartFactory() { binder().bind(IContentPartFactory.class).to(ResizePolicyTestsContentPartFactory.class); } @Override protected void configure() { super.configure(); bindIContentPartFactory(); } }); injector.injectMembers(this); // get viewer IViewer viewer = domain.getAdapter(AdapterKey.get(IViewer.class, IDomain.CONTENT_VIEWER_ROLE)); // hook viewer to scene Scene scene = new Scene(viewer.getCanvas(), 100, 100); JFXPanel panel = new JFXPanel(); panel.setScene(scene); // set viewer contents Dimension content = new Dimension(0, 0); viewer.getContents().setAll(Collections.singletonList(content)); // activate domain domain.activate(); // get content part for the content object IContentPart<? extends Node> contentPart = viewer.getContentPartMap().get(content); // get transform policy for that part return contentPart.getAdapter(ResizePolicy.class); } @Before public void setUp() { resizePolicy = createResizePolicy(); resizePolicy.init(); } @Test public void test_minimumSize_Region() { /* * This test ensures that Bugzilla #512620 is not re-introduced by a * later change. */ // check resize policy is reset assertEquals(0d, resizePolicy.getDeltaWidth(), 0.01); assertEquals(0d, resizePolicy.getDeltaHeight(), 0.01); // set region's min-size to USE_COMPUTED_SIZE Region region = (Region) resizePolicy.getHost().getVisual(); region.setMinSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); assertEquals(Region.USE_COMPUTED_SIZE, region.getMinWidth(), 0.01); assertEquals(Region.USE_COMPUTED_SIZE, region.getMinHeight(), 0.01); // resize below minimum size using ResizePolicy resizePolicy.resize(region.minWidth(-1) - 5, region.minHeight(-1) - 5); // ensure minimum size is respected assertEquals(region.minWidth(-1), resizePolicy.getDeltaWidth(), 0.01); assertEquals(region.minHeight(-1), resizePolicy.getDeltaHeight(), 0.01); } }