/*******************************************************************************
* Copyright (c) 2006-2013, Cloudsmith Inc.
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
******************************************************************************/
package org.eclipse.buckminster.ui.editor.cspec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.buckminster.core.cspec.builder.ActionArtifactBuilder;
import org.eclipse.buckminster.core.cspec.builder.ActionBuilder;
import org.eclipse.buckminster.core.cspec.builder.ArtifactBuilder;
import org.eclipse.buckminster.core.cspec.builder.GroupBuilder;
import org.eclipse.buckminster.core.cspec.builder.TopLevelAttributeBuilder;
import org.eclipse.buckminster.ui.Messages;
import org.eclipse.buckminster.ui.editor.cspec.CSpecEditor.CSpecEditorTab;
import org.eclipse.buckminster.ui.internal.DynamicTableLayout;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* @author Karel Brezina
*
*/
public class AllAttributesView extends Composite {
class TableContentProvider implements IStructuredContentProvider {
@Override
public void dispose() {
// Nothing to dispose
}
@Override
public Object[] getElements(Object inputElement) {
return table.toArray();
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// Nothing to do
}
}
class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
switch (columnIndex) {
case 0:
return ((TopLevelAttributeBuilder) element).getName();
case 1:
return getAttributeType((TopLevelAttributeBuilder) element);
case 2:
return Boolean.valueOf(((TopLevelAttributeBuilder) element).isPublic()).toString();
default:
return ""; //$NON-NLS-1$
}
}
private String getAttributeType(TopLevelAttributeBuilder builder) {
if (builder instanceof ActionBuilder)
return Messages.action;
else if (builder instanceof ActionArtifactBuilder)
return Messages.product_artifact;
else if (builder instanceof ArtifactBuilder)
return Messages.artifact;
else if (builder instanceof GroupBuilder)
return Messages.group;
return ""; //$NON-NLS-1$
}
}
private static final String[] TABLE_TITLES = { Messages.name, Messages.type, Messages.public_label };
private static final int[] TABLE_WEIGHTS = { 60, 20, 20 };
private CSpecEditor cspecEditor;
private TableViewer tableViewer;
private List<TopLevelAttributeBuilder> table = new ArrayList<TopLevelAttributeBuilder>();
private Map<ActionArtifactBuilder, ActionBuilder> aaMap = new HashMap<ActionArtifactBuilder, ActionBuilder>();
private int lastSelectedRow = -1;
public AllAttributesView(Composite parent, int style, CSpecEditor editor) {
super(parent, style);
cspecEditor = editor;
initComposite();
}
public void refresh() {
table.clear();
table.addAll(cspecEditor.getActionBuilders());
for (ActionBuilder actionBuilder : cspecEditor.getActionArtifactBuilders().keySet())
for (ActionArtifactBuilder actionArtifactBuilder : cspecEditor.getActionArtifactBuilders().get(actionBuilder)) {
table.add(actionArtifactBuilder);
aaMap.put(actionArtifactBuilder, actionBuilder);
}
table.addAll(cspecEditor.getArtifactBuilders());
table.addAll(cspecEditor.getGroupBuilders());
Collections.sort(table, CSpecEditorUtils.getAttributeComparator());
tableViewer.setInput(table);
if (getSelectionIndex() == -1 && table.size() > 0) {
if (lastSelectedRow == -1) {
tableViewer.getTable().setSelection(0);
} else {
if (lastSelectedRow >= table.size()) {
lastSelectedRow = table.size() - 1;
}
tableViewer.getTable().setSelection(lastSelectedRow);
}
}
if (getSelectionIndex() != -1) {
lastSelectedRow = getSelectionIndex();
}
}
@Override
public boolean setFocus() {
return tableViewer.getTable().setFocus();
}
protected void initComposite() {
GridLayout topLayout = new GridLayout(2, false);
topLayout.marginHeight = topLayout.marginWidth = 0;
setLayout(topLayout);
setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Table tbl = new Table(this, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
Button detailButton = new Button(this, SWT.PUSH);
detailButton.setText(Messages.show_details);
detailButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
detailButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
show(table.get(tableViewer.getTable().getSelectionIndex()));
}
});
tbl.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
refresh();
}
@Override
public void focusLost(FocusEvent e) {
updateLastSelectedRow();
}
});
tbl.setHeaderVisible(true);
DynamicTableLayout layout = new DynamicTableLayout(50);
int tableIdx = 0;
for (int idx = 0; idx < 3; idx++) {
TableColumn tableColumn = new TableColumn(tbl, SWT.LEFT, tableIdx);
tableColumn.setText(TABLE_TITLES[idx]);
layout.addColumnData(new ColumnWeightData(TABLE_WEIGHTS[idx], true));
tableIdx++;
}
tbl.setLayout(layout);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
// gridData.widthHint = 600;
tbl.setLayoutData(gridData);
tableViewer = new TableViewer(tbl);
tableViewer.setLabelProvider(new TableLabelProvider());
tableViewer.setContentProvider(new TableContentProvider());
tableViewer.setInput(tbl);
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
if (tableViewer.getTable().getSelectionIndex() >= 0) {
show(table.get(tableViewer.getTable().getSelectionIndex()));
}
}
});
}
private int getSelectionIndex() {
return tableViewer.getTable().getSelectionIndex();
}
private void show(TopLevelAttributeBuilder builder) {
if (builder instanceof ActionBuilder) {
if (cspecEditor.getActionsEditor().show(((ActionBuilder) builder), Messages.general))
cspecEditor.switchTab(CSpecEditorTab.ACTIONS);
} else if (builder instanceof ActionArtifactBuilder) {
if (cspecEditor.getActionsEditor().show(aaMap.get(builder), Messages.products)) {
cspecEditor.switchTab(CSpecEditorTab.ACTIONS);
cspecEditor.getActionsTable().showProductArtifact((ActionArtifactBuilder) builder);
}
} else if (builder instanceof ArtifactBuilder) {
if (cspecEditor.getArtifactsEditor().show(((ArtifactBuilder) builder), Messages.general))
cspecEditor.switchTab(CSpecEditorTab.ARTIFACTS);
} else if (builder instanceof GroupBuilder) {
if (cspecEditor.getGroupsEditor().show(((GroupBuilder) builder), Messages.general))
cspecEditor.switchTab(CSpecEditorTab.GROUPS);
}
}
private void updateLastSelectedRow() {
if (getSelectionIndex() != -1) {
lastSelectedRow = getSelectionIndex();
}
}
}