| @@ -1,15 +0,0 @@ | |||
| package xyz.veronie.bgg.data; | |||
| public enum FilterFlagState { | |||
| IS(0), ISNOT(1), IGNORE(2); | |||
| private int state; | |||
| private FilterFlagState(int state) { | |||
| this.state = state; | |||
| } | |||
| public int get() { | |||
| return this.state; | |||
| } | |||
| } | |||
| @@ -1,20 +0,0 @@ | |||
| package xyz.veronie.bgg.data; | |||
| import java.util.HashMap; | |||
| /// DTO / container for configuration of result download | |||
| public class ResultConfig { | |||
| // TODO: integrate different filters (or extend?) | |||
| public HashMap<Subtype,Boolean> subTypes; | |||
| public ResultAction action; | |||
| public SourceFilter source; | |||
| public String user; | |||
| public HashMap<UserFlag, FilterFlagState> userFlags; | |||
| public Integer geeklistId; | |||
| public Integer familyId; | |||
| // TODO: add others | |||
| } | |||
| @@ -1,59 +0,0 @@ | |||
| package xyz.veronie.bgg.data; | |||
| import javax.inject.Inject; | |||
| import org.eclipse.e4.core.di.annotations.Optional; | |||
| import org.eclipse.e4.ui.di.UIEventTopic; | |||
| public class ResultConfigManager { | |||
| private ResultConfig resultConfig = new ResultConfig(); | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicSourceFilterChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_FILTER_CHANGED) | |||
| SourceFilter source) { | |||
| getResultConfig().source = source; | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicSubtypesChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_SUBTYPE_CHANGED) | |||
| Subtype subtype, Boolean checked) { | |||
| getResultConfig().subTypes.put(subtype, checked); | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicUserChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_USER_CHANGED) | |||
| String user) { | |||
| System.out.println("set user to '" + user + "'"); | |||
| getResultConfig().user = user; | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicUserFlagChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_USERFLAG_CHANGED) | |||
| UserFlag flag, FilterFlagState state) { | |||
| getResultConfig().userFlags.put(flag, state); | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicResultActionChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_ACTION_CHANGED) | |||
| ResultAction action) { | |||
| getResultConfig().action = action; | |||
| } | |||
| public ResultConfig getResultConfig() { | |||
| return resultConfig; | |||
| } | |||
| } | |||
| @@ -0,0 +1,45 @@ | |||
| package xyz.veronie.bgg.result; | |||
| import java.util.HashMap; | |||
| import xyz.veronie.bgg.types.FilterFlagState; | |||
| import xyz.veronie.bgg.types.ResultAction; | |||
| import xyz.veronie.bgg.types.SourceFilter; | |||
| import xyz.veronie.bgg.types.Subtype; | |||
| import xyz.veronie.bgg.types.UserFlag; | |||
| /// DTO / container for configuration of result download. Also defines startup settings for controls. | |||
| /// This container is handled by the ResultConfigManager. | |||
| public class ResultConfig { | |||
| // TODO: integrate different filters (or extend?) | |||
| public SourceFilter source = SourceFilter.BGG_USER; | |||
| public ResultAction action = ResultAction.ADD; | |||
| public HashMap<Subtype,Boolean> subTypes = new HashMap<Subtype,Boolean>() { | |||
| private static final long serialVersionUID = -8718858283141976457L; | |||
| { | |||
| for (Subtype st : Subtype.values()) { | |||
| put(st, false); | |||
| } | |||
| put(Subtype.BOARDGAME, true); | |||
| }}; | |||
| // bgg user filter settings | |||
| public String user = ""; | |||
| public HashMap<UserFlag, FilterFlagState> userFlags = new HashMap<UserFlag, FilterFlagState>() { | |||
| private static final long serialVersionUID = 3086538711393696853L; | |||
| { | |||
| for (UserFlag uf : UserFlag.values()) { | |||
| put(uf, FilterFlagState.IGNORE); | |||
| } | |||
| put(UserFlag.OWN, FilterFlagState.IS); | |||
| put(UserFlag.PREVIOUSLY_OWNED, FilterFlagState.ISNOT); | |||
| }}; | |||
| public Integer geeklistId = null; | |||
| public Integer familyId = null; | |||
| // TODO: add others | |||
| } | |||
| @@ -0,0 +1,84 @@ | |||
| package xyz.veronie.bgg.result; | |||
| import javax.inject.Inject; | |||
| import javax.inject.Singleton; | |||
| import org.eclipse.e4.core.di.annotations.Creatable; | |||
| import org.eclipse.e4.core.di.annotations.Optional; | |||
| import org.eclipse.e4.ui.di.UIEventTopic; | |||
| import xyz.veronie.bgg.types.EventConstants; | |||
| import xyz.veronie.bgg.types.ResultAction; | |||
| import xyz.veronie.bgg.types.SourceFilter; | |||
| import xyz.veronie.bgg.types.SubtypeEvent; | |||
| import xyz.veronie.bgg.types.UserFlagEvent; | |||
| /// This object/instance is responsible for managing the current state of the configuration for | |||
| /// BGG result downloads. It is sent an event whenever one of the controls for the | |||
| /// configuration changes, and modifies the ResultConfig accordingly. | |||
| /// Other parts of the program can ask for the result config to either display its state | |||
| /// or execute the BGG download. | |||
| @Creatable | |||
| @Singleton | |||
| public class ResultConfigManager { | |||
| private ResultConfig resultConfig; | |||
| public ResultConfigManager() { | |||
| resultConfig = new ResultConfig(); | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicSourceChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_SOURCE_CHANGED) | |||
| SourceFilter source) { | |||
| getResultConfig().source = source; | |||
| System.out.println("TOPIC_SOURCE_CHANGED: source = " + source); | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicSubtypesChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_SUBTYPE_CHANGED) | |||
| SubtypeEvent se) { | |||
| getResultConfig().subTypes.put(se.subtype, se.checked); | |||
| System.out.println("TOPIC_SUBTYPE_CHANGED: " + (se.checked?"[x] ":"[ ] ") + se.subtype); | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicUserChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_USER_CHANGED) | |||
| String user) { | |||
| System.out.println("set user to '" + user + "'"); | |||
| getResultConfig().user = user; | |||
| System.out.println("TOPIC_USER_CHANGED: user = " + user); | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicUserFlagChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_USERFLAG_CHANGED) | |||
| UserFlagEvent e) { | |||
| getResultConfig().userFlags.put(e.flag, e.state); | |||
| System.out.println("TOPIC_USERFLAG_CHANGED: " + e.flag + " " + e.state); | |||
| } | |||
| @Inject | |||
| @Optional | |||
| private void subscribeTopicResultActionChanged | |||
| (@UIEventTopic(EventConstants.TOPIC_ACTION_CHANGED) | |||
| ResultAction action) { | |||
| getResultConfig().action = action; | |||
| System.out.println("TOPIC_ACTION_CHANGED: action = " + action); | |||
| } | |||
| public ResultConfig getResultConfig() { | |||
| return resultConfig; | |||
| } | |||
| } | |||
| @@ -0,0 +1,57 @@ | |||
| package xyz.veronie.bgg.result; | |||
| public class Thing { | |||
| Integer id; | |||
| String name; | |||
| String designer; | |||
| String publisher; | |||
| String artist; | |||
| Integer yearpublished; | |||
| Integer minplayers; | |||
| Integer maxplayers; | |||
| Integer playingtime; | |||
| Integer minplaytime; | |||
| Integer maxplaytime; | |||
| Integer age; | |||
| Integer usersrated; | |||
| Integer average; | |||
| Float bayesaverage; | |||
| Integer rank; | |||
| Integer rank_wg; | |||
| Integer numcomments; | |||
| Integer numweights; | |||
| Float averageweight; | |||
| Float stddev; | |||
| Float median; | |||
| Boolean owned; | |||
| Boolean trading; | |||
| Boolean wanting; | |||
| Boolean wishing; | |||
| Float userrating; | |||
| String image; | |||
| Integer category; | |||
| Integer mechanic; | |||
| String comment; | |||
| Integer[] players; // 1 to 20 | |||
| String description; | |||
| // exp, | |||
| Integer basegameId; | |||
| Integer reimplementId; | |||
| String reimplement_name; | |||
| Integer reimplementedById; | |||
| String reimplementedByName; | |||
| Integer containsId; | |||
| String containsName; | |||
| Integer iscontained; | |||
| String iscontained_name; | |||
| Integer integration; | |||
| String integration_name; | |||
| Integer numplays; | |||
| Float price; | |||
| Float userweight; | |||
| Integer wishpriority; | |||
| Integer expansions; | |||
| String domain; | |||
| String family; | |||
| Float age_poll; | |||
| } | |||
| @@ -0,0 +1,106 @@ | |||
| package xyz.veronie.bgg.result; | |||
| import java.beans.PropertyChangeListener; | |||
| import java.beans.PropertyChangeSupport; | |||
| public class ThingMetaData { | |||
| private int id; | |||
| private Integer rating; | |||
| private String imgURL; | |||
| private String thumbURL; | |||
| private String comment; | |||
| private Integer otherId; // ??? | |||
| private String username; | |||
| private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); | |||
| public ThingMetaData(int id, Integer rating, String imgURL, String thumbURL, String comment, Integer otherId, String username) { | |||
| this.setId(id); | |||
| this.setRating(rating); | |||
| this.setImgURL(imgURL); | |||
| this.setThumbURL(thumbURL); | |||
| this.setComment(comment); | |||
| this.setOtherId(otherId); | |||
| this.setUsername(username); | |||
| } | |||
| public void addPropertyChangeListener(String propertyName, | |||
| PropertyChangeListener listener) { | |||
| propertyChangeSupport.addPropertyChangeListener(propertyName, listener); | |||
| } | |||
| public void removePropertyChangeListener(PropertyChangeListener listener) { | |||
| propertyChangeSupport.removePropertyChangeListener(listener); | |||
| } | |||
| public int getId() { | |||
| return id; | |||
| } | |||
| public void setId(int id) { | |||
| propertyChangeSupport.firePropertyChange("id", this.id, | |||
| this.id = id); | |||
| } | |||
| public Integer getRating() { | |||
| return rating; | |||
| } | |||
| public void setRating(Integer rating) { | |||
| propertyChangeSupport.firePropertyChange("rating", this.rating, | |||
| this.rating = rating); | |||
| } | |||
| public String getImgURL() { | |||
| return imgURL; | |||
| } | |||
| public void setImgURL(String imgURL) { | |||
| propertyChangeSupport.firePropertyChange("img", this.imgURL, | |||
| this.imgURL = imgURL); | |||
| } | |||
| public String getThumbURL() { | |||
| return thumbURL; | |||
| } | |||
| public void setThumbURL(String thumbURL) { | |||
| propertyChangeSupport.firePropertyChange("thumb", this.thumbURL, | |||
| this.thumbURL = thumbURL); | |||
| } | |||
| public String getComment() { | |||
| return comment; | |||
| } | |||
| public void setComment(String comment) { | |||
| propertyChangeSupport.firePropertyChange("comment", this.comment, | |||
| this.comment = comment); | |||
| } | |||
| public Integer getOtherId() { | |||
| return otherId; | |||
| } | |||
| public void setOtherId(Integer otherId) { | |||
| propertyChangeSupport.firePropertyChange("otherId", this.otherId, | |||
| this.otherId = otherId); | |||
| } | |||
| public String getUsername() { | |||
| return username; | |||
| } | |||
| public void setUsername(String username) { | |||
| propertyChangeSupport.firePropertyChange("username", this.username, | |||
| this.username = username); | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return String.valueOf(id); | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| package xyz.veronie.bgg.result; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| public enum ThingProvider { | |||
| INSTANCE; | |||
| private List<ThingMetaData> thingMetas; | |||
| private ThingProvider() { | |||
| thingMetas = new ArrayList<ThingMetaData>(); | |||
| // TODO: retrieve data from BGG | |||
| // ...and iterate: | |||
| thingMetas.add(new ThingMetaData( | |||
| 286053, | |||
| null, | |||
| "https://cf.geekdo-images.com/original/img/vKBCxo7d6maBDC_X9nmC5MWzIC8=/0x0/pic4880614.jpg", | |||
| "https://cf.geekdo-images.com/thumb/img/gpeB-GrXrknzAqFKEky1JOvcY4w=/fit-in/200x150/pic4880614.jpg", | |||
| "", | |||
| 65212097, | |||
| "veronie")); | |||
| } | |||
| public List<ThingMetaData> getThingMetas() { | |||
| return thingMetas; | |||
| } | |||
| } | |||
| @@ -1,4 +1,4 @@ | |||
| package xyz.veronie.bgg.data; | |||
| package xyz.veronie.bgg.types; | |||
| /// This class contains and handles the result table for BGG things | |||
| public class BggResult { | |||
| @@ -1,10 +1,10 @@ | |||
| package xyz.veronie.bgg.data; | |||
| package xyz.veronie.bgg.types; | |||
| public interface EventConstants { | |||
| String TOPIC_CONFIG_CHANGED = "CONFIG_CHANGED/*"; | |||
| String TOPIC_FILTER_CHANGED = "CONFIG_CHANGED/FILTER"; | |||
| String TOPIC_SOURCE_CHANGED = "CONFIG_CHANGED/FILTER"; | |||
| String TOPIC_SUBTYPE_CHANGED = "CONFIG_CHANGED/SUBTYPE"; | |||
| @@ -14,4 +14,6 @@ public interface EventConstants { | |||
| String TOPIC_USER_CHANGED = "CONFIG_CHANGED/USER"; | |||
| String TOPIC_GEEKLIST_CHANGED = "CONFIG_CHANGED/GEEKLIST"; | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| package xyz.veronie.bgg.types; | |||
| public enum FilterFlagState { | |||
| IS("is"), | |||
| ISNOT("is not"), | |||
| IGNORE("ignore"); | |||
| private String name; | |||
| private FilterFlagState(String name) { | |||
| this.name = name; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return name; | |||
| } | |||
| } | |||
| @@ -1,4 +1,4 @@ | |||
| package xyz.veronie.bgg.data; | |||
| package xyz.veronie.bgg.types; | |||
| public enum ResultAction { | |||
| ADD("add"), | |||
| @@ -1,4 +1,4 @@ | |||
| package xyz.veronie.bgg.data; | |||
| package xyz.veronie.bgg.types; | |||
| public enum SourceFilter { | |||
| @@ -1,4 +1,4 @@ | |||
| package xyz.veronie.bgg.data; | |||
| package xyz.veronie.bgg.types; | |||
| public enum Subtype { | |||
| BOARDGAME("Board games", "boardgame"), | |||
| @@ -0,0 +1,6 @@ | |||
| package xyz.veronie.bgg.types; | |||
| public class SubtypeEvent { | |||
| public Subtype subtype; | |||
| public Boolean checked; | |||
| } | |||
| @@ -1,4 +1,4 @@ | |||
| package xyz.veronie.bgg.data; | |||
| package xyz.veronie.bgg.types; | |||
| public enum UserFlag { | |||
| @@ -0,0 +1,6 @@ | |||
| package xyz.veronie.bgg.types; | |||
| public class UserFlagEvent { | |||
| public UserFlag flag; | |||
| public FilterFlagState state; | |||
| } | |||
| @@ -1,10 +1,18 @@ | |||
| package xyz.veronie.bgg.ui.filters; | |||
| import java.util.HashMap; | |||
| 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; | |||
| @@ -17,9 +25,11 @@ import org.eclipse.swt.widgets.Combo; | |||
| import org.eclipse.swt.widgets.Composite; | |||
| import org.eclipse.swt.widgets.Label; | |||
| import xyz.veronie.bgg.data.EventConstants; | |||
| import xyz.veronie.bgg.data.FilterFlagState; | |||
| import xyz.veronie.bgg.data.UserFlag; | |||
| 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; | |||
| @@ -28,23 +38,11 @@ import xyz.veronie.bgg.data.UserFlag; | |||
| /// These are the controls to retrieve thing IDs for a given BGG user | |||
| /// Filters can be set for the state of the thing in the user's collection | |||
| /// (i.e. owned, previously owned, wishlist, etc.) | |||
| @Creatable | |||
| public class BggUserSourceFilter { | |||
| @Inject | |||
| private IEventBroker eventBroker; | |||
| private HashMap<UserFlag, FilterFlagState> flags = new HashMap<UserFlag, FilterFlagState>() { | |||
| private static final long serialVersionUID = 1L; | |||
| { | |||
| put(UserFlag.OWN, FilterFlagState.IS); | |||
| put(UserFlag.PREVIOUSLY_OWNED, FilterFlagState.ISNOT); | |||
| put(UserFlag.FOR_TRADE, FilterFlagState.IGNORE); | |||
| put(UserFlag.WANTED, FilterFlagState.IGNORE); | |||
| put(UserFlag.WTP, FilterFlagState.IGNORE); | |||
| put(UserFlag.WTB, FilterFlagState.IGNORE); | |||
| put(UserFlag.WISHLIST, FilterFlagState.IGNORE); | |||
| put(UserFlag.PREORDERED, FilterFlagState.IGNORE); | |||
| }}; | |||
| @Inject private IEventBroker eventBroker; | |||
| @Inject private ResultConfigManager configManager; | |||
| public void create(Composite parent, int style) { | |||
| @@ -54,9 +52,23 @@ public class BggUserSourceFilter { | |||
| Label lblUser = new Label(parent, 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(); | |||
| // } | |||
| Combo cbUserName = new Combo(parent, SWT.DROP_DOWN); | |||
| cbUserName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| cbUserName.setText(configManager.getResultConfig().user); | |||
| cbUserName.addSelectionListener(new SelectionAdapter() { | |||
| public void widgetDefaultSelected(SelectionEvent e) { | |||
| setUser(cbUserName.getText()); | |||
| @@ -78,6 +90,7 @@ public class BggUserSourceFilter { | |||
| 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 | |||
| @@ -107,14 +120,25 @@ public class BggUserSourceFilter { | |||
| // 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, UserFlag key) { | |||
| Combo filterCombo = new Combo(parent, SWT.READ_ONLY); | |||
| filterCombo.add("is"); | |||
| filterCombo.add("is not"); | |||
| filterCombo.add("ignored"); | |||
| filterCombo.select(flags.get(key).get()); | |||
| filterCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| // TODO: add listener - send a CONFIG_CHANGED event when something changes | |||
| private void makeFilter(Composite parent, 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()); | |||
| @@ -125,7 +149,7 @@ public class BggUserSourceFilter { | |||
| if(eventBroker != null) { | |||
| eventBroker.post(EventConstants.TOPIC_USER_CHANGED, user); | |||
| } else { | |||
| System.out.println("null???"); | |||
| System.out.println("setGeeklistId: eventBroker is null."); | |||
| } | |||
| } | |||
| @@ -1,5 +1,9 @@ | |||
| package xyz.veronie.bgg.ui.filters; | |||
| import javax.inject.Inject; | |||
| import org.eclipse.e4.core.di.annotations.Creatable; | |||
| import org.eclipse.e4.core.services.events.IEventBroker; | |||
| import org.eclipse.swt.SWT; | |||
| import org.eclipse.swt.events.FocusEvent; | |||
| import org.eclipse.swt.events.FocusListener; | |||
| @@ -11,11 +15,17 @@ 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; | |||
| /// These are the controls to retrieve thing IDs for a given family ID | |||
| @Creatable | |||
| public class GeeklistSourceFilter { | |||
| private static Integer geeklistId; | |||
| public static void create(Composite parent, int style) { | |||
| @Inject private IEventBroker eventBroker; | |||
| @Inject ResultConfigManager configManager; | |||
| public void create(Composite parent, int style) { | |||
| GridLayout filterLayout = new GridLayout(2, false); | |||
| parent.setLayout(filterLayout); | |||
| @@ -28,7 +38,7 @@ public class GeeklistSourceFilter { | |||
| cbGeeklistId.addSelectionListener(new SelectionAdapter() { | |||
| public void widgetDefaultSelected(SelectionEvent e) { | |||
| setGeeklistId(Integer.getInteger(cbGeeklistId.getText())); | |||
| System.out.println("set geeklist id to '" + getGeeklistId() + "'"); | |||
| System.out.println("set geeklist id to '" + configManager.getResultConfig().geeklistId + "'"); | |||
| } | |||
| }); | |||
| cbGeeklistId.addFocusListener(new FocusListener() { | |||
| @@ -36,7 +46,7 @@ public class GeeklistSourceFilter { | |||
| @Override | |||
| public void focusLost(FocusEvent e) { | |||
| setGeeklistId(Integer.getInteger(cbGeeklistId.getText())); | |||
| System.out.println("set geeklist id to '" + getGeeklistId() + "'"); | |||
| System.out.println("set geeklist id to '" + configManager.getResultConfig().geeklistId + "'"); | |||
| } | |||
| @Override | |||
| @@ -47,11 +57,11 @@ public class GeeklistSourceFilter { | |||
| parent.layout(); | |||
| } | |||
| public static Integer getGeeklistId() { | |||
| return geeklistId; | |||
| } | |||
| public static void setGeeklistId(Integer geeklistId) { | |||
| GeeklistSourceFilter.geeklistId = geeklistId; | |||
| public void setGeeklistId(Integer geeklistId) { | |||
| if(eventBroker != null) { | |||
| eventBroker.post(EventConstants.TOPIC_GEEKLIST_CHANGED, geeklistId); | |||
| } else { | |||
| System.out.println("setGeeklistId: eventBroker is null."); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| package xyz.veronie.bgg.ui.filters; | |||
| import java.util.HashMap; | |||
| 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.swt.widgets.Group; | |||
| import xyz.veronie.bgg.result.ResultConfigManager; | |||
| import xyz.veronie.bgg.types.EventConstants; | |||
| import xyz.veronie.bgg.types.Subtype; | |||
| import xyz.veronie.bgg.types.SubtypeEvent; | |||
| public class SubtypeGroup { | |||
| private HashMap<Subtype, Button> buttons; | |||
| public void create(Composite parent, IEventBroker eventBroker, ResultConfigManager configManager) { | |||
| Group gSubtype = new Group(parent, SWT.LEFT); | |||
| gSubtype.setText("Subtypes"); | |||
| gSubtype.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); | |||
| gSubtype.setLayout(new GridLayout(1, false)); | |||
| buttons = new HashMap<Subtype, Button>(); | |||
| for (Subtype st : Subtype.values()) { | |||
| Button bb = new Button(gSubtype, SWT.CHECK); | |||
| bb.setText(st.toString()); | |||
| bb.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| // init | |||
| HashMap<Subtype, Boolean> configuredTypes = configManager.getResultConfig().subTypes; | |||
| bb.setSelection(configuredTypes.get(st)); | |||
| bb.addSelectionListener(new SelectionAdapter() | |||
| { | |||
| @Override | |||
| public void widgetSelected(SelectionEvent e) | |||
| { | |||
| SubtypeEvent stEvent = new SubtypeEvent(); | |||
| stEvent.subtype = st; | |||
| stEvent.checked = bb.getSelection(); | |||
| eventBroker.send(EventConstants.TOPIC_SUBTYPE_CHANGED, stEvent); | |||
| } | |||
| }); | |||
| buttons.put(st, bb); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,40 +0,0 @@ | |||
| package xyz.veronie.bgg.ui.filters; | |||
| import java.util.HashMap; | |||
| import org.eclipse.swt.SWT; | |||
| 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.swt.widgets.Group; | |||
| import xyz.veronie.bgg.data.Subtype; | |||
| public class ThingFilterGroup { | |||
| private HashMap<Subtype, Button> buttons; | |||
| public void create(Composite parent) { | |||
| Group gSubtype = new Group(parent, SWT.LEFT); | |||
| gSubtype.setText("Subtypes"); | |||
| gSubtype.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); | |||
| gSubtype.setLayout(new GridLayout(1, false)); | |||
| buttons = new HashMap<Subtype, Button>(); | |||
| for (Subtype st : Subtype.values()) { | |||
| Button bb = new Button(gSubtype, SWT.CHECK); | |||
| bb.setText(st.toString()); | |||
| bb.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| if(st == Subtype.BOARDGAME) { | |||
| // initially, only boardgame is checked | |||
| bb.setSelection(true); | |||
| } else { | |||
| bb.setSelection(false); | |||
| } | |||
| // TODO: add listener to buttons. Send event with checked subtypes when something changes. | |||
| buttons.put(st, bb); | |||
| } | |||
| } | |||
| } | |||
| @@ -2,22 +2,157 @@ package xyz.veronie.bgg.ui.parts; | |||
| import javax.annotation.PostConstruct; | |||
| import org.eclipse.jface.viewers.ArrayContentProvider; | |||
| import org.eclipse.jface.viewers.ColumnLabelProvider; | |||
| import org.eclipse.jface.viewers.TableViewer; | |||
| import org.eclipse.jface.viewers.TableViewerColumn; | |||
| import org.eclipse.swt.SWT; | |||
| import org.eclipse.swt.layout.GridData; | |||
| //import org.eclipse.swt.layout.GridData; | |||
| import org.eclipse.swt.layout.GridLayout; | |||
| import org.eclipse.swt.widgets.Composite; | |||
| import org.eclipse.swt.widgets.Label; | |||
| import org.eclipse.swt.widgets.Table; | |||
| import org.eclipse.swt.widgets.TableColumn; | |||
| import xyz.veronie.bgg.data.ResultConfigManager; | |||
| import xyz.veronie.bgg.result.ThingMetaData; | |||
| import xyz.veronie.bgg.result.ThingProvider; | |||
| public class BggResultPart { | |||
| private TableViewer viewer; | |||
| @PostConstruct | |||
| public void createControls(Composite parent) { | |||
| Composite main = new Composite(parent, SWT.FILL); | |||
| GridLayout layout = new GridLayout(1, false); | |||
| main.setLayout(layout); | |||
| Label lblTable = new Label(main, SWT.LEFT); | |||
| lblTable.setText("I am a table"); | |||
| lblTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |||
| createViewer(main); | |||
| } | |||
| private void createViewer(Composite parent) { | |||
| viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | |||
| | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); | |||
| createColumns(parent, viewer); | |||
| final Table table = viewer.getTable(); | |||
| table.setHeaderVisible(true); | |||
| table.setLinesVisible(true); | |||
| viewer.setContentProvider(new ArrayContentProvider()); | |||
| // Get the content for the viewer, setInput will call getElements in the | |||
| // contentProvider | |||
| viewer.setInput(ThingProvider.INSTANCE.getThingMetas()); | |||
| // make the selection available to other views | |||
| // TODO: getSite().setSelectionProvider(viewer); | |||
| // Set the sorter for the table | |||
| // Layout the viewer | |||
| GridData gridData = new GridData(); | |||
| gridData.verticalAlignment = GridData.FILL; | |||
| gridData.horizontalSpan = 2; | |||
| gridData.grabExcessHorizontalSpace = true; | |||
| gridData.grabExcessVerticalSpace = true; | |||
| gridData.horizontalAlignment = GridData.FILL; | |||
| viewer.getControl().setLayoutData(gridData); | |||
| } | |||
| public TableViewer getViewer() { | |||
| return viewer; | |||
| } | |||
| // This will create the columns for the table | |||
| private void createColumns(final Composite parent, final TableViewer viewer) { | |||
| String[] titles = { "Id", "Rating", "Image", "Thumb", "comment", "other Id", "User name" }; | |||
| int[] bounds = { 100, 100, 100, 100, 100, 100, 100 }; | |||
| // First column id | |||
| TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0); | |||
| col.setLabelProvider(new ColumnLabelProvider() { | |||
| @Override | |||
| public String getText(Object element) { | |||
| ThingMetaData t = (ThingMetaData) element; | |||
| return String.valueOf(t.getId()); | |||
| } | |||
| }); | |||
| // Second column rating | |||
| col = createTableViewerColumn(titles[1], bounds[1], 1); | |||
| col.setLabelProvider(new ColumnLabelProvider() { | |||
| @Override | |||
| public String getText(Object element) { | |||
| ThingMetaData t = (ThingMetaData) element; | |||
| return String.valueOf(t.getRating()); | |||
| } | |||
| }); | |||
| // now img url | |||
| col = createTableViewerColumn(titles[2], bounds[2], 2); | |||
| col.setLabelProvider(new ColumnLabelProvider() { | |||
| @Override | |||
| public String getText(Object element) { | |||
| ThingMetaData t = (ThingMetaData) element; | |||
| return t.getImgURL(); | |||
| } | |||
| }); | |||
| // thumb url | |||
| col = createTableViewerColumn(titles[3], bounds[3], 3); | |||
| col.setLabelProvider(new ColumnLabelProvider() { | |||
| @Override | |||
| public String getText(Object element) { | |||
| ThingMetaData t = (ThingMetaData) element; | |||
| return t.getThumbURL(); | |||
| } | |||
| }); | |||
| // comment | |||
| col = createTableViewerColumn(titles[4], bounds[4], 4); | |||
| col.setLabelProvider(new ColumnLabelProvider() { | |||
| @Override | |||
| public String getText(Object element) { | |||
| ThingMetaData t = (ThingMetaData) element; | |||
| return t.getComment(); | |||
| } | |||
| }); | |||
| // other id | |||
| col = createTableViewerColumn(titles[5], bounds[5], 5); | |||
| col.setLabelProvider(new ColumnLabelProvider() { | |||
| @Override | |||
| public String getText(Object element) { | |||
| ThingMetaData t = (ThingMetaData) element; | |||
| return String.valueOf(t.getOtherId()); | |||
| } | |||
| }); | |||
| // username | |||
| col = createTableViewerColumn(titles[6], bounds[6], 6); | |||
| col.setLabelProvider(new ColumnLabelProvider() { | |||
| @Override | |||
| public String getText(Object element) { | |||
| ThingMetaData t = (ThingMetaData) element; | |||
| return String.valueOf(t.getUsername()); | |||
| } | |||
| }); | |||
| } | |||
| private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) { | |||
| final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, | |||
| SWT.NONE); | |||
| final TableColumn column = viewerColumn.getColumn(); | |||
| column.setText(title); | |||
| column.setWidth(bound); | |||
| column.setResizable(true); | |||
| column.setMoveable(true); | |||
| return viewerColumn; | |||
| } | |||
| /** | |||
| * Passing the focus request to the viewer's control. | |||
| */ | |||
| public void setFocus() { | |||
| viewer.getControl().setFocus(); | |||
| } | |||
| } | |||
| @@ -4,7 +4,9 @@ import java.util.Arrays; | |||
| import java.util.List; | |||
| import javax.annotation.PostConstruct; | |||
| import javax.inject.Inject; | |||
| 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; | |||
| @@ -24,16 +26,17 @@ import org.eclipse.swt.widgets.Display; | |||
| import org.eclipse.swt.widgets.Group; | |||
| import org.eclipse.swt.widgets.Label; | |||
| import xyz.veronie.bgg.data.ResultAction; | |||
| import xyz.veronie.bgg.data.ResultConfigManager; | |||
| import xyz.veronie.bgg.data.SourceFilter; | |||
| import xyz.veronie.bgg.result.ResultConfigManager; | |||
| import xyz.veronie.bgg.types.EventConstants; | |||
| import xyz.veronie.bgg.types.ResultAction; | |||
| import xyz.veronie.bgg.types.SourceFilter; | |||
| import xyz.veronie.bgg.ui.filters.AgeSourceFilter; | |||
| import xyz.veronie.bgg.ui.filters.BggUserSourceFilter; | |||
| import xyz.veronie.bgg.ui.filters.FamilySourceFilter; | |||
| import xyz.veronie.bgg.ui.filters.GeeklistSourceFilter; | |||
| import xyz.veronie.bgg.ui.filters.RankSourceFilter; | |||
| import xyz.veronie.bgg.ui.filters.SearchSourceFilter; | |||
| import xyz.veronie.bgg.ui.filters.ThingFilterGroup; | |||
| import xyz.veronie.bgg.ui.filters.SubtypeGroup; | |||
| import xyz.veronie.bgg.ui.filters.YearSourceFilter; | |||
| @@ -42,13 +45,14 @@ import xyz.veronie.bgg.ui.filters.YearSourceFilter; | |||
| /// There are different ways to configure which IDs to retrieve. | |||
| public class LoadFromBggPart { | |||
| // TODO: figure out how to make sure this is a singleton | |||
| private ResultConfigManager resultConfigManager; | |||
| LoadFromBggPart() { | |||
| resultConfigManager = new ResultConfigManager(); | |||
| } | |||
| @Inject | |||
| private ResultConfigManager configManager; | |||
| @Inject private IEventBroker eventBroker; | |||
| // inject all source filter composites | |||
| @Inject private BggUserSourceFilter bggUserSourceFilter; | |||
| @Inject private GeeklistSourceFilter geeklistSourceFilter; | |||
| @PostConstruct | |||
| public void createControls(Composite parent) { | |||
| @@ -82,8 +86,8 @@ public class LoadFromBggPart { | |||
| cbSource.setInput(sources); | |||
| // TODO: implement all the sources | |||
| cbSource.setSelection(new StructuredSelection(sources.get(0))); | |||
| cbSource.setSelection(new StructuredSelection(configManager.getResultConfig().source)); | |||
| // listener is configured further below | |||
| // choose the bgg sub-site | |||
| @@ -91,8 +95,8 @@ public class LoadFromBggPart { | |||
| lblSubtype.setText("Subtypes: "); | |||
| lblSubtype.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false)); | |||
| ThingFilterGroup gSubtypes = new ThingFilterGroup(); | |||
| gSubtypes.create(dlConfigGroup); | |||
| SubtypeGroup gSubtypes = new SubtypeGroup(); | |||
| gSubtypes.create(dlConfigGroup, eventBroker, configManager); | |||
| // choose action on result list | |||
| Label lblAct = new Label(dlConfigGroup, SWT.LEFT); | |||
| @@ -105,24 +109,29 @@ public class LoadFromBggPart { | |||
| ResultAction.ADD, ResultAction.REP, ResultAction.SUB, | |||
| ResultAction.AND, ResultAction.MIS }); | |||
| cbAct.setInput(actions); | |||
| cbAct.setSelection(new StructuredSelection(actions.get(0))); | |||
| cbAct.setSelection(new StructuredSelection(configManager.getResultConfig().action)); | |||
| cbAct.addSelectionChangedListener(new ISelectionChangedListener() { | |||
| @Override | |||
| public void selectionChanged(SelectionChangedEvent event) { | |||
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); | |||
| eventBroker.send(EventConstants.TOPIC_ACTION_CHANGED, selection.getFirstElement()); | |||
| } | |||
| }); | |||
| // area to display filter controls in | |||
| Group gFilters = new Group(main, SWT.SHADOW_ETCHED_IN); | |||
| gFilters.setText(""); | |||
| gFilters.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||
| showFilter(gFilters, (IStructuredSelection)cbSource.getSelection()); // set content to initial selection | |||
| showFilter(gFilters, (IStructuredSelection)cbSource.getSelection()); // set content to initial selection | |||
| cbSource.addSelectionChangedListener(new ISelectionChangedListener() { // later, its content will be set via the dropdown | |||
| @Override | |||
| public void selectionChanged(SelectionChangedEvent event) { | |||
| IStructuredSelection selection = (IStructuredSelection) event | |||
| .getSelection(); | |||
| if (selection.size() > 0) { | |||
| // ASK: this is strange to me. Why is filterComposite known INSIDE a free function? | |||
| showFilter(gFilters, selection); | |||
| } | |||
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); | |||
| // ASK: this is strange to me. Why is filterComposite known INSIDE a free function? | |||
| showFilter(gFilters, selection); | |||
| eventBroker.send(EventConstants.TOPIC_SOURCE_CHANGED, selection.getFirstElement()); | |||
| } | |||
| }); | |||
| @@ -152,14 +161,14 @@ public class LoadFromBggPart { | |||
| if(selection.size() == 0) return; | |||
| if(selection.getFirstElement() == SourceFilter.BGG_USER) { | |||
| String user = resultConfigManager.getResultConfig().user; | |||
| String user = configManager.getResultConfig().user; | |||
| if(user == null || user.isEmpty()) { | |||
| System.out.println("Please enter a user name."); | |||
| return; | |||
| } | |||
| System.out.println("...for user '" + user + "'"); | |||
| } else if(selection.getFirstElement() == SourceFilter.GEEKLIST) { | |||
| System.out.println("...for geeklist id '" + GeeklistSourceFilter.getGeeklistId() + "'"); | |||
| System.out.println("...for geeklist id '" + configManager.getResultConfig().geeklistId + "'"); | |||
| } else if(selection.getFirstElement() == SourceFilter.FAMILY) { | |||
| System.out.println("...for family id '" + FamilySourceFilter.getFamilyId() + "'"); | |||
| } | |||
| @@ -185,12 +194,11 @@ public class LoadFromBggPart { | |||
| switch(elem) { | |||
| case BGG_USER: | |||
| System.out.println("construct " + elem); | |||
| BggUserSourceFilter f = new BggUserSourceFilter(); | |||
| f.create(parent, SWT.FILL); | |||
| bggUserSourceFilter.create(parent, SWT.FILL); | |||
| break; | |||
| case GEEKLIST: | |||
| System.out.println("construct " + elem); | |||
| GeeklistSourceFilter.create(parent, SWT.FILL); | |||
| geeklistSourceFilter.create(parent, SWT.FILL); | |||
| break; | |||
| case FAMILY: | |||
| System.out.println("construct " + elem); | |||