@@ -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 | |||
} | |||
} |