/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.command.toolbar.previews;
import elemental.dom.Element;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.command.toolbar.ToolbarMessages;
import org.eclipse.che.ide.ui.Tooltip;
import org.eclipse.che.ide.ui.dropdown.BaseListItem;
import org.eclipse.che.ide.ui.dropdown.DropdownList;
import org.eclipse.che.ide.ui.dropdown.StringItemRenderer;
import java.util.HashMap;
import java.util.Map;
import static org.eclipse.che.ide.command.toolbar.previews.PreviewUrlItemRenderer.HEADER_WIDGET;
import static org.eclipse.che.ide.ui.menu.PositionController.HorizontalAlign.MIDDLE;
import static org.eclipse.che.ide.ui.menu.PositionController.VerticalAlign.BOTTOM;
/** Implementation of {@link PreviewsView} that displays preview URLs in a dropdown list. */
@Singleton
public class PreviewsViewImpl implements PreviewsView {
/** Mapping of URL to list item. */
private final Map<String, BaseListItem<PreviewUrl>> listItems;
private final DropdownList dropdownList;
private final NoPreviewsItem noPreviewsItem;
private final NoPreviewsItemRenderer noPreviewsItemRenderer;
private final ToolbarMessages messages;
private final AppContext appContext;
private ActionDelegate delegate;
@Inject
public PreviewsViewImpl(ToolbarMessages messages, AppContext appContext) {
this.messages = messages;
this.appContext = appContext;
listItems = new HashMap<>();
dropdownList = new DropdownList(HEADER_WIDGET, false);
dropdownList.setWidth("43px");
dropdownList.ensureDebugId("dropdown-preview_url");
dropdownList.setSelectionHandler(item -> listItems.entrySet()
.stream()
.filter(entry -> item.equals(entry.getValue()))
.findAny()
.ifPresent(entry -> delegate.onUrlChosen(entry.getKey())));
noPreviewsItem = new NoPreviewsItem();
noPreviewsItemRenderer = new NoPreviewsItemRenderer();
checkNoPreviewsItem();
Tooltip.create((Element)dropdownList.getElement(), BOTTOM, MIDDLE, messages.previewsTooltip());
}
private void checkNoPreviewsItem() {
if (listItems.isEmpty()) {
dropdownList.addItem(noPreviewsItem, noPreviewsItemRenderer);
} else {
dropdownList.removeItem(noPreviewsItem);
}
}
@Override
public void setDelegate(ActionDelegate delegate) {
this.delegate = delegate;
}
@Override
public Widget asWidget() {
return dropdownList;
}
@Override
public void addUrl(String previewUrl) {
if (listItems.containsKey(previewUrl)) {
return;
}
final PreviewUrl displayablePreviewUrl = new PreviewUrl(previewUrl, appContext);
final BaseListItem<PreviewUrl> listItem = new BaseListItem<>(displayablePreviewUrl);
final PreviewUrlItemRenderer renderer = new PreviewUrlItemRenderer(listItem);
listItems.put(previewUrl, listItem);
dropdownList.addItem(listItem, renderer);
checkNoPreviewsItem();
}
@Override
public void removeUrl(String previewUrl) {
final BaseListItem<PreviewUrl> listItem = listItems.remove(previewUrl);
if (listItem != null) {
dropdownList.removeItem(listItem);
checkNoPreviewsItem();
}
}
@Override
public void removeAllURLs() {
listItems.clear();
dropdownList.clear();
checkNoPreviewsItem();
}
private class NoPreviewsItem extends BaseListItem<String> {
NoPreviewsItem() {
super(messages.previewsNoPreviews());
}
}
private class NoPreviewsItemRenderer extends StringItemRenderer {
NoPreviewsItemRenderer() {
super(noPreviewsItem);
}
@Override
public Widget renderHeaderWidget() {
return HEADER_WIDGET;
}
}
}