/*******************************************************************************
 * Copyright (c) 2010, 2013 TH4 SYSTEMS GmbH and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     TH4 SYSTEMS GmbH - initial API and implementation
 *******************************************************************************/
package org.eclipse.scada.ae.ui.views.dialog;

import org.eclipse.scada.ae.ui.views.Messages;
import org.eclipse.scada.utils.filter.Filter;
import org.eclipse.scada.utils.filter.FilterParseException;
import org.eclipse.scada.utils.filter.FilterParser;
import org.eclipse.scada.utils.lang.Pair;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FilterFreeFormComposite extends Composite
{

    private static final Logger logger = LoggerFactory.getLogger ( FilterFreeFormComposite.class );

    private final FilterChangedListener filterChangedListener;

    private final String filter;

    public FilterFreeFormComposite ( final FilterChangedListener filterChangedListener, final Composite parent, final int style, final String filter )
    {
        super ( parent, style );
        if ( filter == null )
        {
            throw new IllegalArgumentException ( Messages.filter_must_not_be_null );
        }
        this.filterChangedListener = filterChangedListener;
        this.filter = filter;

        createComponents ();
    }

    private void createComponents ()
    {
        final FillLayout layout = new FillLayout ( SWT.VERTICAL );
        layout.marginHeight = 12;
        layout.marginWidth = 12;
        setLayout ( layout );

        final Text filterTextField = new Text ( this, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL );
        filterTextField.setText ( this.filter );
        filterTextField.addKeyListener ( new KeyAdapter () {
            @Override
            public void keyReleased ( final KeyEvent e )
            {
                verifyFilter ( filterTextField.getText () );
            }
        } );
    }

    public boolean verifyFilter ( final String filter )
    {
        try
        {
            final Filter parsedFilter = new FilterParser ( filter ).getFilter ();
            this.filterChangedListener.onFilterChanged ( new Pair<SearchType, String> ( SearchType.FREEFORM, parsedFilter.toString () ) );
        }
        catch ( final FilterParseException e )
        {
            this.filterChangedListener.onFilterParseError ( new Pair<SearchType, String> ( SearchType.FREEFORM, "" + e.getMessage () ) ); //$NON-NLS-1$
            return false;
        }
        catch ( final Exception e )
        {
            logger.info ( "Failed to parse", e );
        }
        this.filterChangedListener.onFilterParseError ( new Pair<SearchType, String> ( SearchType.FREEFORM, null ) );
        return true;
    }
}