| @@ -16,6 +16,7 @@ Require-Bundle: org.eclipse.core.runtime, | |||||
| javax.inject | javax.inject | ||||
| Automatic-Module-Name: de.wt.secondtry | Automatic-Module-Name: de.wt.secondtry | ||||
| Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | Bundle-RequiredExecutionEnvironment: JavaSE-1.8 | ||||
| Import-Package: javax.inject;version="1.0.0", | |||||
| Import-Package: com.google.gson;version="2.8.2", | |||||
| javax.inject;version="1.0.0", | |||||
| org.eclipse.e4.ui.model.application.descriptor.basic, | org.eclipse.e4.ui.model.application.descriptor.basic, | ||||
| org.eclipse.e4.ui.model.application.ui.basic | org.eclipse.e4.ui.model.application.ui.basic | ||||
| @@ -0,0 +1,80 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
| xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
| <modelVersion>4.0.0</modelVersion> | |||||
| <groupId>xyz.veronie.bgg</groupId> | |||||
| <artifactId>xyz.veronie.bgg.ui</artifactId> | |||||
| <version>0.0.1-SNAPSHOT</version> | |||||
| <name>xyz.veronie.bgg.ui2</name> | |||||
| <!-- FIXME change it to the project's website --> | |||||
| <url>http://www.example.com</url> | |||||
| <properties> | |||||
| <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||||
| <maven.compiler.source>1.7</maven.compiler.source> | |||||
| <maven.compiler.target>1.7</maven.compiler.target> | |||||
| </properties> | |||||
| <dependencies> | |||||
| <dependency> | |||||
| <groupId>com.google.code.gson</groupId> | |||||
| <artifactId>gson</artifactId> | |||||
| <version>2.8.6</version> | |||||
| </dependency> | |||||
| <dependency> | |||||
| <groupId>junit</groupId> | |||||
| <artifactId>junit</artifactId> | |||||
| <version>4.11</version> | |||||
| <scope>test</scope> | |||||
| </dependency> | |||||
| </dependencies> | |||||
| <build> | |||||
| <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> | |||||
| <plugins> | |||||
| <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> | |||||
| <plugin> | |||||
| <artifactId>maven-clean-plugin</artifactId> | |||||
| <version>3.1.0</version> | |||||
| </plugin> | |||||
| <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> | |||||
| <plugin> | |||||
| <artifactId>maven-resources-plugin</artifactId> | |||||
| <version>3.0.2</version> | |||||
| </plugin> | |||||
| <plugin> | |||||
| <artifactId>maven-compiler-plugin</artifactId> | |||||
| <version>3.8.0</version> | |||||
| </plugin> | |||||
| <plugin> | |||||
| <artifactId>maven-surefire-plugin</artifactId> | |||||
| <version>2.22.1</version> | |||||
| </plugin> | |||||
| <plugin> | |||||
| <artifactId>maven-jar-plugin</artifactId> | |||||
| <version>3.0.2</version> | |||||
| </plugin> | |||||
| <plugin> | |||||
| <artifactId>maven-install-plugin</artifactId> | |||||
| <version>2.5.2</version> | |||||
| </plugin> | |||||
| <plugin> | |||||
| <artifactId>maven-deploy-plugin</artifactId> | |||||
| <version>2.8.2</version> | |||||
| </plugin> | |||||
| <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> | |||||
| <plugin> | |||||
| <artifactId>maven-site-plugin</artifactId> | |||||
| <version>3.7.1</version> | |||||
| </plugin> | |||||
| <plugin> | |||||
| <artifactId>maven-project-info-reports-plugin</artifactId> | |||||
| <version>3.0.0</version> | |||||
| </plugin> | |||||
| </plugins> | |||||
| </pluginManagement> | |||||
| </build> | |||||
| </project> | |||||
| @@ -28,6 +28,7 @@ import org.xml.sax.InputSource; | |||||
| import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||
| import xyz.veronie.bgg.types.EventConstants; | import xyz.veronie.bgg.types.EventConstants; | ||||
| import xyz.veronie.bgg.types.FamilyType; | |||||
| import xyz.veronie.bgg.types.FilterFlagState; | import xyz.veronie.bgg.types.FilterFlagState; | ||||
| import xyz.veronie.bgg.types.Subtype; | import xyz.veronie.bgg.types.Subtype; | ||||
| import xyz.veronie.bgg.types.UserFlag; | import xyz.veronie.bgg.types.UserFlag; | ||||
| @@ -99,6 +100,10 @@ public class BggApi { | |||||
| StringBuilder urlStr = new StringBuilder(); | StringBuilder urlStr = new StringBuilder(); | ||||
| urlStr.append(BASE_URL + FAMILY + "?id=" + String.valueOf(resultConfig.familyId)); | urlStr.append(BASE_URL + FAMILY + "?id=" + String.valueOf(resultConfig.familyId)); | ||||
| if(resultConfig.familyType != FamilyType.ALL) { | |||||
| urlStr.append("?type=" + resultConfig.familyType); | |||||
| } | |||||
| return getThings(urlStr.toString()); | return getThings(urlStr.toString()); | ||||
| } | } | ||||
| @@ -2,6 +2,7 @@ package xyz.veronie.bgg.result; | |||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import xyz.veronie.bgg.types.FamilyType; | |||||
| import xyz.veronie.bgg.types.FilterFlagState; | import xyz.veronie.bgg.types.FilterFlagState; | ||||
| import xyz.veronie.bgg.types.ResultAction; | import xyz.veronie.bgg.types.ResultAction; | ||||
| import xyz.veronie.bgg.types.SourceFilter; | import xyz.veronie.bgg.types.SourceFilter; | ||||
| @@ -32,6 +33,7 @@ public class ResultConfig { | |||||
| public Integer geeklistId = null; | public Integer geeklistId = null; | ||||
| public Integer familyId = null; | public Integer familyId = null; | ||||
| public FamilyType familyType = FamilyType.ALL; | |||||
| // TODO: add others | // TODO: add others | ||||
| @@ -9,6 +9,7 @@ import org.eclipse.e4.core.di.annotations.Optional; | |||||
| import org.eclipse.e4.ui.di.UIEventTopic; | import org.eclipse.e4.ui.di.UIEventTopic; | ||||
| import xyz.veronie.bgg.types.EventConstants; | import xyz.veronie.bgg.types.EventConstants; | ||||
| import xyz.veronie.bgg.types.FamilyType; | |||||
| import xyz.veronie.bgg.types.ResultAction; | import xyz.veronie.bgg.types.ResultAction; | ||||
| import xyz.veronie.bgg.types.SourceFilter; | import xyz.veronie.bgg.types.SourceFilter; | ||||
| import xyz.veronie.bgg.types.Subtype; | import xyz.veronie.bgg.types.Subtype; | ||||
| @@ -94,6 +95,15 @@ public class ResultConfigManager { | |||||
| System.out.println("TOPIC_FAMILY_CHANGED: geeklistId = " + id); | System.out.println("TOPIC_FAMILY_CHANGED: geeklistId = " + id); | ||||
| } | } | ||||
| @Inject | |||||
| @Optional | |||||
| private void subscribeTopicResultFamilyChanged | |||||
| (@UIEventTopic(EventConstants.TOPIC_FAMILYTYPE_CHANGED) | |||||
| FamilyType ft) { | |||||
| getResultConfig().familyType = ft; | |||||
| System.out.println("TOPIC_FAMILYTYPE_CHANGED: family type = " + ft); | |||||
| } | |||||
| public ResultConfig getResultConfig() { | public ResultConfig getResultConfig() { | ||||
| return resultConfig; | return resultConfig; | ||||
| } | } | ||||
| @@ -2,9 +2,11 @@ package xyz.veronie.bgg.result; | |||||
| import java.beans.PropertyChangeListener; | import java.beans.PropertyChangeListener; | ||||
| import java.beans.PropertyChangeSupport; | import java.beans.PropertyChangeSupport; | ||||
| import com.google.gson.Gson; | |||||
| public class ThingMetaData { | |||||
| public class ThingMetaData implements java.io.Serializable { | |||||
| private static final long serialVersionUID = -5268898737006538509L; | |||||
| private int id; | private int id; | ||||
| private String name; | private String name; | ||||
| private String imgURL; | private String imgURL; | ||||
| @@ -12,7 +14,7 @@ public class ThingMetaData { | |||||
| private String comment; | private String comment; | ||||
| private Integer numPlays; | private Integer numPlays; | ||||
| private static String[] titles = { "Id", "Name" }; //, "Image", "Thumb", "comment", "# plays"}; | |||||
| private static String[] titles = { "Id", "Name" }; | |||||
| private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); | private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); | ||||
| @@ -55,25 +57,9 @@ public class ThingMetaData { | |||||
| case 1: | case 1: | ||||
| returnStr = this.name; | returnStr = this.name; | ||||
| break; | break; | ||||
| // case 2: | |||||
| // returnStr = this.imgURL; | |||||
| // break; | |||||
| // case 3: | |||||
| // returnStr = this.thumbURL; | |||||
| // break; | |||||
| // case 4: | |||||
| // returnStr = this.comment; | |||||
| // break; | |||||
| // case 5: | |||||
| // if (this.numPlays == null) { | |||||
| // returnStr = ""; | |||||
| // } else { | |||||
| // returnStr = String.valueOf(this.numPlays); | |||||
| // } | |||||
| // break; | |||||
| default: | default: | ||||
| throw new ArrayIndexOutOfBoundsException( | throw new ArrayIndexOutOfBoundsException( | ||||
| "idx " + String.valueOf(idx) + " must be in [0," + (titles.length-1) + "]"); | |||||
| "idx " + String.valueOf(idx) + " must be in [0,1]"); | |||||
| } | } | ||||
| return returnStr; | return returnStr; | ||||
| @@ -137,8 +123,12 @@ public class ThingMetaData { | |||||
| @Override | @Override | ||||
| public String toString() { | public String toString() { | ||||
| return String.valueOf(id); | |||||
| //return String.valueOf(id); | |||||
| Gson gson = new Gson(); | |||||
| return gson.toJson(this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,40 +1,67 @@ | |||||
| package xyz.veronie.bgg.result; | package xyz.veronie.bgg.result; | ||||
| import java.io.BufferedWriter; | |||||
| import java.io.FileWriter; | |||||
| import java.io.IOException; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.function.Predicate; | import java.util.function.Predicate; | ||||
| import javax.inject.Inject; | |||||
| import org.eclipse.e4.core.di.annotations.Optional; | |||||
| import org.eclipse.e4.ui.di.UIEventTopic; | |||||
| import com.google.gson.Gson; | |||||
| import xyz.veronie.bgg.types.EventConstants; | |||||
| import xyz.veronie.bgg.types.SourceFilter; | |||||
| public enum ThingProvider { | public enum ThingProvider { | ||||
| INSTANCE; | INSTANCE; | ||||
| /// list of things. Each ID is expected to exist exactly once. | |||||
| private List<ThingMetaData> thingMetas; | private List<ThingMetaData> thingMetas; | ||||
| private ThingProvider() { | private ThingProvider() { | ||||
| thingMetas = new ArrayList<ThingMetaData>(); | thingMetas = new ArrayList<ThingMetaData>(); | ||||
| } | } | ||||
| /// replace current list with new list | |||||
| public void replaceThingMetas(ArrayList<ThingMetaData> metas) { | public void replaceThingMetas(ArrayList<ThingMetaData> metas) { | ||||
| this.thingMetas = metas; | this.thingMetas = metas; | ||||
| } | } | ||||
| /// add things from argument to current list iff their ID does not exist yet | |||||
| public void addThingMetas(ArrayList<ThingMetaData> metas) { | public void addThingMetas(ArrayList<ThingMetaData> metas) { | ||||
| this.thingMetas.addAll(metas); | |||||
| for(ThingMetaData tmd : metas) { | |||||
| Boolean exists = false; | |||||
| for(ThingMetaData thisTmd : this.thingMetas) { | |||||
| if(tmd.getId() == thisTmd.getId()) { | |||||
| exists = true; | |||||
| } | |||||
| } | |||||
| if(!exists) { | |||||
| this.thingMetas.add(tmd); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| public static Predicate<ThingMetaData> thingEqual(ThingMetaData other) | |||||
| // helper functino for subtractThingMetas | |||||
| private static Predicate<ThingMetaData> thingEqual(ThingMetaData other) | |||||
| { | { | ||||
| return p -> p.getId() == other.getId(); | return p -> p.getId() == other.getId(); | ||||
| } | } | ||||
| /// remove the things in the argument from the current list of things (using their ID) | |||||
| public void subtractThingMetas(ArrayList<ThingMetaData> metas) { | public void subtractThingMetas(ArrayList<ThingMetaData> metas) { | ||||
| for(ThingMetaData tmd : metas) { | for(ThingMetaData tmd : metas) { | ||||
| this.thingMetas.removeIf(thingEqual(tmd)); | this.thingMetas.removeIf(thingEqual(tmd)); | ||||
| } | } | ||||
| } | } | ||||
| /// keep only things that exist in both argument list and current list (by ID) | |||||
| public void intersectThingMetas(ArrayList<ThingMetaData> metas) { | public void intersectThingMetas(ArrayList<ThingMetaData> metas) { | ||||
| List<ThingMetaData> cpMetas = new ArrayList<ThingMetaData>(this.thingMetas); | List<ThingMetaData> cpMetas = new ArrayList<ThingMetaData>(this.thingMetas); | ||||
| this.thingMetas.clear(); | this.thingMetas.clear(); | ||||
| @@ -47,8 +74,35 @@ public enum ThingProvider { | |||||
| } | } | ||||
| } | } | ||||
| /// create a tag of the current list | |||||
| public void tagResult() { | |||||
| Gson gson = new Gson(); | |||||
| String resultList = gson.toJson(this.thingMetas); | |||||
| try { | |||||
| BufferedWriter writer = new BufferedWriter( | |||||
| new FileWriter("result_" + Long.toString(System.currentTimeMillis()))); | |||||
| writer.write(resultList); | |||||
| writer.close(); | |||||
| } catch (IOException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| // return the current list of ids | |||||
| public List<ThingMetaData> getThingMetas() { | public List<ThingMetaData> getThingMetas() { | ||||
| return thingMetas; | return thingMetas; | ||||
| } | } | ||||
| @Inject | |||||
| @Optional | |||||
| private void subscribeTopicSourceChanged | |||||
| (@UIEventTopic(EventConstants.TOPIC_TAG_RESULT) | |||||
| String str) { | |||||
| System.out.println("Tag result now."); | |||||
| this.tagResult(); | |||||
| } | |||||
| } | } | ||||
| @@ -18,6 +18,8 @@ public interface EventConstants { | |||||
| String TOPIC_FAMILY_CHANGED = "CONFIG_CHANGED/FAMILY"; | String TOPIC_FAMILY_CHANGED = "CONFIG_CHANGED/FAMILY"; | ||||
| String TOPIC_FAMILYTYPE_CHANGED = "CONFIG_CHANGED/FAMILYTYPE"; | |||||
| String TOPIC_RESULT_CHANGED = "RESULT_CHANGED"; | String TOPIC_RESULT_CHANGED = "RESULT_CHANGED"; | ||||
| String TOPIC_STATUS = "STATUS"; | String TOPIC_STATUS = "STATUS"; | ||||
| @@ -26,4 +28,7 @@ public interface EventConstants { | |||||
| String TOPIC_FAMILY_INFO = "INFO/FAMILY"; | String TOPIC_FAMILY_INFO = "INFO/FAMILY"; | ||||
| String TOPIC_TAG_RESULT = "EVENT_TAG_RESULT"; | |||||
| } | } | ||||
| @@ -0,0 +1,26 @@ | |||||
| package xyz.veronie.bgg.types; | |||||
| public enum FamilyType { | |||||
| ALL("any", ""), | |||||
| BG_FAMILY("board game family", "boardgamefamily"), | |||||
| RPG("RPG", "rpg"), | |||||
| RPG_PERIODIC("RPG periodical", "rpgperiodical"); | |||||
| private String name; //< the display name | |||||
| private String familyApiString; //< the THINGTYPE string for BGG XMLAPI2 | |||||
| private FamilyType(String name, String familyApiString) { | |||||
| this.name = name; | |||||
| this.familyApiString = familyApiString; | |||||
| } | |||||
| @Override | |||||
| public String toString() { | |||||
| return this.name; | |||||
| } | |||||
| /// return the string used in BGG XMLAPI2 to identify the thingtype | |||||
| public String toApiString() { | |||||
| return this.familyApiString; | |||||
| } | |||||
| } | |||||
| @@ -1,5 +1,6 @@ | |||||
| package xyz.veronie.bgg.ui.filters; | package xyz.veronie.bgg.ui.filters; | ||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | import java.util.Arrays; | ||||
| import java.util.List; | import java.util.List; | ||||
| @@ -28,8 +29,10 @@ 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.EventConstants; | ||||
| import xyz.veronie.bgg.types.FilterFlagState; | import xyz.veronie.bgg.types.FilterFlagState; | ||||
| import xyz.veronie.bgg.types.Subtype; | |||||
| import xyz.veronie.bgg.types.UserFlag; | import xyz.veronie.bgg.types.UserFlag; | ||||
| import xyz.veronie.bgg.types.UserFlagEvent; | import xyz.veronie.bgg.types.UserFlagEvent; | ||||
| import xyz.veronie.bgg.ui.helpers.CommonControls; | |||||
| @@ -46,7 +49,7 @@ public class BggUserSourceFilter { | |||||
| public void create(Composite parent, int style) { | public void create(Composite parent, int style) { | ||||
| GridLayout filterLayout = new GridLayout(4, false); | |||||
| GridLayout filterLayout = new GridLayout(5, false); | |||||
| parent.setLayout(filterLayout); | parent.setLayout(filterLayout); | ||||
| Label lblUser = new Label(parent, SWT.LEFT); | Label lblUser = new Label(parent, SWT.LEFT); | ||||
| @@ -87,36 +90,67 @@ 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)); | |||||
| // 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 | // TODO: implement edit users | ||||
| CommonControls.makeEmptySpace(parent, 1); | |||||
| // choose the thing sub-type | |||||
| Label lblSubtype = new Label(parent, SWT.LEFT); | |||||
| lblSubtype.setText("Subtypes: "); | |||||
| lblSubtype.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false)); | |||||
| ComboViewer cbSubtypes = new ComboViewer(parent, 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()); | |||||
| } | |||||
| }); | |||||
| Label infoLabel = new Label(parent, SWT.LEFT); | Label infoLabel = new Label(parent, SWT.LEFT); | ||||
| infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule."); | infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule."); | ||||
| GridData gdInfo = new GridData(SWT.FILL, SWT.FILL, true, false); | GridData gdInfo = new GridData(SWT.FILL, SWT.FILL, true, false); | ||||
| gdInfo.horizontalSpan = 4; | |||||
| gdInfo.horizontalSpan = 5; | |||||
| infoLabel.setLayoutData(gdInfo); | infoLabel.setLayoutData(gdInfo); | ||||
| makeFilter(parent, UserFlag.OWN); | makeFilter(parent, UserFlag.OWN); | ||||
| makeFilter(parent, UserFlag.WTP); | makeFilter(parent, UserFlag.WTP); | ||||
| CommonControls.makeEmptySpace(parent, 1); | |||||
| makeFilter(parent, UserFlag.PREVIOUSLY_OWNED); | makeFilter(parent, UserFlag.PREVIOUSLY_OWNED); | ||||
| makeFilter(parent, UserFlag.WTB); | makeFilter(parent, UserFlag.WTB); | ||||
| CommonControls.makeEmptySpace(parent, 1); | |||||
| makeFilter(parent, UserFlag.TRADE); | makeFilter(parent, UserFlag.TRADE); | ||||
| makeFilter(parent, UserFlag.WISHLIST); | makeFilter(parent, UserFlag.WISHLIST); | ||||
| CommonControls.makeEmptySpace(parent, 1); | |||||
| makeFilter(parent, UserFlag.WANT); | makeFilter(parent, UserFlag.WANT); | ||||
| makeFilter(parent, UserFlag.PREORDERED); | makeFilter(parent, UserFlag.PREORDERED); | ||||
| CommonControls.makeEmptySpace(parent, 1); | |||||
| makeFilter(parent, UserFlag.RATED); | makeFilter(parent, UserFlag.RATED); | ||||
| makeFilter(parent, UserFlag.COMMENT); | makeFilter(parent, UserFlag.COMMENT); | ||||
| CommonControls.makeEmptySpace(parent, 1); | |||||
| makeFilter(parent, UserFlag.PLAYED); | makeFilter(parent, UserFlag.PLAYED); | ||||
| parent.pack(); | parent.pack(); | ||||
| parent.getParent().pack(); | parent.getParent().pack(); | ||||
| parent.layout(); | parent.layout(); | ||||
| @@ -1,5 +1,8 @@ | |||||
| package xyz.veronie.bgg.ui.filters; | package xyz.veronie.bgg.ui.filters; | ||||
| import java.util.ArrayList; | |||||
| 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; | ||||
| @@ -7,6 +10,12 @@ import org.eclipse.e4.core.di.annotations.Optional; | |||||
| import org.eclipse.e4.core.services.events.IEventBroker; | import org.eclipse.e4.core.services.events.IEventBroker; | ||||
| import org.eclipse.e4.ui.di.UIEventTopic; | import org.eclipse.e4.ui.di.UIEventTopic; | ||||
| import org.eclipse.jface.dialogs.MessageDialog; | import org.eclipse.jface.dialogs.MessageDialog; | ||||
| 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.custom.StyledText; | import org.eclipse.swt.custom.StyledText; | ||||
| import org.eclipse.swt.events.FocusEvent; | import org.eclipse.swt.events.FocusEvent; | ||||
| @@ -21,6 +30,7 @@ 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.EventConstants; | ||||
| import xyz.veronie.bgg.types.FamilyType; | |||||
| /// These are the controls to retrieve thing IDs for a given family ID | /// These are the controls to retrieve thing IDs for a given family ID | ||||
| @Creatable | @Creatable | ||||
| @@ -45,7 +55,7 @@ public class FamilySourceFilter { | |||||
| if(fid != null) { | if(fid != null) { | ||||
| cbFamilyId.setText(Integer.toString(fid)); | cbFamilyId.setText(Integer.toString(fid)); | ||||
| } | } | ||||
| cbFamilyId.addSelectionListener(new SelectionAdapter() { | cbFamilyId.addSelectionListener(new SelectionAdapter() { | ||||
| public void widgetDefaultSelected(SelectionEvent e) { | public void widgetDefaultSelected(SelectionEvent e) { | ||||
| try { | try { | ||||
| @@ -78,6 +88,28 @@ public class FamilySourceFilter { | |||||
| } | } | ||||
| }); | }); | ||||
| Label lblFamilyType = new Label(parent, SWT.LEFT); | |||||
| lblFamilyType.setText("Family Type: "); | |||||
| lblFamilyType.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||||
| ComboViewer cbSubtypes = new ComboViewer(parent, SWT.READ_ONLY); | |||||
| cbSubtypes.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||||
| cbSubtypes.setContentProvider(ArrayContentProvider.getInstance()); | |||||
| List<FamilyType> subtypes = new ArrayList<FamilyType>(); | |||||
| for (FamilyType ft : FamilyType.values()) { | |||||
| subtypes.add(ft); | |||||
| } | |||||
| cbSubtypes.setInput(subtypes); | |||||
| cbSubtypes.setSelection(new StructuredSelection(configManager.getResultConfig().familyType)); | |||||
| cbSubtypes.addSelectionChangedListener(new ISelectionChangedListener() { | |||||
| @Override | |||||
| public void selectionChanged(SelectionChangedEvent event) { | |||||
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); | |||||
| eventBroker.send(EventConstants.TOPIC_FAMILYTYPE_CHANGED, selection.getFirstElement()); | |||||
| } | |||||
| }); | |||||
| confLabel = new StyledText(parent, SWT.MULTI | SWT.READ_ONLY); | confLabel = new StyledText(parent, SWT.MULTI | SWT.READ_ONLY); | ||||
| confLabel.setText(""); | confLabel.setText(""); | ||||
| confLabel.setWordWrap(true); | confLabel.setWordWrap(true); | ||||
| @@ -0,0 +1,19 @@ | |||||
| package xyz.veronie.bgg.ui.helpers; | |||||
| import org.eclipse.swt.SWT; | |||||
| import org.eclipse.swt.layout.GridData; | |||||
| import org.eclipse.swt.widgets.Composite; | |||||
| import org.eclipse.swt.widgets.Label; | |||||
| public class CommonControls { | |||||
| public static void makeEmptySpace(Composite parent, int span) { | |||||
| Label empty = new Label(parent, SWT.LEFT); | |||||
| empty.setText(""); | |||||
| GridData gde = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); | |||||
| if(span > 1) { | |||||
| gde.horizontalSpan = span; | |||||
| } | |||||
| empty.setLayoutData(gde); | |||||
| } | |||||
| } | |||||
| @@ -1,9 +1,12 @@ | |||||
| package xyz.veronie.bgg.ui.parts; | package xyz.veronie.bgg.ui.parts; | ||||
| import java.util.List; | |||||
| import javax.annotation.PostConstruct; | import javax.annotation.PostConstruct; | ||||
| import javax.inject.Inject; | import javax.inject.Inject; | ||||
| import org.eclipse.e4.core.di.annotations.Optional; | import org.eclipse.e4.core.di.annotations.Optional; | ||||
| import org.eclipse.e4.core.services.events.IEventBroker; | |||||
| import org.eclipse.e4.ui.di.UIEventTopic; | import org.eclipse.e4.ui.di.UIEventTopic; | ||||
| import org.eclipse.jface.viewers.ArrayContentProvider; | import org.eclipse.jface.viewers.ArrayContentProvider; | ||||
| import org.eclipse.jface.viewers.ColumnLabelProvider; | import org.eclipse.jface.viewers.ColumnLabelProvider; | ||||
| @@ -12,7 +15,9 @@ import org.eclipse.jface.viewers.TableViewerColumn; | |||||
| import org.eclipse.swt.SWT; | 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.layout.GridLayout; | ||||
| import org.eclipse.swt.widgets.Button; | |||||
| import org.eclipse.swt.widgets.Composite; | import org.eclipse.swt.widgets.Composite; | ||||
| import org.eclipse.swt.widgets.Label; | |||||
| import org.eclipse.swt.widgets.Table; | import org.eclipse.swt.widgets.Table; | ||||
| import org.eclipse.swt.widgets.TableColumn; | import org.eclipse.swt.widgets.TableColumn; | ||||
| @@ -22,20 +27,35 @@ import xyz.veronie.bgg.types.EventConstants; | |||||
| public class BggResultPart { | public class BggResultPart { | ||||
| private TableViewer viewer; | private TableViewer viewer; | ||||
| private Label statsLabel; | |||||
| @Inject private IEventBroker eventBroker; | |||||
| @PostConstruct | @PostConstruct | ||||
| public void createControls(Composite parent) { | public void createControls(Composite parent) { | ||||
| Composite main = new Composite(parent, SWT.FILL); | Composite main = new Composite(parent, SWT.FILL); | ||||
| GridLayout layout = new GridLayout(1, false); | |||||
| main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||||
| GridLayout layout = new GridLayout(2, false); | |||||
| main.setLayout(layout); | main.setLayout(layout); | ||||
| createViewer(main); | createViewer(main); | ||||
| statsLabel = new Label(main, SWT.FILL); | |||||
| statsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||||
| statsLabel.setText("0 items"); | |||||
| Button tagResultButton = new Button(main, SWT.PUSH); | |||||
| tagResultButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||||
| tagResultButton.addListener(SWT.SELECTED, event -> { | |||||
| eventBroker.post(EventConstants.TOPIC_TAG_RESULT, ""); | |||||
| }); | |||||
| } | } | ||||
| private void createViewer(Composite parent) { | private void createViewer(Composite parent) { | ||||
| viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | ||||
| | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); | |||||
| | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER ); | |||||
| createColumns(parent, viewer); | createColumns(parent, viewer); | ||||
| final Table table = viewer.getTable(); | final Table table = viewer.getTable(); | ||||
| table.setHeaderVisible(true); | table.setHeaderVisible(true); | ||||
| @@ -52,10 +72,10 @@ public class BggResultPart { | |||||
| // Layout the viewer | // Layout the viewer | ||||
| GridData gridData = new GridData(); | GridData gridData = new GridData(); | ||||
| gridData.verticalAlignment = GridData.FILL; | gridData.verticalAlignment = GridData.FILL; | ||||
| gridData.horizontalSpan = 2; | |||||
| gridData.grabExcessHorizontalSpace = true; | gridData.grabExcessHorizontalSpace = true; | ||||
| gridData.grabExcessVerticalSpace = true; | gridData.grabExcessVerticalSpace = true; | ||||
| gridData.horizontalAlignment = GridData.FILL; | gridData.horizontalAlignment = GridData.FILL; | ||||
| gridData.horizontalSpan = 2; | |||||
| viewer.getControl().setLayoutData(gridData); | viewer.getControl().setLayoutData(gridData); | ||||
| } | } | ||||
| @@ -107,8 +127,14 @@ public class BggResultPart { | |||||
| (@UIEventTopic(EventConstants.TOPIC_RESULT_CHANGED) | (@UIEventTopic(EventConstants.TOPIC_RESULT_CHANGED) | ||||
| String empty) { | String empty) { | ||||
| System.out.println("TOPIC_RESULT_CHANGED"); | System.out.println("TOPIC_RESULT_CHANGED"); | ||||
| viewer.setInput(ThingProvider.INSTANCE.getThingMetas()); | |||||
| List<ThingMetaData> thingMetas = ThingProvider.INSTANCE.getThingMetas(); | |||||
| viewer.setInput(thingMetas); | |||||
| viewer.refresh(); | viewer.refresh(); | ||||
| statsLabel.setText(Integer.toString(thingMetas.size()) + " items"); | |||||
| statsLabel.redraw(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -42,6 +42,7 @@ import xyz.veronie.bgg.ui.filters.GeeklistSourceFilter; | |||||
| import xyz.veronie.bgg.ui.filters.RankSourceFilter; | import xyz.veronie.bgg.ui.filters.RankSourceFilter; | ||||
| import xyz.veronie.bgg.ui.filters.SearchSourceFilter; | import xyz.veronie.bgg.ui.filters.SearchSourceFilter; | ||||
| import xyz.veronie.bgg.ui.filters.YearSourceFilter; | import xyz.veronie.bgg.ui.filters.YearSourceFilter; | ||||
| import xyz.veronie.bgg.ui.helpers.CommonControls; | |||||
| @@ -98,29 +99,9 @@ public class LoadFromBggPart { | |||||
| cbSource.setSelection(new StructuredSelection(configManager.getResultConfig().source)); | cbSource.setSelection(new StructuredSelection(configManager.getResultConfig().source)); | ||||
| // listener is configured further below | // listener is configured further below | ||||
| makeEmptySpace(main, 1); | |||||
| CommonControls.makeEmptySpace(main, 3); | |||||
| // choose the thing sub-type | |||||
| Label lblSubtype = new Label(main, SWT.LEFT); | |||||
| lblSubtype.setText("Subtypes: "); | |||||
| lblSubtype.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false)); | |||||
| ComboViewer cbSubtypes = new ComboViewer(main, 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()); | |||||
| } | |||||
| }); | |||||
| @@ -147,7 +128,7 @@ public class LoadFromBggPart { | |||||
| // next row: | // next row: | ||||
| makeEmptySpace(main, 5); | |||||
| CommonControls.makeEmptySpace(main, 5); | |||||
| // next row | // next row | ||||
| @@ -242,7 +223,7 @@ public class LoadFromBggPart { | |||||
| ComboViewer cbAct = new ComboViewer(main, SWT.READ_ONLY); | ComboViewer cbAct = new ComboViewer(main, SWT.READ_ONLY); | ||||
| GridData gdact = new GridData(SWT.FILL, SWT.FILL, false, false); | GridData gdact = new GridData(SWT.FILL, SWT.FILL, false, false); | ||||
| cbSubtypes.getCombo().setLayoutData(gdact); | |||||
| cbAct.getCombo().setLayoutData(gdact); | |||||
| cbAct.setContentProvider(ArrayContentProvider.getInstance()); | cbAct.setContentProvider(ArrayContentProvider.getInstance()); | ||||
| List<ResultAction> actions = new ArrayList<ResultAction>(); | List<ResultAction> actions = new ArrayList<ResultAction>(); | ||||
| for(ResultAction act : ResultAction.values()) { | for(ResultAction act : ResultAction.values()) { | ||||
| @@ -331,14 +312,5 @@ public class LoadFromBggPart { | |||||
| } | } | ||||
| public void makeEmptySpace(Composite parent, int span) { | |||||
| Label empty = new Label(parent, SWT.LEFT); | |||||
| empty.setText(""); | |||||
| GridData gde = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); | |||||
| if(span > 1) { | |||||
| gde.horizontalSpan = span; | |||||
| } | |||||
| empty.setLayoutData(gde); | |||||
| } | |||||
| } | } | ||||
| @@ -1,5 +1,22 @@ | |||||
| package xyz.veronie.bgg.ui.parts; | package xyz.veronie.bgg.ui.parts; | ||||
| import javax.annotation.PostConstruct; | |||||
| import org.eclipse.swt.SWT; | |||||
| import org.eclipse.swt.layout.GridData; | |||||
| import org.eclipse.swt.layout.GridLayout; | |||||
| import org.eclipse.swt.widgets.Composite; | |||||
| public class LoadThingDetailsPart { | public class LoadThingDetailsPart { | ||||
| @PostConstruct | |||||
| public void createControls(Composite parent) { | |||||
| Composite main = new Composite(parent, SWT.FILL); | |||||
| main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); | |||||
| GridLayout layout = new GridLayout(5, false); | |||||
| main.setLayout(layout); | |||||
| } | |||||
| } | } | ||||
| @@ -7,16 +7,11 @@ import javax.inject.Inject; | |||||
| import org.eclipse.e4.core.di.annotations.Optional; | import org.eclipse.e4.core.di.annotations.Optional; | ||||
| import org.eclipse.e4.ui.di.UIEventTopic; | import org.eclipse.e4.ui.di.UIEventTopic; | ||||
| import org.eclipse.jface.resource.ColorDescriptor; | |||||
| import org.eclipse.jface.resource.DeviceResourceException; | |||||
| import org.eclipse.jface.resource.JFaceResources; | import org.eclipse.jface.resource.JFaceResources; | ||||
| import org.eclipse.jface.resource.LocalResourceManager; | import org.eclipse.jface.resource.LocalResourceManager; | ||||
| import org.eclipse.jface.resource.ResourceManager; | import org.eclipse.jface.resource.ResourceManager; | ||||
| import org.eclipse.swt.SWT; | import org.eclipse.swt.SWT; | ||||
| import org.eclipse.swt.graphics.Color; | |||||
| import org.eclipse.swt.graphics.Device; | |||||
| import org.eclipse.swt.graphics.RGB; | import org.eclipse.swt.graphics.RGB; | ||||
| import org.eclipse.swt.layout.FillLayout; | |||||
| 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.Composite; | import org.eclipse.swt.widgets.Composite; | ||||
| @@ -38,6 +33,7 @@ public class StatusBar { | |||||
| statusLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | statusLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | ||||
| // create the manager and bind to a widget | // create the manager and bind to a widget | ||||
| // TODO: do I have to free the color? how? | |||||
| ResourceManager resManager = | ResourceManager resManager = | ||||
| new LocalResourceManager(JFaceResources.getResources(), statusLabel); | new LocalResourceManager(JFaceResources.getResources(), statusLabel); | ||||
| statusLabel.setBackground(resManager.createColor(new RGB(255,255,0))); | statusLabel.setBackground(resManager.createColor(new RGB(255,255,0))); | ||||
| @@ -0,0 +1,4 @@ | |||||
| #Created by Apache Maven 3.6.3 | |||||
| version=0.0.1-SNAPSHOT | |||||
| groupId=xyz.veronie.bgg | |||||
| artifactId=xyz.veronie.bgg.ui | |||||