/* * Copyright 2015 JBoss, by Red Hat, Inc * * 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.client.docks; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Event; import javax.enterprise.event.Observes; import javax.inject.Inject; import org.uberfire.client.docks.view.DocksBar; import org.uberfire.client.docks.view.DocksBars; import org.uberfire.client.workbench.docks.UberfireDock; import org.uberfire.client.workbench.docks.UberfireDockContainerReadyEvent; import org.uberfire.client.workbench.docks.UberfireDockPosition; import org.uberfire.client.workbench.docks.UberfireDockReadyEvent; import org.uberfire.client.workbench.docks.UberfireDocks; import org.uberfire.client.workbench.events.PerspectiveChange; @ApplicationScoped public class UberfireDocksImpl implements UberfireDocks { public static final String IDE_DOCK = "IDE_DOCK"; final Map<String, List<UberfireDock>> docksPerPerspective = new HashMap<String, List<UberfireDock>>(); final Map<String, Set<UberfireDockPosition>> disableDocksPerPerspective = new HashMap<String, Set<UberfireDockPosition>>(); String currentSelectedPerspective; private DocksBars docksBars; @Inject private Event<UberfireDockReadyEvent> dockReadyEvent; @Inject public UberfireDocksImpl(DocksBars docksBars) { this.docksBars = docksBars; } protected void setup(@Observes UberfireDockContainerReadyEvent event) { docksBars.setup(); } @Override public void configure(Map<String, String> configurations) { if (configurations != null && configurations.get(IDE_DOCK) != null) { docksBars.setIDEdock(Boolean.valueOf(configurations.get(IDE_DOCK))); } } @Override public void add(UberfireDock... docks) { for (UberfireDock dock : docks) { if (dock.getAssociatedPerspective() != null) { List<UberfireDock> uberfireDocks = docksPerPerspective.get(dock.getAssociatedPerspective()); if (uberfireDocks == null) { uberfireDocks = new ArrayList<UberfireDock>(); } uberfireDocks.add(dock); docksPerPerspective.put(dock.getAssociatedPerspective(), uberfireDocks); } } updateDocks(); } public void perspectiveChangeEvent(@Observes PerspectiveChange perspectiveChange) { this.currentSelectedPerspective = perspectiveChange.getIdentifier(); updateDocks(); fireDockReadyEvent(); } protected void fireDockReadyEvent() { dockReadyEvent.fire(new UberfireDockReadyEvent(currentSelectedPerspective)); } @Override public void remove(UberfireDock... docks) { for (UberfireDock dock : docks) { if (dock.getAssociatedPerspective() != null) { List<UberfireDock> uberfireDocks = docksPerPerspective.get(dock.getAssociatedPerspective()); uberfireDocks.remove(dock); docksPerPerspective.put(dock.getAssociatedPerspective(), uberfireDocks); } } updateDocks(); } @Override public void expand(UberfireDock dock) { if (docksBars.isReady()) { docksBars.expand(dock); } } @Override public void disable(UberfireDockPosition position, String perspectiveName) { addToDisableDocksList(position, perspectiveName); disableDock(position); } private void disableDock(UberfireDockPosition position) { if (docksBars.isReady()) { docksBars.clearAndCollapse(position); } } @Override public void enable(UberfireDockPosition position, String perspectiveName) { removeFromDisableDocksList(position, perspectiveName); enableDock(position); } private void enableDock(UberfireDockPosition position) { if (docksBars.isReady()) { docksBars.clearAndCollapse(position); if (currentSelectedPerspective != null) { List<UberfireDock> docks = docksPerPerspective.get(currentSelectedPerspective); if (docks != null && !docks.isEmpty()) { for (UberfireDock dock : docks) { if (dock.getDockPosition().equals(position)) { docksBars.addDock(dock); } } docksBars.expand(position); } } } } private void updateDocks() { if (docksBars.isReady()) { docksBars.clearAndCollapseAllDocks(); if (currentSelectedPerspective != null) { List<UberfireDock> docks = docksPerPerspective.get(currentSelectedPerspective); if (docks != null && !docks.isEmpty()) { for (UberfireDock dock : docks) { docksBars.addDock(dock); } expandAllAvailableDocks(); } } } } private void expandAllAvailableDocks() { for (DocksBar docksBar : docksBars.getDocksBars()) { if (dockIsEnable(docksBar.getPosition())) { docksBars.expand(docksBar); } } } private void addToDisableDocksList(UberfireDockPosition position, String perspectiveName) { Set<UberfireDockPosition> disableDocks = disableDocksPerPerspective.get(perspectiveName); if (disableDocks == null) { disableDocks = new HashSet<UberfireDockPosition>(); disableDocksPerPerspective.put(perspectiveName, disableDocks); } disableDocks.add(position); } private void removeFromDisableDocksList(UberfireDockPosition position, String perspectiveName) { Set<UberfireDockPosition> disableDocks = disableDocksPerPerspective.get(perspectiveName); if (disableDocks != null) { disableDocks.remove(position); } } private boolean dockIsEnable(UberfireDockPosition dockPosition) { Set<UberfireDockPosition> uberfireDockPositions = disableDocksPerPerspective.get(currentSelectedPerspective); if (uberfireDockPositions != null && uberfireDockPositions.contains(dockPosition)) { return false; } return true; } }