package name.abuchen.portfolio.ui.views.taxonomy; import javax.inject.Inject; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.ColorDialog; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.util.Colors; import name.abuchen.portfolio.ui.util.SimpleAction; import name.abuchen.portfolio.ui.util.viewers.Column; import name.abuchen.portfolio.ui.util.viewers.ShowHideColumnHelper; /* package */class DefinitionViewer extends AbstractNodeTreeViewer { @Inject public DefinitionViewer(TaxonomyModel model, TaxonomyNodeRenderer renderer) { super(model, renderer); } @Override protected String readExpansionState() { return getModel().getExpansionStateDefinition(); } @Override protected void storeExpansionState(String expanded) { getModel().setExpansionStateDefinition(expanded); } @Override protected void addColumns(ShowHideColumnHelper support) { addDimensionColumn(support); Column column = new Column("color", Messages.ColumnColor, SWT.LEFT, 60); //$NON-NLS-1$ column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return null; } @Override public Color getBackground(Object element) { TaxonomyNode node = (TaxonomyNode) element; if (node.isClassification()) return getRenderer().getColorFor((TaxonomyNode) element); else return null; } }); support.addColumn(column); addActualColumns(support); addAdditionalColumns(support); } @Override protected void fillContextMenu(IMenuManager manager) { super.fillContextMenu(manager); final IStructuredSelection selection = getNodeViewer().getStructuredSelection(); if (selection.isEmpty() || selection.size() > 1) return; final TaxonomyNode node = (TaxonomyNode) selection.getFirstElement(); if (node == null || node.isUnassignedCategory()) return; if (!node.isClassification()) return; MenuManager color = new MenuManager(Messages.ColumnColor); color.add(new SimpleAction(Messages.MenuTaxonomyColorEdit, a -> doEditColor(node))); color.add(new SimpleAction(Messages.MenuTaxonomyColorRandomPalette, a -> doAutoAssignColors(node))); color.add(new SimpleAction(Messages.MenuTaxonomyColorCascadeToChildren, a -> doCascadeColorsDown(node))); manager.appendToGroup(MENU_GROUP_DEFAULT_ACTIONS, color); } private void doEditColor(TaxonomyNode node) { RGB oldColor = Colors.toRGB(node.getClassification().getColor()); ColorDialog colorDialog = new ColorDialog(getNodeViewer().getControl().getShell()); colorDialog.setRGB(oldColor); RGB newColor = colorDialog.open(); if (newColor != null && !newColor.equals(oldColor)) { String hex = Colors.toHex(newColor); node.getClassification().setColor(hex); // use same color for virtual and classification root nodes if (node.getParent().isRoot()) node.getParent().getClassification().setColor(hex); getModel().fireTaxonomyModelChange(node); getModel().markDirty(); } } private void doAutoAssignColors(TaxonomyNode node) { node.getClassification().assignRandomColors(); getModel().fireTaxonomyModelChange(null); getNodeViewer().getTree().redraw(); // avoids artifacts around cell getModel().markDirty(); } protected void doCascadeColorsDown(TaxonomyNode node) { node.getClassification().cascadeColorDown(); getModel().fireTaxonomyModelChange(null); getNodeViewer().getTree().redraw(); // avoids artifacts around cell getModel().markDirty(); } }