package fr.opensagres.nosql.ide.mongodb.ui.internal.editors.database;
import java.util.List;
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.swt.SWT;
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.Table;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import com.mongodb.DBObject;
import fr.opensagres.nosql.ide.mongodb.ui.internal.Messages;
import fr.opensagres.nosql.ide.mongodb.ui.internal.viewers.document.DBObjectKeyColumnLabelProvider;
import fr.opensagres.nosql.ide.mongodb.ui.internal.viewers.document.DBObjectValueColumnLabelProvider;
import fr.opensagres.nosql.ide.mongodb.ui.internal.viewers.user.DBUserLabelProvider;
import fr.opensagres.nosql.ide.mongodb.ui.singlesourcing.SingleSourcingUtils;
import fr.opensagres.nosql.ide.ui.editors.AbstractMasterDetailsBlock;
import fr.opensagres.nosql.ide.ui.viewers.ViewerHelper;
public class UsersMasterDetailsBlock extends AbstractMasterDetailsBlock {
private static final Integer ADD_BUTTON_INDEX = 1;
private static final Integer REMOVE_BUTTON_INDEX = 2;
private UserDetailsPage userDetailsPage;
private TableViewer viewer;
private Button removeButton;
public UsersMasterDetailsBlock(UsersPage usersPage) {
super(usersPage);
this.userDetailsPage = new UserDetailsPage();
}
@Override
protected void createMasterPart(final IManagedForm managedForm,
Composite parent) {
FormToolkit toolkit = managedForm.getToolkit();
Section section = toolkit.createSection(parent, Section.DESCRIPTION
| Section.TITLE_BAR);
section.setText(Messages.UsersEditor_UsersPage_UsersMasterDetailsBlock_title); //$NON-NLS-1$
section.setDescription(Messages.UsersEditor_UsersPage_UsersMasterDetailsBlock_desc); //$NON-NLS-1$
section.marginWidth = 10;
section.marginHeight = 5;
Composite client = toolkit.createComposite(section, SWT.WRAP);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = 2;
layout.marginHeight = 2;
client.setLayout(layout);
Table usersTable = toolkit.createTable(client, SWT.MULTI);
usersTable.setHeaderVisible(true);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 20;
gd.widthHint = 100;
usersTable.setLayoutData(gd);
SingleSourcingUtils.FormToolkit_paintBordersFor(toolkit, client);
createButtons(toolkit, client);
section.setClient(client);
final SectionPart spart = new SectionPart(section);
managedForm.addPart(spart);
viewer = new TableViewer(usersTable);
createColumns(viewer);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event
.getSelection();
if (selection.size() == 1) {
managedForm.fireSelectionChanged(spart,
event.getSelection());
}
removeButton.setEnabled(true);
}
});
// viewer.setContentProvider(DBUserContentProvider.getInstance());
viewer.setLabelProvider(DBUserLabelProvider.getInstance());
init();
}
private void createButtons(FormToolkit toolkit, Composite parent) {
GridData gd;
Composite buttonsContainer = toolkit.createComposite(parent);
gd = new GridData(GridData.FILL_VERTICAL);
buttonsContainer.setLayoutData(gd);
buttonsContainer.setLayout(createButtonsLayout());
SelectionAdapter listener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (e.widget.getData() == ADD_BUTTON_INDEX) {
handleAddButton();
} else if (e.widget.getData() == REMOVE_BUTTON_INDEX) {
handleRemoveButton();
}
}
};
Button addButton = toolkit.createButton(buttonsContainer,
Messages.addButton_label, SWT.PUSH); //$NON-NLS-1$
gd = new GridData(GridData.FILL_HORIZONTAL
| GridData.VERTICAL_ALIGN_BEGINNING);
addButton.setData(ADD_BUTTON_INDEX);
addButton.setLayoutData(gd);
addButton.setEnabled(true);
addButton.addSelectionListener(listener);
removeButton = toolkit.createButton(buttonsContainer,
Messages.removeButton_label, SWT.PUSH); //$NON-NLS-1$
gd = new GridData(GridData.FILL_HORIZONTAL
| GridData.VERTICAL_ALIGN_BEGINNING);
removeButton.setData(REMOVE_BUTTON_INDEX);
removeButton.setLayoutData(gd);
removeButton.setEnabled(false);
removeButton.addSelectionListener(listener);
SingleSourcingUtils.FormToolkit_paintBordersFor(toolkit,
buttonsContainer);
}
protected void handleAddButton() {
// DBObject user = new DB();
// user.setLabel("New user");
// getUsers().add(user);
// viewer.add(user);
// viewer.setSelection(new StructuredSelection(user));
}
protected void handleRemoveButton() {
IStructuredSelection selection = (IStructuredSelection) viewer
.getSelection();
if (!selection.isEmpty()) {
DBObject user = null;
Object[] users = selection.toArray();
for (int i = 0; i < users.length; i++) {
user = (DBObject) users[i];
// getUsers().remove(user);
viewer.remove(user);
}
viewer.refresh();
}
}
protected GridLayout createButtonsLayout() {
GridLayout layout = new GridLayout();
layout.marginWidth = layout.marginHeight = 0;
return layout;
}
// @Override
// public void onBind(DataBindingContext dataBindingContext) {
// Set<Hobby> users = getUsers();
// viewer.setInput(users);
// }
private void init() {
try {
List<DBObject> users = ((DatabaseEditor) getEditor())
.getModelObject().getUsers();
viewer.setInput(users);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public IDetailsPage getPage(Object key) {
return userDetailsPage;
}
public Object getPageKey(Object object) {
return null;
}
private static void createColumns(final TableViewer viewer) {
// First column is for the username
TableViewerColumn col = ViewerHelper.createColumn(viewer,
Messages.columnUsername, 150,
DBObjectKeyColumnLabelProvider.getInstance());
// col.getColumn().addSelectionListener(
// new SortTableColumnSelectionListener("name"));
// Second column is for the readOnly
col = ViewerHelper.createColumn(viewer, Messages.columnReadonly, 100,
DBObjectValueColumnLabelProvider.getInstance());
// col.getColumn().addSelectionListener(
// new SortTableColumnSelectionListener("address.name"));
}
}