| @@ -1,38 +1,17 @@ | |||
| package xyz.veronie.bgg.ui.filters; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| import javax.inject.Inject; | |||
| import org.eclipse.e4.core.di.annotations.Creatable; | |||
| import org.eclipse.e4.core.services.events.IEventBroker; | |||
| import org.eclipse.jface.viewers.ArrayContentProvider; | |||
| import org.eclipse.jface.viewers.ComboViewer; | |||
| import org.eclipse.jface.viewers.ISelectionChangedListener; | |||
| import org.eclipse.jface.viewers.IStructuredSelection; | |||
| import org.eclipse.jface.viewers.SelectionChangedEvent; | |||
| import org.eclipse.jface.viewers.StructuredSelection; | |||
| import org.eclipse.swt.SWT; | |||
| import org.eclipse.swt.events.FocusEvent; | |||
| import org.eclipse.swt.events.FocusListener; | |||
| import org.eclipse.swt.events.SelectionAdapter; | |||
| import org.eclipse.swt.events.SelectionEvent; | |||
| import org.eclipse.swt.layout.GridData; | |||
| import org.eclipse.swt.layout.GridLayout; | |||
| import org.eclipse.swt.widgets.Combo; | |||
| import org.eclipse.swt.widgets.Composite; | |||
| import org.eclipse.swt.widgets.Label; | |||
| import xyz.veronie.bgg.result.ResultConfigManager; | |||
| import xyz.veronie.bgg.types.EventConstants; | |||
| import xyz.veronie.bgg.types.FilterFlagState; | |||
| import xyz.veronie.bgg.types.Subtype; | |||
| import xyz.veronie.bgg.types.UserFlag; | |||
| import xyz.veronie.bgg.types.UserFlagEvent; | |||
| import xyz.veronie.bgg.ui.filters.composites.BggUserSourceComposite; | |||
| import xyz.veronie.bgg.ui.helpers.BatLayouts; | |||
| import xyz.veronie.bgg.ui.helpers.CommonControls; | |||
| /// These are the controls to retrieve thing IDs for a given BGG user | |||
| @@ -44,8 +23,6 @@ public class BggUserSourceFilter { | |||
| @Inject private IEventBroker eventBroker; | |||
| @Inject private ResultConfigManager configManager; | |||
| private Combo cbUserName; | |||
| public void create(Composite parent, int style) { | |||
| Composite mainCompo = new Composite(parent, SWT.FILL); | |||
| @@ -54,152 +31,11 @@ public class BggUserSourceFilter { | |||
| mainCompo.setLayout(gl_mainCompo); | |||
| mainCompo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |||
| Label lblUser = new Label(mainCompo, SWT.LEFT); | |||
| lblUser.setText("User name: "); | |||
| lblUser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| // // Define field assists for the text widget | |||
| // // use "." and " " activate the content proposals | |||
| // char[] autoActivationCharacters = new char[] { '.', ' ' }; | |||
| // KeyStroke keyStroke; | |||
| // try { | |||
| // keyStroke = KeyStroke.getInstance("Ctrl+Space"); | |||
| // new ContentProposalAdapter(text, new TextContentAdapter(), | |||
| // new SimpleContentProposalProvider(new String[] { "ProposalOne", "ProposalTwo", "ProposalThree" }), | |||
| // keyStroke, autoActivationCharacters); | |||
| // } catch (ParseException e1) { | |||
| // e1.printStackTrace(); | |||
| // } | |||
| cbUserName = new Combo(mainCompo, SWT.DROP_DOWN); | |||
| GridData gd = new GridData(SWT.FILL, SWT.FILL, false, false); | |||
| gd.widthHint = 100; | |||
| cbUserName.setLayoutData(gd); | |||
| cbUserName.setText(configManager.getResultConfig().user); | |||
| cbUserName.addSelectionListener(new SelectionAdapter() { | |||
| public void widgetDefaultSelected(SelectionEvent e) { | |||
| setUser(cbUserName.getText()); | |||
| } | |||
| }); | |||
| cbUserName.addFocusListener(new FocusListener() { | |||
| @Override | |||
| public void focusLost(FocusEvent e) { | |||
| setUser(cbUserName.getText()); | |||
| } | |||
| @Override | |||
| public void focusGained(FocusEvent e) { | |||
| // nothing | |||
| } | |||
| }); | |||
| CommonControls.makeEmptySpace(mainCompo, 1); | |||
| // Button btEditUsers = new Button(parent, SWT.PUSH); | |||
| // btEditUsers.setText("edit users"); | |||
| // btEditUsers.setEnabled(false); | |||
| // btEditUsers.setVisible(false); | |||
| // btEditUsers.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| // TODO: implement edit users | |||
| // choose the thing sub-type | |||
| Label lblSubtype = new Label(mainCompo, SWT.LEFT); | |||
| lblSubtype.setText("Subtypes: "); | |||
| lblSubtype.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false)); | |||
| ComboViewer cbSubtypes = new ComboViewer(mainCompo, SWT.READ_ONLY); | |||
| cbSubtypes.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| cbSubtypes.setContentProvider(ArrayContentProvider.getInstance()); | |||
| List<Subtype> subtypes = new ArrayList<Subtype>(); | |||
| for (Subtype st : Subtype.values()) { | |||
| subtypes.add(st); | |||
| } | |||
| cbSubtypes.setInput(subtypes); | |||
| cbSubtypes.setSelection(new StructuredSelection(configManager.getResultConfig().subtype)); | |||
| cbSubtypes.addSelectionChangedListener(new ISelectionChangedListener() { | |||
| @Override | |||
| public void selectionChanged(SelectionChangedEvent event) { | |||
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); | |||
| eventBroker.send(EventConstants.TOPIC_SUBTYPE_CHANGED, selection.getFirstElement()); | |||
| } | |||
| }); | |||
| Composite flagsComposite = new Composite(mainCompo, SWT.FILL); | |||
| GridLayout layout = new GridLayout(4,false); | |||
| GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false); | |||
| gridData.horizontalSpan = 5; | |||
| flagsComposite.setLayoutData(gridData); | |||
| layout.horizontalSpacing = 16; | |||
| flagsComposite.setLayout(layout); | |||
| Label infoLabel = new Label(flagsComposite, SWT.LEFT); | |||
| infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule."); | |||
| GridData gdInfo = new GridData(SWT.FILL, SWT.FILL, true, false); | |||
| gdInfo.horizontalSpan = 4; | |||
| infoLabel.setLayoutData(gdInfo); | |||
| makeFilter(flagsComposite, UserFlag.OWN); | |||
| makeFilter(flagsComposite, UserFlag.WTP); | |||
| makeFilter(flagsComposite, UserFlag.PREVIOUSLY_OWNED); | |||
| makeFilter(flagsComposite, UserFlag.WTB); | |||
| makeFilter(flagsComposite, UserFlag.TRADE); | |||
| makeFilter(flagsComposite, UserFlag.WISHLIST); | |||
| makeFilter(flagsComposite, UserFlag.WANT); | |||
| makeFilter(flagsComposite, UserFlag.PREORDERED); | |||
| makeFilter(flagsComposite, UserFlag.RATED); | |||
| makeFilter(flagsComposite, UserFlag.COMMENT); | |||
| makeFilter(flagsComposite, UserFlag.PLAYED); | |||
| new BggUserSourceComposite(mainCompo, SWT.NONE, eventBroker, configManager); | |||
| mainCompo.pack(); | |||
| //mainCompo.layout(true, true); | |||
| parent.pack(); | |||
| parent.layout(true, true); | |||
| } | |||
| /// Create a control for a filter. | |||
| // Filters are tri-state: include iff has flag, include iff it does not have the flag, | |||
| // don't care if it has that flag. | |||
| // TODO: create a three-way toggle button instead. | |||
| private void makeFilter(Composite parent, final UserFlag key) { | |||
| ComboViewer filterCombo = new ComboViewer(parent, SWT.READ_ONLY); | |||
| filterCombo.setContentProvider(ArrayContentProvider.getInstance()); | |||
| List<FilterFlagState> states = Arrays.asList(new FilterFlagState[] { | |||
| FilterFlagState.IS, FilterFlagState.ISNOT, FilterFlagState.IGNORE | |||
| }); | |||
| filterCombo.setInput(states); | |||
| filterCombo.setSelection(new StructuredSelection(configManager.getResultConfig().userFlags.get(key))); | |||
| filterCombo.addSelectionChangedListener(new ISelectionChangedListener() { | |||
| @Override | |||
| public void selectionChanged(SelectionChangedEvent event) { | |||
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); | |||
| UserFlagEvent ufe = new UserFlagEvent(); | |||
| ufe.flag = key; | |||
| ufe.state = (FilterFlagState)selection.getFirstElement(); | |||
| eventBroker.send(EventConstants.TOPIC_USERFLAG_CHANGED, ufe); | |||
| } | |||
| }); | |||
| Label filterLabel = new Label(parent, SWT.LEFT); | |||
| filterLabel.setText(key.toString()); | |||
| filterLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| } | |||
| public void setUser(String user) { | |||
| if(eventBroker != null) { | |||
| eventBroker.post(EventConstants.TOPIC_USER_CHANGED, user); | |||
| } else { | |||
| System.out.println("setGeeklistId: eventBroker is null."); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,136 @@ | |||
| package xyz.veronie.bgg.ui.filters.composites; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import org.eclipse.e4.core.services.events.IEventBroker; | |||
| import org.eclipse.jface.viewers.ArrayContentProvider; | |||
| import org.eclipse.jface.viewers.ComboViewer; | |||
| import org.eclipse.jface.viewers.ISelectionChangedListener; | |||
| import org.eclipse.jface.viewers.IStructuredSelection; | |||
| import org.eclipse.jface.viewers.SelectionChangedEvent; | |||
| import org.eclipse.jface.viewers.StructuredSelection; | |||
| import org.eclipse.swt.SWT; | |||
| import org.eclipse.swt.events.FocusAdapter; | |||
| import org.eclipse.swt.events.FocusEvent; | |||
| import org.eclipse.swt.layout.GridData; | |||
| import org.eclipse.swt.layout.GridLayout; | |||
| import org.eclipse.swt.widgets.Combo; | |||
| import org.eclipse.swt.widgets.Composite; | |||
| import org.eclipse.swt.widgets.Label; | |||
| import xyz.veronie.bgg.result.ResultConfigManager; | |||
| import xyz.veronie.bgg.types.EventConstants; | |||
| import xyz.veronie.bgg.types.Subtype; | |||
| import xyz.veronie.bgg.types.UserFlag; | |||
| public class BggUserSourceComposite extends Composite { | |||
| private IEventBroker eventBroker; | |||
| /** | |||
| * Create the composite. | |||
| * @param parent | |||
| * @param style | |||
| */ | |||
| public BggUserSourceComposite(Composite parent, int style, | |||
| IEventBroker eventBroker, ResultConfigManager configManager) | |||
| { | |||
| super(parent, style); | |||
| this.eventBroker = eventBroker; | |||
| Composite main = new Composite(parent, SWT.FILL); | |||
| main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |||
| main.setLayout(new GridLayout(1, false)); | |||
| Composite topRowComposite = new Composite(main, SWT.NONE); | |||
| topRowComposite.setLayout(new GridLayout(5, false)); | |||
| topRowComposite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 1, 1)); | |||
| Label lblUserName = new Label(topRowComposite, SWT.NONE); | |||
| lblUserName.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); | |||
| lblUserName.setText("User name:"); | |||
| ComboViewer comboViewerUserName = new ComboViewer(topRowComposite, SWT.NONE); | |||
| Combo cbUserName = comboViewerUserName.getCombo(); | |||
| cbUserName.addFocusListener(new FocusAdapter() { | |||
| @Override | |||
| public void focusLost(FocusEvent e) { | |||
| setUser(cbUserName.getText()); | |||
| } | |||
| }); | |||
| GridData gd_cbUserName = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1); | |||
| gd_cbUserName.widthHint = 100; | |||
| cbUserName.setLayoutData(gd_cbUserName); | |||
| cbUserName.setText(configManager.getResultConfig().user); | |||
| new Label(topRowComposite, SWT.NONE); | |||
| Label lblSubtype = new Label(topRowComposite, SWT.NONE); | |||
| lblSubtype.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); | |||
| lblSubtype.setText("Subtypes:"); | |||
| ComboViewer comboViewerSubtypes = new ComboViewer(topRowComposite, SWT.NONE); | |||
| Combo cbSubtypes = comboViewerSubtypes.getCombo(); | |||
| cbSubtypes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); | |||
| comboViewerSubtypes.setContentProvider(new ArrayContentProvider()); | |||
| comboViewerSubtypes.setInput(getSubtypes()); | |||
| comboViewerSubtypes.setSelection(new StructuredSelection(configManager.getResultConfig().subtype)); | |||
| comboViewerSubtypes.addSelectionChangedListener(new ISelectionChangedListener() { | |||
| @Override | |||
| public void selectionChanged(SelectionChangedEvent event) { | |||
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); | |||
| eventBroker.send(EventConstants.TOPIC_SUBTYPE_CHANGED, selection.getFirstElement()); | |||
| } | |||
| }); | |||
| Composite centerComposite = new Composite(main, SWT.NONE); | |||
| centerComposite.setLayout(new GridLayout(1, false)); | |||
| centerComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); | |||
| // centerComposite.setLayout(new FillLayout(SWT.VERTICAL)); | |||
| Label infoLabel = new Label(centerComposite, SWT.LEFT); | |||
| infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule."); | |||
| GridData gdInfo = new GridData(SWT.FILL, SWT.FILL, true, false); | |||
| infoLabel.setLayoutData(gdInfo); | |||
| new FilterFlagComposite(centerComposite, UserFlag.OWN, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.PREORDERED, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.WISHLIST, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.WTB, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.WTP, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.WANT, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.PREVIOUSLY_OWNED, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.PLAYED, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.TRADE, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.RATED, configManager, eventBroker); | |||
| new FilterFlagComposite(centerComposite, UserFlag.COMMENT, configManager, eventBroker); | |||
| this.pack(); | |||
| } | |||
| private void setUser(String user) { | |||
| if(eventBroker != null) { | |||
| eventBroker.post(EventConstants.TOPIC_USER_CHANGED, user); | |||
| } else { | |||
| System.out.println("setGeeklistId: eventBroker is null."); | |||
| } | |||
| } | |||
| public List<Subtype> getSubtypes() { | |||
| List<Subtype> subtypes = new ArrayList<Subtype>(); | |||
| for (Subtype st : Subtype.values()) { | |||
| subtypes.add(st); | |||
| } | |||
| return subtypes; | |||
| } | |||
| @Override | |||
| protected void checkSubclass() { | |||
| // Disable the check that prevents subclassing of SWT components | |||
| } | |||
| } | |||
| @@ -0,0 +1,130 @@ | |||
| package xyz.veronie.bgg.ui.filters.composites; | |||
| import org.eclipse.e4.core.services.events.IEventBroker; | |||
| import org.eclipse.swt.SWT; | |||
| import org.eclipse.swt.events.SelectionAdapter; | |||
| import org.eclipse.swt.events.SelectionEvent; | |||
| import org.eclipse.swt.layout.GridData; | |||
| import org.eclipse.swt.layout.GridLayout; | |||
| import org.eclipse.swt.widgets.Button; | |||
| import org.eclipse.swt.widgets.Composite; | |||
| import org.eclipse.wb.swt.ResourceManager; | |||
| import xyz.veronie.bgg.result.ResultConfigManager; | |||
| import xyz.veronie.bgg.types.EventConstants; | |||
| import xyz.veronie.bgg.types.FilterFlagState; | |||
| import xyz.veronie.bgg.types.UserFlag; | |||
| import xyz.veronie.bgg.types.UserFlagEvent; | |||
| public class FilterFlagComposite extends Composite { | |||
| private Button btnFlagSwitch; | |||
| /** | |||
| * Create the composite. | |||
| * @param parent | |||
| * @param style | |||
| */ | |||
| public FilterFlagComposite(Composite parent, UserFlag flag, | |||
| ResultConfigManager configManager, IEventBroker eventBroker) | |||
| { | |||
| super(parent, SWT.NONE); | |||
| this.setLayout(new GridLayout(2, false)); | |||
| this.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); | |||
| // get current state from config to initialize | |||
| FilterFlagState flagState = configManager.getResultConfig().userFlags.get(flag); | |||
| boolean isTurnedOn = !flagState.equals(FilterFlagState.IGNORE); | |||
| Button btnCheckFlag = new Button(this, SWT.CHECK); | |||
| btnCheckFlag.setText(flag.toString()); | |||
| btnCheckFlag.setSelection(isTurnedOn); | |||
| GridData gd_btnCheckFlag = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1); | |||
| gd_btnCheckFlag.widthHint = 100; | |||
| btnCheckFlag.setLayoutData(gd_btnCheckFlag); | |||
| btnFlagSwitch = new Button(this, SWT.TOGGLE); | |||
| GridData gd_btnFlagSwitch = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); | |||
| gd_btnFlagSwitch.widthHint = 30; | |||
| btnFlagSwitch.setEnabled(isTurnedOn); | |||
| if(isTurnedOn) { | |||
| if(flagState.equals(FilterFlagState.IS)) { | |||
| setSwitchOn(); | |||
| } else { // IS_NOT | |||
| setSwitchOff(); | |||
| } | |||
| } else { | |||
| setSwitchOn(); | |||
| } | |||
| btnFlagSwitch.addSelectionListener(new SelectionAdapter() { | |||
| @Override | |||
| public void widgetSelected(SelectionEvent e) { | |||
| Button source = (Button)e.getSource(); | |||
| UserFlagEvent ufe = new UserFlagEvent(); | |||
| ufe.flag = flag; | |||
| boolean isSelected = source.getSelection(); | |||
| if(isSelected) { | |||
| ufe.state = FilterFlagState.IS; | |||
| setSwitchOn(); | |||
| } else { | |||
| ufe.state = FilterFlagState.ISNOT; | |||
| setSwitchOff(); | |||
| } | |||
| eventBroker.send(EventConstants.TOPIC_USERFLAG_CHANGED, ufe); | |||
| } | |||
| }); | |||
| btnCheckFlag.addSelectionListener(new SelectionAdapter() { | |||
| @Override | |||
| public void widgetSelected(SelectionEvent e) { | |||
| Button source = (Button)e.getSource(); | |||
| boolean isSelected = source.getSelection(); | |||
| UserFlagEvent ufe = new UserFlagEvent(); | |||
| ufe.flag = flag; | |||
| if(!isSelected) { | |||
| ufe.state = FilterFlagState.IGNORE; | |||
| setSwitchOn(); | |||
| btnFlagSwitch.setEnabled(false); | |||
| } else { | |||
| if(btnFlagSwitch.getSelection()) { | |||
| ufe.state = FilterFlagState.IS; | |||
| } else { | |||
| ufe.state = FilterFlagState.ISNOT; | |||
| } | |||
| btnFlagSwitch.setEnabled(true); | |||
| } | |||
| eventBroker.send(EventConstants.TOPIC_USERFLAG_CHANGED, ufe); | |||
| } | |||
| }); | |||
| this.pack(); | |||
| this.getParent().layout(true, true); | |||
| } | |||
| private void setSwitchOn() { | |||
| btnFlagSwitch.setImage(ResourceManager.getPluginImage("xyz.veronie.bgg.ui", "icons/noun_switch on_30x30.png")); | |||
| btnFlagSwitch.setSelection(true); | |||
| } | |||
| private void setSwitchOff() { | |||
| btnFlagSwitch.setImage(ResourceManager.getPluginImage("xyz.veronie.bgg.ui", "icons/noun_switch off_30x30.png")); | |||
| btnFlagSwitch.setSelection(false); | |||
| } | |||
| @Override | |||
| protected void checkSubclass() { | |||
| // Disable the check that prevents subclassing of SWT components | |||
| } | |||
| } | |||