/* * Copyright 2013 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.kie.workbench.common.screens.explorer.client.widgets.business; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.guvnor.common.services.project.model.Project; import org.gwtbootstrap3.client.ui.Label; import org.gwtbootstrap3.client.ui.LinkedGroup; import org.gwtbootstrap3.client.ui.LinkedGroupItem; import org.gwtbootstrap3.client.ui.Panel; import org.gwtbootstrap3.client.ui.PanelBody; import org.gwtbootstrap3.client.ui.PanelCollapse; import org.gwtbootstrap3.client.ui.PanelGroup; import org.gwtbootstrap3.client.ui.constants.Toggle; import org.jboss.errai.security.shared.api.identity.User; import org.kie.workbench.common.screens.explorer.client.resources.i18n.ProjectExplorerConstants; import org.kie.workbench.common.screens.explorer.client.resources.images.ProjectExplorerImageResources; import org.kie.workbench.common.screens.explorer.client.utils.Classifier; import org.kie.workbench.common.screens.explorer.client.utils.Utils; import org.kie.workbench.common.screens.explorer.client.widgets.BaseViewImpl; import org.kie.workbench.common.screens.explorer.client.widgets.BaseViewPresenter; import org.kie.workbench.common.screens.explorer.client.widgets.View; import org.kie.workbench.common.screens.explorer.client.widgets.navigator.Explorer; import org.kie.workbench.common.screens.explorer.client.widgets.navigator.NavigatorOptions; import org.kie.workbench.common.screens.explorer.client.widgets.tagSelector.TagSelector; import org.kie.workbench.common.screens.explorer.model.FolderItem; import org.kie.workbench.common.screens.explorer.model.FolderItemType; import org.kie.workbench.common.screens.explorer.model.FolderListing; import org.kie.workbench.common.screens.explorer.utils.Sorters; import org.uberfire.client.mvp.PlaceManager; import org.uberfire.client.workbench.type.AnyResourceType; import org.uberfire.client.workbench.type.ClientResourceType; import org.uberfire.ext.widgets.common.client.accordion.TriggerWidget; import org.uberfire.ext.widgets.common.client.common.BusyPopup; /** * Business View implementation */ @ApplicationScoped public class BusinessViewWidget extends BaseViewImpl implements View { private static final String ID_CLEANUP_PATTERN = "[^a-zA-Z0-9]"; private static BusinessViewImplBinder uiBinder = GWT.create(BusinessViewImplBinder.class); //TreeSet sorts members upon insertion private final Set<FolderItem> sortedFolderItems = new TreeSet<FolderItem>(Sorters.ITEM_SORTER); private final NavigatorOptions businessOptions = new NavigatorOptions() {{ showFiles(false); showHiddenFiles(false); showDirectories(true); allowUpLink(false); showItemAge(false); showItemMessage(false); showItemLastUpdater(false); }}; @UiField Explorer explorer; @UiField PanelGroup itemsContainer; @UiField(provided = true) @Inject TagSelector tagSelector; @Inject Classifier classifier; @Inject PlaceManager placeManager; @Inject User user; private Map<String, PanelCollapse> collapses = new HashMap<>(); private BaseViewPresenter presenter; @PostConstruct public void init() { //Cannot create and bind UI until after injection points have been initialized initWidget(uiBinder.createAndBindUi(this)); itemsContainer.setId(DOM.createUniqueId()); } @Override public void init(final BaseViewPresenter presenter) { this.presenter = presenter; explorer.init(businessOptions, Explorer.NavType.TREE, presenter); } @Override public void setContent(final Project project, final FolderListing folderListing, final Map<FolderItem, List<FolderItem>> siblings) { explorer.setupHeader(project); explorer.loadContent(folderListing, siblings); setItems(folderListing); } @Override public void setItems(final FolderListing folderListing) { renderItems(folderListing); } @Override public void renderItems(FolderListing folderListing) { tagSelector.loadContent(presenter.getActiveContentTags(), presenter.getCurrentTag()); itemsContainer.clear(); sortedFolderItems.clear(); for (final FolderItem content : folderListing.getContent()) { if (!content.getType().equals(FolderItemType.FOLDER)) { sortedFolderItems.add(content); } } if (!sortedFolderItems.isEmpty()) { final Map<ClientResourceType, Collection<FolderItem>> resourceTypeGroups = classifier.group(sortedFolderItems); final TreeMap<ClientResourceType, Collection<FolderItem>> sortedResourceTypeGroups = new TreeMap<>(Sorters.RESOURCE_TYPE_GROUP_SORTER); sortedResourceTypeGroups.putAll(resourceTypeGroups); for (final Map.Entry<ClientResourceType, Collection<FolderItem>> entry : sortedResourceTypeGroups.entrySet()) { final LinkedGroup itemsNavList = new LinkedGroup(); itemsNavList.getElement().getStyle().setMarginBottom(0, Style.Unit.PX); final PanelCollapse collapse = new PanelCollapse(); final String collapseId = getCollapseId(entry.getKey()); final PanelCollapse oldCollapse = collapses.get(collapseId); final boolean in = (oldCollapse != null) ? oldCollapse.isIn() : false; collapse.setId(collapseId); collapse.setIn(in); final PanelBody body = new PanelBody(); body.getElement().getStyle().setPadding(0, Style.Unit.PX); collapse.add(body); body.add(itemsNavList); for (FolderItem folderItem : entry.getValue()) { itemsNavList.add(makeItemNavLink(entry.getKey(), folderItem)); } itemsContainer.add(new Panel() {{ add(makeTriggerWidget(entry.getKey(), collapse)); add(collapse); }}); collapses.put(collapseId, collapse); } } else { itemsContainer.add(new Label(ProjectExplorerConstants.INSTANCE.noItemsExist())); } } private TriggerWidget makeTriggerWidget(final ClientResourceType resourceType, final PanelCollapse collapse) { final String description = getResourceTypeDescription(resourceType); if (resourceType.getIcon() != null) { return new TriggerWidget(resourceType.getIcon(), description, !collapse.isIn()) {{ setDataToggle(Toggle.COLLAPSE); setDataParent(itemsContainer.getId()); setDataTargetWidget(collapse); }}; } return new TriggerWidget(description, !collapse.isIn()) {{ setDataToggle(Toggle.COLLAPSE); setDataParent(itemsContainer.getId()); setDataTargetWidget(collapse); }}; } @Override public void showHiddenFiles(boolean show) { // No hidden files here. } @Override public void setNavType(Explorer.NavType navType) { explorer.setNavType(navType, businessOptions); } @Override public void hideTagFilter() { tagSelector.hide(); if (presenter.getActiveContent() != null) { renderItems(presenter.getActiveContent()); } } @Override public void showTagFilter() { tagSelector.show(); } @Override public void hideHeaderNavigator() { explorer.hideHeaderNavigator(); } @Override public void showHeaderNavigator() { explorer.showHeaderNavigator(); } @Override public Explorer getExplorer() { return explorer; } private String getResourceTypeDescription(final ClientResourceType resourceType) { String description = resourceType.getDescription(); description = (description == null || description.isEmpty()) ? ProjectExplorerConstants.INSTANCE.miscellaneous_files() : description; return description; } private IsWidget makeItemNavLink(final ClientResourceType resourceType, final FolderItem folderItem) { String _fileName = folderItem.getFileName(); if (!(resourceType instanceof AnyResourceType)) { _fileName = Utils.getBaseFileName(_fileName, resourceType.getSuffix()); } _fileName = _fileName.replaceAll(" ", "\u00a0"); final String fileName = _fileName; final LinkedGroupItem navLink = new LinkedGroupItem() {{ setText(fileName); addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { presenter.onItemSelected(folderItem); } }); }}; Image lockImage; if (folderItem.getLockedBy() == null) { lockImage = new Image(ProjectExplorerImageResources.INSTANCE.lockEmpty()); } else if (folderItem.getLockedBy().equals(user.getIdentifier())) { lockImage = new Image(ProjectExplorerImageResources.INSTANCE.lockOwned()); lockImage.setTitle(ProjectExplorerConstants.INSTANCE.lockOwnedHint()); } else { lockImage = new Image(ProjectExplorerImageResources.INSTANCE.lock()); lockImage.setTitle(ProjectExplorerConstants.INSTANCE.lockHint() + " " + folderItem.getLockedBy()); } navLink.getWidget(0) .getElement() .setInnerHTML("<span>" + lockImage.toString() + " " + fileName + "</span>"); return navLink; } private String getCollapseId(ClientResourceType resourceType) { return resourceType != null ? resourceType.getShortName().replaceAll(ID_CLEANUP_PATTERN, "") : ""; } @Override public void showBusyIndicator(final String message) { BusyPopup.showMessage(message); } @Override public void hideBusyIndicator() { BusyPopup.close(); } interface BusinessViewImplBinder extends UiBinder<Widget, BusinessViewWidget> { } }