org.csstudio.opibuilder.visualparts.WidgetsSelectDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.csstudio.opibuilder.visualparts.WidgetsSelectDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Oak Ridge National Laboratory.
 * 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
 ******************************************************************************/
package org.csstudio.opibuilder.visualparts;

import java.util.ArrayList;
import java.util.List;

import org.csstudio.opibuilder.model.AbstractPVWidgetModel;
import org.csstudio.opibuilder.util.WidgetDescriptor;
import org.csstudio.opibuilder.util.WidgetsService;
import org.csstudio.ui.util.CustomMediaFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

/**Select widget dialog.
 * @author Xihui Chen
 *
 */
public class WidgetsSelectDialog extends Dialog {

    private TableViewer widgetsViewer;
    private String selectedWidget;
    private int widgetCount;
    private String defaultSelectedWidgetID;
    private boolean onlyPVWidgets;

    /**Constructor
     * @param parentShell the parent shell.
     * @param widgetCount Number of widgets that will be created (only for the warning dialog)
     * @param onlyPVWidgets true if only list PV widgets.
     */
    public WidgetsSelectDialog(Shell parentShell, int widgetCount, boolean onlyPVWidgets) {
        super(parentShell);
        this.widgetCount = widgetCount;
        // Allow resize
        setShellStyle(getShellStyle() | SWT.RESIZE);
        defaultSelectedWidgetID = "org.csstudio.opibuilder.widgets.TextUpdate"; //$NON-NLS-1$
        this.onlyPVWidgets = onlyPVWidgets;
    }

    public String getOutput() {
        return selectedWidget;
    }

    public void setDefaultSelectedWidgetID(String defaultSelectedWidgetID) {
        this.defaultSelectedWidgetID = defaultSelectedWidgetID;
    }

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText("Select the widget to create");
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        final Composite parent_Composite = (Composite) super.createDialogArea(parent);
        Composite rightComposite = new Composite(parent_Composite, SWT.NONE);
        rightComposite.setLayout(new GridLayout(1, false));
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.widthHint = 320;
        gd.heightHint = 500;
        rightComposite.setLayoutData(gd);

        widgetsViewer = createWidgetsViewer(rightComposite);
        List<String> widgetsList = new ArrayList<String>();
        for (String typeID : WidgetsService.getInstance().getAllWidgetTypeIDs()) {
            if (onlyPVWidgets && WidgetsService.getInstance().getWidgetDescriptor(typeID).getWidgetModel()
                    .getProperty(AbstractPVWidgetModel.PROP_PVNAME) == null)
                continue;
            widgetsList.add(typeID);
        }

        //sort widgets by name?
        //        String[] pvWidgets = pvWidgetList.toArray(new String[0]);
        //        Arrays.sort(pvWidgets, new Comparator<String>() {
        //
        //            public int compare(String o1, String o2) {
        //                String name1 = WidgetsService.getInstance().getWidgetDescriptor(o1).getName();
        //                String name2 = WidgetsService.getInstance().getWidgetDescriptor(o2).getName();
        //                return name1.compareTo(name2);
        //            }
        //        });

        widgetsViewer.setInput(widgetsList);
        widgetsViewer.setSelection(new StructuredSelection(defaultSelectedWidgetID));

        if (widgetCount > 1) {
            Composite bottomComposite = new Composite(parent_Composite, SWT.NONE);
            bottomComposite.setLayout(new GridLayout(2, false));
            gd = new GridData(SWT.FILL, SWT.FILL, true, true);
            bottomComposite.setLayoutData(gd);

            Label imageLabel = new Label(bottomComposite, SWT.None);
            if (widgetCount > 30)
                imageLabel.setImage(Display.getDefault().getSystemImage(SWT.ICON_WARNING));

            Label messageLabel = new Label(bottomComposite, SWT.WRAP);
            messageLabel.setText(widgetCount + " widgets will be created."
                    + (widgetCount > 20 ? " It may take a while to create them." : "")); //$NON-NLS-2$
        }

        return parent_Composite;

    }

    private TableViewer createWidgetsViewer(Composite parent) {
        final TableViewer viewer = new TableViewer(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE);
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setLabelProvider(new WidgetsListLableProvider());
        viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                selectedWidget = (String) ((StructuredSelection) viewer.getSelection()).getFirstElement();
            }
        });

        viewer.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                okPressed();
            }
        });

        return viewer;
    }

    static class WidgetsListLableProvider extends LabelProvider {
        @Override
        public String getText(Object element) {
            String typeID = (String) element;
            return WidgetsService.getInstance().getWidgetDescriptor(typeID).getName();
        }

        @Override
        public Image getImage(Object element) {
            String typeID = (String) element;
            WidgetDescriptor widgetDescriptor = WidgetsService.getInstance().getWidgetDescriptor(typeID);
            Image image = CustomMediaFactory.getInstance().getImageFromPlugin(widgetDescriptor.getPluginId(),
                    widgetDescriptor.getIconPath());
            return image;
        }
    }

}