/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.xviewer.customize;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.nebula.widgets.xviewer.Activator;
import org.eclipse.nebula.widgets.xviewer.IXViewerLabelProvider;
import org.eclipse.nebula.widgets.xviewer.XViewer;
import org.eclipse.nebula.widgets.xviewer.XViewerColumnLabelProvider;
import org.eclipse.nebula.widgets.xviewer.XViewerColumnSorter;
import org.eclipse.nebula.widgets.xviewer.XViewerComputedColumn;
import org.eclipse.nebula.widgets.xviewer.XViewerText;
import org.eclipse.nebula.widgets.xviewer.action.ColumnMultiEditAction;
import org.eclipse.nebula.widgets.xviewer.action.TableCustomizationAction;
import org.eclipse.nebula.widgets.xviewer.action.ViewSelectedCellDataAction;
import org.eclipse.nebula.widgets.xviewer.action.ViewSelectedCellDataAction.Option;
import org.eclipse.nebula.widgets.xviewer.action.ViewTableReportAction;
import org.eclipse.nebula.widgets.xviewer.core.model.CustomizeData;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.nebula.widgets.xviewer.core.util.CollectionsUtil;
import org.eclipse.nebula.widgets.xviewer.util.internal.ArrayTreeContentProvider;
import org.eclipse.nebula.widgets.xviewer.util.internal.HtmlUtil;
import org.eclipse.nebula.widgets.xviewer.util.internal.PatternFilter;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerPatternFilter;
import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.HtmlDialog;
import org.eclipse.nebula.widgets.xviewer.util.internal.dialog.XCheckFilteredTreeDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.ListDialog;
/**
* Allow for the customization of the xViewer's right-click menus. Full menu can be used or selected Actions accessed
* for partial implementation in existing menus
*
* @author Donald G. Dunne
*/
public class XViewerCustomMenu {
protected XViewer xViewer;
private final Clipboard clipboard = new Clipboard(null);
protected Action filterByValue, filterByColumn, filterBySelColumn, clearAllSorting, clearAllFilters, tableProperties,
viewTableReport, columnMultiEdit, removeSelected, removeNonSelected, copySelected, showColumn, addComputedColumn,
sumColumn, averageColumn, hideColumn, copySelectedColumnCells, viewSelectedCell, copySelectedCell, uniqueValues;
private boolean headerMouseClick = false;
public boolean isHeaderMouseClick() {
return headerMouseClick;
}
public XViewerCustomMenu() {
// do nothing
}
public XViewerCustomMenu(XViewer xViewer) {
this.xViewer = xViewer;
}
public void init(final XViewer xviewer) {
this.xViewer = xviewer;
setupActions();
xViewer.getTree().addKeyListener(new KeySelectedListener());
xViewer.getTree().addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(org.eclipse.swt.events.DisposeEvent e) {
if (clipboard != null) {
clipboard.dispose();
}
}
});
xViewer.getMenuManager().addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
if (headerMouseClick) {
setupMenuForHeader();
xviewer.updateMenuActionsForHeader();
} else {
setupMenuForTable();
xViewer.updateMenuActionsForTable();
}
}
});
xViewer.getTree().addListener(SWT.MenuDetect, new Listener() {
@Override
public void handleEvent(Event event) {
Point pt = Display.getCurrent().map(null, xViewer.getTree(), new Point(event.x, event.y));
Rectangle clientArea = xViewer.getTree().getClientArea();
headerMouseClick = clientArea.y <= pt.y && pt.y < (clientArea.y + xViewer.getTree().getHeaderHeight());
}
});
}
protected void setupMenuForHeader() {
MenuManager mm = xViewer.getMenuManager();
setupMenuForHeader(mm);
}
public void setupMenuForHeader(MenuManager menuManager) {
menuManager.add(showColumn);
menuManager.add(hideColumn);
menuManager.add(addComputedColumn);
menuManager.add(copySelectedColumnCells);
menuManager.add(new Separator());
menuManager.add(filterBySelColumn);
menuManager.add(filterByColumn);
menuManager.add(clearAllFilters);
menuManager.add(clearAllSorting);
menuManager.add(new Separator());
menuManager.add(sumColumn);
menuManager.add(averageColumn);
menuManager.add(uniqueValues);
}
protected void setupMenuForTable() {
MenuManager mm = xViewer.getMenuManager();
setupMenuForTable(mm);
}
public void setupMenuForTable(MenuManager menuManager) {
menuManager.add(new GroupMarker(XViewer.MENU_GROUP_PRE));
menuManager.add(new Separator());
menuManager.add(tableProperties);
menuManager.add(viewTableReport);
if (xViewer.isColumnMultiEditEnabled()) {
updateEditMenu(menuManager);
}
menuManager.add(viewSelectedCell);
menuManager.add(copySelectedCell);
menuManager.add(copySelected);
menuManager.add(copySelectedColumnCells);
menuManager.add(new Separator());
menuManager.add(filterByValue);
menuManager.add(filterByColumn);
menuManager.add(clearAllFilters);
menuManager.add(clearAllSorting);
if (xViewer.isRemoveItemsMenuOptionEnabled()) {
menuManager.add(new Separator());
menuManager.add(removeSelected);
menuManager.add(removeNonSelected);
}
menuManager.add(new GroupMarker(XViewer.MENU_GROUP_POST));
}
public void updateEditMenu(MenuManager mm) {
final Collection<TreeItem> selectedTreeItems = Arrays.asList(xViewer.getTree().getSelection());
Set<TreeColumn> editableColumns = ColumnMultiEditAction.getEditableTreeColumns(xViewer, selectedTreeItems);
MenuManager editMenuManager =
createEditMenuManager(xViewer, XViewerText.get("menu.edit.multi"), selectedTreeItems, editableColumns); //$NON-NLS-1$
mm.add(editMenuManager);
}
public static MenuManager createEditMenuManager(final XViewer xViewer, String name, final Collection<TreeItem> selectedTreeItems, Set<TreeColumn> editableColumns) {
MenuManager editMenuManager = new MenuManager(name, XViewerText.get("menu.edit")); //$NON-NLS-1$
if (editableColumns.isEmpty()) {
editMenuManager.add(new Action(XViewerText.get("menu.edit.no_columns")) { //$NON-NLS-1$
@Override
public void run() {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_fields.multi_editable")); //$NON-NLS-1$ //$NON-NLS-2$
}
});
} else {
Map<String, TreeColumn> nameToColumn = new HashMap<String, TreeColumn>();
for (final TreeColumn treeColumn : editableColumns) {
nameToColumn.put(treeColumn.getText(), treeColumn);
}
String[] names = nameToColumn.keySet().toArray(new String[nameToColumn.size()]);
Arrays.sort(names);
for (String columnName : names) {
final TreeColumn treeColumn = nameToColumn.get(columnName);
if (treeColumn.getData() instanceof XViewerColumn) {
XViewerColumn xCol = (XViewerColumn) treeColumn.getData();
if (xCol.isMultiColumnEditable()) {
editMenuManager.add(new Action(XViewerText.get("menu.edit") + " " + xCol.getName()) { //$NON-NLS-1$//$NON-NLS-2$
@Override
public void run() {
xViewer.handleColumnMultiEdit(treeColumn, selectedTreeItems);
}
});
}
}
}
}
return editMenuManager;
}
public void createTableCustomizationMenuItem(Menu popupMenu) {
new ActionContributionItem(xViewer.getCustomizeActionWithoutDropDown()).fill(popupMenu, -1);
}
public void createViewTableReportMenuItem(Menu popupMenu) {
setupActions();
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.view_report")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewTableReport.run();
}
});
}
public void addFilterMenuBlock(Menu popupMenu) {
createFilterByColumnMenuItem(popupMenu);
createClearAllFiltersMenuItem(popupMenu);
createClearAllSortingMenuItem(popupMenu);
}
public void createFilterByColumnMenuItem(Menu popupMenu) {
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.column_filter")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
performFilterByColumn();
}
});
}
public void createFilterByValueMenuItem(Menu popupMenu) {
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.value_filter")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
performFilterByValue();
}
});
}
public void createClearAllFiltersMenuItem(Menu popupMenu) {
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.clear_filters")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
xViewer.getCustomizeMgr().clearFilters();
}
});
}
public void createClearAllSortingMenuItem(Menu popupMenu) {
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.clear_sorts")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
xViewer.getCustomizeMgr().clearSorter();
}
});
}
public void addCopyViewMenuBlock(Menu popupMenu) {
createViewSelectedCellMenuItem(popupMenu);
createCopyRowsMenuItem(popupMenu);
createCopyCellsMenuItem(popupMenu);
}
public void createCopyRowsMenuItem(Menu popupMenu) {
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.copy_row")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
performCopy();
}
});
}
public void createCopyCellsMenuItem(Menu popupMenu) {
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.copy_column")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
performCopyColumnCells();
}
});
}
public void createViewSelectedCellMenuItem(Menu popupMenu) {
setupActions();
final MenuItem item = new MenuItem(popupMenu, SWT.CASCADE);
item.setText(XViewerText.get("menu.copy_celldata")); //$NON-NLS-1$
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
copySelectedCell.run();
}
});
final MenuItem item1 = new MenuItem(popupMenu, SWT.CASCADE);
item1.setText(XViewerText.get("menu.view_celldata")); //$NON-NLS-1$
item1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewSelectedCell.run();
}
});
}
private static PatternFilter patternFilter = new XViewerPatternFilter();
protected void handleShowColumn() {
TreeColumn insertTreeCol = xViewer.getRightClickSelectedColumn();
XViewerColumn insertXCol = insertTreeCol != null ? (XViewerColumn) insertTreeCol.getData() : null;
XCheckFilteredTreeDialog dialog = new XCheckFilteredTreeDialog(XViewerText.get("dialog.show_columns.title"), //$NON-NLS-1$
XViewerText.get("dialog.show_columns.prompt"), patternFilter, new ArrayTreeContentProvider(), //$NON-NLS-1$
new XViewerColumnLabelProvider(), new XViewerColumnSorter());
dialog.setInput(xViewer.getCustomizeMgr().getCurrentTableColumns());
if (dialog.open() == 0) {
// System.out.println("Selected " + dialog.getChecked());
// System.out.println("Selected column to add before " + insertXCol);
CustomizeData custData = xViewer.getCustomizeMgr().generateCustDataFromTable();
List<XViewerColumn> xCols = custData.getColumnData().getColumns();
List<XViewerColumn> newXCols = new ArrayList<XViewerColumn>();
// if insert col == null; insert new columns at end; set insert col to first non-shown col
if (insertXCol == null) {
for (XViewerColumn currXCol : xCols) {
if (!currXCol.isShow()) {
insertXCol = currXCol;
break;
}
}
}
// else insert before selected insert col
for (XViewerColumn currXCol : xCols) {
if (currXCol.equals(insertXCol)) {
for (Object obj : dialog.getChecked()) {
XViewerColumn newXCol = (XViewerColumn) obj;
newXCol.setShow(true);
newXCols.add(newXCol);
}
}
if (!dialog.getChecked().contains(currXCol)) {
newXCols.add(currXCol);
}
}
custData.getColumnData().setColumns(newXCols);
xViewer.getCustomizeMgr().loadCustomization(custData);
xViewer.refreshColumnsWithPreCompute();
}
}
protected void handleAddComputedColumn() {
TreeColumn insertTreeCol = xViewer.getRightClickSelectedColumn();
XViewerColumn insertXCol = (XViewerColumn) insertTreeCol.getData();
XCheckFilteredTreeDialog dialog = new XCheckFilteredTreeDialog("", //$NON-NLS-1$
XViewerText.get("dialog.add_column.prompt", insertXCol.getName(), //$NON-NLS-1$
insertXCol.getId()),
patternFilter, new ArrayTreeContentProvider(), new XViewerColumnLabelProvider(), new XViewerColumnSorter());
Collection<XViewerComputedColumn> computedCols = xViewer.getComputedColumns(insertXCol);
if (computedCols.isEmpty()) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_computed")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
dialog.setInput(computedCols);
if (dialog.open() == 0) {
// System.out.println("Selected " + dialog.getChecked());
// System.out.println("Selected column to add before " + insertXCol);
CustomizeData custData = xViewer.getCustomizeMgr().generateCustDataFromTable();
List<XViewerColumn> xCols = custData.getColumnData().getColumns();
List<XViewerColumn> newXCols = new ArrayList<XViewerColumn>();
for (XViewerColumn currXCol : xCols) {
if (currXCol.equals(insertXCol)) {
for (Object obj : dialog.getChecked()) {
XViewerComputedColumn newComputedXCol = ((XViewerComputedColumn) obj).copy();
newComputedXCol.setShow(true);
newComputedXCol.setSourceXViewerColumn(insertXCol);
newComputedXCol.setXViewer(xViewer);
newXCols.add(newComputedXCol);
}
}
newXCols.add(currXCol);
}
custData.getColumnData().setColumns(newXCols);
xViewer.getCustomizeMgr().loadCustomization(custData);
xViewer.refresh();
}
}
protected void handleUniqeValuesColumn() {
TreeColumn treeCol = xViewer.getRightClickSelectedColumn();
XViewerColumn xCol = (XViewerColumn) treeCol.getData();
TreeItem[] items = xViewer.getTree().getSelection();
if (items.length == 0) {
items = xViewer.getTree().getItems();
}
if (items.length == 0) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_items.sum")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
Set<String> values = new HashSet<String>();
for (TreeItem item : items) {
for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
if (xViewer.getTree().getColumn(x).equals(treeCol)) {
values.add(((IXViewerLabelProvider) xViewer.getLabelProvider()).getColumnText(item.getData(), x));
}
}
}
String html = HtmlUtil.simplePage(HtmlUtil.textToHtml(CollectionsUtil.toString("\n", values))); //$NON-NLS-1$
new HtmlDialog(XViewerText.get("dialog.unique.title"), XViewerText.get("dialog.unique.prompt", xCol.getName()), //$NON-NLS-1$ //$NON-NLS-2$
html).open();
}
protected void handleSumColumn() {
TreeColumn treeCol = xViewer.getRightClickSelectedColumn();
XViewerColumn xCol = (XViewerColumn) treeCol.getData();
if (!xCol.isSummable()) {
XViewerLib.popup("Invalid Selection for Sum",
String.format("Sum not available for column [%s]", xCol.getName()));
return;
}
TreeItem[] items = xViewer.getTree().getSelection();
if (items.length == 0) {
items = xViewer.getTree().getItems();
}
if (items.length == 0) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_items.sum")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
List<String> values = new ArrayList<String>();
for (TreeItem item : items) {
for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
if (xViewer.getTree().getColumn(x).equals(treeCol)) {
values.add(((IXViewerLabelProvider) xViewer.getLabelProvider()).getColumnText(item.getData(), x));
}
}
}
XViewerLib.popup(XViewerText.get("menu.sum.prompt"), xCol.sumValues(values)); //$NON-NLS-1$
}
protected void handleAverageColumn() {
TreeColumn treeCol = xViewer.getRightClickSelectedColumn();
XViewerColumn xCol = (XViewerColumn) treeCol.getData();
if (!xCol.isSummable()) {
XViewerLib.popup("Invalid Selection for Average",
String.format("Average not available for column [%s]", xCol.getName()));
return;
}
TreeItem[] items = xViewer.getTree().getSelection();
if (items.length == 0) {
items = xViewer.getTree().getItems();
}
if (items.length == 0) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_items.average")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
List<String> values = new ArrayList<String>();
for (TreeItem item : items) {
for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
if (xViewer.getTree().getColumn(x).equals(treeCol)) {
values.add(((IXViewerLabelProvider) xViewer.getLabelProvider()).getColumnText(item.getData(), x));
}
}
}
XViewerLib.popup(XViewerText.get("menu.sum.prompt"), xCol.averageValues(values)); //$NON-NLS-1$
}
protected void handleHideColumn() {
TreeColumn insertTreeCol = xViewer.getRightClickSelectedColumn();
XViewerColumn insertXCol = (XViewerColumn) insertTreeCol.getData();
// System.out.println("Hide column " + insertXCol);
CustomizeData custData = xViewer.getCustomizeMgr().generateCustDataFromTable();
List<XViewerColumn> xCols = custData.getColumnData().getColumns();
List<XViewerColumn> newXCols = new ArrayList<XViewerColumn>();
for (XViewerColumn currXCol : xCols) {
if (currXCol.equals(insertXCol)) {
currXCol.setShow(false);
}
newXCols.add(currXCol);
}
custData.getColumnData().setColumns(newXCols);
xViewer.getCustomizeMgr().loadCustomization(custData);
xViewer.refresh();
}
protected void setupActions() {
showColumn = new Action(XViewerText.get("menu.show")) { //$NON-NLS-1$
@Override
public void run() {
handleShowColumn();
}
};
addComputedColumn = new Action(XViewerText.get("menu.add")) { //$NON-NLS-1$
@Override
public void run() {
handleAddComputedColumn();
}
};
sumColumn = new Action(XViewerText.get("menu.sum")) { //$NON-NLS-1$
@Override
public void run() {
handleSumColumn();
}
};
averageColumn = new Action(XViewerText.get("menu.average")) { //$NON-NLS-1$
@Override
public void run() {
handleAverageColumn();
}
};
uniqueValues = new Action(XViewerText.get("menu.unique")) { //$NON-NLS-1$
@Override
public void run() {
handleUniqeValuesColumn();
}
};
hideColumn = new Action(XViewerText.get("menu.hide")) { //$NON-NLS-1$
@Override
public void run() {
handleHideColumn();
}
};
removeSelected = new Action(XViewerText.get("menu.remove_selected")) { //$NON-NLS-1$
@Override
public void run() {
performRemoveSelectedRows();
}
};
removeNonSelected = new Action(XViewerText.get("menu.remove_non_selected")) { //$NON-NLS-1$
@Override
public void run() {
performRemoveNonSelectedRows();
}
};
copySelected = new Action(XViewerText.get("menu.copy_row")) { //$NON-NLS-1$
@Override
public void run() {
performCopy();
}
};
viewSelectedCell = new ViewSelectedCellDataAction(xViewer, null, Option.View);
copySelectedCell = new ViewSelectedCellDataAction(xViewer, clipboard, Option.Copy);
copySelectedColumnCells = new Action(XViewerText.get("menu.copy_column")) { //$NON-NLS-1$
@Override
public void run() {
performCopyColumnCells();
};
};
clearAllSorting = new Action(XViewerText.get("menu.clear_sorts")) { //$NON-NLS-1$
@Override
public void run() {
xViewer.getCustomizeMgr().clearSorter();
}
};
clearAllFilters = new Action(XViewerText.get("menu.clear_filters")) { //$NON-NLS-1$
@Override
public void run() {
xViewer.getCustomizeMgr().clearFilters();
}
};
filterBySelColumn = new Action(XViewerText.get("menu.column_filter_sel")) { //$NON-NLS-1$
@Override
public void run() {
performFilterBySelColumn();
}
};
filterByColumn = new Action(XViewerText.get("menu.column_filter")) { //$NON-NLS-1$
@Override
public void run() {
performFilterByColumn();
}
};
filterByValue = new Action(XViewerText.get("menu.value_filter")) { //$NON-NLS-1$
@Override
public void run() {
performFilterByValue();
}
};
tableProperties = new TableCustomizationAction(xViewer);
viewTableReport = new ViewTableReportAction(xViewer);
columnMultiEdit = new ColumnMultiEditAction(xViewer);
}
private class KeySelectedListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
// do nothing
}
@Override
public void keyReleased(KeyEvent e) {
if (e.keyCode == 'c' && e.stateMask == (SWT.CONTROL | SWT.SHIFT)) {
performCopyColumnCells();
} else if (e.keyCode == 'b' && e.stateMask == (SWT.CONTROL | SWT.SHIFT)) {
performViewOrCopyCell(Option.Copy);
} else if (e.keyCode == 'v' && e.stateMask == (SWT.CONTROL | SWT.SHIFT)) {
performViewOrCopyCell(Option.View);
} else if (e.keyCode == 'c' && e.stateMask == SWT.CONTROL) {
performCopy();
}
}
}
private void performRemoveSelectedRows() {
try {
TreeItem[] items = xViewer.getTree().getSelection();
if (items.length == 0) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_items")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
Set<Object> objs = new HashSet<Object>();
for (TreeItem item : items) {
objs.add(item.getData());
}
xViewer.remove(objs);
} catch (Exception ex) {
XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
}
}
private void performRemoveNonSelectedRows() {
try {
TreeItem[] items = xViewer.getTree().getSelection();
if (items.length == 0) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_items")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
Set<Object> keepObjects = new HashSet<Object>();
for (TreeItem item : items) {
keepObjects.add(item.getData());
}
xViewer.setInputXViewer(keepObjects);
} catch (Exception ex) {
XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
}
}
private void performFilterByValue() {
TreeColumn treeCol = xViewer.getRightClickSelectedColumn();
String colId = ((XViewerColumn) treeCol.getData()).getId();
int colIndex = xViewer.getRightClickSelectedColumnNum();
TreeItem treeItem = xViewer.getRightClickSelectedItem();
String cellVal = treeItem.getText(colIndex);
xViewer.getCustomizeMgr().setColumnFilterText(colId, cellVal);
}
private void performFilterByColumn() {
Set<TreeColumn> visibleColumns = new HashSet<TreeColumn>();
for (TreeColumn treeCol : xViewer.getTree().getColumns()) {
if (treeCol.getWidth() > 0) {
visibleColumns.add(treeCol);
}
}
if (visibleColumns.isEmpty()) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_columns")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
ListDialog ld = new ListDialog(xViewer.getTree().getShell()) {
@Override
protected Control createDialogArea(Composite container) {
Control control = super.createDialogArea(container);
getTableViewer().setSorter(treeColumnSorter);
return control;
}
};
ld.setMessage(XViewerText.get("dialog.column_filter.title")); //$NON-NLS-1$
ld.setInput(visibleColumns);
ld.setLabelProvider(treeColumnLabelProvider);
ld.setContentProvider(new ArrayContentProvider());
ld.setTitle(XViewerText.get("dialog.column_filter.title")); //$NON-NLS-1$
int result = ld.open();
if (result != 0) {
return;
}
TreeColumn treeCol = (TreeColumn) ld.getResult()[0];
XViewerColumn col = (XViewerColumn) treeCol.getData();
xViewer.getColumnFilterDataUI().promptSetFilter(col);
}
private void performFilterBySelColumn() {
XViewerColumn col = (XViewerColumn) xViewer.getRightClickSelectedColumn().getData();
xViewer.getColumnFilterDataUI().promptSetFilter(col);
}
private void performCopyColumnCells() {
Set<TreeColumn> visibleColumns = new HashSet<TreeColumn>();
TreeItem[] items = xViewer.getTree().getSelection();
if (items.length == 0) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_selection")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
ArrayList<String> textTransferData = new ArrayList<String>();
IXViewerLabelProvider labelProv = (IXViewerLabelProvider) xViewer.getLabelProvider();
for (TreeColumn treeCol : xViewer.getTree().getColumns()) {
if (treeCol.getWidth() > 0) {
visibleColumns.add(treeCol);
}
}
if (visibleColumns.isEmpty()) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_columns")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
ListDialog ld = new ListDialog(xViewer.getTree().getShell()) {
@Override
protected Control createDialogArea(Composite container) {
Control control = super.createDialogArea(container);
getTableViewer().setSorter(treeColumnSorter);
return control;
}
};
ld.setMessage(XViewerText.get("dialog.copy_column.title")); //$NON-NLS-1$
ld.setInput(visibleColumns);
ld.setLabelProvider(treeColumnLabelProvider);
ld.setContentProvider(new ArrayContentProvider());
ld.setTitle(XViewerText.get("dialog.copy_column.title")); //$NON-NLS-1$
int result = ld.open();
if (result != 0) {
return;
}
TreeColumn treeCol = (TreeColumn) ld.getResult()[0];
StringBuffer sb = new StringBuffer();
for (TreeItem item : items) {
for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
if (xViewer.getTree().getColumn(x).equals(treeCol)) {
sb.append(labelProv.getColumnText(item.getData(), x));
sb.append("\n"); //$NON-NLS-1$
}
}
}
textTransferData.add(sb.toString());
if (textTransferData.size() > 0) {
clipboard.setContents(new Object[] {CollectionsUtil.toString(textTransferData, null, ", ", null)}, //$NON-NLS-1$
new Transfer[] {TextTransfer.getInstance()});
}
}
private void performCopy() {
TreeItem[] items = xViewer.getTree().getSelection();
if (items.length == 0) {
XViewerLib.popup(XViewerText.get("error"), XViewerText.get("error.no_items")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
ArrayList<String> textTransferData = new ArrayList<String>();
IXViewerLabelProvider labelProv = (IXViewerLabelProvider) xViewer.getLabelProvider();
if (items.length > 0) {
StringBuffer sb = new StringBuffer();
for (TreeItem item : items) {
List<String> strs = new ArrayList<String>();
for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
if (xViewer.getTree().getColumn(x).getWidth() > 0) {
String data = labelProv.getColumnText(item.getData(), x);
if (data != null) {
strs.add(data);
}
}
}
sb.append(CollectionsUtil.toString("\t", strs)); //$NON-NLS-1$
sb.append("\n"); //$NON-NLS-1$
}
textTransferData.add(sb.toString());
if (textTransferData.size() > 0) {
clipboard.setContents(new Object[] {CollectionsUtil.toString(textTransferData, null, ", ", null)}, //$NON-NLS-1$
new Transfer[] {TextTransfer.getInstance()});
}
}
}
private void performViewOrCopyCell(Option option) {
try {
MouseEvent event = xViewer.getMouseListener().getLeftClickEvent();
TreeItem item = xViewer.getItemUnderMouseClick(new Point(event.x, event.y));
TreeColumn column = xViewer.getColumnUnderMouseClick(new Point(event.x, event.y));
if (item != null && column != null) {
int columnNum = 0;
for (int x = 0; x < xViewer.getTree().getColumnCount(); x++) {
if (xViewer.getTree().getColumn(x).equals(column)) {
columnNum = x;
break;
}
}
ViewSelectedCellDataAction action = new ViewSelectedCellDataAction(xViewer, clipboard, option);
action.run(column, item, columnNum);
}
} catch (Exception ex) {
// do nothing
}
}
static LabelProvider treeColumnLabelProvider = new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof TreeColumn) {
return ((TreeColumn) element).getText();
}
return XViewerText.get("error.unknown_element"); //$NON-NLS-1$
}
};
static ViewerSorter treeColumnSorter = new ViewerSorter() {
@SuppressWarnings("unchecked")
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
return getComparator().compare(((TreeColumn) e1).getText(), ((TreeColumn) e2).getText());
}
};
}