blob: 3ba5343d7a325ac992aeb85b85cffa281fdf4991 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2005, 2014 IBM Corporation, Ericsson
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM - Initial API and implementation
* Bernd Hufmann - Updated for TMF
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.views.uml2sd.preferences;
import java.util.Arrays;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Map;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IColor;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IFont;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.impl.ColorImpl;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.impl.FontImpl;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.util.Messages;
/**
* This is the Sequence Diagram preference handler. This class is responsible
* for accessing the current user preferences selection This class also provider
* getters for each modifiable preferences.
*
* @version 1.0
* @author sveyrier
*/
public class SDViewPref implements ISDPreferences, IPropertyChangeListener {
private static final RGB DEFAULT_TIME_COMP_RGB = new RGB(218, 232, 238);
private static final RGB DEFAULT_RGB = new RGB(134, 176, 212);
private static final RGB DEFAULT_LIFELINE_HEADER_RGB = new RGB(129, 127, 137);
private static final RGB DEFAULT_FRAME_RGB = new RGB(0, 0, 0);
private static final RGB DEFAULT_LIFELINE_RGB = new RGB(129, 129, 129);
private static final RGB FOREGROUND_LIFELINE_RGB = new RGB(129, 129, 129);
private static final RGB FOREGROUND_FRAME_RGB = new RGB(81, 153, 200);
private static final RGB FOREGROUND_LIFELINE_HEADER_RGB = new RGB(129, 127, 137);
private static final RGB FOREGROUND_RGB = new RGB(134, 176, 212);
private static final RGB BACKGROUND_DEFAULT_RGB = new RGB(255, 255, 255);
private static final RGB BACKGROUND_LIFELINE_HEADER_RGB = new RGB(245, 244, 244);
private static final RGB BACKGROUND_LIFELINE_RGB = new RGB(220, 220, 220);
private static final RGB BACKGROUND_FRAME_RGB = new RGB(201, 222, 233);
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
/**
* Postfix string for background color property
*/
public static final String BACK_COLOR_POSTFIX = "_BACK_COLOR";//$NON-NLS-1$
/**
* Postfix string for foreground color property
*/
public static final String FORE_COLOR_POSTFIX = "_FORE_COLOR";//$NON-NLS-1$
/**
* Postfix string for text color property
*/
public static final String TEXT_COLOR_POSTFIX = "_TEXT_COLOR";//$NON-NLS-1$
/**
* Array of preference names
*/
private static final String[] FONT_LIST = { PREF_LIFELINE, PREF_EXEC, PREF_SYNC_MESS, PREF_SYNC_MESS_RET, PREF_ASYNC_MESS, PREF_ASYNC_MESS_RET, PREF_FRAME, PREF_LIFELINE_HEADER, PREF_FRAME_NAME };
/**
* A 2nd array of preference names
*/
private static final String[] FONT_LIST2 = { Messages.SequenceDiagram_Lifeline, Messages.SequenceDiagram_ExecutionOccurrence, Messages.SequenceDiagram_SyncMessage, Messages.SequenceDiagram_SyncMessageReturn,
Messages.SequenceDiagram_AsyncMessage, Messages.SequenceDiagram_AsyncMessageReturn, Messages.SequenceDiagram_Frame, Messages.SequenceDiagram_LifelineHeader, Messages.SequenceDiagram_FrameTitle };
/**
* Array of background color preference names
*/
private static final String[] PREF_BACK_COLOR_LIST = { PREF_LIFELINE, PREF_EXEC, PREF_FRAME, PREF_LIFELINE_HEADER, PREF_FRAME_NAME };
/**
* Array of foreground color preference names
*/
private static final String[] PREF_FORE_COLOR_LIST = { PREF_LIFELINE, PREF_EXEC, PREF_SYNC_MESS, PREF_SYNC_MESS_RET, PREF_ASYNC_MESS, PREF_ASYNC_MESS_RET, PREF_FRAME, PREF_LIFELINE_HEADER, PREF_FRAME_NAME };
/**
* Array of text color preference names
*/
private static final String[] PREF_TEXT_COLOR_LIST = { PREF_LIFELINE, PREF_SYNC_MESS, PREF_SYNC_MESS_RET, PREF_ASYNC_MESS, PREF_ASYNC_MESS_RET, PREF_LIFELINE_HEADER, PREF_FRAME_NAME };
/**
* Temporary tag
*/
public static final String TEMP_TAG = "_TEMP";//$NON-NLS-1$
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The sequence diagram preferences singleton instance
*/
private static SDViewPref fHandle = null;
/**
* Hashtable for font preferences
*/
private Map<String, IFont> fFontPref;
/**
* Hashtable for foreground color preferences
*/
private Map<String, IColor> fForeColorPref;
/**
* Hashtable for background color preferences
*/
private Map<String, IColor> fBackColorPref;
/**
* Hashtable for text color preferences
*/
private Map<String, IColor> fTextColorPref;
/**
* The reference to the preference store.
*/
private IPreferenceStore fPrefStore = null;
/**
* Color for the time compression selection
*/
private IColor fTimeCompressionSelectionColor = null;
/**
* Flag whether no focus selection or not.
*/
private boolean fNoFocusSelection = false;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Builds the Sequence Diagram preference handler: - Define the preference
* default values. - Load the currently used preferences setting
*/
protected SDViewPref() {
fPrefStore = Activator.getDefault().getPreferenceStore();
fPrefStore.setDefault(PREF_LINK_FONT, true);
fPrefStore.setDefault(PREF_EXCLUDE_EXTERNAL_TIME, true);
fPrefStore.setDefault(PREF_LIFELINE_WIDTH, 200);
fPrefStore.setDefault(PREF_USE_GRADIENT, true);
fPrefStore.setDefault(PREF_TOOLTIP, true);
fFontPref = new Hashtable<>();
fForeColorPref = new Hashtable<>();
fBackColorPref = new Hashtable<>();
fTextColorPref = new Hashtable<>();
for (int i = 0; i < FONT_LIST.length; i++) {
if (FONT_LIST[i].equals(PREF_FRAME_NAME)) {
FontData[] data = Display.getDefault().getSystemFont().getFontData();
data[0].setStyle(SWT.BOLD);
PreferenceConverter.setDefault(fPrefStore, FONT_LIST[i], data[0]);
PreferenceConverter.setDefault(fPrefStore, FONT_LIST[i] + TEMP_TAG, data[0]);
} else {
PreferenceConverter.setDefault(fPrefStore, FONT_LIST[i], Display.getDefault().getSystemFont().getFontData());
PreferenceConverter.setDefault(fPrefStore, FONT_LIST[i] + TEMP_TAG, Display.getDefault().getSystemFont().getFontData());
}
}
for (int i = 0; i < PREF_BACK_COLOR_LIST.length; i++) {
IColor color;
if ((PREF_BACK_COLOR_LIST[i].equals(PREF_EXEC)) || PREF_BACK_COLOR_LIST[i].equals(PREF_FRAME_NAME)) {
color = new ColorImpl(Display.getDefault(), BACKGROUND_FRAME_RGB);
} else if (PREF_BACK_COLOR_LIST[i].equals(PREF_LIFELINE)) {
color = new ColorImpl(Display.getDefault(), BACKGROUND_LIFELINE_RGB);
} else if (PREF_BACK_COLOR_LIST[i].equals(PREF_LIFELINE_HEADER)) {
color = new ColorImpl(Display.getDefault(), BACKGROUND_LIFELINE_HEADER_RGB);
} else {
color = new ColorImpl(Display.getDefault(), BACKGROUND_DEFAULT_RGB);
}
PreferenceConverter.setDefault(fPrefStore, PREF_BACK_COLOR_LIST[i] + BACK_COLOR_POSTFIX, ((Color) color.getColor()).getRGB());
PreferenceConverter.setDefault(fPrefStore, PREF_BACK_COLOR_LIST[i] + BACK_COLOR_POSTFIX + TEMP_TAG, ((Color) color.getColor()).getRGB());
color.dispose();
}
for (int i = 0; i < PREF_FORE_COLOR_LIST.length; i++) {
IColor color;
if (PREF_FORE_COLOR_LIST[i].equals(PREF_LIFELINE)) {
color = new ColorImpl(Display.getDefault(), FOREGROUND_LIFELINE_RGB);
} else if (PREF_FORE_COLOR_LIST[i].equals(PREF_FRAME_NAME)) {
color = new ColorImpl(Display.getDefault(), FOREGROUND_FRAME_RGB);
} else if (PREF_FORE_COLOR_LIST[i].equals(PREF_LIFELINE_HEADER)) {
color = new ColorImpl(Display.getDefault(), FOREGROUND_LIFELINE_HEADER_RGB);
} else {
color = new ColorImpl(Display.getDefault(), FOREGROUND_RGB);
}
PreferenceConverter.setDefault(fPrefStore, PREF_FORE_COLOR_LIST[i] + FORE_COLOR_POSTFIX, ((Color) color.getColor()).getRGB());
PreferenceConverter.setDefault(fPrefStore, PREF_FORE_COLOR_LIST[i] + FORE_COLOR_POSTFIX + TEMP_TAG, ((Color) color.getColor()).getRGB());
color.dispose();
}
for (int i = 0; i < PREF_TEXT_COLOR_LIST.length; i++) {
IColor color;
if (PREF_TEXT_COLOR_LIST[i].equals(PREF_LIFELINE)) {
color = new ColorImpl(Display.getDefault(), DEFAULT_LIFELINE_RGB);
} else if (PREF_TEXT_COLOR_LIST[i].equals(PREF_FRAME_NAME)) {
color = new ColorImpl(Display.getDefault(), DEFAULT_FRAME_RGB);
} else if (PREF_TEXT_COLOR_LIST[i].equals(PREF_LIFELINE_HEADER)) {
color = new ColorImpl(Display.getDefault(), DEFAULT_LIFELINE_HEADER_RGB);
} else {
color = new ColorImpl(Display.getDefault(), DEFAULT_RGB);
}
PreferenceConverter.setDefault(fPrefStore, PREF_TEXT_COLOR_LIST[i] + TEXT_COLOR_POSTFIX, ((Color) color.getColor()).getRGB());
PreferenceConverter.setDefault(fPrefStore, PREF_TEXT_COLOR_LIST[i] + TEXT_COLOR_POSTFIX + TEMP_TAG, ((Color) color.getColor()).getRGB());
color.dispose();
}
IColor color = new ColorImpl(Display.getDefault(), DEFAULT_TIME_COMP_RGB);
PreferenceConverter.setDefault(fPrefStore, PREF_TIME_COMP, ((Color) color.getColor()).getRGB());
color.dispose();
buildFontsAndColors();
fPrefStore.addPropertyChangeListener(this);
}
/**
* Returns the PreferenceStore
*
* @return the PreferenceStore
*/
public IPreferenceStore getPreferenceStore() {
return fPrefStore;
}
/**
* Apply the preferences in the preferences handler
*/
public void apply() {
buildFontsAndColors();
fPrefStore.firePropertyChangeEvent("PREFOK", null, null); //$NON-NLS-1$
}
/**
* Returns an unique instance of the Sequence Diagram preference handler
*
* @return the preference handler instance
*/
public static synchronized SDViewPref getInstance() {
if (fHandle == null) {
fHandle = new SDViewPref();
}
return fHandle;
}
@Override
public IColor getForeGroundColor(String prefName) {
if ((fForeColorPref.get(prefName + FORE_COLOR_POSTFIX) != null) && (fForeColorPref.get(prefName + FORE_COLOR_POSTFIX) instanceof ColorImpl)) {
return fForeColorPref.get(prefName + FORE_COLOR_POSTFIX);
}
return ColorImpl.getSystemColor(SWT.COLOR_BLACK);
}
@Override
public IColor getBackGroundColor(String prefName) {
if ((fBackColorPref.get(prefName + BACK_COLOR_POSTFIX) != null) && (fBackColorPref.get(prefName + BACK_COLOR_POSTFIX) instanceof ColorImpl)) {
return fBackColorPref.get(prefName + BACK_COLOR_POSTFIX);
}
return ColorImpl.getSystemColor(SWT.COLOR_WHITE);
}
@Override
public IColor getFontColor(String prefName) {
if ((fTextColorPref.get(prefName + TEXT_COLOR_POSTFIX) != null) && (fTextColorPref.get(prefName + TEXT_COLOR_POSTFIX) instanceof ColorImpl)) {
return fTextColorPref.get(prefName + TEXT_COLOR_POSTFIX);
}
return ColorImpl.getSystemColor(SWT.COLOR_BLACK);
}
@Override
public IColor getForeGroundColorSelection() {
if (fNoFocusSelection) {
return ColorImpl.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND);
}
return ColorImpl.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT);
}
@Override
public IColor getBackGroundColorSelection() {
if (fNoFocusSelection) {
return ColorImpl.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
}
return ColorImpl.getSystemColor(SWT.COLOR_LIST_SELECTION);
}
@Override
public IFont getFont(String prefName) {
if (fFontPref.get(prefName) != null) {
return fFontPref.get(prefName);
}
return FontImpl.getSystemFont();
}
/**
* Returns the SwimLane width chosen
*
* @return the SwimLane width
*/
public int getLifelineWidth() {
return fPrefStore.getInt(PREF_LIFELINE_WIDTH);
}
/**
* Returns if font linkage with zoom has been chosen
*
* @return true if checked false otherwise
*/
public boolean fontLinked() {
return fPrefStore.getBoolean(PREF_LINK_FONT);
}
/**
* Returns the tooltip enablement
*
* @return true if checked false otherwise
*/
public boolean tooltipEnabled() {
return fPrefStore.getBoolean(PREF_TOOLTIP);
}
/**
* Return true if the user do not want to take external time (basically
* found and lost messages with time) into account in the min max
* computation
*
* @return true if checked false otherwise
*/
public boolean excludeExternalTime() {
return fPrefStore.getBoolean(PREF_EXCLUDE_EXTERNAL_TIME);
}
@Override
public boolean useGradienColor() {
return fPrefStore.getBoolean(PREF_USE_GRADIENT);
}
@Override
public IColor getTimeCompressionSelectionColor() {
return fTimeCompressionSelectionColor;
}
/**
* Builds the new colors and fonts according the current user selection when
* the OK or Apply button is clicked
*/
private void buildFontsAndColors() {
Display display = Display.getDefault();
for (int i = 0; i < FONT_LIST.length; i++) {
FontData fontData = PreferenceConverter.getFontData(fPrefStore, FONT_LIST[i]);
IFont font = fFontPref.get(FONT_LIST[i]);
if (font != null) {
font.dispose();
}
fFontPref.put(FONT_LIST[i], new FontImpl(display, fontData));
}
for (int i = 0; i < PREF_BACK_COLOR_LIST.length; i++) {
RGB rgb = PreferenceConverter.getColor(fPrefStore, PREF_BACK_COLOR_LIST[i] + BACK_COLOR_POSTFIX);
IColor color = fBackColorPref.get(PREF_BACK_COLOR_LIST[i] + BACK_COLOR_POSTFIX);
if (color != null) {
color.dispose();
}
fBackColorPref.put(PREF_BACK_COLOR_LIST[i] + BACK_COLOR_POSTFIX, new ColorImpl(display, rgb.red, rgb.green, rgb.blue));
}
for (int i = 0; i < PREF_FORE_COLOR_LIST.length; i++) {
RGB rgb = PreferenceConverter.getColor(fPrefStore, PREF_FORE_COLOR_LIST[i] + FORE_COLOR_POSTFIX);
IColor color = fForeColorPref.get(PREF_FORE_COLOR_LIST[i] + FORE_COLOR_POSTFIX);
if (color != null) {
color.dispose();
}
fForeColorPref.put(PREF_FORE_COLOR_LIST[i] + FORE_COLOR_POSTFIX, new ColorImpl(display, rgb.red, rgb.green, rgb.blue));
}
for (int i = 0; i < PREF_TEXT_COLOR_LIST.length; i++) {
RGB rgb = PreferenceConverter.getColor(fPrefStore, PREF_TEXT_COLOR_LIST[i] + TEXT_COLOR_POSTFIX);
IColor color = fTextColorPref.get(PREF_TEXT_COLOR_LIST[i] + TEXT_COLOR_POSTFIX);
if (color != null) {
color.dispose();
}
fTextColorPref.put(PREF_TEXT_COLOR_LIST[i] + TEXT_COLOR_POSTFIX, new ColorImpl(display, rgb.red, rgb.green, rgb.blue));
}
RGB rgb = PreferenceConverter.getColor(fPrefStore, PREF_TIME_COMP);
if (fTimeCompressionSelectionColor != null) {
fTimeCompressionSelectionColor.dispose();
}
fTimeCompressionSelectionColor = new ColorImpl(display, rgb.red, rgb.green, rgb.blue);
}
/**
* Add a property-change listener
*
* @param listener
* The listener to add
*/
public void addPropertyChangeListener(IPropertyChangeListener listener) {
fPrefStore.addPropertyChangeListener(listener);
}
/**
* Remove a property-change listener
*
* @param listener
* The listerner to remove
*/
public void removePropertyChangeListener(IPropertyChangeListener listener) {
fPrefStore.removePropertyChangeListener(listener);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (!event.getProperty().equals("PREFOK")) { //$NON-NLS-1$
buildFontsAndColors();
fPrefStore.firePropertyChangeEvent("PREFOK", null, null); //$NON-NLS-1$
}
}
/**
* Set the "no focus selection" preference
*
* @param v
* New value to use
*/
public void setNoFocusSelection(boolean v) {
fNoFocusSelection = v;
}
/**
* Returns a unmodifiable map with font preferences.
*
* @return map with font preferences
*/
protected Map<String, IFont> getFontPref() {
return Collections.unmodifiableMap(fFontPref);
}
/**
* Returns a unmodifiable map with foreground color preferences
*
* @return map with foreground color preferences
*/
public Map<String, IColor> getForeColorPref() {
return Collections.unmodifiableMap(fForeColorPref);
}
/**
* Returns a unmodifiable map with background color preferences
*
* @return map with background color preferences
*/
public Map<String, IColor> getBackColorPref() {
return Collections.unmodifiableMap(fBackColorPref);
}
/**
* Returns a unmodifiable map with text color preferences
*
* @return map with text color preferences
*/
public Map<String, IColor> getTextColorPref() {
return Collections.unmodifiableMap(fTextColorPref);
}
/**
* Returns the preference store.
*
* @return the preference store
*/
public IPreferenceStore getPrefStore() {
return fPrefStore;
}
/**
* Returns flag about focus selection
*
* @return flag about focus selection
*/
public boolean isNoFocusSelection() {
return fNoFocusSelection;
}
/**
* Returns the static font list.
*
* @return static font list
*/
public static String[] getFontList() {
return Arrays.copyOf(FONT_LIST, FONT_LIST.length);
}
/**
* Returns the 2nd static font list.
*
* @return 2nd static font list
*/
public static String[] getFontList2() {
return Arrays.copyOf(FONT_LIST2, FONT_LIST2.length);
}
/**
* Returns the preference background color list.
*
* @return preference background color list
*/
public static String[] getPrefBackColorList() {
return Arrays.copyOf(PREF_BACK_COLOR_LIST, PREF_BACK_COLOR_LIST.length);
}
/**
* Returns the preference foreground color list.
*
* @return preference foreground color list
*/
public static String[] getPrefForeColorList() {
return Arrays.copyOf(PREF_FORE_COLOR_LIST, PREF_FORE_COLOR_LIST.length);
}
/**
* Returns the preference text color list color list.
*
* @return preference text color list color list
*/
public static String[] getPrefTextColorList() {
return Arrays.copyOf(PREF_TEXT_COLOR_LIST, PREF_TEXT_COLOR_LIST.length);
}
}