123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- * Copyright 2000-2021 Vaadin Ltd.
- *
- * 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 com.vaadin.client.ui.customlayout;
-
- import java.util.logging.Logger;
-
- import com.google.gwt.user.client.DOM;
- import com.google.gwt.user.client.ui.Widget;
- import com.vaadin.client.ApplicationConnection;
- import com.vaadin.client.ComponentConnector;
- import com.vaadin.client.ConnectorHierarchyChangeEvent;
- import com.vaadin.client.Paintable;
- import com.vaadin.client.UIDL;
- import com.vaadin.client.communication.StateChangeEvent;
- import com.vaadin.client.ui.AbstractLayoutConnector;
- import com.vaadin.client.ui.SimpleManagedLayout;
- import com.vaadin.client.ui.VCustomLayout;
- import com.vaadin.shared.ui.Connect;
- import com.vaadin.shared.ui.customlayout.CustomLayoutState;
- import com.vaadin.ui.CustomLayout;
-
- /**
- * A connector class for CustomLayout.
- *
- * @author Vaadin Ltd
- */
- @SuppressWarnings("deprecation")
- @Connect(CustomLayout.class)
- public class CustomLayoutConnector extends AbstractLayoutConnector
- implements SimpleManagedLayout, Paintable {
-
- private boolean templateUpdated;
-
- @Override
- public CustomLayoutState getState() {
- return (CustomLayoutState) super.getState();
- }
-
- @Override
- protected void init() {
- super.init();
- getWidget().client = getConnection();
- getWidget().pid = getConnectorId();
-
- }
-
- @Override
- public void onStateChanged(StateChangeEvent stateChangeEvent) {
- super.onStateChanged(stateChangeEvent);
-
- // Ensure the template is initialized even if there are no children
- // (#9725)
- updateHtmlTemplate();
-
- // Evaluate scripts
- VCustomLayout.eval(getWidget().scripts);
- getWidget().scripts = null;
-
- }
-
- private void updateHtmlTemplate() {
- if (templateUpdated) {
- // We (currently) only do this once. You can't change the template
- // later on.
- return;
- }
- String templateName = getState().templateName;
- String templateContents = getState().templateContents;
-
- if (templateName != null) {
- // Get the HTML-template from client. Overrides templateContents
- // (even though both can never be given at the same time)
- templateContents = getConnection()
- .getResource("layouts/" + templateName + ".html");
- }
-
- if (templateContents != null) {
- // Template ok -> initialize.
- getWidget().initializeHTML(templateContents,
- getConnection().getThemeUri());
- } else {
- // Template missing -> show debug notice and render components in
- // order.
- String warning = templateName != null
- ? "Layout file layouts/" + templateName
- + ".html is missing."
- : "Layout file not specified.";
- getWidget().getElement().setInnerHTML("<em>" + warning
- + " Components will be drawn for debug purposes.</em>");
- }
- templateUpdated = true;
- }
-
- @Override
- public void onConnectorHierarchyChange(
- ConnectorHierarchyChangeEvent event) {
- // Must call here in addition to onStateChanged because
- // onConnectorHierarchyChange is invoked before onStateChanged
- updateHtmlTemplate();
- // For all contained widgets
- for (ComponentConnector child : getChildComponents()) {
- String location = getState().childLocations.get(child);
- try {
- getWidget().setWidget(child.getWidget(), location);
- } catch (final IllegalArgumentException e) {
- // If no location is found, this component is not visible
- getLogger().warning("Child not rendered as no slot with id '"
- + location + "' has been defined");
- }
- }
- for (ComponentConnector oldChild : event.getOldChildren()) {
- if (oldChild.getParent() == this) {
- // Connector still a child of this
- continue;
- }
- Widget oldChildWidget = oldChild.getWidget();
- if (oldChildWidget.isAttached()) {
- // slot of this widget is emptied, remove it
- getWidget().remove(oldChildWidget);
- }
- }
-
- }
-
- @Override
- public VCustomLayout getWidget() {
- return (VCustomLayout) super.getWidget();
- }
-
- @Override
- public void updateCaption(ComponentConnector paintable) {
- getWidget().updateCaption(paintable);
- }
-
- @Override
- public void layout() {
- getWidget().iLayoutJS(DOM.getFirstChild(getWidget().getElement()));
- }
-
- @Override
- public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
- // Not interested in anything from the UIDL - just implementing the
- // interface to avoid some warning (#8688)
- }
-
- private static Logger getLogger() {
- return Logger.getLogger(CustomLayoutConnector.class.getName());
- }
- }
|