/**************************************************************************************************
* Copyright (c) 2010 Fabian Steeg. All rights reserved. This program and the accompanying materials
* are 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
* <p/>
* Contributors: Fabian Steeg - initial API and implementation
*************************************************************************************************/
package de.uni_koeln.ub.drc.ui.views;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Link;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
import scala.collection.JavaConversions;
import de.uni_koeln.ub.drc.data.Comment;
import de.uni_koeln.ub.drc.data.Page;
import de.uni_koeln.ub.drc.ui.DrcUiActivator;
import de.uni_koeln.ub.drc.ui.Messages;
import de.uni_koeln.ub.drc.ui.views.WordViewModel.WordViewLabelProvider;
/**
* View on comments for a page.
*
* @author Fabian Steeg (fsteeg), Mihail Atanassov (matana)
*/
public final class CommentsView extends ViewPart {
/**
* The class / CommentsView ID
*/
public static final String ID = CommentsView.class.getName().toLowerCase();
static final String NEW_COMMENT = "new_comment"; //$NON-NLS-1$
private TableViewer viewer;
private Page page;
private Text commentField;
/**
* @param parent
* The parent composite for this part
*/
@Override
public void createPartControl(final Composite parent) {
initAddCommentBar(parent);
initTableViewer(parent);
GridLayoutFactory.fillDefaults().generateLayout(parent);
attachSelectionListener();
}
@Override
public void setFocus() {
}
private void attachSelectionListener() {
ISelectionService selectionService = (ISelectionService) getSite()
.getService(ISelectionService.class);
selectionService.addSelectionListener(new ISelectionListener() {
@Override
@SuppressWarnings("unchecked")
public void selectionChanged(IWorkbenchPart part,
ISelection selection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
if (structuredSelection.getFirstElement() instanceof Page) {
List<Page> pages = structuredSelection.toList();
if (pages != null && pages.size() > 0) {
page = pages.get(0);
setInput();
}
}
}
});
}
/* DI */@SuppressWarnings("unused")
@PostConstruct
private void addFocusListener() {
commentField
.addFocusListener(new SpecialCharacterView.TextFocusListener(
commentField));
}
private void initAddCommentBar(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(2, false));
commentField = new Text(comp, SWT.BORDER);
commentField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button add = new Button(comp, SWT.PUSH | SWT.FLAT);
add.setImage(DrcUiActivator.getDefault().loadImage("icons/add.gif")); //$NON-NLS-1$
add.setToolTipText(Messages.get().AddNewComment);
SelectionListener listener = new SelectionListener() {
@Override
// on button click
public void widgetSelected(SelectionEvent e) {
addComment(commentField);
}
@Override
// on enter in text
public void widgetDefaultSelected(SelectionEvent e) {
addComment(commentField);
}
private void addComment(final Text commentField) {
String text = commentField.getText().trim();
if (text.length() > 0) {
page.comments().$plus$eq(
new Comment(DrcUiActivator.getDefault()
.currentUser().id(), text, System
.currentTimeMillis()));
setInput();
page.saveToDb(DrcUiActivator.getDefault().currentUser()
.collection(), DrcUiActivator.getDefault().db());
commentField.setText(""); //$NON-NLS-1$
SearchView sv = DrcUiActivator.find(SearchView.class);
sv.updateTreeViewer();
}
}
};
add.addSelectionListener(listener);
commentField.addSelectionListener(listener);
}
private void initTableViewer(final Composite parent) {
viewer = new TableViewer(parent, SWT.MULTI | SWT.V_SCROLL
| SWT.FULL_SELECTION | SWT.BORDER);
initTable();
viewer.setContentProvider(new CommentsContentProvider());
viewer.setLabelProvider(new CommentsLabelProvider());
setInput();
}
private void initTable() {
final int[] columns = new int[] { 25, 500, 350, 250 };
createColumn("", columns[0]); //$NON-NLS-1$
createColumn(Messages.get().Comment, columns[1]);
createColumn(Messages.get().Author, columns[2]);
createColumn(Messages.get().Date, columns[3]);
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
}
private void createColumn(final String name, final int width) {
TableViewerColumn column1 = new TableViewerColumn(viewer, SWT.NONE);
column1.getColumn().setText(name);
column1.getColumn().setWidth(width);
column1.getColumn().setResizable(true);
column1.getColumn().setMoveable(true);
}
private void setInput() {
if (page != null) {
TableHelper.clearWidgets(viewer.getTable());
viewer.setInput(JavaConversions.asJavaList(page.comments())
.toArray(new Comment[] {}));
addLinks();
}
}
private void addLinks() {
Table table = viewer.getTable();
TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
final TableItem item = items[i];
final String author = ((Comment) item.getData()).user();
Link link = TableHelper.insertLink(viewer.getTable(), item, author,
2);
item.setData(new Widget[] { link });
}
}
private static final class CommentsContentProvider implements
IStructuredContentProvider {
@Override
public Object[] getElements(final Object inputElement) {
Object[] elements = (Object[]) inputElement;
return elements;
}
@Override
public void dispose() {
}
@Override
public void inputChanged(final Viewer viewer, final Object oldInput,
final Object newInput) {
}
}
private static final class CommentsLabelProvider extends LabelProvider
implements ITableLabelProvider {
@Override
public String getColumnText(final Object element, final int columnIndex) {
Comment comment = (Comment) element;
switch (columnIndex) {
case 0:
return ""; //$NON-NLS-1$
case 1:
return comment.text();
case 2:
return WordViewLabelProvider.userDetails(comment.user());
case 3:
return new Date(comment.date()).toString();
default:
return comment.toString();
}
}
@Override
public Image getColumnImage(final Object element, final int columnIndex) {
if (columnIndex == 0) {
return DrcUiActivator.getDefault().loadImage("icons/write.gif"); //$NON-NLS-1$
}
return null;
}
}
}