/** * */ package de.hannesniederhausen.storynotes.ui.internal.navigation.widgets; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Widget; import de.hannesniederhausen.storynotes.model.Note; /** * @author Hannes Niederhausen * */ public class NavigationItem extends Item { private IEclipseContext context; private ITreeContentProvider contentProvider; private IActionProvider actionProvider; private ILabelProvider labelProvider; private Composite container; private Object model; private Button siblingButton; private Button childrenButton; public NavigationItem(Widget parent, int style, ILabelProvider labelProvider, ITreeContentProvider contentProvider, IEclipseContext context, IActionProvider actionProvider, Object model) { super(parent, style); this.context = context; this.actionProvider = actionProvider; this.contentProvider = contentProvider; this.labelProvider = labelProvider; this.model = model; createControl(parent, style, labelProvider, model); } @Override public void setText(String string) { if (string == null || string.isEmpty()) { string = labelProvider.getText(model); } super.setText(string); siblingButton.setText(string); container.getParent().layout(); } private void createControl(Widget parent, int style, ILabelProvider labelProvider, Object model) { container = new Composite((Composite) parent, style); container.setLayout(new GridLayout(2, false)); siblingButton = new Button(container, SWT.PUSH); siblingButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { showSiblingSelectionOptions(); } }); setText(labelProvider.getText(model)); if (model instanceof Note) return; childrenButton = new Button(container, SWT.PUSH); childrenButton.setText(">"); childrenButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { showChildSelectionOptions(); } }); } private void showChildSelectionOptions() { Object[] children = contentProvider.getChildren(model); ChoiceDialog dlg = new ChoiceDialog(container.getShell(), 0, context, labelProvider, actionProvider, model); dlg.setInput(children); Point p = childrenButton.toDisplay(0,0); p.y += childrenButton.getBounds().height; dlg.getShell().setLocation(p); dlg.open(); } private void fillMenu(Object[] children, Menu childMenu) { for (Object o : children) { MenuItem item = new MenuItem(childMenu, SWT.PUSH); item.setText(labelProvider.getText(o)); } } private void showSiblingSelectionOptions() { Object parent = contentProvider.getParent(model); if (parent==null) { return; } Object[] children = contentProvider.getChildren(parent); ChoiceDialog dlg = new ChoiceDialog(container.getShell(), 0, context, labelProvider, null, model); dlg.setInput(children); Point p = siblingButton.toDisplay(0,0); p.y += siblingButton.getBounds().height; dlg.getShell().setLocation(p); dlg.open(); } }