package org.marketcetera.photon.ui; import org.eclipse.swt.SWT; 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbenchPartSite; import org.marketcetera.photon.Messages; import quickfix.DataDictionary; public class MessageListTableFormatBase<T> extends EnumTableFormat<T> implements Messages { private final IWorkbenchPartSite site; public MessageListTableFormatBase(Table table, Enum<?>[] columns, IWorkbenchPartSite site, DataDictionary dataDictionary) { super(table, columns, dataDictionary); this.site = site; site.getSelectionProvider(); init(table); } public MessageListTableFormatBase(Table table, Enum<?>[] columns, IWorkbenchPartSite site) { super(table, columns); this.site = site; site.getSelectionProvider(); init(table); } private void init(Table table) { createContextMenu("messagesContextMenu",table); //$NON-NLS-1$ hookColumnChooserMenu(table); } private void hookColumnChooserMenu(final Table table) { // we're hooking up a submenu using straight-up swt (as opposed to contribution items) // since this is how it will eventually work in swt post-3.2 when table supports // attaching a pop-up menu to the column headers. final Menu menu = table.getMenu(); menu.addListener(SWT.Show, new Listener() { private MenuItem columnsCascadeItem; public void handleEvent(Event e) { if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount() - 1).equals(columnsCascadeItem)) // this menu already has our additions return; if (menu.getItemCount() != 0) { new MenuItem(menu, SWT.SEPARATOR); } columnsCascadeItem = new MenuItem(menu, SWT.CASCADE); columnsCascadeItem.setText(CHOOSE_COLUMNS_LABEL.getText()); Menu columnsCascadeMenu = new Menu(table.getShell(), SWT.DROP_DOWN); columnsCascadeItem.setMenu(columnsCascadeMenu); for(final TableColumn column : table.getColumns()) { boolean columnIsInitialZeroWidthColumn = isColumnHidden(column) && (column.getText() == null || column.getText() .length() == 0); if (!columnIsInitialZeroWidthColumn) { MenuItem item = new MenuItem(columnsCascadeMenu, SWT.CHECK); item.setText(column.getText()); item.setEnabled(true); item.setSelection(!isColumnHidden(column)); item.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (isColumnHidden(column)) showColumn(column); else hideColumn(column); } }); } } new MenuItem(columnsCascadeMenu, SWT.SEPARATOR); MenuItem moreColumnsItem = new MenuItem(columnsCascadeMenu, SWT.PUSH); moreColumnsItem.setText(MORE_COLUMNS_LABEL.getText()); moreColumnsItem.setEnabled(false); } }); } private void createContextMenu(String name, final Table table) { ContextMenuFactory contextMenuFactory = new ContextMenuFactory(); contextMenuFactory.createContextMenu(name, table, site); } }