/** * Copyright 2013 European Parliament * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://joinup.ec.europa.eu/software/page/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and limitations under the Licence. */ package org.nsesa.editor.gwt.an.common.client.ui.overlay.document; import com.google.gwt.dom.client.Element; import com.google.inject.Inject; import org.nsesa.editor.gwt.an.common.client.ui.overlay.document.gen.Akomantoso20OverlayFactory; import org.nsesa.editor.gwt.an.common.client.ui.overlay.document.gen.Csd02OverlayFactory; import org.nsesa.editor.gwt.an.common.client.ui.overlay.document.gen.Csd05OverlayFactory; import org.nsesa.editor.gwt.core.client.ui.overlay.document.DefaultOverlayFactory; import org.nsesa.editor.gwt.core.client.ui.overlay.document.OverlayStrategy; import org.nsesa.editor.gwt.core.client.ui.overlay.document.OverlayWidget; import org.nsesa.editor.gwt.core.client.ui.overlay.document.OverlayWidgetWalker; /** * Date: 27/03/13 13:51 * * @author <a href="mailto:philip.luppens@gmail.com">Philip Luppens</a> * @version $Id$ */ public class CompositeOverlayFactory extends DefaultOverlayFactory { private final Akomantoso20OverlayFactory akomantoso20OverlayFactory; private final Csd02OverlayFactory csd02OverlayFactory; private final Csd05OverlayFactory csd05OverlayFactory; @Inject public CompositeOverlayFactory(final OverlayStrategy overlayStrategy, final Akomantoso20OverlayFactory akomantoso20OverlayFactory, final Csd02OverlayFactory csd02OverlayFactory, final Csd05OverlayFactory csd05OverlayFactory) { super(overlayStrategy); this.akomantoso20OverlayFactory = akomantoso20OverlayFactory; this.csd02OverlayFactory = csd02OverlayFactory; this.csd05OverlayFactory = csd05OverlayFactory; } @Override public OverlayWidget getAmendableWidget(String namespaceURI, String tag) { OverlayWidget amendableWidget = null; if (akomantoso20OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = akomantoso20OverlayFactory.getAmendableWidget(namespaceURI, tag); } else if (csd02OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = csd02OverlayFactory.getAmendableWidget(namespaceURI, tag); } else if (csd05OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = csd05OverlayFactory.getAmendableWidget(namespaceURI, tag); } if (amendableWidget == null) amendableWidget = super.getAmendableWidget(namespaceURI, tag); setAmendable(amendableWidget); return amendableWidget; } @Override public OverlayWidget getAmendableWidget(Element element) { OverlayWidget amendableWidget = null; String namespaceURI = akomantoso20OverlayFactory.getOverlayStrategy().getNamespaceURI(element); if (akomantoso20OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = akomantoso20OverlayFactory.getAmendableWidget(element); } else { namespaceURI = csd02OverlayFactory.getOverlayStrategy().getNamespaceURI(element); if (csd02OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = csd02OverlayFactory.getAmendableWidget(element); } else { namespaceURI = csd05OverlayFactory.getOverlayStrategy().getNamespaceURI(element); if (csd05OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = csd05OverlayFactory.getAmendableWidget(element); } } } if (amendableWidget == null) amendableWidget = super.getAmendableWidget(element); setAmendable(amendableWidget); return amendableWidget; } @Override public OverlayWidget toAmendableWidget(Element element) { OverlayWidget amendableWidget = null; String namespaceURI = akomantoso20OverlayFactory.getOverlayStrategy().getNamespaceURI(element); if (akomantoso20OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = akomantoso20OverlayFactory.toAmendableWidget(element); } else { namespaceURI = csd02OverlayFactory.getOverlayStrategy().getNamespaceURI(element); if (csd02OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = csd02OverlayFactory.toAmendableWidget(element); } else { namespaceURI = csd05OverlayFactory.getOverlayStrategy().getNamespaceURI(element); if (csd05OverlayFactory.getNamespaceURI().equals(namespaceURI)) { amendableWidget = csd05OverlayFactory.toAmendableWidget(element); } } } if (amendableWidget == null) amendableWidget = super.toAmendableWidget(element); setAmendable(amendableWidget); return amendableWidget; } protected void setAmendable(final OverlayWidget overlayWidget) { if (overlayWidget != null) { final String namespaceURI20 = akomantoso20OverlayFactory.getNamespaceURI(); final String namespaceURI30_02 = csd02OverlayFactory.getNamespaceURI(); final String namespaceURI30_05 = csd05OverlayFactory.getNamespaceURI(); overlayWidget.walk(new OverlayWidgetWalker.DefaultOverlayWidgetVisitor() { @Override public boolean visit(OverlayWidget visited) { final boolean baseHierarchySubclass = AkomaNtosoUtil.representsBlock(visited); // this prevents us from marking all children as amendable if we're in a quotedStructure if (!visited.hasParent(namespaceURI20, "quotedStructure") && !visited.hasParent(namespaceURI30_02, "quotedStructure") && !visited.hasParent(namespaceURI30_05, "quotedStructure")) visited.setAmendable(baseHierarchySubclass); return true; } }); } } }