// Copyright 2012 Google Inc. All Rights Reserved. // // 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 com.google.collide.client.code; import com.google.collide.client.util.Elements; import com.google.collide.json.client.JsoStringMap; import com.google.collide.json.shared.JsonStringMap.IterationCallback; import com.google.collide.mvp.CompositeView; import com.google.collide.mvp.UiComponent; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import elemental.html.DivElement; import elemental.html.SpanElement; /** * Presenter for the participant list in the navigation bar. * */ public class ParticipantList extends UiComponent<ParticipantList.View> implements ParticipantModel.Listener { /** * Static factory method for obtaining an instance of the ParticipantList. */ public static ParticipantList create(View view, Resources res, ParticipantModel model) { ParticipantList participantList = new ParticipantList(view, model); participantList.init(); return participantList; } /** * CSS for the participant list. * */ public interface Css extends CssResource { String name(); String root(); String row(); String swatch(); } interface Resources extends ClientBundle { @Source("ParticipantList.css") Css workspaceNavigationParticipantListCss(); } static class View extends CompositeView<Void> { final Resources res; final Css css; private final JsoStringMap<DivElement> rows = JsoStringMap.create(); View(Resources res) { this.res = res; this.css = res.workspaceNavigationParticipantListCss(); setElement(Elements.createDivElement(css.root())); } private void addParticipant(String userId, String displayEmail, String name, String color) { DivElement rowElement = Elements.createDivElement(css.row()); DivElement swatchElement = Elements.createDivElement(css.swatch()); swatchElement.setAttribute("style", "background-color: " + color); rowElement.appendChild(swatchElement); SpanElement nameElement = Elements.createSpanElement(css.name()); nameElement.setTextContent(name); nameElement.setTitle(displayEmail); rowElement.appendChild(nameElement); getElement().appendChild(rowElement); rows.put(userId, rowElement); } private void removeParticipant(String userId) { DivElement row = rows.get(userId); if (row != null) { row.removeFromParent(); } } } private final ParticipantModel model; private ParticipantList(View view, ParticipantModel model) { super(view); this.model = model; } @Override public void participantAdded(Participant participant) { addParticipantToView(participant); } @Override public void participantRemoved(Participant participant) { getView().removeParticipant(participant.getUserId()); } public ParticipantModel getModel() { return model; } private void init() { model.addListener(this); populateViewFromModel(); } private void addParticipantToView(Participant participant) { getView().addParticipant(participant.getUserId(), participant.getDisplayEmail(), participant.getDisplayName(), participant.getColor()); } private void populateViewFromModel() { JsoStringMap<Participant> participants = getModel().getParticipants(); participants.iterate(new IterationCallback<Participant>() { @Override public void onIteration(String userId, Participant participant) { addParticipantToView(participant); } }); } }