/* * Carrot2 project. * * Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński. * All rights reserved. * * Refer to the full license file "carrot2.LICENSE" * in the root folder of the repository checkout or at: * http://www.carrot2.org/carrot2.LICENSE */ package org.carrot2.workbench.editors; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import org.carrot2.util.attribute.AttributeDescriptor; import org.carrot2.util.attribute.BindableDescriptor; import org.eclipse.swt.widgets.Composite; /** * Template implementation of {@link IAttributeEditor}. */ public abstract class AttributeEditorAdapter implements IAttributeEditor { /** * Array of listeners interested in receiving change events from this editor. */ private final List<IAttributeListener> listeners = new CopyOnWriteArrayList<IAttributeListener>(); protected AttributeDescriptor descriptor; protected BindableDescriptor bindable; protected IAttributeEventProvider eventProvider; /** * Layout and visual info. */ private AttributeEditorInfo attributeEditorInfo; /** * Store attribute descriptor in {@link #descriptor}. */ public final AttributeEditorInfo init(BindableDescriptor bindable, AttributeDescriptor attribute, IAttributeEventProvider eventProvider, Map<String,Object> defaultValues) { this.descriptor = attribute; this.bindable = bindable; this.eventProvider = eventProvider; this.attributeEditorInfo = init(defaultValues); return attributeEditorInfo; } /** * @return This method is invoked to initialize the subclasses. Some values have been assigned * to protected fields already. */ protected abstract AttributeEditorInfo init(Map<String,Object> defaultValues); /** * Returns attribute key from the attribute descriptor. */ public String getAttributeKey() { return this.descriptor.key; } /* * Re-declare methods from {@link IAttributeEditor} to avoid @Override warnings. */ public abstract void createEditor(Composite parent, int gridColumns); /** * Does nothing by default. */ public void setFocus() { // Ignore. } /* * */ public abstract Object getValue(); /* * */ public abstract void setValue(Object object); /* * */ public void addAttributeListener(IAttributeListener listener) { listeners.add(listener); } /* * */ public void removeAttributeListener(IAttributeListener listener) { listeners.remove(listener); } /* * */ private boolean flag1; protected void fireAttributeChanged(AttributeEvent event) { if (flag1) return; flag1 = true; try { for (IAttributeListener listener : listeners) { listener.valueChanged(event); } } finally { flag1 = false; } } /* * */ private boolean flag2; protected void fireContentChanging(AttributeEvent event) { if (flag2) return; flag2 = true; try { for (IAttributeListener listener : listeners) { listener.valueChanging(event); } } finally { flag2 = false; } } /** * Clear listeners array and clean references. */ public void dispose() { listeners.clear(); descriptor = null; } }