Merge "Omaha #3709 Support foreground/background colors by site for nws-collaborate room" into omaha_14.4.1

Former-commit-id: 99b30457c5 [formerly 370a090480 [formerly f2751d48244d29af3f047d49da5ae117ce14a86b]]
Former-commit-id: 370a090480
Former-commit-id: a3827ad7bd
This commit is contained in:
Nate Jensen 2014-12-02 12:08:22 -06:00 committed by Gerrit Code Review
commit 6c2b926f12
10 changed files with 432 additions and 644 deletions

View file

@ -0,0 +1,135 @@
package com.raytheon.uf.viz.collaboration.ui;
import java.util.HashMap;
import java.util.Map;
import javax.swing.plaf.synth.ColorType;
import org.eclipse.swt.graphics.RGB;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManager;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.serialization.SingleTypeJAXBManager;
import com.raytheon.uf.viz.collaboration.ui.ColorInfoMap.ColorInfo;
/**
* Abstract class collaboration chat coloring configuration managers
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Nov 13, 2014 3709 mapeters Initial creation.
*
* </pre>
*
* @author mapeters
* @version 1.0
*/
public abstract class AbstractColorConfigManager {
private static final SingleTypeJAXBManager<ColorInfoMap> jaxb = SingleTypeJAXBManager
.createWithoutException(ColorInfoMap.class);
/**
* Set and store the color type of the given user/site to be the given rgb
* at the given file location. If creating new {@link ColorInfo} and setting
* background, set foreground to defaultForeground to prevent it from
* incorrectly defaulting.
*
* @param key
* @param type
* @param rgb
* @param defaultForeground
* @param filePath
*/
protected void setColor(String key, ColorType type, RGB rgb,
RGB defaultForeground, String filePath) {
ColorInfoMap colorInfoMap = this.getColorInfoMap();
if (colorInfoMap == null) {
colorInfoMap = new ColorInfoMap();
this.setColorInfoMap(colorInfoMap);
}
Map<String, ColorInfo> colors = colorInfoMap.getColors();
if (colors == null) {
colorInfoMap.setColors(new HashMap<String, ColorInfo>());
colors = colorInfoMap.getColors();
}
ColorInfo colorInfo = colors.get(key);
if (colorInfo != null) {
colorInfo.setColor(type, rgb, defaultForeground);
} else {
ColorInfo color = new ColorInfo();
color.setColor(type, rgb, defaultForeground);
colors.put(key, color);
}
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext lContext = pathMgr.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.USER);
LocalizationFile file = pathMgr.getLocalizationFile(lContext, filePath);
try {
jaxb.marshalToXmlFile(colorInfoMap, file.getFile().getPath());
file.save();
} catch (Exception e) {
Activator.statusHandler.error(
"Unable to write color information to file: "
+ file.getName() + " in context " + lContext, e);
}
}
/**
* Get the {@link ColorInfo} for the given user/site from memory.
*
* @param key
* @param filePath
* @return
*/
protected ColorInfo getColor(String key, String filePath) {
ColorInfoMap colorInfoMap = this.getColorInfoMap();
if (colorInfoMap == null) {
IPathManager pm = (PathManager) PathManagerFactory.getPathManager();
LocalizationContext locContext = pm.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.USER);
LocalizationFile file = pm
.getLocalizationFile(locContext, filePath);
if (file != null && file.exists()) {
try {
colorInfoMap = jaxb.unmarshalFromXmlFile(file.getFile());
this.setColorInfoMap(colorInfoMap);
} catch (SerializationException e) {
Activator.statusHandler.error(
"Unable to read color information from file: "
+ file.getName() + " in level "
+ LocalizationLevel.USER, e);
}
}
}
if (colorInfoMap != null) {
Map<String, ColorInfo> colors = colorInfoMap.getColors();
if (colors != null) {
return colors.get(key);
}
}
return null;
}
public abstract void setColor(String key, ColorType type, RGB rgb,
RGB defaultForeground);
public abstract ColorInfo getColor(String key);
protected abstract ColorInfoMap getColorInfoMap();
protected abstract void setColorInfoMap(ColorInfoMap colorInfo);
}

View file

@ -31,7 +31,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.RGB;
/** /**
* Contains foreground and background chat colors for a list of users * Contains foreground and background chat colors for a list of users or sites
* *
* <pre> * <pre>
* *
@ -40,6 +40,7 @@ import org.eclipse.swt.graphics.RGB;
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Nov 13, 2014 3709 mapeters Initial creation. * Nov 13, 2014 3709 mapeters Initial creation.
* Nov 26, 2014 3709 mapeters Renamed from UserColorInformation, added fgSet getter.
* *
* </pre> * </pre>
* *
@ -48,15 +49,15 @@ import org.eclipse.swt.graphics.RGB;
*/ */
@XmlRootElement @XmlRootElement
@XmlAccessorType(XmlAccessType.NONE) @XmlAccessorType(XmlAccessType.NONE)
public class UserColorInformation { public class ColorInfoMap {
@XmlElement @XmlElement
private Map<String, UserColor> colors; private Map<String, ColorInfo> colors;
/** /**
* @return the colors * @return the colors
*/ */
public Map<String, UserColor> getColors() { public Map<String, ColorInfo> getColors() {
return colors; return colors;
} }
@ -64,12 +65,12 @@ public class UserColorInformation {
* @param colors * @param colors
* the colors to set * the colors to set
*/ */
public void setColors(Map<String, UserColor> colors) { public void setColors(Map<String, ColorInfo> colors) {
this.colors = colors; this.colors = colors;
} }
@XmlAccessorType(XmlAccessType.NONE) @XmlAccessorType(XmlAccessType.NONE)
public static class UserColor { public static class ColorInfo {
/** /**
* tells {@link #setColor()} when to use defaultForeground * tells {@link #setColor()} when to use defaultForeground
@ -98,7 +99,7 @@ public class UserColorInformation {
@XmlAttribute @XmlAttribute
private int bgBlue = 255; private int bgBlue = 255;
public UserColor() { public ColorInfo() {
} }
/** /**
@ -199,8 +200,16 @@ public class UserColorInformation {
* foreground color, otherwise it defaults to black * foreground color, otherwise it defaults to black
*/ */
setColor(ColorType.FOREGROUND, defaultForeground, null); setColor(ColorType.FOREGROUND, defaultForeground, null);
fgSet = false;
} }
} }
} }
/**
* @return whether the foreground has been set
*/
public boolean isForegroundSet() {
return fgSet;
}
} }
} }

View file

@ -0,0 +1,89 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.ui;
import javax.swing.plaf.synth.ColorType;
import org.eclipse.swt.graphics.RGB;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.viz.collaboration.ui.ColorInfoMap.ColorInfo;
/**
* Configuration manager for reading/writing colors for each site to/from a
* user-localized file
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Oct 10, 2014 3708 bclement Moved color methods from SiteConfigurationManager
* Nov 26, 2014 3709 mapeters Abstracted out code to {@link AbstractColorConfigManager},
* renamed from SiteColorConfigManager.
*
* </pre>
*
* @author bclement
* @version 1.0
*/
public class FeedColorConfigManager extends AbstractColorConfigManager {
private static final String FILE_PATH = "collaboration"
+ IPathManager.SEPARATOR + "siteColorInfo.xml";
private static ColorInfoMap colorInfoMap;
/**
* Set and store the color type of the given site to be the given rgb.
*
* @param site
* @param type
* @param rgb
* @param defaultForeground
*/
@Override
public synchronized void setColor(String site,
ColorType type, RGB rgb, RGB defaultForeground) {
super.setColor(site, type, rgb, defaultForeground, FILE_PATH);
}
/**
* Get the {@link ColorInfo} for the given site from memory.
*
* @param site
* @return
*/
@Override
public synchronized ColorInfo getColor(String site) {
return super.getColor(site, FILE_PATH);
}
@Override
protected ColorInfoMap getColorInfoMap() {
return colorInfoMap;
}
@Override
protected void setColorInfoMap(ColorInfoMap colorInfoMap) {
FeedColorConfigManager.colorInfoMap = colorInfoMap;
}
}

View file

@ -1,159 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.ui;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManager;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.viz.collaboration.ui.SiteColorInformation.SiteColor;
/**
* Site coloring configuration manager
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Oct 10, 2014 3708 bclement Moved color methods from SiteConfigurationManager
*
* </pre>
*
* @author bclement
* @version 1.0
*/
public class SiteColorConfigManager {
private static SiteColorInformation colorInfo;
/**
*
*/
private SiteColorConfigManager() {
}
/**
* Write the colorInfo.xml file out to user localization so that the user
* can retrieve it on CAVE restart
*
* @param information
*/
public static void writeSiteColorInformation(
SiteColorInformation information) {
colorInfo = information;
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext lContext = pathMgr.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.USER);
LocalizationFile file = pathMgr.getLocalizationFile(lContext,
"collaboration" + File.separator + "colorInfo.xml");
try {
JAXBContext context = JAXBContext
.newInstance(SiteColorInformation.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
new Boolean(true));
marshaller.marshal(information, file.getFile());
file.save();
} catch (Exception e) {
Activator.statusHandler.error(
"Unable to write color information to file: "
+ file.getName() + " in context " + lContext, e);
}
}
/**
* Instantiate the colorInfo object so that the colors can be read in from
* the colorInfo.xml file and retrieved from localization
*
* @return
*/
public static SiteColorInformation getSiteColorInformation() {
if (colorInfo == null) {
PathManager pm = (PathManager) PathManagerFactory.getPathManager();
Map<LocalizationLevel, LocalizationFile> files = pm
.getTieredLocalizationFile(LocalizationType.CAVE_STATIC,
"collaboration" + File.separator + "colorInfo.xml");
LocalizationLevel[] levels = LocalizationLevel.values();
for (int i = levels.length - 1; i >= 0 && colorInfo == null; --i) {
LocalizationLevel level = levels[i];
if (level == LocalizationLevel.SITE
|| level == LocalizationLevel.USER) {
LocalizationFile file = files.get(level);
if (file != null) {
InputStream in = null;
try {
in = file.openInputStream();
JAXBContext context = JAXBContext
.newInstance(SiteColorInformation.class);
Unmarshaller unmarshaller = context
.createUnmarshaller();
colorInfo = (SiteColorInformation) unmarshaller
.unmarshal(in);
} catch (Exception e) {
Activator.statusHandler.error(
"Unable to read color information from file: "
+ file.getName() + " in level "
+ level, e);
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
Activator.statusHandler.error(
"Problem closing color information file: "
+ file.getName(), e);
}
}
}
}
}
}
return colorInfo;
}
/**
* @return list of colors from site information config
*/
public static List<SiteColor> getSiteColors() {
SiteColorInformation colorInfo = getSiteColorInformation();
if (colorInfo != null) {
return getSiteColorInformation().getColors();
} else {
return null;
}
}
}

View file

@ -1,173 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.collaboration.ui;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.swt.graphics.RGB;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 16, 2012 mnash Initial creation
*
* </pre>
*
* @author mnash
* @version 1.0
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class SiteColorInformation {
@XmlElement
List<SiteColor> colors;
/**
* @return the colors
*/
public List<SiteColor> getColors() {
return colors;
}
/**
* @param colors
* the colors to set
*/
public void setColors(List<SiteColor> colors) {
this.colors = colors;
}
@XmlAccessorType(XmlAccessType.NONE)
public static class SiteColor {
@XmlAttribute
private String site;
@XmlAttribute
private int red;
@XmlAttribute
private int green;
@XmlAttribute
private int blue;
public SiteColor() {
}
/**
* @return the site
*/
public String getSite() {
return site;
}
/**
* @param site
* the site to set
*/
public void setSite(String site) {
this.site = site;
}
/**
* @return the red
*/
public int getRed() {
return red;
}
/**
* @param red
* the red to set
*/
public void setRed(int red) {
this.red = red;
}
/**
* @return the green
*/
public int getGreen() {
return green;
}
/**
* @param green
* the green to set
*/
public void setGreen(int green) {
this.green = green;
}
/**
* @return the blue
*/
public int getBlue() {
return blue;
}
/**
* @param blue
* the blue to set
*/
public void setBlue(int blue) {
this.blue = blue;
}
public RGB getColor() {
return new RGB(red, green, blue);
}
public void setColor(RGB rgb) {
red = rgb.red;
green = rgb.green;
blue = rgb.blue;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof SiteColor == false) {
return false;
} else {
return this.getSite().equals(((SiteColor) obj).getSite());
}
}
}
}

View file

@ -19,25 +19,12 @@
**/ **/
package com.raytheon.uf.viz.collaboration.ui; package com.raytheon.uf.viz.collaboration.ui;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.swing.plaf.synth.ColorType; import javax.swing.plaf.synth.ColorType;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.RGB;
import com.raytheon.uf.common.localization.IPathManager; import com.raytheon.uf.common.localization.IPathManager;
import com.raytheon.uf.common.localization.LocalizationContext; import com.raytheon.uf.viz.collaboration.ui.ColorInfoMap.ColorInfo;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel;
import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType;
import com.raytheon.uf.common.localization.LocalizationFile;
import com.raytheon.uf.common.localization.PathManager;
import com.raytheon.uf.common.localization.PathManagerFactory;
import com.raytheon.uf.viz.collaboration.ui.UserColorInformation.UserColor;
/** /**
* User coloring configuration manager * User coloring configuration manager
@ -48,106 +35,53 @@ import com.raytheon.uf.viz.collaboration.ui.UserColorInformation.UserColor;
* *
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Nov 13, 2014 3709 mapeters Initial creation * Nov 13, 2014 3709 mapeters Initial creation.
* Nov 26, 2014 3709 mapeters Abstracted out code to {@link AbstractColorConfigManager}.
* *
* </pre> * </pre>
* *
* @author mapeters * @author mapeters
* @version 1.0 * @version 1.0
*/ */
public class UserColorConfigManager { public class UserColorConfigManager extends AbstractColorConfigManager {
private static UserColorInformation colorInfo; private static final String FILE_PATH = "collaboration"
+ IPathManager.SEPARATOR + "userColorInfo.xml";
private UserColorConfigManager() { private static ColorInfoMap colorInfoMap;
}
/** /**
* Set and store the color type of the given user to be the given rgb. If * Set and store the color type of the given user to be the given rgb.
* creating new {@link UserColor} and setting background, set foreground to
* defaultForeground to prevent it from incorrectly defaulting.
* *
* @param user * @param user
* @param type * @param type
* @param rgb * @param rgb
* @param defaultForeground * @param defaultForeground
*/ */
public synchronized static void setColorForUser(String user, @Override
public synchronized void setColor(String user,
ColorType type, RGB rgb, RGB defaultForeground) { ColorType type, RGB rgb, RGB defaultForeground) {
if (colorInfo == null) { super.setColor(user, type, rgb, defaultForeground, FILE_PATH);
colorInfo = new UserColorInformation();
}
Map<String, UserColor> colors = colorInfo.getColors();
if (colors == null) {
colorInfo.setColors(new HashMap<String, UserColor>());
colors = colorInfo.getColors();
}
UserColor userColor = colors.get(user);
if (userColor != null) {
userColor.setColor(type, rgb, null);
} else {
UserColor color = new UserColor();
color.setColor(type, rgb, defaultForeground);
colors.put(user, color);
}
IPathManager pathMgr = PathManagerFactory.getPathManager();
LocalizationContext lContext = pathMgr.getContext(
LocalizationType.CAVE_STATIC, LocalizationLevel.USER);
LocalizationFile file = pathMgr.getLocalizationFile(lContext,
"collaboration" + IPathManager.SEPARATOR + "userColorInfo.xml");
try {
JAXBContext context = JAXBContext
.newInstance(UserColorInformation.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
new Boolean(true));
marshaller.marshal(colorInfo, file.getFile());
file.save();
} catch (Exception e) {
Activator.statusHandler.error(
"Unable to write color information to file: "
+ file.getName() + " in context " + lContext, e);
}
} }
/** /**
* Get the {@link UserColor} for the given user from memory. * Get the {@link ColorInfo} for the given user from memory.
* *
* @param user * @param user
* @return * @return
*/ */
public synchronized static UserColor getColorForUser(String user) { @Override
if(colorInfo == null) { public synchronized ColorInfo getColor(String user) {
IPathManager pm = (PathManager) PathManagerFactory.getPathManager(); return super.getColor(user, FILE_PATH);
LocalizationContext locContext = pm.getContext( }
LocalizationType.CAVE_STATIC, LocalizationLevel.USER);
LocalizationFile file = pm.getLocalizationFile(locContext,
"collaboration" + IPathManager.SEPARATOR
+ "userColorInfo.xml");
if (file != null && file.exists()) { @Override
try (InputStream in = file.openInputStream()) { protected ColorInfoMap getColorInfoMap() {
JAXBContext context = JAXBContext return colorInfoMap;
.newInstance(UserColorInformation.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
colorInfo = (UserColorInformation) unmarshaller
.unmarshal(in);
} catch (Exception e) {
Activator.statusHandler.error(
"Unable to read color information from file: "
+ file.getName() + " in level "
+ LocalizationLevel.USER, e);
} }
}
} @Override
if(colorInfo != null) { protected void setColorInfoMap(ColorInfoMap colorInfoMap) {
Map<String, UserColor> colors = colorInfo.getColors(); UserColorConfigManager.colorInfoMap = colorInfoMap;
if (colors != null) {
return colors.get(user);
}
}
return null;
} }
} }

View file

@ -97,6 +97,7 @@ import com.raytheon.viz.ui.views.CaveFloatingView;
* Oct 14, 2014 3709 mapeters Support changing foreground/background color. * Oct 14, 2014 3709 mapeters Support changing foreground/background color.
* Nov 14, 2014 3709 mapeters Changing foreground/background colors no longer * Nov 14, 2014 3709 mapeters Changing foreground/background colors no longer
* implemented here, added messagesTextMenuMgr. * implemented here, added messagesTextMenuMgr.
* Nov 26, 2014 3709 mapeters Added {@link #getColorFromRGB()}.
* </pre> * </pre>
* *
* @author rferrel * @author rferrel
@ -151,9 +152,9 @@ public abstract class AbstractSessionView<T extends IUser> extends
protected abstract void setMessageLabel(Composite comp); protected abstract void setMessageLabel(Composite comp);
public AbstractSessionView() { public AbstractSessionView() {
imageMap = new HashMap<String, Image>(); imageMap = new HashMap<>();
fonts = new HashMap<String, Font>(); fonts = new HashMap<>();
colors = new HashMap<RGB, Color>(); colors = new HashMap<>();
} }
protected void initComponents(Composite parent) { protected void initComponents(Composite parent) {
@ -402,15 +403,10 @@ public abstract class AbstractSessionView<T extends IUser> extends
RGB rgb = new RGB(keyword.getRed(), keyword RGB rgb = new RGB(keyword.getRed(), keyword
.getGreen(), keyword.getBlue()); .getGreen(), keyword.getBlue());
Color color = null;
// using the stored colors so we don't leak // using the stored colors so we don't leak
if (colors.containsKey(rgb)) { Color color = getColorFromRGB(rgb);
color = colors.get(rgb);
} else {
color = new Color(Display.getCurrent(),
rgb);
colors.put(rgb, color);
}
TextStyle style = new TextStyle(font, TextStyle style = new TextStyle(font,
color, null); color, null);
StyleRange keywordRange = new StyleRange( StyleRange keywordRange = new StyleRange(
@ -664,4 +660,18 @@ public abstract class AbstractSessionView<T extends IUser> extends
}); });
} }
/**
* Get corresponding Color from map using RGB
*
* @param rgb
* @return
*/
protected Color getColorFromRGB(RGB rgb) {
Color color = colors.get(rgb);
if (color == null) {
color = new Color(Display.getCurrent(), rgb);
colors.put(rgb, color);
}
return color;
}
} }

View file

@ -22,9 +22,7 @@ package com.raytheon.uf.viz.collaboration.ui.session;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.swing.plaf.synth.ColorType; import javax.swing.plaf.synth.ColorType;
@ -55,8 +53,8 @@ import com.raytheon.uf.viz.collaboration.comm.provider.user.RosterItem;
import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId; import com.raytheon.uf.viz.collaboration.comm.provider.user.UserId;
import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueParticipant; import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueParticipant;
import com.raytheon.uf.viz.collaboration.ui.Activator; import com.raytheon.uf.viz.collaboration.ui.Activator;
import com.raytheon.uf.viz.collaboration.ui.ColorInfoMap.ColorInfo;
import com.raytheon.uf.viz.collaboration.ui.UserColorConfigManager; import com.raytheon.uf.viz.collaboration.ui.UserColorConfigManager;
import com.raytheon.uf.viz.collaboration.ui.UserColorInformation.UserColor;
import com.raytheon.uf.viz.collaboration.ui.actions.PrintLogActionContributionItem; import com.raytheon.uf.viz.collaboration.ui.actions.PrintLogActionContributionItem;
import com.raytheon.uf.viz.collaboration.ui.notifier.NotifierTask; import com.raytheon.uf.viz.collaboration.ui.notifier.NotifierTask;
import com.raytheon.uf.viz.collaboration.ui.notifier.NotifierTools; import com.raytheon.uf.viz.collaboration.ui.notifier.NotifierTools;
@ -79,6 +77,7 @@ import com.raytheon.uf.viz.core.sounds.SoundUtil;
* Jun 17, 2014 3078 bclement changed peer type to IUser * Jun 17, 2014 3078 bclement changed peer type to IUser
* Nov 14, 2014 3709 mapeters support foregound/background color * Nov 14, 2014 3709 mapeters support foregound/background color
* settings for each user * settings for each user
* Nov 26, 2014 3709 mapeters add colorConfigManager, use parent's colors map
* *
* </pre> * </pre>
* *
@ -103,12 +102,12 @@ public class PeerToPeerView extends AbstractSessionView<IUser> implements
private static final Color BLACK = Display.getCurrent().getSystemColor( private static final Color BLACK = Display.getCurrent().getSystemColor(
SWT.COLOR_BLACK); SWT.COLOR_BLACK);
private Map<RGB, Color> rgbToColor = new HashMap<>();
private IUser peer; private IUser peer;
private boolean online = true; private boolean online = true;
private static UserColorConfigManager colorConfigManager;
public PeerToPeerView() { public PeerToPeerView() {
super(); super();
CollaborationConnection.getConnection().registerEventHandler(this); CollaborationConnection.getConnection().registerEventHandler(this);
@ -128,10 +127,6 @@ public class PeerToPeerView extends AbstractSessionView<IUser> implements
conn.unregisterEventHandler(this); conn.unregisterEventHandler(this);
} }
super.dispose(); super.dispose();
for (Color color : rgbToColor.values()) {
color.dispose();
}
} }
/* /*
@ -238,7 +233,7 @@ public class PeerToPeerView extends AbstractSessionView<IUser> implements
if (userId != null) { if (userId != null) {
// get user colors from config manager // get user colors from config manager
UserColor userColor = UserColorConfigManager.getColorForUser(userId ColorInfo userColor = colorConfigManager.getColor(userId
.getName()); .getName());
if (userColor != null) { if (userColor != null) {
fgColor = getColorFromRGB(userColor fgColor = getColorFromRGB(userColor
@ -266,21 +261,6 @@ public class PeerToPeerView extends AbstractSessionView<IUser> implements
messagesText.setTopIndex(lineNumber); messagesText.setTopIndex(lineNumber);
} }
/**
* Get corresponding Color from map using RGB
*
* @param rgb
* @return
*/
private Color getColorFromRGB(RGB rgb) {
Color color = rgbToColor.get(rgb);
if (color == null) {
color = new Color(Display.getCurrent(), rgb);
rgbToColor.put(rgb, color);
}
return color;
}
@Override @Override
protected String getSessionImageName() { protected String getSessionImageName() {
return PEER_TO_PEER_IMAGE_NAME; return PEER_TO_PEER_IMAGE_NAME;
@ -344,6 +324,7 @@ public class PeerToPeerView extends AbstractSessionView<IUser> implements
@Override @Override
protected void initComponents(Composite parent) { protected void initComponents(Composite parent) {
super.initComponents(parent); super.initComponents(parent);
colorConfigManager = new UserColorConfigManager();
// unfortunately this code cannot be a part of createToolbarButton // unfortunately this code cannot be a part of createToolbarButton
// because I cannot instantiate the ACI until after the messagesText // because I cannot instantiate the ACI until after the messagesText
@ -424,16 +405,18 @@ public class PeerToPeerView extends AbstractSessionView<IUser> implements
*/ */
private class ChangeUserColorAction extends Action { private class ChangeUserColorAction extends Action {
ColorType type; private ColorType type;
String user; private String user;
boolean me; private boolean me;
public ChangeUserColorAction(ColorType type, String user, boolean me) { private ChangeUserColorAction(ColorType type, String user,
super("Change " + (me ? "Your " : (user + "'s ")) + type.toString() boolean me) {
+ " Color...", IconUtil.getImageDescriptor(Activator super("Change " + (me ? "Your " : (user + "'s "))
.getDefault().getBundle(), "change_color.gif")); + type.toString() + " Color...", IconUtil
.getImageDescriptor(Activator.getDefault().getBundle(),
"change_color.gif"));
this.type = type; this.type = type;
this.user = user; this.user = user;
this.me = me; this.me = me;
@ -443,24 +426,21 @@ public class PeerToPeerView extends AbstractSessionView<IUser> implements
public void run() { public void run() {
ColorDialog dialog = new ColorDialog(Display.getCurrent() ColorDialog dialog = new ColorDialog(Display.getCurrent()
.getActiveShell()); .getActiveShell());
RGB defaultForeground = null; RGB defaultForeground = me ? DEFAULT_USER_FOREGROUND_COLOR.getRGB()
UserColor userColor = UserColorConfigManager.getColorForUser(user);
if (userColor != null) {
dialog.setRGB(userColor.getColor(type));
} else {
defaultForeground = me ? DEFAULT_USER_FOREGROUND_COLOR.getRGB()
: DEFAULT_PEER_FOREGROUND_COLOR.getRGB(); : DEFAULT_PEER_FOREGROUND_COLOR.getRGB();
if (type == ColorType.FOREGROUND) { ColorInfo colorInfo = colorConfigManager.getColor(user);
if (colorInfo != null) {
dialog.setRGB(colorInfo.getColor(type));
} else if (type == ColorType.FOREGROUND) {
/* /*
* set the dialog to display default foreground color as * set the dialog to display default foreground color as
* currently selected * currently selected
*/ */
dialog.setRGB(defaultForeground); dialog.setRGB(defaultForeground);
} }
}
RGB rgb = dialog.open(); RGB rgb = dialog.open();
if (rgb != null) { if (rgb != null) {
UserColorConfigManager.setColorForUser(user, type, rgb, colorConfigManager.setColor(user, type, rgb,
defaultForeground); defaultForeground);
} }
} }

View file

@ -19,10 +19,11 @@
**/ **/
package com.raytheon.uf.viz.collaboration.ui.session; package com.raytheon.uf.viz.collaboration.ui.session;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import javax.swing.plaf.synth.ColorType;
import org.eclipse.jface.action.Action; import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.MenuManager;
@ -31,12 +32,12 @@ import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Display;
import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Presence;
import org.osgi.framework.Bundle;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.raytheon.uf.viz.collaboration.comm.identity.IMessage; import com.raytheon.uf.viz.collaboration.comm.identity.IMessage;
@ -44,9 +45,8 @@ import com.raytheon.uf.viz.collaboration.comm.identity.info.SiteConfigInformatio
import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationConnection; import com.raytheon.uf.viz.collaboration.comm.provider.connection.CollaborationConnection;
import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueParticipant; import com.raytheon.uf.viz.collaboration.comm.provider.user.VenueParticipant;
import com.raytheon.uf.viz.collaboration.ui.Activator; import com.raytheon.uf.viz.collaboration.ui.Activator;
import com.raytheon.uf.viz.collaboration.ui.SiteColorConfigManager; import com.raytheon.uf.viz.collaboration.ui.ColorInfoMap.ColorInfo;
import com.raytheon.uf.viz.collaboration.ui.SiteColorInformation; import com.raytheon.uf.viz.collaboration.ui.FeedColorConfigManager;
import com.raytheon.uf.viz.collaboration.ui.SiteColorInformation.SiteColor;
import com.raytheon.uf.viz.collaboration.ui.SiteConfigurationManager; import com.raytheon.uf.viz.collaboration.ui.SiteConfigurationManager;
import com.raytheon.uf.viz.collaboration.ui.prefs.CollabPrefConstants; import com.raytheon.uf.viz.collaboration.ui.prefs.CollabPrefConstants;
import com.raytheon.uf.viz.core.icon.IconUtil; import com.raytheon.uf.viz.core.icon.IconUtil;
@ -77,6 +77,7 @@ import com.raytheon.uf.viz.core.icon.IconUtil;
* Apr 01, 2014 2938 mpduff Update logic for site and role changes. * Apr 01, 2014 2938 mpduff Update logic for site and role changes.
* Apr 22, 2014 3038 bclement added initialized flag to differentiate between roster population and new joins * Apr 22, 2014 3038 bclement added initialized flag to differentiate between roster population and new joins
* Oct 10, 2014 3708 bclement SiteConfigurationManager refactor * Oct 10, 2014 3708 bclement SiteConfigurationManager refactor
* Nov 26, 2014 3709 mapeters support foreground/background color preferences for each site
* *
* </pre> * </pre>
* *
@ -88,15 +89,17 @@ public class SessionFeedView extends SessionView {
public static final String ID = "com.raytheon.uf.viz.collaboration.SessionFeedView"; public static final String ID = "com.raytheon.uf.viz.collaboration.SessionFeedView";
private Action colorChangeAction;
private Action autoJoinAction; private Action autoJoinAction;
private Action userAddSiteAction; private Action userAddSiteAction;
private Action userRemoveSiteAction; private Action userRemoveSiteAction;
private List<SiteColor> colors; private Action bgColorChangeAction;
private Action fgColorChangeAction;
private static FeedColorConfigManager colorConfigManager;
private String actingSite; private String actingSite;
@ -127,14 +130,8 @@ public class SessionFeedView extends SessionView {
@Override @Override
protected void initComponents(Composite parent) { protected void initComponents(Composite parent) {
super.initComponents(parent); super.initComponents(parent);
colors = SiteColorConfigManager.getSiteColors();
if (colors != null) { colorConfigManager = new FeedColorConfigManager();
for (VenueParticipant user : session.getVenue().getParticipants()) {
setColorForSite(user);
}
} else {
colors = new ArrayList<SiteColor>();
}
usersTable.refresh(); usersTable.refresh();
} }
@ -152,37 +149,10 @@ public class SessionFeedView extends SessionView {
@Override @Override
protected void createActions() { protected void createActions() {
super.createActions(); super.createActions();
Bundle bundle = Activator.getDefault().getBundle();
colorChangeAction = new Action("Change Site Color...",
IconUtil.getImageDescriptor(bundle, "change_color.gif")) {
@Override
public void run() {
ColorDialog dlg = new ColorDialog(Display.getCurrent()
.getActiveShell());
RGB rgb = dlg.open();
if (rgb != null) {
/*
* get the selected entry so we know what site to change the
* color for
*/
String site = getSelectedSite();
replaceSiteColor(site.toString(), rgb); bgColorChangeAction = new ChangeSiteColorAction(ColorType.BACKGROUND);
/*
* loop through all the entries in the list so we can set
* the color for all sites corresponding to "selectedSite"
*/
if (site != null) {
for (VenueParticipant user : session.getVenue()
.getParticipants()) {
setColorForSite(user);
}
}
usersTable.refresh(); fgColorChangeAction = new ChangeSiteColorAction(ColorType.FOREGROUND);
}
}
};
autoJoinAction = new Action(CollabPrefConstants.AUTO_JOIN, SWT.TOGGLE) { autoJoinAction = new Action(CollabPrefConstants.AUTO_JOIN, SWT.TOGGLE) {
@Override @Override
@ -238,7 +208,8 @@ public class SessionFeedView extends SessionView {
@Override @Override
protected void fillContextMenu(IMenuManager manager) { protected void fillContextMenu(IMenuManager manager) {
super.fillContextMenu(manager); super.fillContextMenu(manager);
manager.add(colorChangeAction); manager.add(bgColorChangeAction);
manager.add(fgColorChangeAction);
String site = getSelectedSite(); String site = getSelectedSite();
if (!SiteConfigurationManager.isVisible(actingSite, site)) { if (!SiteConfigurationManager.isVisible(actingSite, site)) {
userAddSiteAction userAddSiteAction
@ -299,14 +270,57 @@ public class SessionFeedView extends SessionView {
} }
} }
/**
* Get site's foreground/background colors from colorConfigManager to pass
* to parent method.
*
* @param sb
* @param offset
* @param name
* @param userId
* @param ranges
* @param fgColor
* @param bgColor
* @param subject
*/
@Override @Override
protected void styleAndAppendText(StringBuilder sb, int offset, protected void styleAndAppendText(StringBuilder sb, int offset,
String name, VenueParticipant userId, String subject, String name, VenueParticipant userId, List<StyleRange> ranges,
List<StyleRange> ranges) { Color fgColor, Color bgColor, String subject) {
String site = null;
if (subject != null) { if (subject != null) {
setColorForSite(userId, subject); site = subject;
} else if (userId != null) {
Presence presence = session.getVenue().getPresence(userId);
if (presence != null) {
site = String.valueOf(presence
.getProperty(SiteConfigInformation.SITE_NAME));
} }
super.styleAndAppendText(sb, offset, name, userId, subject, ranges); }
if (site != null) {
ColorInfo siteColor = colorConfigManager.getColor(site);
if (siteColor != null) {
if (siteColor.isForegroundSet()) {
fgColor = getColorFromRGB(siteColor
.getColor(ColorType.FOREGROUND));
}
bgColor = getColorFromRGB(siteColor
.getColor(ColorType.BACKGROUND));
}
}
super.styleAndAppendText(sb, offset, name, userId, ranges, fgColor,
bgColor, subject);
}
/**
* Get the selected user
*
* @return
*/
private VenueParticipant getSelectedParticipant() {
IStructuredSelection selection = (IStructuredSelection) usersTable
.getSelection();
return (VenueParticipant) selection.getFirstElement();
} }
/** /**
@ -316,77 +330,12 @@ public class SessionFeedView extends SessionView {
* @return * @return
*/ */
private String getSelectedSite() { private String getSelectedSite() {
IStructuredSelection selection = (IStructuredSelection) usersTable VenueParticipant selectedEntry = getSelectedParticipant();
.getSelection();
VenueParticipant selectedEntry = (VenueParticipant) selection
.getFirstElement();
Presence pres = session.getVenue().getPresence(selectedEntry); Presence pres = session.getVenue().getPresence(selectedEntry);
Object selectedSite = pres.getProperty(SiteConfigInformation.SITE_NAME); Object selectedSite = pres.getProperty(SiteConfigInformation.SITE_NAME);
return selectedSite == null ? "" : selectedSite.toString(); return selectedSite == null ? "" : selectedSite.toString();
} }
/**
* Takes an IRosterEntry and sets their color in the SessionColorManager for
* the site that they belong to, calls into
* setColorForSite(UserId,IPresence)
*
* @param user
*/
private void setColorForSite(VenueParticipant user) {
Presence presence = session.getVenue().getPresence(user);
setColorForSite(user, presence);
}
/**
* Does the work for setting the color for each user that belongs to a site
*
* @param id
* @param presence
*/
private void setColorForSite(VenueParticipant id, Presence presence) {
if (presence == null) {
return;
}
Object site = presence.getProperty(SiteConfigInformation.SITE_NAME);
if (site != null) {
setColorForSite(id, site.toString());
}
}
private void setColorForSite(VenueParticipant id, String site) {
SiteColor siteColor = new SiteColor();
siteColor.setSite(site.toString());
int index = colors.indexOf(siteColor);
if (index >= 0) {
SiteColor actualColor = colors.get(index);
colorManager.setColorForUser(id, actualColor.getColor());
}
}
/**
* Removes the color from the map if the site exists in the list
*
* @param site
* @param rgb
*/
private void replaceSiteColor(String site, RGB rgb) {
// now that the users have their color set, we need to add
// to the list that has the site color information
SiteColor color = new SiteColor();
color.setSite(site);
color.setColor(rgb);
boolean exists = false;
for (SiteColor col : SessionFeedView.this.colors) {
if (col.getSite().equals(site)) {
exists = true;
}
}
if (exists) {
SessionFeedView.this.colors.remove(color);
}
SessionFeedView.this.colors.add(color);
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -450,11 +399,6 @@ public class SessionFeedView extends SessionView {
} }
} }
/*
* Presence changed is triggered for participant's site being changed.
* Need to set the color to handle this situation.
*/
setColorForSite(participant, presence);
refreshParticipantList(); refreshParticipantList();
} }
@ -541,16 +485,44 @@ public class SessionFeedView extends SessionView {
} }
/* /*
* (non-Javadoc) * action for changing foreground/background color for a selected site
*
* @see com.raytheon.uf.viz.collaboration.ui.session.SessionView#dispose()
*/ */
private class ChangeSiteColorAction extends Action {
private ColorType type;
private ChangeSiteColorAction(ColorType type) {
super("Change Site " + type.toString() + " Color...", IconUtil
.getImageDescriptor(Activator.getDefault().getBundle(),
"change_color.gif"));
this.type = type;
}
@Override @Override
public void dispose() { public void run() {
super.dispose(); ColorDialog dialog = new ColorDialog(Display.getCurrent()
SiteColorInformation information = new SiteColorInformation(); .getActiveShell());
information.setColors(this.colors); RGB defaultForeground = colorManager
// TODO should color config be written more often? .getColorForUser(getSelectedParticipant());
SiteColorConfigManager.writeSiteColorInformation(information); String site = getSelectedSite();
ColorInfo colorInfo = colorConfigManager.getColor(site);
if (colorInfo != null
&& (type != ColorType.FOREGROUND || colorInfo.isForegroundSet())) {
/*
* don't set dialog from colorInfo if null or type is foreground
* and foreground hasn't been set (use default)
*/
dialog.setRGB(colorInfo.getColor(type));
} else if (type == ColorType.FOREGROUND) {
dialog.setRGB(defaultForeground);
}
RGB rgb = dialog.open();
if (rgb != null) {
colorConfigManager.setColor(site, type, rgb,
defaultForeground);
}
usersTable.refresh();
}
} }
} }

View file

@ -23,9 +23,7 @@ package com.raytheon.uf.viz.collaboration.ui.session;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuListener;
@ -115,6 +113,8 @@ import com.raytheon.uf.viz.core.sounds.SoundUtil;
* negative weights - set to zero if negative. * negative weights - set to zero if negative.
* Jun 17, 2014 3078 bclement added private chat to menu and double click * Jun 17, 2014 3078 bclement added private chat to menu and double click
* Jul 03, 2014 3342 bclement added count to participants label * Jul 03, 2014 3342 bclement added count to participants label
* Nov 26, 2014 3709 mapeters added styleAndAppendText() taking fg and bg colors,
* use parent's colors map.
* *
* </pre> * </pre>
* *
@ -148,8 +148,6 @@ public class SessionView extends AbstractSessionView<VenueParticipant>
protected SessionColorManager colorManager; protected SessionColorManager colorManager;
protected Map<RGB, Color> mappedColors;
public SessionView() { public SessionView() {
super(); super();
} }
@ -159,7 +157,6 @@ public class SessionView extends AbstractSessionView<VenueParticipant>
super.createPartControl(parent); super.createPartControl(parent);
createActions(); createActions();
createContextMenu(); createContextMenu();
mappedColors = new HashMap<RGB, Color>();
} }
/* /*
@ -408,12 +405,6 @@ public class SessionView extends AbstractSessionView<VenueParticipant>
disposeArrow(downArrow); disposeArrow(downArrow);
disposeArrow(rightArrow); disposeArrow(rightArrow);
if (mappedColors != null) {
for (Color col : mappedColors.values()) {
col.dispose();
}
mappedColors.clear();
}
if (colorManager != null) { if (colorManager != null) {
colorManager.clearColors(); colorManager.clearColors();
} }
@ -471,12 +462,8 @@ public class SessionView extends AbstractSessionView<VenueParticipant>
String name, VenueParticipant userId, String subject, String name, VenueParticipant userId, String subject,
List<StyleRange> ranges) { List<StyleRange> ranges) {
RGB rgb = colorManager.getColorForUser(userId); RGB rgb = colorManager.getColorForUser(userId);
if (mappedColors.get(rgb) == null) {
Color col = new Color(Display.getCurrent(), rgb);
mappedColors.put(rgb, col);
}
styleAndAppendText(sb, offset, name, userId, ranges, styleAndAppendText(sb, offset, name, userId, ranges,
mappedColors.get(rgb)); getColorFromRGB(rgb), null, subject);
} }
/* /*
@ -491,22 +478,26 @@ public class SessionView extends AbstractSessionView<VenueParticipant>
protected void styleAndAppendText(StringBuilder sb, int offset, protected void styleAndAppendText(StringBuilder sb, int offset,
String name, VenueParticipant userId, List<StyleRange> ranges, String name, VenueParticipant userId, List<StyleRange> ranges,
Color color) { Color color) {
StyleRange range = new StyleRange(messagesText.getCharCount(), offset, styleAndAppendText(sb, offset, name, userId, ranges, color, null, null);
color, null, SWT.NORMAL);
ranges.add(range);
if (userId != null) {
range = new StyleRange(messagesText.getCharCount() + offset,
name.length() + 1, color, null, SWT.BOLD);
} else {
range = new StyleRange(messagesText.getCharCount() + offset,
sb.length() - offset, color, null, SWT.BOLD);
} }
protected void styleAndAppendText(StringBuilder sb, int offset,
String name, VenueParticipant userId, List<StyleRange> ranges,
Color fgColor, Color bgColor, String subject) {
StyleRange range = new StyleRange(messagesText.getCharCount(),
sb.length(), fgColor, null, SWT.NORMAL);
ranges.add(range);
range = new StyleRange(messagesText.getCharCount() + offset,
(userId != null ? name.length() + 1 : sb.length() - offset),
fgColor, null, SWT.BOLD);
ranges.add(range); ranges.add(range);
messagesText.append(sb.toString()); messagesText.append(sb.toString());
for (StyleRange newRange : ranges) { for (StyleRange newRange : ranges) {
messagesText.setStyleRange(newRange); messagesText.setStyleRange(newRange);
} }
messagesText.setTopIndex(messagesText.getLineCount() - 1); int lineNumber = messagesText.getLineCount() - 1;
messagesText.setLineBackground(lineNumber, 1, bgColor);
messagesText.setTopIndex(lineNumber);
} }
public String getRoom() { public String getRoom() {