/* * 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.uberfire.wbtest.client.panels.docking; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.inject.Named; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; import org.slf4j.Logger; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.util.Layouts; import org.uberfire.client.workbench.PanelManager; import org.uberfire.client.workbench.panels.impl.SimpleWorkbenchPanelPresenter; import org.uberfire.mvp.PlaceRequest; import org.uberfire.mvp.impl.DefaultPlaceRequest; import org.uberfire.wbtest.client.api.AbstractTestScreenActivity; import org.uberfire.workbench.model.CompassPosition; import org.uberfire.workbench.model.PanelDefinition; import org.uberfire.workbench.model.PartDefinition; import org.uberfire.workbench.model.impl.PanelDefinitionImpl; @Dependent @Named("org.uberfire.wbtest.client.panels.docking.NestingScreen") public class NestingScreen extends AbstractTestScreenActivity { /** * Gets incremented every time a new instance of this class is created. Tests that want to assert on how many * instances have been created by a specific operation are free to reset this to 0. */ public static int instanceCount; @Inject Logger log; @Inject PlaceManager placeManager; @Inject PanelManager panelManager; Panel panel = new FlowPanel(); Button addNorthPanelButton = new Button("Add North Child"); Button addSouthPanelButton = new Button("Add South Child"); Button addEastPanelButton = new Button("Add East Child"); Button addWestPanelButton = new Button("Add West Child"); Button closeButton = new Button("Close"); Button dumpLayout = new Button("Dump Layout Info"); Map<CompassPosition, Integer> childCounts = new HashMap<CompassPosition, Integer>(); /** * The value of the "place" parameter from the PlaceRequest that launched us. Gets used for building predictable but * unique IDs for each nested panel. */ private String positionTag; @Inject public NestingScreen(PlaceManager placeManager) { super(placeManager); instanceCount++; } @Override public IsWidget getWidget() { return panel; } @PostConstruct private void setup() { addNorthPanelButton.addStyleName("north"); addNorthPanelButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { addNestedPanel(CompassPosition.NORTH); } }); addSouthPanelButton.addStyleName("south"); addSouthPanelButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { addNestedPanel(CompassPosition.SOUTH); } }); addEastPanelButton.addStyleName("east"); addEastPanelButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { addNestedPanel(CompassPosition.EAST); } }); addWestPanelButton.addStyleName("west"); addWestPanelButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { addNestedPanel(CompassPosition.WEST); } }); closeButton.addStyleName("close"); closeButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { placeManager.closePlace(getPlace()); } }); dumpLayout.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { log.info(Layouts.getContainmentHierarchy(panel)); } }); panel.add(addNorthPanelButton); panel.add(addSouthPanelButton); panel.add(addEastPanelButton); panel.add(addWestPanelButton); panel.add(closeButton); panel.add(dumpLayout); } @Override public void onStartup(PlaceRequest place) { super.onStartup(place); positionTag = place.getParameter("place", "root"); panel.ensureDebugId("NestingScreen-" + positionTag); panel.add(new Label(positionTag)); } @Override public String getTitle() { if (positionTag != null) { return positionTag; } return "Not Started"; } void addNestedPanel(CompassPosition position) { PanelDefinition myParentPanel = findParentPanel(panelManager.getRoot()); if (myParentPanel == null) { Window.alert("Could not find my parent panel!"); return; } Integer childCount = childCounts.get(position); if (childCount == null) { childCount = 0; } childCounts.put(position, childCount + 1); final String childPositionTag = positionTag + position.name().charAt(0) + childCount; PanelDefinition childPanel = new PanelDefinitionImpl(SimpleWorkbenchPanelPresenter.class.getName()); childPanel.setElementId("NestingScreenPanel-" + childPositionTag); childPanel.setWidth(100); childPanel.setHeight(100); panelManager.addWorkbenchPanel(myParentPanel, childPanel, position); PlaceRequest childScreen = new DefaultPlaceRequest(getClass().getName()); childScreen.addParameter("place", childPositionTag); placeManager.goTo(childScreen, childPanel); } private PanelDefinition findParentPanel(PanelDefinition startAt) { for (PartDefinition part : startAt.getParts()) { if (part.getPlace().equals(place)) { return startAt; } } for (PanelDefinition child : startAt.getChildren()) { PanelDefinition found = findParentPanel(child); if (found != null) { return found; } } return null; } }