/*****************************************************************************
* This file is part of Rinzo
*
* Author: Claudio Cancinos
* WWW: https://sourceforge.net/projects/editorxml
* Copyright (C): 2008, Claudio Cancinos
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* 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 Lesser General Public
* License along with this program; If not, see <http://www.gnu.org/licenses/>
****************************************************************************/
package ar.com.tadp.xml.rinzo.core.preferences;
import java.util.ArrayList;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.List;
/**
*
* @author ccancinos
*/
public class ColorPreferenceEditor extends FieldEditor {
private List list;
private ColorChooser colorChooser;
private ArrayList<ColorPreferenceModel> colorModelList;
protected ColorPreferenceEditor() {
}
public ColorPreferenceEditor(String name, String labelText, Composite parent, Map<String, String> colorPreferencesMap) {
init(name, labelText);
setupColorPreferences(colorPreferencesMap);
createControl(parent);
}
private void setupColorPreferences(Map<String, String> colorPreferencesMap) {
for (Entry<String, String> colorPreference : colorPreferencesMap.entrySet()) {
setupColorPreference((String) colorPreference.getKey(), (String) colorPreference.getValue());
}
}
protected void setupColorPreference(String displayText, String key) {
// Hacer que un ColorPreferenceModel mappee el valor del color, y
// tambien si debe ser bold o no
ColorPreferenceModel lineNumberForeGround = new ColorPreferenceModel(displayText, key);
getColorModelList().add(lineNumberForeGround);
}
protected void adjustForNumColumns(int numColumns) {
Control control = getLabelControl();
((GridData) control.getLayoutData()).horizontalSpan = numColumns;
((GridData) list.getLayoutData()).horizontalSpan = numColumns - 1;
}
protected void doFillIntoGrid(Composite parent, int numColumns) {
Control control = getLabelControl(parent);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
control.setLayoutData(gd);
list = getListControl(parent);
gd = new GridData();
gd.verticalAlignment = 1;
gd.horizontalAlignment = 1;
gd.widthHint = 180;
gd.heightHint = 160;
gd.horizontalSpan = numColumns - 2;
gd.grabExcessHorizontalSpace = false;
gd.grabExcessVerticalSpace = true;
list.setLayoutData(gd);
colorChooser = getColorChooserControl(parent);
gd = new GridData();
gd.verticalAlignment = 1;
gd.horizontalAlignment = 1;
gd.widthHint = -1;
gd.heightHint = -1;
gd.horizontalIndent = 0;
gd.horizontalSpan = 1;
gd.verticalSpan = 1;
gd.grabExcessHorizontalSpace = false;
gd.grabExcessVerticalSpace = false;
colorChooser.setLayoutData(gd);
colorChooser.layout();
initializeColorList();
}
private void initializeColorList() {
for (ColorPreferenceModel colorModel : this.getColorModelList()) {
this.list.add(colorModel.getDisplayText());
}
this.list.getDisplay().asyncExec(new Runnable() {
public void run() {
if (list != null && !list.isDisposed()) {
list.select(0);
updateColorChooser();
}
}
});
}
protected void doLoad() {
for (ColorPreferenceModel colorModel : getColorModelList()) {
colorModel.setColorValue(PreferenceConverter.getColor(getPreferenceStore(), colorModel.getPreferenceKey()));
colorModel.setBold(getPreferenceStore().getBoolean(colorModel.getPreferenceKey() + "#bold"));
}
}
protected void doLoadDefault() {
for (ColorPreferenceModel colorModel : getColorModelList()) {
colorModel.setColorValue(PreferenceConverter.getDefaultColor(getPreferenceStore(), colorModel.getPreferenceKey()));
colorModel.setBold(getPreferenceStore().getDefaultBoolean(colorModel.getPreferenceKey() + "#bold"));
}
}
public void store() {
if (getPreferenceStore() == null) {
return;
}
if (presentsDefaultValue()) {
for (ColorPreferenceModel colorModel : this.getColorModelList()) {
this.getPreferenceStore().setToDefault(colorModel.getPreferenceKey());
}
} else {
doStore();
}
}
protected void doStore() {
for (ColorPreferenceModel colorModel : getColorModelList()) {
PreferenceConverter.setValue(getPreferenceStore(), colorModel.getPreferenceKey(), colorModel.getColorValue());
getPreferenceStore().setValue(colorModel.getPreferenceKey() + "#bold", colorModel.isBold());
}
}
public int getNumberOfControls() {
return 3;
}
public List getListControl(Composite parent) {
if (list == null) {
list = new List(parent, 2820);
list.setFont(parent.getFont());
list.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
org.eclipse.swt.widgets.Widget widget = event.widget;
if (widget == list)
updateColorChooser();
}
});
list.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
list = null;
}
});
} else {
checkParent(list, parent);
}
return list;
}
public ColorChooser getColorChooserControl(Composite parent) {
if (colorChooser == null) {
colorChooser = new ColorChooser(parent, 0);
colorChooser.addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
int index = list.getSelectionIndex();
ColorPreferenceModel cpm = colorModelList.get(index);
cpm.setColorValue(colorChooser.getColorValue());
}
});
colorChooser.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
int index = list.getSelectionIndex();
ColorPreferenceModel cpm = colorModelList.get(index);
cpm.setBold(colorChooser.isBold());
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
colorChooser.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
colorChooser = null;
}
});
} else {
checkParent(colorChooser, parent);
}
return colorChooser;
}
public ArrayList<ColorPreferenceModel> getColorModelList() {
if (colorModelList == null) {
colorModelList = new ArrayList<ColorPreferenceModel>();
}
return colorModelList;
}
private void updateColorChooser() {
int index = list.getSelectionIndex();
ColorPreferenceModel cpm = colorModelList.get(index);
colorChooser.setColorValue(cpm.getColorValue());
colorChooser.setBold(cpm.isBold());
}
}