com.google.cloud.tools.eclipse.projectselector.ProjectSelector.java Source code

Java tutorial

Introduction

Here is the source code for com.google.cloud.tools.eclipse.projectselector.ProjectSelector.java

Source

/*
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.cloud.tools.eclipse.projectselector;

import com.google.cloud.tools.eclipse.projectselector.model.GcpProject;
import com.google.cloud.tools.eclipse.ui.util.event.OpenUriSelectionListener;
import com.google.cloud.tools.eclipse.ui.util.event.OpenUriSelectionListener.ErrorDialogErrorHandler;
import com.google.common.base.Strings;
import java.util.List;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Link;

public class ProjectSelector extends Composite {

    private final TableViewer tableViewer;
    private final WritableList input;
    private Link statusLink;

    public ProjectSelector(Composite parent) {
        super(parent, SWT.NONE);
        setLayout(new GridLayout());

        Composite tableComposite = new Composite(this, SWT.NONE);
        TableColumnLayout tableColumnLayout = new TableColumnLayout();
        tableComposite.setLayout(tableColumnLayout);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(tableComposite);

        tableViewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        createColumns(tableColumnLayout);
        tableViewer.getTable().setHeaderVisible(true);
        input = WritableList.withElementType(GcpProject.class);
        ViewerSupport.bind(tableViewer, input, PojoProperties.values(new String[] { "name", //$NON-NLS-1$
                "id" })); //$NON-NLS-1$
        tableViewer.setComparator(new ViewerComparator());

        statusLink = new Link(this, SWT.NONE);
        statusLink.addSelectionListener(new OpenUriSelectionListener(new ErrorDialogErrorHandler(getShell())));
        statusLink.setText("");
        GridDataFactory.fillDefaults().applyTo(statusLink);
    }

    private void createColumns(TableColumnLayout tableColumnLayout) {
        TableViewerColumn nameColumn = new TableViewerColumn(tableViewer, SWT.LEFT);
        nameColumn.getColumn().setText(Messages.getString("projectselector.header.name")); //$NON-NLS-1$
        tableColumnLayout.setColumnData(nameColumn.getColumn(), new ColumnWeightData(1, 200));

        TableViewerColumn idColumn = new TableViewerColumn(tableViewer, SWT.LEFT);
        idColumn.getColumn().setWidth(200);
        idColumn.getColumn().setText(Messages.getString("projectselector.header.id")); //$NON-NLS-1$
        tableColumnLayout.setColumnData(idColumn.getColumn(), new ColumnWeightData(1, 200));
    }

    public TableViewer getViewer() {
        return tableViewer;
    }

    public void setProjects(List<GcpProject> projects) {
        ISelection selection = tableViewer.getSelection();
        input.clear();
        if (projects != null) {
            input.addAll(projects);
        }
        tableViewer.setSelection(selection);
    }

    public void addSelectionChangedListener(ISelectionChangedListener listener) {
        tableViewer.addPostSelectionChangedListener(listener);
    }

    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
        tableViewer.removePostSelectionChangedListener(listener);
    }

    public void setStatusLink(String linkText, String tooltip) {
        statusLink.setText(linkText);
        setTooltip(tooltip);
        boolean hide = Strings.isNullOrEmpty(linkText);
        ((GridData) statusLink.getLayoutData()).exclude = hide;
        statusLink.setVisible(!hide);
        layout();
        IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
        if (!selection.isEmpty()) {
            tableViewer.reveal(selection.getFirstElement());
        }
    }

    private void setTooltip(String tooltip) {
        if (Strings.isNullOrEmpty(tooltip)) {
            statusLink.setToolTipText(null);
        } else {
            statusLink.setToolTipText(tooltip);
        }
    }

    public void clearStatusLink() {
        setStatusLink("", "");
    }
}