com.nextep.designer.vcs.ui.dialogs.FindElementDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.nextep.designer.vcs.ui.dialogs.FindElementDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2011 neXtep Software and contributors.
 * All rights reserved.
 *
 * This file is part of neXtep designer.
 *
 * NeXtep designer is free software: you can redistribute it 
 * and/or modify it under the terms of the GNU General Public 
 * License as published by the Free Software Foundation, either 
 * version 3 of the License, or any later version.
 *
 * NeXtep designer is distributed in the hope that it will be 
 * useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Contributors:
 *     neXtep Softwares - initial API and implementation
 *******************************************************************************/
package com.nextep.designer.vcs.ui.dialogs;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import com.nextep.datadesigner.model.ITypedObject;
import com.nextep.designer.vcs.VCSPlugin;
import com.nextep.designer.vcs.ui.VCSUIMessages;
import com.nextep.designer.vcs.ui.jface.NameFilter;
import com.nextep.designer.vcs.ui.jface.TypedViewerComparator;
import com.nextep.designer.vcs.ui.jface.VersionableNewLabelProvider;
import com.nextep.designer.vcs.ui.services.ICommonUIService;

/**
 * This dialog shows a list of elements provided by a {@link IContentProvider} in a filter dialog
 * allowing user to quickly filter and select an element.<br>
 * This dialog should generally not be used directly. Please use the {@link ICommonUIService}
 * methods instead.
 * 
 * @author Christophe Fondacci
 */
public class FindElementDialog extends Dialog {

    private String title;
    private IContentProvider contentProvider;
    private ILabelProvider labelProvider;
    private TableViewer viewer;
    private ITypedObject selectedElement = null;
    private Object input;

    public FindElementDialog(Shell parent, String title, IContentProvider contentProvider, Object input) {
        this(parent, title, contentProvider, new VersionableNewLabelProvider(), input);
    }

    public FindElementDialog(Shell parent, String title, IContentProvider contentProvider,
            ILabelProvider labelProvider, Object input) {
        super(parent);
        this.contentProvider = contentProvider;
        this.labelProvider = labelProvider;
        if (title == null) {
            this.title = VCSUIMessages.getString("dialog.findElement.defaultTitle"); //$NON-NLS-1$
        } else {
            this.title = title;
        }
        this.input = input;
    }

    @Override
    protected void configureShell(Shell newShell) {
        newShell.setText(title);
        super.configureShell(newShell);
    }

    @Override
    protected int getShellStyle() {
        return SWT.TITLE | SWT.CLOSE | SWT.MAX | SWT.RESIZE | SWT.APPLICATION_MODAL;
    }

    @Override
    protected Point getInitialSize() {
        return new Point(600, 400);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite group = (Composite) super.createDialogArea(parent);

        // Initializing filters
        Label filterLabel = new Label(group, SWT.NONE);
        filterLabel.setText(VCSUIMessages.getString("dialog.findElement.filterLabel")); //$NON-NLS-1$
        filterLabel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));

        final Text filterText = new Text(group, SWT.BORDER);
        filterText.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));

        Label matchLabel = new Label(group, SWT.NONE);
        matchLabel.setText(VCSUIMessages.getString("dialog.findElement.matchingLabel")); //$NON-NLS-1$
        matchLabel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));

        // Initializing viewer
        viewer = new TableViewer(group);
        viewer.getControl().setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
        viewer.setContentProvider(contentProvider);
        // Handling auto-decoration on styled label provider
        IBaseLabelProvider viewerLabelProvider = labelProvider;
        if (labelProvider instanceof IStyledLabelProvider) {
            viewerLabelProvider = new DecoratingStyledCellLabelProvider((IStyledLabelProvider) labelProvider,
                    PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), null);
        }
        viewer.setLabelProvider(viewerLabelProvider);
        viewer.addFilter(new NameFilter(filterText));
        viewer.setSorter(new TypedViewerComparator());
        viewer.setInput(input == null ? VCSPlugin.getViewService().getCurrentWorkspace() : input);

        // Registering filter actions
        filterText.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.keyCode == SWT.ARROW_DOWN) {
                    int index = viewer.getTable().getSelectionIndex();
                    if (index != -1 && viewer.getTable().getItemCount() > index + 1) {
                        viewer.getTable().setSelection(index + 1);
                    }
                    e.doit = false;
                } else if (e.keyCode == SWT.ARROW_UP) {
                    int index = viewer.getTable().getSelectionIndex();
                    if (index != -1 && index >= 1) {
                        viewer.getTable().setSelection(index - 1);
                    }
                    e.doit = false;
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
                viewer.setFilters(new NameFilter[] { new NameFilter(filterText) });
                if (viewer.getSelection().isEmpty()) {
                    if (viewer.getTable().getItemCount() > 0) {
                        viewer.getTable().select(0);
                    }
                }
            }

        });

        // Registering double click action
        viewer.getControl().addListener(SWT.MouseDoubleClick, new Listener() {

            @Override
            public void handleEvent(Event event) {
                okPressed();
            }
        });
        if (viewer.getTable().getItemCount() > 0) {
            viewer.getTable().select(0);
        }
        return group;
    }

    @Override
    protected void okPressed() {
        if (viewer.getSelection() instanceof IStructuredSelection) {
            Object elt = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
            if (elt instanceof ITypedObject) {
                selectedElement = (ITypedObject) elt;
            }
        }
        super.okPressed();
    }

    public ITypedObject getSelectedElement() {
        return selectedElement;
    }
}