package name.abuchen.portfolio.ui.views.settings; import java.util.UUID; import javax.inject.Inject; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import name.abuchen.portfolio.model.AttributeType; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.ClientSettings; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.ui.Images; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.util.ContextMenu; import name.abuchen.portfolio.ui.util.LabelOnly; import name.abuchen.portfolio.ui.util.viewers.Column; import name.abuchen.portfolio.ui.util.viewers.ColumnEditingSupport; import name.abuchen.portfolio.ui.util.viewers.ColumnEditingSupport.ModificationListener; import name.abuchen.portfolio.ui.util.viewers.ShowHideColumnHelper; import name.abuchen.portfolio.ui.util.viewers.StringEditingSupport; import name.abuchen.portfolio.ui.views.settings.SettingsView.Tab; public class AttributeListTab implements Tab, ModificationListener { @Inject private Client client; @Inject private IPreferenceStore preferences; private TableViewer tableViewer; private ContextMenu contextMenuAdd; @Override public CTabItem createTab(CTabFolder folder) { Composite container = new Composite(folder, SWT.NONE); TableColumnLayout layout = new TableColumnLayout(); container.setLayout(layout); tableViewer = new TableViewer(container, SWT.FULL_SELECTION | SWT.MULTI); ColumnEditingSupport.prepare(tableViewer); ShowHideColumnHelper support = new ShowHideColumnHelper(AttributeListTab.class.getSimpleName(), preferences, tableViewer, layout); addColumns(support); support.createColumns(); tableViewer.getTable().setHeaderVisible(true); tableViewer.getTable().setLinesVisible(true); tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setInput(client.getSettings().getAttributeTypes().toArray()); tableViewer.refresh(); new ContextMenu(tableViewer.getTable(), m -> fillContextMenu(m)).hook(); CTabItem item = new CTabItem(folder, SWT.NONE); item.setText(Messages.AttributeTypeTitle); item.setControl(container); return item; } private void addColumns(ShowHideColumnHelper support) { Column column = new Column(Messages.ColumnName, SWT.None, 250); column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((AttributeType) element).getName(); } @Override public Image getImage(Object element) { return Images.TEXT.image(); } }); new StringEditingSupport(AttributeType.class, "name").addListener(this).attachTo(column); //$NON-NLS-1$ support.addColumn(column); column = new Column(Messages.ColumnColumnLabel, SWT.None, 150); column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((AttributeType) element).getColumnLabel(); } }); new StringEditingSupport(AttributeType.class, "columnLabel").addListener(this).attachTo(column); //$NON-NLS-1$ support.addColumn(column); column = new Column(Messages.ColumnFieldType, SWT.None, 150); column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return AttributeFieldType.of((AttributeType) element).toString(); } }); support.addColumn(column); } private void fillContextMenu(IMenuManager manager) { IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection(); AttributeType attributeType = (AttributeType) selection.getFirstElement(); if (selection.size() == 1) addMoveUpAndDownActions(manager, attributeType); manager.add(new Separator()); addDeleteActions(manager, selection); } private void addMoveUpAndDownActions(IMenuManager manager, AttributeType attributeType) { int index = tableViewer.getTable().getSelectionIndex(); if (index < 0) return; if (index > 0) { manager.add(new Action(Messages.MenuMoveUp) { @Override public void run() { ClientSettings settings = client.getSettings(); settings.removeAttributeType(attributeType); settings.addAttributeType(index - 1, attributeType); tableViewer.setInput(client.getSettings().getAttributeTypes().toArray()); client.markDirty(); } }); } if (index < tableViewer.getTable().getItemCount() - 1) { manager.add(new Action(Messages.MenuMoveDown) { @Override public void run() { ClientSettings settings = client.getSettings(); settings.removeAttributeType(attributeType); settings.addAttributeType(index + 1, attributeType); tableViewer.setInput(client.getSettings().getAttributeTypes().toArray()); client.markDirty(); } }); } } private void addDeleteActions(IMenuManager manager, IStructuredSelection selection) { manager.add(new Separator()); manager.add(new Action(Messages.BookmarksListView_delete) { @Override public void run() { ClientSettings settings = client.getSettings(); for (Object element : selection.toArray()) { AttributeType attribute = (AttributeType) element; // remove any existing attribute values from securities for (Security security : client.getSecurities()) security.getAttributes().remove(attribute); settings.removeAttributeType(attribute); } client.markDirty(); tableViewer.setInput(settings.getAttributeTypes().toArray()); } }); } @Override public void onModified(Object element, Object newValue, Object oldValue) { client.markDirty(); } @Override public void showAddMenu(Shell shell) { if (contextMenuAdd == null) contextMenuAdd = new ContextMenu(tableViewer.getControl(), m -> fillAddMenu(m)); contextMenuAdd.getMenu().setVisible(true); } private void fillAddMenu(IMenuManager manager) { manager.add(new LabelOnly(Messages.LabelNewFieldByType)); for (AttributeFieldType fieldType : AttributeFieldType.values()) { manager.add(new Action(fieldType.toString()) { @Override public void run() { AttributeType attributeType = new AttributeType(UUID.randomUUID().toString()); attributeType.setName(Messages.ColumnName); attributeType.setColumnLabel(Messages.ColumnColumnLabel); attributeType.setConverter(fieldType.getConverterClass()); attributeType.setType(fieldType.getFieldClass()); // only security supported currently attributeType.setTarget(Security.class); client.getSettings().addAttributeType(attributeType); tableViewer.setInput(client.getSettings().getAttributeTypes().toArray()); client.markDirty(); tableViewer.editElement(attributeType, 0); } }); } } }