@@ -1,38 +1,17 @@ | |||||
package xyz.veronie.bgg.ui.filters; | package xyz.veronie.bgg.ui.filters; | ||||
import java.util.ArrayList; | |||||
import java.util.Arrays; | |||||
import java.util.List; | |||||
import javax.inject.Inject; | import javax.inject.Inject; | ||||
import org.eclipse.e4.core.di.annotations.Creatable; | import org.eclipse.e4.core.di.annotations.Creatable; | ||||
import org.eclipse.e4.core.services.events.IEventBroker; | 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.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.GridData; | ||||
import org.eclipse.swt.layout.GridLayout; | import org.eclipse.swt.layout.GridLayout; | ||||
import org.eclipse.swt.widgets.Combo; | |||||
import org.eclipse.swt.widgets.Composite; | import org.eclipse.swt.widgets.Composite; | ||||
import org.eclipse.swt.widgets.Label; | |||||
import xyz.veronie.bgg.result.ResultConfigManager; | 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.BatLayouts; | ||||
import xyz.veronie.bgg.ui.helpers.CommonControls; | |||||
/// These are the controls to retrieve thing IDs for a given BGG user | /// 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 IEventBroker eventBroker; | ||||
@Inject private ResultConfigManager configManager; | @Inject private ResultConfigManager configManager; | ||||
private Combo cbUserName; | |||||
public void create(Composite parent, int style) { | public void create(Composite parent, int style) { | ||||
Composite mainCompo = new Composite(parent, SWT.FILL); | Composite mainCompo = new Composite(parent, SWT.FILL); | ||||
@@ -54,152 +31,11 @@ public class BggUserSourceFilter { | |||||
mainCompo.setLayout(gl_mainCompo); | mainCompo.setLayout(gl_mainCompo); | ||||
mainCompo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | 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.pack(); | ||||
//mainCompo.layout(true, true); | |||||
parent.pack(); | parent.pack(); | ||||
parent.layout(true, true); | 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 | |||||
} | |||||
} |