/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* 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
*******************************************************************************/
package org.ebayopensource.turmeric.eclipse.ui.components;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.TableColumn;
/**
* Custom widget - Table Viewer with button panel.
*
* @author ramurthy
*/
public class TableButtonPanelViewer extends TableViewer {
private ColumnDef[] columns ;
private Button addButton;
private Button removeButton;
private Button upButton;
private Button downButton;
/**
* Instantiates a new table button panel viewer.
*
* @param parent the parent
* @param style the style
* @param columnDef the column def
*/
public TableButtonPanelViewer(Composite parent, int style, ColumnDef[] columnDef) {
super(parent, style | SWT.SINGLE);
this.columns = columnDef;
getTable().setHeaderVisible(true);
getTable().setLinesVisible(true);
setColumns();
}
/**
* Instantiates a new table button panel viewer.
*
* @param parent the parent
* @param style the style
* @param columnDef the column def
* @param createAddRemoveButtons the create add remove buttons
*/
public TableButtonPanelViewer(Composite parent, int style, ColumnDef[] columnDef,
boolean createAddRemoveButtons) {
this(parent, style, columnDef, createAddRemoveButtons, createAddRemoveButtons);
}
/**
* Instantiates a new table button panel viewer.
*
* @param parent the parent
* @param style the style
* @param columnDef the column def
* @param createAddRemoveButtons the create add remove buttons
* @param createUpDownButtons the create up down buttons
*/
public TableButtonPanelViewer(Composite parent, int style, ColumnDef[] columnDef,
boolean createAddRemoveButtons, boolean createUpDownButtons) {
this(parent, style, columnDef);
if (createAddRemoveButtons)
createButtons(parent, createUpDownButtons);
}
private void setColumns() {
if (columns != null) {
for (int i = 0; i < columns.length; i++) {
TableColumn tableColumn = new TableColumn(getTable(), SWT.NONE);
tableColumn.setText(columns[i].getTitle());
tableColumn.setWidth(columns[i].getWidth());
tableColumn.setData(columns[i]);
tableColumn.setImage(columns[i].getImage());
}
}
addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
viewerSelectionChanged(event);
resetButtons();
}
});
}
/**
* Viewer selection changed.
*
* @param event the event
*/
protected void viewerSelectionChanged(SelectionChangedEvent event) {
}
/**
* Gets the adds the button.
*
* @return the adds the button
*/
public Button getAddButton() {
return addButton;
}
/**
* Gets the removes the button.
*
* @return the removes the button
*/
public Button getRemoveButton() {
return removeButton;
}
/**
* Gets the up button.
*
* @return the up button
*/
public Button getUpButton() {
return upButton;
}
/**
* Gets the down button.
*
* @return the down button
*/
public Button getDownButton() {
return downButton;
}
private void createButtons(Composite parent, boolean createUpDownButtons) {
Composite buttonComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
buttonComposite.setLayout(layout);
GridData gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
buttonComposite.setLayoutData(gd);
gd = new GridData();
gd.widthHint = 80;
addButton = new Button(buttonComposite, SWT.PUSH | SWT.CENTER);
addButton.setText("&Add");
addButton.setLayoutData(gd);
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
addButtonSelected(e);
resetButtons();
}
});
removeButton = new Button(buttonComposite, SWT.PUSH | SWT.CENTER);
removeButton.setText("&Remove");
removeButton.setLayoutData(gd);
removeButton.setEnabled(false);
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
removeButtonSelected(e);
resetButtons();
}
});
if (createUpDownButtons) {
//we also need the Up/Down buttons
new Label(buttonComposite, SWT.LEFT);
upButton = new Button(buttonComposite, SWT.PUSH | SWT.CENTER);
upButton.setText("&Up");
upButton.setLayoutData(gd);
upButton.setEnabled(false);
upButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
upButtonSelected(e);
resetButtons();
}
});
downButton = new Button(buttonComposite, SWT.PUSH | SWT.CENTER);
downButton.setText("&Down");
downButton.setLayoutData(gd);
downButton.setEnabled(false);
downButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
downButtonSelected(e);
resetButtons();
}
});
}
}
/**
* Adds the button selected.
*
* @param event the event
*/
protected void addButtonSelected(SelectionEvent event) {
}
/**
* Removes the button selected.
*
* @param event the event
*/
protected void removeButtonSelected(SelectionEvent event) {
}
/**
* Up button selected.
*
* @param event the event
*/
protected void upButtonSelected(SelectionEvent event) {
}
/**
* Down button selected.
*
* @param event the event
*/
protected void downButtonSelected(SelectionEvent event) {
}
private void resetButtons() {
if (upButton != null && downButton != null) {
upButton.setEnabled(false);
downButton.setEnabled(false);
}
final Object obj = getSelectedObject();
removeButton.setEnabled(obj != null);
if (obj != null) {
removeButton.setEnabled(true);
if (upButton != null && downButton != null) {
final int index = getTable().getSelectionIndex();
final int size = getTable().getItemCount();
if (index > 0)
upButton.setEnabled(true);
if (index + 1 < size)
downButton.setEnabled(true);
}
}
}
/**
* Sets the adds the buttons enabled.
*
* @param enabled the new adds the buttons enabled
*/
public void setAddButtonsEnabled(boolean enabled) {
addButton.setEnabled(enabled);
}
/**
* Gets the selected object.
*
* @return the selected object
*/
public Object getSelectedObject() {
if (getSelection().isEmpty() == false
&& getSelection() instanceof IStructuredSelection) {
return ((IStructuredSelection)getSelection()).getFirstElement();
}
return null;
}
/**
* Gets the column names.
*
* @return the column names
*/
public List<String> getColumnNames() {
String[] columnNames = new String[columns.length];
for (int i = 0; i < columns.length; i++) {
columnNames[i] = columns[i].getTitle();
}
return Arrays.asList(columnNames);
}
/**
* Column Definition.
*
* @author ramurthy
*/
public static class ColumnDef {
private String title;
private int width;
private Image image;
/**
* Instantiates a new column def.
*
* @param title the title
* @param width the width
*/
public ColumnDef(String title, int width) {
this.title = title;
this.width = width;
}
/**
* Instantiates a new column def.
*
* @param title the title
* @param width the width
* @param image the image
*/
public ColumnDef(String title, int width, Image image) {
this(title, width);
this.image = image;
}
/**
* Gets the title.
*
* @return the title
*/
public String getTitle() {
return title;
}
/**
* Gets the width.
*
* @return the width
*/
public int getWidth() {
return width;
}
/**
* Gets the image.
*
* @return the image
*/
public Image getImage() {
return image;
}
}
}