org.fusesource.ide.camel.editor.preferences.PreferredLabelDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.fusesource.ide.camel.editor.preferences.PreferredLabelDialog.java

Source

/******************************************************************************* 
 * Copyright (c) 2017 Red Hat, Inc. 
 * Distributed under license by Red Hat, Inc. All rights reserved. 
 * This program is 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: 
 * Red Hat, Inc. - initial API and implementation 
 ******************************************************************************/
package org.fusesource.ide.camel.editor.preferences;

import static java.util.stream.Collectors.toList;
import static org.fusesource.ide.camel.model.service.core.util.CamelCatalogUtils.RUNTIME_PROVIDER_KARAF;
import static org.fusesource.ide.camel.model.service.core.util.CamelCatalogUtils.getLatestCamelVersion;

import java.util.List;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.fusesource.ide.camel.editor.internal.UIMessages;
import org.fusesource.ide.camel.editor.provider.ProviderHelper;
import org.fusesource.ide.camel.model.service.core.catalog.Parameter;
import org.fusesource.ide.camel.model.service.core.catalog.cache.CamelModel;
import org.fusesource.ide.camel.model.service.core.catalog.eips.Eip;
import org.fusesource.ide.camel.model.service.internal.CamelService;

/**
 * 
 * @author Andrej Podhradsky (apodhrad@redhat.com)
 *
 */
public class PreferredLabelDialog extends TitleAreaDialog {

    private String component;
    private String parameter;

    private ComboViewer componentCombo;
    private ComboViewer parameterCombo;

    private IInputValidator componentValidator;
    private IInputValidator parameterValidator;

    private CamelModel camelModel;

    public PreferredLabelDialog(Shell parentShell) {
        super(parentShell);
    }

    public String getComponent() {
        return component;
    }

    public void setComponent(String component) {
        this.component = component;
    }

    public String getParameter() {
        return parameter;
    }

    public void setParameter(String parameter) {
        this.parameter = parameter;
    }

    public void setComponentValidator(IInputValidator componentValidator) {
        this.componentValidator = componentValidator;
    }

    public void setParameterValidator(IInputValidator parameterValidator) {
        this.parameterValidator = parameterValidator;
    }

    protected CamelModel getCamelModel() {
        if (camelModel == null) {
            camelModel = new CamelService().getCamelModel(getLatestCamelVersion(), RUNTIME_PROVIDER_KARAF);
        }
        return camelModel;
    }

    protected List<Eip> getComponents() {
        return getCamelModel().getEips().stream().filter(ProviderHelper::belongsToAnyCategory).collect(toList());
    }

    public void validate() {
        String msg = null;
        if (componentValidator != null) {
            msg = componentValidator.isValid(componentCombo.getCombo().getText());
        }
        if (msg == null && parameterValidator != null) {
            msg = parameterValidator.isValid(parameterCombo.getCombo().getText());
        }
        setWarning(msg);
    }

    public void setWarning(String msg) {
        Button okButton = getButton(IDialogConstants.OK_ID);
        if (okButton != null) {
            setMessage(msg, msg == null ? IMessageProvider.NONE : IMessageProvider.WARNING);
            okButton.setEnabled(msg == null);
        }
    }

    public void setDescription(String msg) {
        setMessage(msg, IMessageProvider.INFORMATION);
    }

    @Override
    public void create() {
        super.create();
        setTitle(UIMessages.preferredLabelsTitle);

        componentCombo.addSelectionChangedListener(event -> {
            ISelection selection = event.getSelection();
            if (selection instanceof StructuredSelection) {
                Object selectedObject = ((StructuredSelection) selection).getFirstElement();
                if (selectedObject instanceof Eip) {
                    parameterCombo.setInput(((Eip) selectedObject).getParameters());
                }
            }
        });

        if (component != null && !component.isEmpty()) {
            Eip eip = getCamelModel().getEip(component);
            componentCombo.getCombo().setEnabled(false);
            componentCombo.setInput(new Eip[] { eip });
            componentCombo.setSelection(new StructuredSelection(eip));
            if (parameter != null && !parameter.isEmpty()) {
                parameterCombo.setSelection(new StructuredSelection(eip.getParameter(parameter)));
            }
            setDescription(NLS.bind(UIMessages.preferredLabelsEditDialogDescription, component));
        } else {
            componentCombo.setInput(getComponents());
            setDescription(UIMessages.preferredLabelsNewDialogDescription);
        }
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite area = (Composite) super.createDialogArea(parent);
        Composite container = new Composite(area, SWT.NONE);
        container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        GridLayout layout = new GridLayout(2, false);
        container.setLayout(layout);

        componentCombo = createComboViewer(container, UIMessages.preferredLabelsComponent);
        parameterCombo = createComboViewer(container, UIMessages.preferredLabelsParameter);

        return area;
    }

    private ComboViewer createComboViewer(Composite container, String label) {
        Label lbtFirstName = new Label(container, SWT.NONE);
        lbtFirstName.setText(label);

        GridData gd = new GridData();
        gd.grabExcessHorizontalSpace = true;
        gd.horizontalAlignment = GridData.FILL;

        ComboViewer comboViewer = new ComboViewer(container, SWT.BORDER | SWT.READ_ONLY);
        comboViewer.getCombo().setLayoutData(gd);
        comboViewer.setContentProvider(ArrayContentProvider.getInstance());
        comboViewer.setComparator(new ViewerComparator());
        comboViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof Eip) {
                    return ((Eip) element).getName();
                }
                if (element instanceof Parameter) {
                    return ((Parameter) element).getName();
                }
                return element.toString();
            }
        });
        comboViewer.addPostSelectionChangedListener(event -> validate());
        return comboViewer;
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        if (getComponent() != null && !getComponent().isEmpty()) {
            shell.setText(UIMessages.preferredLabelsEditDialogTitle);
        } else {
            shell.setText(UIMessages.preferredLabelsNewDialogTitle);
        }
    }

    @Override
    protected boolean isResizable() {
        return true;
    }

    private void saveInput() {
        component = componentCombo.getCombo().getText();
        parameter = parameterCombo.getCombo().getText();
    }

    @Override
    protected void okPressed() {
        saveInput();
        super.okPressed();
    }

}