package com.example.e4.rcp.todo.parts;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.e4.ui.di.Focus;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.services.EMenuService;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.EditingSupport;
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.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Table;
import org.eclipse.swt.widgets.Text;
import com.example.e4.rcp.todo.events.MyEventConstants;
import com.example.e4.rcp.todo.i18n.Messages;
import com.example.e4.rcp.todo.model.ITodoService;
import com.example.e4.rcp.todo.model.Todo;
public class TodoOverviewPart {
private Button btnNewButton;
private Label lblNewLabel;
private TableViewer viewer;
@Inject
UISynchronize sync;
@Inject
ESelectionService service;
@Inject
EModelService modelService;
@Inject
MApplication application;
@Inject
IEventBroker broker;
@Inject
ITodoService todoService;
private WritableList writableList;
protected String searchString = "";
private TableViewerColumn colDescription;
private TableViewerColumn colSummary;
@PostConstruct
public void createControls(Composite parent, EMenuService menuService, @Translation Messages message) {
parent.setLayout(new GridLayout(1, false));
btnNewButton = new Button(parent, SWT.PUSH);
btnNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
broker.post(MyEventConstants.TOPIC_TODOS_CHANGED, new HashMap<String, String>());
}
});
Text search = new Text(parent, SWT.SEARCH | SWT.CANCEL | SWT.ICON_SEARCH);
// Assuming that GridLayout is used
search.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
search.setMessage("Filter");
// Filter at every keystroke
search.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
Text source = (Text) e.getSource();
searchString = source.getText();
// Trigger update in the viewer
viewer.refresh();
}
});
// SWT.SEARCH | SWT.CANCEL not supported under Windows7
// This does not work under Windows7
search.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
if (e.detail == SWT.CANCEL) {
Text text = (Text) e.getSource();
text.setText("");
//
}
}
});
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
Table table = viewer.getTable();
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
table.setHeaderVisible(true);
table.setLinesVisible(true);
colSummary = new TableViewerColumn(viewer, SWT.NONE);
colSummary.getColumn().setWidth(100);
colSummary.setEditingSupport(new EditingSupport(viewer) {
@Override
protected void setValue(Object element, Object value) {
Todo todo = (Todo) element;
todo.setSummary(String.valueOf(value));
viewer.refresh();
}
@Override
protected Object getValue(Object element) {
Todo todo = (Todo) element;
return todo.getSummary();
}
@Override
protected CellEditor getCellEditor(Object element) {
return new TextCellEditor(viewer.getTable(), SWT.NONE);
}
@Override
protected boolean canEdit(Object element) {
return true;
}
});
colDescription = new TableViewerColumn(viewer, SWT.NONE);
colDescription.getColumn().setWidth(100);
// We search in the summary and description field
viewer.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
Todo todo = (Todo) element;
return todo.getSummary().contains(searchString) || todo.getDescription().contains(searchString);
}
});
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
service.setSelection(selection.getFirstElement());
}
});
menuService.registerContextMenu(viewer.getControl(), "com.example.e4.rcp.todo.popupmenu.table");
writableList = new WritableList(todoService.getTodos(), Todo.class);
ViewerSupport.bind(viewer, writableList,
BeanProperties.values(new String[] { Todo.FIELD_SUMMARY, Todo.FIELD_DESCRIPTION }));
translateTable(message);
}
@Inject
@Optional
private void subscribeTopicTodoAllTopics(
@UIEventTopic(MyEventConstants.TOPIC_TODO_ALLTOPICS) Map<String, String> event) {
Job job = new Job("loading") {
@Override
protected IStatus run(IProgressMonitor monitor) {
final List<Todo> list = todoService.getTodos();
sync.asyncExec(new Runnable() {
@Override
public void run() {
if (viewer != null) {
writableList.clear();
writableList.addAll(list);
}
}
});
return Status.OK_STATUS;
}
};
job.schedule();
}
@Focus
private void setFocus() {
btnNewButton.setFocus();
}
@Inject
public void translateTable(@Translation Messages message) {
if (viewer != null && !viewer.getTable().isDisposed()) {
colSummary.getColumn().setText(message.txtSummary);
colDescription.getColumn().setText(message.txtDescription);
btnNewButton.setText(message.buttonLoadData);
}
}
}