blob: 14fd08ada13bd2a89dbdbdfe0d0b5f12dda1902a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Ericsson
*
* 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
*
* Description:
* This class implements the implementation of the review table view.
*
* Contributors:
* Jacques Bouthillier - Initial Implementation of the table view
******************************************************************************/
package org.eclipse.mylyn.reviews.r4e_gerrit.ui.internal.model;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.mylyn.reviews.r4e_gerrit.core.R4EGerritReviewData;
import org.eclipse.mylyn.reviews.r4e_gerrit.ui.R4EGerritUi;
import org.eclipse.mylyn.reviews.r4e_gerrit.ui.internal.commands.table.AdjustMyStarredHandler;
import org.eclipse.mylyn.reviews.r4e_gerrit.ui.internal.utils.UIUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
* @author Jacques Bouthillier
* @version $Revision: 1.0 $
*
*/
public class UIReviewTable {
private final int TABLE_STYLE = (SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
// ------------------------------------------------------------------------
// Variables
// ------------------------------------------------------------------------
private TableViewer fViewer;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
public UIReviewTable() {
}
// ------------------------------------------------------------------------
// Methods
// ------------------------------------------------------------------------
public TableViewer createTableViewerSection(Composite aParent) {
// Create a form to maintain the search data
Composite viewerForm = UIUtils.createsGeneralComposite(aParent,
SWT.BORDER | SWT.SHADOW_ETCHED_IN);
GridData gribDataViewer = new GridData(GridData.FILL_BOTH);
viewerForm.setLayoutData(gribDataViewer);
// Add a listener when the view is resized
GridLayout layout = new GridLayout();
layout.numColumns = ReviewTableDefinition.values().length;
layout.makeColumnsEqualWidth = false;
viewerForm.setLayout(layout);
// Create the table viewer to maintain the list of reviews
fViewer = new TableViewer(viewerForm, TABLE_STYLE);
fViewer = buildAndLayoutTable(fViewer);
// Set the content provider and the Label provider and the sorter
fViewer.setContentProvider(new ReviewTableContentProvider());
// Set the viewer for the provider
ReviewTableLabelProvider tableProvider = new ReviewTableLabelProvider();
fViewer.setLabelProvider(tableProvider);
ReviewTableSorter.bind(fViewer);
// Create the help context id for the viewer's control
// PlatformUI
// .getWorkbench()
// .getHelpSystem()
// .setHelp(fViewer.getControl(),
// "org.eclipse.mylyn.reviews.r4e-gerrit.ui.viewer");
//
fViewer.getTable().addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
// TODO Auto-generated method stub
R4EGerritUi.Ftracer.traceInfo("Table selection: "
+ e.toString());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
});
// Add a Key event and mouse down listener
fViewer.getTable().addListener(SWT.MouseDown, mouseButtonListener);
// fViewer.getTable().addKeyListener(keyEventListener);
return fViewer;
}
/**
* Create each column for the List of Reviews
*
* @param aParent
* @param aViewer
*/
private TableViewer buildAndLayoutTable(final TableViewer aViewer) {
final Table table = aViewer.getTable();
//Get the review table definition
ReviewTableDefinition[] tableInfo = ReviewTableDefinition.values();
int size = tableInfo.length;
R4EGerritUi.Ftracer.traceInfo("Table Name Width Resize Moveable");
for (int index = 0; index < size; index++) {
R4EGerritUi.Ftracer.traceInfo("index [ " + index +
" ] " + tableInfo[index].getName() +
"\t: " + tableInfo[index].getWidth() +
"\t: " + tableInfo[index].getResize() +
"\t: " + tableInfo[index].getMoveable() );
TableViewerColumn col = createTableViewerColumn(tableInfo[index]);
GridData gribData = new GridData(GridData.FILL_BOTH);
gribData.minimumWidth = tableInfo[index].getWidth();
col.getColumn().getParent().setLayoutData(gribData);
}
TableLayout tableLayout = new TableLayout();
table.setLayout(tableLayout);
table.addControlListener(new ControlListener() {
@Override
public void controlResized(ControlEvent e) {
table.setRedraw(false);
Point tableSize = table.getSize();
Point parentSize = table.getParent().getSize();
//Adjust the width according to its parent
int minimumTableWidth = ReviewTableDefinition.getMinimumWidth();
int mimimumSubjectWidth = ReviewTableDefinition.SUBJECT.getWidth();
int minProjectWidth = ReviewTableDefinition.PROJECT.getWidth();
int proAndSubjetWidth = mimimumSubjectWidth + minProjectWidth;
//Adjust the subject and project column to take the remaining space
int scrollWidth = table.getVerticalBar().getSize().x;
int computeExtraWidth = parentSize.x - 10 - ( minimumTableWidth ) - scrollWidth ;
int newSubjectWidth = mimimumSubjectWidth;
int newProjectWidth = minProjectWidth;
//If extra space, redistribute it to specific column
if (computeExtraWidth > 0) {
//Assign some to subject and some to Project
int value = 2*computeExtraWidth /3;
newSubjectWidth = mimimumSubjectWidth + value; // 2/3 of the extra
newProjectWidth = minProjectWidth + computeExtraWidth- value; // 1/3 of the extra
}
//Subject column
table.getColumn(2).setWidth(newSubjectWidth);
//Project column
table.getColumn(4).setWidth(newProjectWidth);
table.setSize(parentSize.x - 10, tableSize.y);
table.setRedraw(true);
}
@Override
public void controlMoved(ControlEvent e) {
}
});
table.setHeaderVisible(true);
table.setLinesVisible(true);
return aViewer;
}
/**
* Create each column in the review table list
*
* @param ReviewTableDefinition
* @return TableViewerColumn
*/
private TableViewerColumn createTableViewerColumn(
ReviewTableDefinition aTableInfo) {
final TableViewerColumn viewerColumn = new TableViewerColumn(fViewer,
SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(aTableInfo.getName());
column.setWidth(aTableInfo.getWidth());
column.setResizable(aTableInfo.getResize());
column.setMoveable(aTableInfo.getMoveable());
return viewerColumn;
}
private Listener mouseButtonListener = new Listener() {
public void handleEvent(Event aEvent) {
R4EGerritUi.Ftracer.traceInfo("mouseButtonListener() for "
+ aEvent.button);
switch (aEvent.type) {
case SWT.MouseDown:
// Left Click
if (aEvent.button == 1) {
// Process the Item table handling
processItemSelection();
// singleClickFocus(tableIndex);
}
// For now, use button 2 to modify the starred value column 1
if (aEvent.button == 2) {
// Select the new item in the table
Table table = fViewer.getTable();
table.deselectAll();
Point p = new Point(aEvent.x, aEvent.y);
TableItem tbi = fViewer.getTable().getItem(p);
if (tbi != null) {
table.setSelection(tbi);
}
// Execute the command to adjust the column: ID with the
// starred information
AdjustMyStarredHandler handler = new AdjustMyStarredHandler();
try {
handler.execute(new ExecutionEvent());
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Right Click
if (aEvent.button == 3) {
// Process the Item table handling
// processItemSelection();
}
break;
default:
break;
}
}
};
/**
* Key Listener to handle the Mouse down event on the ITEM and ANOMALY table
*/
private KeyListener keyEventListener = new KeyListener() {
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
Table table = fViewer.getTable();
int[] selecteditems = table.getSelectionIndices();
int val = selecteditems[0];
if (e.keyCode == SWT.ARROW_UP) {
// So we need to reduce the selected item
R4EGerritUi.Ftracer
.traceInfo("keyEventListener() for ARROW_UP "
+ e.keyCode);
if (val > 0) {
val--;
table.deselect(selecteditems[0]);
}
}
if (e.keyCode == SWT.ARROW_DOWN) {
// So we need to increase the selected item
R4EGerritUi.Ftracer
.traceInfo("keyEventListener() for ARROW_DOWN "
+ e.keyCode);
if (val < table.getItemCount() - 1) {
val++;
table.deselect(selecteditems[0]);
}
}
// Set the new selection
table.select(val);
// // Process the Item table handling
// processItemSelection();
//
// // Open the file in the editor
// singleClickFocus(tableIndex);
}
};
/**
* Process the selected data from the item table
*/
private void processItemSelection() {
ISelection tableSelection = fViewer.getSelection();
R4EGerritUi.Ftracer
.traceInfo("Selected : " + tableSelection.getClass());
if (tableSelection.isEmpty()) {
R4EGerritUi.Ftracer.traceInfo("Selected table selection is EMPTY ");
} else {
if (tableSelection instanceof IStructuredSelection) {
Object obj = ((IStructuredSelection) tableSelection)
.getFirstElement();
R4EGerritUi.Ftracer
.traceInfo("Selected table selection class: "
+ obj.getClass());
if (obj instanceof R4EGerritReviewData) {
R4EGerritReviewData item = (R4EGerritReviewData) obj;
R4EGerritUi.Ftracer
.traceInfo("Selected table OBJECT selection ID: "
+ item.getAttribute(R4EGerritReviewData.SHORT_CHANGE_ID)
+ "\t subject: "
+ item.getAttribute(R4EGerritReviewData.SUBJECT));
}
}
}
// if (tableSelection.length == 1) {
// ReviewTableListItem selected = tableSelection[0];
// }
// if (R4EGerritTableView.getActiveView() != null) {
// ArrayList<IReviewEntityItem> itemlist = getSelectedItems();
// // Number of item to set the check flag
// if (itemlist.size() > 0) {
// // Only display the first one
// IReviewEntityItem item = itemlist.get(0);
// ReviewItemNavigatorViewPart.getInstance().displayInfo(item);
// } else {
// ReviewItemNavigatorAction.updateItemNavigatorIcon();
// }
// }
// // Set the review view toolbar
// ReviewItemNavigatorAction.updateItemNavigatorIcon();
//
// ReviewTableCommonAction.setToolbarButtonsSensitivity();
}
}