/**
* Copyright 2010 Google 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.waveprotocol.wave.client.wavepanel.render;
import org.waveprotocol.wave.client.account.ProfileManager;
import org.waveprotocol.wave.client.common.safehtml.SafeHtml;
import org.waveprotocol.wave.client.common.util.DateUtils;
import org.waveprotocol.wave.client.wavepanel.view.IntrinsicBlipMetaView;
import org.waveprotocol.wave.model.conversation.ConversationBlip;
import org.waveprotocol.wave.model.document.Document;
import org.waveprotocol.wave.model.supplement.ReadableSupplementedWave;
import org.waveprotocol.wave.model.wave.ParticipantId;
import java.util.Set;
/**
* Defines the shallow blip rendering for the Undercurrent UI.
*
*/
public final class UndercurrentShallowBlipRenderer implements ShallowBlipRenderer {
private static final int MAX_CONTRIBUTORS = 3;
/** Provides names and avatars of participants. */
private final ProfileManager manager;
/** Provides read state of blips. */
private final ReadableSupplementedWave supplement;
/**
* Defines the rendering function for the contents of a blip.
*/
public interface DocumentRenderer {
SafeHtml render(String blipId, Document doc);
}
public UndercurrentShallowBlipRenderer(
ProfileManager manager, ReadableSupplementedWave supplement) {
this.manager = manager;
this.supplement = supplement;
}
@Override
public void render(ConversationBlip blip, IntrinsicBlipMetaView view) {
renderContributors(blip, view);
renderTime(blip, view);
renderRead(blip, view);
}
@Override
public void renderContributors(ConversationBlip blip, IntrinsicBlipMetaView meta) {
Set<ParticipantId> contributors = blip.getContributorIds();
if (!contributors.isEmpty()) {
meta.setAvatar(avatarOf(contributors.iterator().next()));
meta.setMetaline(buildNames(contributors));
} else {
// Blips are never meant to have no contributors. The wave state is broken.
meta.setAvatar("");
meta.setMetaline("anon");
}
}
@Override
public void renderTime(ConversationBlip blip, IntrinsicBlipMetaView meta) {
meta.setTime(DateUtils.getInstance().formatPastDate(blip.getLastModifiedTime()));
}
@Override
public void renderRead(ConversationBlip blip, IntrinsicBlipMetaView blipUi) {
blipUi.setRead(!supplement.isUnread(blip));
}
/**
* @return the rich text for the contributors in a blip.
*/
private String buildNames(Set<ParticipantId> contributors) {
StringBuilder names = new StringBuilder();
int i = 0;
for (ParticipantId contributor : contributors) {
if (i >= MAX_CONTRIBUTORS) {
break;
} else if (manager.shouldIgnore(contributor)) {
continue;
}
if (i > 0) {
names.append(", ");
}
names.append(nameOf(contributor));
i++;
}
return names.toString();
}
private String nameOf(ParticipantId contributor) {
return manager.getProfile(contributor).getFirstName();
}
private String avatarOf(ParticipantId contributor) {
return manager.getProfile(contributor).getImageUrl();
}
}