/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.views.markers.internal;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class DialogProblemFilter extends
        org.eclipse.ui.views.markers.internal.DialogMarkerFilter {

    private DescriptionGroup descriptionGroup;

    private SeverityGroup severityGroup;

    private class DescriptionGroup {
        private Label descriptionLabel;

        private Combo combo;

        private Text description;

        private String contains = Messages.getString("filtersDialog.contains"); //$NON-NLS-1$

        private String doesNotContain = Messages
                .getString("filtersDialog.doesNotContain"); //$NON-NLS-1$

        public DescriptionGroup(Composite parent) {
            descriptionLabel = new Label(parent, SWT.NONE);
            descriptionLabel.setFont(parent.getFont());
            descriptionLabel.setText(Messages
                    .getString("filtersDialog.descriptionLabel")); //$NON-NLS-1$

            combo = new Combo(parent, SWT.READ_ONLY);
            combo.setFont(parent.getFont());
            combo.add(contains);
            combo.add(doesNotContain);
            combo.addSelectionListener(selectionListener);
            // Prevent Esc and Return from closing the dialog when the combo is active.
            combo.addTraverseListener(new TraverseListener() {
                public void keyTraversed(TraverseEvent e) {
                    if (e.detail == SWT.TRAVERSE_ESCAPE
                            || e.detail == SWT.TRAVERSE_RETURN) {
                        e.doit = false;
                    }
                }
            });

            description = new Text(parent, SWT.SINGLE | SWT.BORDER);
            description.setFont(parent.getFont());
            GridData data = new GridData(GridData.FILL_HORIZONTAL);
            data.horizontalSpan = 3;
            description.setLayoutData(data);
            description.addModifyListener(new ModifyListener() {
                public void modifyText(ModifyEvent e) {
                    DialogProblemFilter.this.markDirty();
                }
            });
        }

        public boolean getContains() {
            return combo.getSelectionIndex() == combo.indexOf(contains);
        }

        public void setContains(boolean value) {
            if (value) {
                combo.select(combo.indexOf(contains));
            } else {
                combo.select(combo.indexOf(doesNotContain));
            }
        }

        public void setDescription(String text) {
            if (text == null) {
                description.setText(""); //$NON-NLS-1$ 
            } else {
                description.setText(text);
            }
        }

        public String getDescription() {
            return description.getText();
        }

        public void updateEnablement() {
            descriptionLabel.setEnabled(isFilterEnabled());
            combo.setEnabled(isFilterEnabled());
            description.setEnabled(isFilterEnabled());
        }
    }

    private class SeverityGroup {
        private Button enablementButton;

        private Button errorButton;

        private Button warningButton;

        private Button infoButton;

        public SeverityGroup(Composite parent) {
            SelectionListener listener = new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    updateEnablement();
                    DialogProblemFilter.this.markDirty();
                }
            };

            enablementButton = new Button(parent, SWT.CHECK);
            GridData data = new GridData(GridData.FILL_HORIZONTAL);
            data.horizontalSpan = 2;
            enablementButton.setLayoutData(data);
            enablementButton.setFont(parent.getFont());
            enablementButton.setText(Messages
                    .getString("filtersDialog.severityLabel")); //$NON-NLS-1$
            enablementButton.addSelectionListener(listener);

            errorButton = new Button(parent, SWT.CHECK);
            errorButton.setFont(parent.getFont());
            errorButton.setText(Messages
                    .getString("filtersDialog.severityError")); //$NON-NLS-1$
            errorButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            errorButton.addSelectionListener(selectionListener);

            warningButton = new Button(parent, SWT.CHECK);
            warningButton.setFont(parent.getFont());
            warningButton.setText(Messages
                    .getString("filtersDialog.severityWarning")); //$NON-NLS-1$
            warningButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            warningButton.addSelectionListener(selectionListener);

            infoButton = new Button(parent, SWT.CHECK);
            infoButton.setFont(parent.getFont());
            infoButton
                    .setText(Messages.getString("filtersDialog.severityInfo")); //$NON-NLS-1$
            infoButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            infoButton.addSelectionListener(selectionListener);
        }

        public boolean isEnabled() {
            return enablementButton.getSelection();
        }

        public void setEnabled(boolean enabled) {
            enablementButton.setSelection(enabled);
        }

        public boolean isErrorSelected() {
            return errorButton.getSelection();
        }

        public void setErrorSelected(boolean selected) {
            errorButton.setSelection(selected);
        }

        public boolean isWarningSelected() {
            return warningButton.getSelection();
        }

        public void setWarningSelected(boolean selected) {
            warningButton.setSelection(selected);
        }

        public boolean isInfoSelected() {
            return infoButton.getSelection();
        }

        public void setInfoSelected(boolean selected) {
            infoButton.setSelection(selected);
        }

        public void updateEnablement() {
            enablementButton.setEnabled(isFilterEnabled());
            errorButton.setEnabled(enablementButton.isEnabled() && isEnabled());
            warningButton.setEnabled(enablementButton.isEnabled()
                    && isEnabled());
            infoButton.setEnabled(enablementButton.isEnabled() && isEnabled());
        }
    }

    /**
     * @param parentShell
     * @param filter
     */
    public DialogProblemFilter(Shell parentShell, ProblemFilter filter) {
        super(parentShell, filter);
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.views.markerview.FiltersDialog#createAttributesArea(org.eclipse.swt.widgets.Composite)
     */
    protected void createAttributesArea(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setFont(parent.getFont());
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        GridLayout layout = new GridLayout(5, false);
        layout.verticalSpacing = 7;
        composite.setLayout(layout);

        descriptionGroup = new DescriptionGroup(composite);
        severityGroup = new SeverityGroup(composite);
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.views.markerview.FiltersDialog#updateFilterFromUI(org.eclipse.ui.views.markerview.MarkerFilter)
     */
    protected void updateFilterFromUI() {
        ProblemFilter filter = (ProblemFilter) getFilter();

        filter.setContains(descriptionGroup.getContains());
        filter.setDescription(descriptionGroup.getDescription().trim());

        filter.setSelectBySeverity(severityGroup.isEnabled());
        int severity = 0;
        if (severityGroup.isErrorSelected()) {
            severity = severity | ProblemFilter.SEVERITY_ERROR;
        }
        if (severityGroup.isWarningSelected()) {
            severity = severity | ProblemFilter.SEVERITY_WARNING;
        }
        if (severityGroup.isInfoSelected()) {
            severity = severity | ProblemFilter.SEVERITY_INFO;
        }
        filter.setSeverity(severity);

        super.updateFilterFromUI();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.views.markerview.FiltersDialog#updateUIFromFilter(org.eclipse.ui.views.markerview.MarkerFilter)
     */
    protected void updateUIFromFilter() {
        ProblemFilter filter = (ProblemFilter) getFilter();

        descriptionGroup.setContains(filter.getContains());
        descriptionGroup.setDescription(filter.getDescription());

        severityGroup.setEnabled(filter.getSelectBySeverity());
        int severity = filter.getSeverity();
        severityGroup
                .setErrorSelected((severity & ProblemFilter.SEVERITY_ERROR) > 0);
        severityGroup
                .setWarningSelected((severity & ProblemFilter.SEVERITY_WARNING) > 0);
        severityGroup
                .setInfoSelected((severity & ProblemFilter.SEVERITY_INFO) > 0);

        super.updateUIFromFilter();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.views.markerview.FiltersDialog#updateEnabledState()
     */
    protected void updateEnabledState() {
        super.updateEnabledState();
        descriptionGroup.updateEnablement();
        severityGroup.updateEnablement();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.views.markerview.FiltersDialog#resetPressed()
     */
    protected void resetPressed() {
        descriptionGroup.setContains(ProblemFilter.DEFAULT_CONTAINS);
        descriptionGroup.setDescription(ProblemFilter.DEFAULT_DESCRIPTION);

        severityGroup.setEnabled(ProblemFilter.DEFAULT_SELECT_BY_SEVERITY);
        severityGroup
                .setErrorSelected((ProblemFilter.DEFAULT_SEVERITY & ProblemFilter.SEVERITY_ERROR) > 0);
        severityGroup
                .setWarningSelected((ProblemFilter.DEFAULT_SEVERITY & ProblemFilter.SEVERITY_WARNING) > 0);
        severityGroup
                .setInfoSelected((ProblemFilter.DEFAULT_SEVERITY & ProblemFilter.SEVERITY_INFO) > 0);

        super.resetPressed();
    }

}