/**
*
*/
package org.goko.tools.serial.jssc.preferences.console;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.goko.common.preferences.GkPreferencesPage;
import org.goko.tools.serial.jssc.console.internal.JsscConsoleFilter;
import org.goko.tools.serial.jssc.console.internal.JsscConsoleFilterType;
import org.goko.tools.serial.jssc.preferences.connection.SerialConnectionPreference;
/**
* @author Psyko
* @date 18 déc. 2016
*/
public class JsscConsolePreferencesPage extends GkPreferencesPage {
private Table filterTable;
private List<JsscConsoleFilter> lstFilter;
private TableViewer filterTableViewer;
private JsscConsoleFilter lastSelection;
public JsscConsolePreferencesPage() {
setTitle("Serial console");
}
@Override
protected Control createContents(final Composite parentComposite) {
lstFilter = new ArrayList<JsscConsoleFilter>();
Composite parent = new Composite(parentComposite, SWT.NONE);
parent.setLayout(new GridLayout(2, false));
Label lblApplyFiltersTo = new Label(parent, SWT.NONE);
lblApplyFiltersTo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
lblApplyFiltersTo.setText("Filter list :");
new Label(parent, SWT.NONE);
filterTableViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
filterTable = filterTableViewer.getTable();
filterTable.setLinesVisible(true);
filterTable.setHeaderVisible(true);
filterTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(filterTableViewer, SWT.NONE);
TableColumn columnViewerDescription = tableViewerColumn_2.getColumn();
columnViewerDescription.setWidth(100);
columnViewerDescription.setText("Description");
tableViewerColumn_2.setLabelProvider(new ColumnLabelProvider(){
/** (inheritDoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
return ((JsscConsoleFilter)element).getDescription();
}
});
TableViewerColumn tableViewerColumn = new TableViewerColumn(filterTableViewer, SWT.NONE);
TableColumn columnViewerPattern = tableViewerColumn.getColumn();
columnViewerPattern.setWidth(94);
columnViewerPattern.setText("Pattern");
tableViewerColumn.setLabelProvider(new ColumnLabelProvider(){
/** (inheritDoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
return ((JsscConsoleFilter)element).getRegex();
}
});
TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(filterTableViewer, SWT.NONE);
TableColumn columnViewerEnable = tableViewerColumn_1.getColumn();
columnViewerEnable.setWidth(60);
columnViewerEnable.setText("Enabled");
tableViewerColumn_1.setLabelProvider(new ColumnLabelProvider(){
/** (inheritDoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if(((JsscConsoleFilter)element).isEnabled()){
return "Enabled";
}
return "Disabled";
}
});
TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(filterTableViewer, SWT.NONE);
TableColumn columnViewerType = tableViewerColumn_3.getColumn();
columnViewerType.setWidth(60);
columnViewerType.setText("Type");
tableViewerColumn_3.setLabelProvider(new ColumnLabelProvider(){
/** (inheritDoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
return ((JsscConsoleFilter)element).getType().getLabel();
}
});
// set the content provider
filterTableViewer.setContentProvider(ArrayContentProvider.getInstance());
// provide the input to the viewer
filterTableViewer.setInput(lstFilter);
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gl_composite = new GridLayout(1, false);
gl_composite.marginWidth = 0;
composite.setLayout(gl_composite);
composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, true, 1, 1));
Button btnAdd = new Button(composite, SWT.NONE);
btnAdd.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
JsscConsoleFilter filter = new JsscConsoleFilter(true, StringUtils.EMPTY, StringUtils.EMPTY, JsscConsoleFilterType.INPUT);
JsscConsoleFilterEditDialog dialog = new JsscConsoleFilterEditDialog(parentComposite.getShell());
dialog.setFilter(filter);
int result = dialog.open();
if(result == Window.OK){
lstFilter.add(filter);
lastSelection = filter;
filterTableViewer.refresh();
updateSelection();
}
}
});
GridData gd_btnAdd = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gd_btnAdd.widthHint = 80;
btnAdd.setLayoutData(gd_btnAdd);
btnAdd.setText("Add...");
final Button btnEdit = new Button(composite, SWT.NONE);
btnEdit.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
JsscConsoleFilter filter = (JsscConsoleFilter) filterTableViewer.getStructuredSelection().getFirstElement();
JsscConsoleFilterEditDialog dialog = new JsscConsoleFilterEditDialog(parentComposite.getShell());
dialog.setFilter(filter);
int result = dialog.open();
if(result == Window.OK){
lastSelection = filter;
filterTableViewer.refresh();
updateSelection();
}
}
});
btnEdit.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnEdit.setText("Edit...");
final Button btnRemove = new Button(composite, SWT.NONE);
btnRemove.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
if(!filterTableViewer.getStructuredSelection().isEmpty()){
JsscConsoleFilter filter = (JsscConsoleFilter) filterTableViewer.getStructuredSelection().getFirstElement();
lstFilter.remove(filter);
filterTableViewer.refresh();
updateSelection();
}
}
});
btnRemove.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnRemove.setText("Remove");
Label label = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
final Button btnEnable = new Button(composite, SWT.NONE);
btnEnable.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
if(!filterTableViewer.getStructuredSelection().isEmpty()){
JsscConsoleFilter filter = (JsscConsoleFilter)filterTableViewer.getStructuredSelection().getFirstElement();
filter.setEnabled(true);
filterTableViewer.refresh();
updateSelection();
}
}
});
btnEnable.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnEnable.setText("Enable");
final Button btnDisable = new Button(composite, SWT.NONE);
btnDisable.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
if(!filterTableViewer.getStructuredSelection().isEmpty()){
JsscConsoleFilter filter = (JsscConsoleFilter)filterTableViewer.getStructuredSelection().getFirstElement();
filter.setEnabled(false);
filterTableViewer.refresh();
updateSelection();
}
}
});
btnDisable.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnDisable.setText("Disable");
filterTableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if(filterTableViewer.getStructuredSelection().isEmpty()){
btnEdit.setEnabled(false);
btnRemove.setEnabled(false);
btnEnable.setEnabled(false);
btnDisable.setEnabled(false);
lastSelection = null;
}else{
btnEdit.setEnabled(true);
btnRemove.setEnabled(true);
lastSelection = (JsscConsoleFilter)filterTableViewer.getStructuredSelection().getFirstElement();
btnEnable.setEnabled(!lastSelection.isEnabled());
btnDisable.setEnabled(lastSelection.isEnabled());
}
}
});
lstFilter.clear();
lstFilter.addAll(SerialConnectionPreference.getInstance().getFilters());
filterTableViewer.refresh();
updateSelection();
return parent;
}
void updateSelection(){
if(CollectionUtils.isNotEmpty(lstFilter) ){
if(lastSelection != null && lstFilter.contains(lastSelection)){
filterTableViewer.setSelection(new StructuredSelection(lastSelection));
}else{
filterTableViewer.setSelection(new StructuredSelection(lstFilter.get(0)));
}
}else{
filterTableViewer.setSelection(new StructuredSelection());
}
}
/** (inheritDoc)
* @see org.eclipse.jface.preference.PreferencePage#performOk()
*/
@Override
public boolean performOk() {
if(lstFilter != null){
SerialConnectionPreference.getInstance().setFilters(lstFilter);
}
return super.performOk();
}
/** (inheritDoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
// TODO Auto-generated method stub
}
}