/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.attribute.editor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import org.jboss.tools.common.model.ui.IListEditor;
import org.jboss.tools.common.model.ui.IStructuredChangeListener;
import org.jboss.tools.common.model.ui.IStructuredEditor;
import org.jboss.tools.common.model.ui.StructuredChangedEvent;
import org.jboss.tools.common.model.ui.attribute.IListContentProvider;
import org.jboss.tools.common.model.ui.attribute.adapter.ITableAdapter;
import org.jboss.tools.common.model.ui.attribute.adapter.StructuredListAdapter.INewValueProvider;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.jboss.tools.common.model.ui.actions.IActionProvider;
import org.jboss.tools.common.model.ui.widgets.BorderedControl;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
import org.jboss.tools.common.model.ui.widgets.ScrolledComposite;
import org.jboss.tools.common.model.ui.widgets.border.Border;
public class TableStructuredFieldEditor extends ExtendedFieldEditor
implements IPropertyFieldEditor, IStructuredEditor, IListEditor, IFieldEditor, PropertyChangeListener, IStructuredChangeListener, ISelectionChangedListener {
// controls
// label get from superclass
private TableViewer tableViewer;
private Control tableControl;
private Table tableField;
private IPropertyEditor propertyEditor;
//following fields are never read
IStructuredContentProvider structuredContentProvider;
IStructuredChangeListener structuredChangeListener;
INewValueProvider newValueProvider;
ILabelProvider labelProvider;
IListContentProvider listContentProvider;
ITableAdapter tableAdapter;
Composite composite;
Composite tableButtonsControl;
PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public TableStructuredFieldEditor() {}
public TableStructuredFieldEditor(IWidgetSettings settings) {
super(settings);
}
protected void adjustForNumColumns(int numColumns) {}
protected void doFillIntoGrid(Composite parent, int numColumns) {}
protected void doLoad() {}
protected void doLoadDefault() {}
protected void doStore() {}
public int getNumberOfControls() {
return 2;
}
// IPropertyFieldEditor
public void setPropertyEditor(IPropertyEditor propertyEditor) {
this.propertyEditor = propertyEditor;
initialize();
}
// IStructuredEditor
public void setStructuredContentProvider(IStructuredContentProvider structuredContentProvider) {
this.structuredContentProvider = structuredContentProvider;
}
// IStructuredEditor
public void setStructuredChangeListener(IStructuredChangeListener structuredChangeListener) {
this.structuredChangeListener = structuredChangeListener;
}
// IStructuredEditor
public void setNewStructuredElementProvider(INewValueProvider newValueProvider) {
this.newValueProvider = newValueProvider;
}
// IListEditor
public void setLabelProvider(ILabelProvider labelProvider) {
this.labelProvider = labelProvider;
}
// IListEditor
public void setListContentProvider(IListContentProvider listContentProvider) {
this.listContentProvider = listContentProvider;
}
// IFieldEditor
public Control[] getControls(Composite parent) {
return new Control[] {getLabelComposite(parent), createTableButtonsComponent(parent)};
}
// PropertyChangeListener
// listen change value from adapter
public void propertyChange(PropertyChangeEvent evt) {
}
protected void applyButtonSkin(Control button) {
if (button!=null) {
Color bg = getSettings().getColor("Button.Background"); //$NON-NLS-1$
Color fg = getSettings().getColor("Button.Foreground"); //$NON-NLS-1$
Font font = getSettings().getFont("Button.Font"); //$NON-NLS-1$
button.setBackground(bg);
button.setForeground(fg);
button.setFont(font);
}
}
private IActionProvider actionProvider;
private ActionButtonControl actionButtonControl;
public Control createButtonsControl(Composite parent) {
return actionButtonControl.createControl(parent);
}
private ActionButtonControl createActionButtonControl() {
ActionButtonControl actionButtonControl = new ActionButtonControl();
actionButtonControl.setPropertyEditor(propertyEditor);
return actionButtonControl;
}
public Control getTableControl() {
return tableControl;
}
public Control createTableControl(Composite parent) {
if (tableField == null) {
int style = getSettings().getStyle("Table.Style"); //$NON-NLS-1$
Color bg = getSettings().getColor("Table.Background"); //$NON-NLS-1$
Color fg = getSettings().getColor("Table.Foreground"); //$NON-NLS-1$
Font font = getSettings().getFont("Table.Font"); //$NON-NLS-1$
Border border = getSettings().getBorder("Table.Border"); //$NON-NLS-1$
if (style==SWT.DEFAULT) style = SWT.NONE;
if (border!=null) {
BorderedControl borderedControl = new BorderedControl(parent, SWT.NONE, border);
tableField = new Table(borderedControl, style | SWT.FULL_SELECTION);
tableControl = borderedControl;
} else {
tableField = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION);
tableControl = tableField;
}
tableField.setFont(font);
tableField.setBackground(bg);
tableField.setForeground(fg);
tableField.setHeaderVisible(true);
tableField.setLinesVisible(true);
tableField.setLayout(new TableLayout());
tableField.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
if(getActionProvider() == null) return;
Display.getDefault().asyncExec(new Runnable() {
public void run() {
IAction action = getActionProvider().getAction(TableStructuredEditor.DOUBLE_CLICK__ACTION);
if (action!=null) action.run();
}
});
}
public void mouseDown(MouseEvent e) {
}
public void mouseUp(MouseEvent e) {
}
});
// create columns
if (tableAdapter!=null) {
TableColumn[] cs = tableAdapter.createTableColumn(tableField, SWT.NONE);
if(cs != null && cs.length == 1) {
tableField.setLinesVisible(false);
tableField.setHeaderVisible(false);
GridData g = new GridData(GridData.FILL_BOTH);
g.horizontalSpan = 2;
}
}
// create TableViewer
if (tableViewer==null) {
tableViewer = new TableViewer(tableField);
}
if (tableAdapter!=null) {
tableViewer.setLabelProvider(tableAdapter.getTableLabelProvider());
}
if (tableAdapter!=null) {
tableViewer.setContentProvider(tableAdapter);
}
if (tableAdapter!=null) {
tableViewer.setInput(this);
}
if (tableAdapter!=null) {
tableViewer.addSelectionChangedListener(tableAdapter);
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if(tableField == null || tableField.isDisposed() || !tableField.isFocusControl()) return;
TableItem[] items = tableField.getSelection();
if(items == null || items.length == 0) return;
Rectangle r = items[0].getBounds(0);
ScrolledComposite.scrollToVisible(tableField, r);
}
});
tableField.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if(tableField == null || tableField.isDisposed() || !tableField.isFocusControl()) return;
TableItem[] items = tableField.getSelection();
if(items != null && items.length > 0) {
Rectangle r = items[0].getBounds(0);
ScrolledComposite.scrollToVisible(tableField, r);
} else {
ScrolledComposite.scrollToVisible(tableField, new Rectangle(0, 0, 100, 10));
}
}
public void focusLost(FocusEvent e) {
}
});
}
structureChanged(null);
}
return this.tableControl;
}
public Control createTableButtonsComponent(Composite parent) {
if (tableButtonsControl==null) {
tableButtonsControl = new Composite(parent, SWT.NONE);
tableButtonsControl.setBackground(parent.getBackground());
GridData gd;
GridLayout layout = new GridLayout(3, Boolean.FALSE.booleanValue());
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
tableButtonsControl.setLayout(layout);
Label l = new Label(tableButtonsControl, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 3;
l.setLayoutData(gd);
Control control;
// table
control = createTableControl(tableButtonsControl);
if(tableField.getColumnCount() == 1) {
l.setText("" + tableField.getColumn(0).getText()); //$NON-NLS-1$
} else {
l.dispose();
}
gd = new GridData(GridData.FILL_BOTH);
control.setLayoutData(gd);
if (this.tableAdapter.getActionProvider()!=null &&
this.tableAdapter.getActionProvider().getActions()!=null &&
this.tableAdapter.getActionProvider().getActions().length>0) {
// divider
control = new Composite(tableButtonsControl, SWT.NONE);
control.setBackground(tableButtonsControl.getBackground());
gd = new GridData();
gd.widthHint = 5;
control.setLayoutData(gd);
// buttons
control = createButtonsControl(tableButtonsControl);
if (control!=null) {
gd = new GridData();
gd.verticalAlignment = SWT.UP;
control.setLayoutData(gd);
}
}
updateTableLayoutData();
}
return tableButtonsControl;
}
public boolean updateTableLayoutData() {
if(tableField == null || tableField.isDisposed()) return false;
boolean isNew = false;
boolean changed = false;
GridData data = null;
if(tableButtonsControl.getLayoutData() instanceof GridData) {
data = (GridData)tableButtonsControl.getLayoutData();
} else {
data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 2;
isNew = true;
changed = true;
}
int itemCount = tableField.getItemCount();
if(itemCount > 10) {
if(data.heightHint != 250 || data.verticalAlignment != GridData.BEGINNING) {
changed = true;
data.verticalAlignment = GridData.BEGINNING;
data.heightHint = 250;
}
} else {
if(data.heightHint != SWT.DEFAULT || data.verticalAlignment != GridData.FILL) {
changed = true;
data.verticalAlignment = GridData.FILL;
data.heightHint = SWT.DEFAULT;
}
}
if(changed) {
tableButtonsControl.setLayoutData(data);
}
return !isNew && changed;
}
public Control getControl() {
return this.tableControl;
}
private void initialize() {
if (propertyEditor!=null) {
this.tableAdapter = (ITableAdapter)propertyEditor.getAdapter(ITableAdapter.class);
}
if (tableAdapter!=null) {
tableAdapter.addStructureChangeListener(this);
tableAdapter.addSelectionChangedListener(this);
actionProvider = (IActionProvider)propertyEditor.getAdapter(IActionProvider.class);
actionButtonControl = createActionButtonControl();
actionButtonControl.setPropertyEditor(propertyEditor);
actionButtonControl.setSettings(getSettings());
}
}
// IStructureChangeListener
public void structureChanged(StructuredChangedEvent event) {
if(tableViewer == null) return;
Table table = tableViewer.getTable();
if(table == null || table.isDisposed()) return;
int i = table.getSelectionIndex();
if(i < 0) i = 0;
tableViewer.refresh();
int c = tableViewer.getTable().getItemCount();
if(updateTableLayoutData()) {
tableButtonsControl.layout();
tableButtonsControl.getParent().layout();
tableButtonsControl.getParent().getParent().layout();
}
while(i >= c) --i;
if(i >= 0) {
tableViewer.setSelection(new StructuredSelection(tableViewer.getTable().getItem(i).getData()));
}
}
//ISelectionChangedListener
public void selectionChanged(SelectionChangedEvent event) {
tableAdapter.removeSelectionChangedListener(this);
tableViewer.setSelection(event.getSelection());
tableAdapter.addSelectionChangedListener(this);
if(actionProvider != null) {
actionProvider.update(event.getSelection());
}
}
protected IActionProvider getActionProvider() {
return actionProvider;
}
protected void setActionProvider(IActionProvider provider) {
actionProvider = provider;
}
public void setEnabled(boolean enabled){
super.setEnabled(enabled);
//if (this.getTableControl()!=null) getTableControl().setEnabled(enabled);
// it must make model in action provider // if (actionButtonControl!=null) actionButtonControl.setEnabled(enabled);
}
public TableViewer getTableViewer() {
return tableViewer;
}
public void cut() {}
public void copy() {}
public void paste() {}
public void delete() {}
}