package org.sigmah.client.ui.view.contact; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.google.gwt.core.client.Scheduler; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Widget; import com.extjs.gxt.ui.client.event.ComponentEvent; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.util.Padding; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.TabItem; import com.extjs.gxt.ui.client.widget.TabPanel; import com.extjs.gxt.ui.client.widget.layout.HBoxLayout; import com.extjs.gxt.ui.client.widget.layout.VBoxLayout; import org.sigmah.client.ui.presenter.contact.ContactPresenter; import org.sigmah.client.ui.view.base.AbstractView; import org.sigmah.client.ui.widget.layout.Layouts; import org.sigmah.client.ui.widget.panel.Panels; import org.sigmah.client.util.ClientUtils; import org.sigmah.shared.dto.referential.ContactModelType; public class ContactView extends AbstractView implements ContactPresenter.View { private static final int AVATAR_WIDTH = 128; private static final int AVATAR_HEIGHT = 128; private static final int CARD_WIDTH = 350; private static final int LABEL_HEIGHT = 30; private static final int PADDING = 15; private final String AVATAR_STYLE_NAME = "contact-card-avatar"; private final String AVATAR_DEFAULT_INDIVIDUAL_STYLE_NAME = "contact-card-avatar-individual"; private final String AVATAR_DEFAULT_ORGANIZATION_STYLE_NAME = "contact-card-avatar-organization"; private final String LABEL_STYLE_NAME = "contact-card-label"; public final String NAME_STYLE_NAME = "contact-card-name"; public final String ORGANIZATION_STYLE_NAME = "contact-card-organization"; private ContentPanel contentPanel; private HTML avatar; private LayoutContainer topDetailsContainer; private LayoutContainer bottomDetailsContainer; private TabPanel tabPanel; @Override public Component getMainComponent() { return contentPanel; } @Override public void initialize() { Widget contactCardPanel = createContactCardPanel(); tabPanel = Panels.tab(); tabPanel.setBorderStyle(true); tabPanel.setBodyBorder(true); tabPanel.setBorders(true); tabPanel.setPlain(true); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { tabPanel.setWidth(contentPanel.getWidth() - CARD_WIDTH); } }); LayoutContainer layoutContainer = Layouts.hBox(HBoxLayout.HBoxLayoutAlign.STRETCH); layoutContainer.add(contactCardPanel); layoutContainer.add(tabPanel); contentPanel = Panels.content(""); // Temporary title. contentPanel.setHeaderVisible(true); contentPanel.add(layoutContainer); add(contentPanel); } private Widget createContactCardPanel() { avatar = new HTML(); avatar.setWidth(AVATAR_WIDTH + "px"); avatar.setHeight(AVATAR_HEIGHT + "px"); avatar.setStyleName(AVATAR_STYLE_NAME); topDetailsContainer = Layouts.vBox(VBoxLayout.VBoxLayoutAlign.LEFT); topDetailsContainer.setHeight(AVATAR_HEIGHT); topDetailsContainer.setWidth(CARD_WIDTH - AVATAR_WIDTH); LayoutContainer topContainer = Layouts.hBox(HBoxLayout.HBoxLayoutAlign.MIDDLE); topContainer.setWidth(CARD_WIDTH); topContainer.setHeight(AVATAR_HEIGHT + PADDING * 2); topContainer.add(avatar); topContainer.add(topDetailsContainer); bottomDetailsContainer = Layouts.vBox(VBoxLayout.VBoxLayoutAlign.LEFT, new Layouts.LayoutOptions(new Padding(0, 0, 0, 20))); bottomDetailsContainer.setWidth(CARD_WIDTH - AVATAR_WIDTH); LayoutContainer cardContainer = Layouts.vBox(VBoxLayout.VBoxLayoutAlign.STRETCH); cardContainer.setWidth(CARD_WIDTH); cardContainer.add(topContainer); cardContainer.add(bottomDetailsContainer); return cardContainer; } @Override public void setAvatarUrl(String url) { avatar.getElement().getStyle().setBackgroundImage("url(\"" + url + "\")"); } @Override public void setDefaultAvatar(ContactModelType type) { avatar.getElement().getStyle().clearBackgroundImage(); switch (type) { case INDIVIDUAL: avatar.addStyleName(AVATAR_DEFAULT_INDIVIDUAL_STYLE_NAME); break; case ORGANIZATION: avatar.addStyleName(AVATAR_DEFAULT_ORGANIZATION_STYLE_NAME); break; default: throw new IllegalStateException("Unknown ContactModelType : " + type); } } @Override public void prepareContainers() { topDetailsContainer.removeAll(); bottomDetailsContainer.removeAll(); avatar.removeStyleName(AVATAR_DEFAULT_INDIVIDUAL_STYLE_NAME); avatar.removeStyleName(AVATAR_DEFAULT_ORGANIZATION_STYLE_NAME); avatar.getElement().getStyle().clearBackgroundImage(); } @Override public void addLabel(String label) { addLabel(label, LABEL_STYLE_NAME); } @Override public void addNameLabel(String name) { addLabel(name, NAME_STYLE_NAME); } @Override public void addOrganizationLabel(String organization) { addLabel(organization, ORGANIZATION_STYLE_NAME); } @Override public void addLabel(String label, String style) { if (ClientUtils.isBlank(label)) { return; } HTML html = new HTML(label); html.setHeight(LABEL_HEIGHT + "px"); html.setStyleName(style); html.setWordWrap(false); if ((topDetailsContainer.getItemCount() + 1 ) * LABEL_HEIGHT > AVATAR_HEIGHT) { bottomDetailsContainer.add(html); bottomDetailsContainer.setHeight(bottomDetailsContainer.getItemCount() * LABEL_HEIGHT); bottomDetailsContainer.layout(); return; } topDetailsContainer.add(html); topDetailsContainer.layout(); } @Override public void setHeaderText(String header) { contentPanel.setHeadingText(header); } @Override public void addTab(String tabTitle, final Widget tabView) { final TabItem tabItem = new TabItem(tabTitle); tabItem.addListener(Events.Select, new Listener<ComponentEvent>() { @Override public void handleEvent(ComponentEvent be) { fixTabViewHeight(tabView, tabItem); } }); tabItem.add(tabView); Window.addResizeHandler(new ResizeHandler() { @Override public void onResize(ResizeEvent event) { fixTabViewHeight(tabView, tabItem); } }); fixTabViewHeight(tabView, tabItem); tabPanel.add(tabItem); } @Override public void selectFirstTab() { if (tabPanel.getItemCount() > 0) { tabPanel.setSelection(tabPanel.getItem(0)); } } private void fixTabViewHeight(final Widget tabView, final TabItem tabItem) { Timer timer = new Timer() { @Override public void run() { if (tabView.isVisible() && tabItem == tabPanel.getSelectedItem()) { tabView.setHeight(tabItem.getHeight() + "px"); } } }; timer.schedule(200); } }