/*******************************************************************************
* Copyright (c) 2014 Rohde & Schwarz GmbH & Co. KG and others.
* 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
*
* Contributors:
* Martin Runge - initial implementation of cmake support
*******************************************************************************/
package org.eclipse.cdt.cmake.ui;
import org.eclipse.cdt.cmake.var.ArchToolchainPair;
import org.eclipse.cdt.cmake.var.ArchToolchainPairList;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Table;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.PlatformUI;
/**
* @author runge_m
*
*/
public class ArchTable extends FieldEditor {
private TableViewer tableViewer;
private Composite tableParent;
private ArchToolchainPairList atlist;
/**
* The button box containing the Add and Remove buttons;
* <code>null</code> if none (before creation or after disposal).
*/
private Composite buttonBox;
private Button addButton;
private Button removeButton;
private SelectionListener selectionListener;
public ArchTable(String name, String labelText, Composite parent) {
init(name, labelText);
createControl(parent);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
*/
@Override
protected void adjustForNumColumns(int numColumns) {
Control labelCcontrol = getLabelControl();
((GridData) labelCcontrol.getLayoutData()).horizontalSpan = numColumns;
((GridData) getTableControl().getLayoutData()).horizontalSpan = numColumns - 1;
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite, int)
*/
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
// doFillLabelIntoGrid(parent, numColumns);
doFillBoxIntoGrid(parent, numColumns);
}
protected void doFillLabelIntoGrid(Composite parent, int numColumns) {
String text = getLabelText();
if (text != null && text.length() > 0) {
Control control = getLabelControl(parent);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
control.setLayoutData(gd);
}
}
protected void doFillBoxIntoGrid(Composite parent, int numColumns) {
Control control = getLabelControl(parent);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
control.setLayoutData(gd);
Control table = createTableControl(parent);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.FILL;
gd.horizontalSpan = numColumns - 1;
gd.grabExcessHorizontalSpace = true;
table.setLayoutData(gd);
buttonBox = getButtonBoxControl(parent);
gd = new GridData();
gd.verticalAlignment = GridData.BEGINNING;
buttonBox.setLayoutData(gd);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doLoad()
*/
@Override
protected void doLoad() {
if ( atlist == null) {
atlist = new ArchToolchainPairList();
}
atlist.doLoad();
tableViewer.setInput( atlist );
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
*/
@Override
protected void doLoadDefault() {
if ( atlist == null) {
atlist = new ArchToolchainPairList();
}
atlist.doLoad(true);
tableViewer.setInput( atlist );
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#doStore()
*/
@Override
protected void doStore() {
if(atlist == null) return;
atlist.doStore();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
*/
@Override
public int getNumberOfControls() {
return 3;
}
@Override
protected void createControl(Composite parent) {
GridLayout ly = (GridLayout) parent.getLayout();
doFillIntoGrid(parent, getNumberOfControls());
}
public Table createTableControl(Composite parent) {
Table table = getTableControl();
if (table == null) {
tableParent = parent;
tableViewer = new TableViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
createColumns(tableViewer);
table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.setFont(parent.getFont());
tableViewer.setComparator(new ViewerComparator());
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
// tableViewer.setInput( atlist );
} else {
checkParent(table, parent);
}
return table;
}
/**
* @param tableViewer
*/
private void createColumns(TableViewer tv) {
// create a column for the architecture's name
TableViewerColumn colArchName = new TableViewerColumn(tv, SWT.NONE);
colArchName.getColumn().setWidth(200);
colArchName.getColumn().setText("Architecture");
colArchName.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
ArchToolchainPair p = (ArchToolchainPair) element;
return p.getArchName();
}
});
colArchName.setEditingSupport(new ArchCellEditor(tableViewer));
// create a column for the architecture's name
TableViewerColumn colToolchainFile = new TableViewerColumn(tv, SWT.NONE);
colToolchainFile.getColumn().setWidth(200);
colToolchainFile.getColumn().setText("CMake toolchain file");
colToolchainFile.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
ArchToolchainPair p = (ArchToolchainPair) element;
return p.getToolchainFile();
}
});
}
/**
* @return
*/
private Table getTableControl() {
if(tableViewer != null) {
return tableViewer.getTable();
}
else {
return null;
}
}
/**
* Returns this field editor's button box containing the Add, Remove,
* Up, and Down button.
*
* @param parent the parent control
* @return the button box
*/
public Composite getButtonBoxControl(Composite parent) {
if (buttonBox == null) {
buttonBox = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
buttonBox.setLayout(layout);
addButton = createPushButton(buttonBox, Messages.ArchTableEditor_Add);//$NON-NLS-1$
removeButton = createPushButton(buttonBox, Messages.ArchTableEditor_Remove);//$NON-NLS-1$
buttonBox.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
addButton = null;
removeButton = null;
buttonBox = null;
}
});
} else {
checkParent(buttonBox, parent);
}
selectionChanged();
return buttonBox;
}
/**
* Helper method to create a push button.
*
* @param parent the parent control
* @param key the resource name used to supply the button's label text
* @return Button
*/
private Button createPushButton(Composite parent, String key) {
Button button = new Button(parent, SWT.PUSH);
button.setText(JFaceResources.getString(key));
button.setFont(parent.getFont());
GridData data = new GridData(GridData.FILL_HORIZONTAL);
int widthHint = convertHorizontalDLUsToPixels(button,
IDialogConstants.BUTTON_WIDTH);
data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
SWT.DEFAULT, true).x);
button.setLayoutData(data);
button.addSelectionListener(getSelectionListener());
return button;
}
/**
* Creates a selection listener.
*/
public void createSelectionListener() {
selectionListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
Widget widget = event.widget;
if (widget == addButton) {
addPressed();
} else if (widget == removeButton) {
removePressed();
} else if (widget == getTableControl()) {
selectionChanged();
}
}
};
}
/**
*
*/
protected void selectionChanged() {
}
private void addPressed() {
ArchToolchainPairEditor ed = new ArchToolchainPairEditor( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() );
int rc = ed.open();
if(rc == Window.OK) {
atlist.add(ed.getPair());
tableViewer.refresh();
}
}
private void removePressed() {
Table table = getTableControl();
// table.remove(table.getSelectionIndices());
int [] sel = table.getSelectionIndices();
for(int i=0; i < sel.length; i++) {
// #i have already been removed by earlier runs, remove i from index
atlist.remove(sel[i] - i);
}
tableViewer.refresh();
}
/**
* Returns this field editor's selection listener.
* The listener is created if nessessary.
*
* @return the selection listener
*/
private SelectionListener getSelectionListener() {
if (selectionListener == null) {
createSelectionListener();
}
return selectionListener;
}
}