/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * 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:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.preferences.ui.component;

import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.osbp.preferences.ProductConfigurationDefaultPrefs;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;

public class HookedIntegerFieldEditor extends IntegerFieldEditor {

	private final IPreferenceCheckStateProvider fCheckStateProvider;
    protected CLabel label;
    
	public HookedIntegerFieldEditor(String preference, String label, IPreferenceCheckStateProvider checkStateProvider, Composite parent) {
		super(preference, label, parent);
		fCheckStateProvider = checkStateProvider;
	}

	@Override
	protected boolean doCheckState() {
		if	(fCheckStateProvider != null) {
			return fCheckStateProvider.doCheckState(this, getTextControl().getText());
		}
		return super.doCheckState();
	}

	@Override
	protected void doFillIntoGrid(Composite parent, int numColumns) {
		super.doFillIntoGrid(parent, numColumns);
		getTextControl().addModifyListener(new ModifyListener() {
			@Override
			public void modifyText(ModifyEvent e) {
				showDefaultHint();
			}
		});
	}

	protected void showDefaultHint() {
		APreferencePage.showLabelDefaultHint(label, getIntValue() == getPreferenceStore().getDefaultInt(getPreferenceName()));
	}
	
	@Override
    public Label getLabelControl(Composite parent) {
        if (label == null) {
            label = new CLabel(parent, SWT.LEFT | SWT.RIGHT_TO_LEFT);
            label.setFont(parent.getFont());
            String text = getLabelText();
            if (text != null) {
				label.setText(text);
			}
            label.addDisposeListener(new DisposeListener() {
                @Override
				public void widgetDisposed(DisposeEvent event) {
                    label = null;
                }
            });
        } else {
            checkParent(label, parent);
        }
        return null;
    }

	@Override
    public void setEnabled(boolean enabled, Composite parent) {
        label.setEnabled(enabled);
    }
	
	@Override
	protected void doLoad() {
		super.doLoad();
		showDefaultHint();
	}

	@Override
	protected void doLoadDefault() {
		super.doLoadDefault();
		showDefaultHint();
	}
}
