diff --git a/src/com/sharad/quizbowl/ui/client/HomeWidget.java b/src/com/sharad/quizbowl/ui/client/HomeWidget.java index 51e7a31..792ae4c 100755 --- a/src/com/sharad/quizbowl/ui/client/HomeWidget.java +++ b/src/com/sharad/quizbowl/ui/client/HomeWidget.java @@ -18,11 +18,13 @@ import com.google.gwt.jsonp.client.JsonpRequestBuilder; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.cellview.client.CellBrowser; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; @@ -38,6 +40,7 @@ import com.sharad.quizbowl.ui.client.util.Resources; import com.sharad.quizbowl.ui.client.util.guava.Joiner; import com.sharad.quizbowl.ui.client.widget.AnswerInfoPanel; +import com.sharad.quizbowl.ui.client.widget.Browser; import com.sharad.quizbowl.ui.client.widget.Chatroom; import com.sharad.quizbowl.ui.client.widget.FilterBar; import com.sharad.quizbowl.ui.client.widget.FilterBox; @@ -66,7 +69,6 @@ import com.sharad.quizbowl.ui.client.widget.event.ReadEventHandler; import com.sharad.quizbowl.ui.client.widget.event.SortEvent; import com.sharad.quizbowl.ui.client.widget.event.SortEventHandler; -import com.smartgwt.client.widgets.Canvas; public class HomeWidget extends Composite { @@ -115,6 +117,8 @@ interface HomeWidgetUiBinder extends UiBinder { @UiField static Button startButton; static MultiReader multiReader; + @UiField(provided = true) + CellBrowser browser; public HomeWidget(JsArrayInteger years, JsArrayString tournaments, JsArrayString difficulties, JsArrayString categories) { @@ -153,7 +157,9 @@ public void onTossupsReceived(FilterEvent event) { horizontalPanel = new FlowPanel(); centerPanel = new LayoutPanel(); searchPanel = new DockLayoutPanel(Unit.PX); - + // TODO + browser = new CellBrowser(new Browser.DatabaseBrowseTreeModel( + difficulties), null); main.add(uiBinder.createAndBindUi(this)); setSearchConfiguration(Search.DEFAULT_CONFIGURATION); reader.addReadEventHandler(new ReadEventHandler() { @@ -267,6 +273,7 @@ public void onClick(ClickEvent event) { } }); + signoutBox.yesButton.addClickHandler(new ClickHandler() { @Override diff --git a/src/com/sharad/quizbowl/ui/client/HomeWidget.ui.xml b/src/com/sharad/quizbowl/ui/client/HomeWidget.ui.xml index 8c948d1..3f3ade1 100755 --- a/src/com/sharad/quizbowl/ui/client/HomeWidget.ui.xml +++ b/src/com/sharad/quizbowl/ui/client/HomeWidget.ui.xml @@ -1,7 +1,7 @@ + xmlns:cl='urn:import:com.sharad.quizbowl.ui.client' xmlns:c='urn:import:com.google.gwt.user.cellview.client'> .databasePanel { width: 100%; @@ -65,6 +65,12 @@ + + + Browser + + + diff --git a/src/com/sharad/quizbowl/ui/client/widget/Browser.java b/src/com/sharad/quizbowl/ui/client/widget/Browser.java new file mode 100644 index 0000000..29e9991 --- /dev/null +++ b/src/com/sharad/quizbowl/ui/client/widget/Browser.java @@ -0,0 +1,370 @@ +package com.sharad.quizbowl.ui.client.widget; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import com.google.gwt.cell.client.AbstractCell; +import com.google.gwt.cell.client.Cell; +import com.google.gwt.cell.client.CheckboxCell; +import com.google.gwt.cell.client.CompositeCell; +import com.google.gwt.cell.client.FieldUpdater; +import com.google.gwt.cell.client.HasCell; +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JsArrayString; +import com.google.gwt.dom.client.Element; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.shared.GwtEvent; +import com.google.gwt.event.shared.HandlerManager; +import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.jsonp.client.JsonpRequestBuilder; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.cellview.client.CellBrowser; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.view.client.AsyncDataProvider; +import com.google.gwt.view.client.DefaultSelectionEventManager; +import com.google.gwt.view.client.HasData; +import com.google.gwt.view.client.ListDataProvider; +import com.google.gwt.view.client.MultiSelectionModel; +import com.google.gwt.view.client.ProvidesKey; +import com.google.gwt.view.client.Range; +import com.google.gwt.view.client.TreeViewModel; +import com.sharad.quizbowl.ui.client.QuizbowlUI; +import com.sharad.quizbowl.ui.client.widget.event.FilterEvent; +import com.sharad.quizbowl.ui.client.widget.event.FilterEventHandler; + +public class Browser extends Composite { + @UiField(provided = true) + CellBrowser browser; + @UiField + Button search; + private HandlerManager handlerManager; + private static BrowserUiBinder uiBinder = GWT.create(BrowserUiBinder.class); + + interface BrowserUiBinder extends UiBinder { + } + + DatabaseBrowseTreeModel model; + + public Browser(JsArrayString difficulties) { + model = new DatabaseBrowseTreeModel(difficulties); + browser = new CellBrowser(model, null); + browser.setHeight("250px"); + browser.setWidth("650px"); + initWidget(uiBinder.createAndBindUi(this)); + handlerManager = new HandlerManager(this); + search.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + if (model.selectionModel.getSelectedSet().size() != 0) { + HashMap> params = new HashMap>(); + List temp = new ArrayList(); + for (Round r : model.selectionModel.getSelectedSet()) { + if (params.containsKey("tournament")) { + if (!params.get("tournament").contains( + r.getTournament())) + params.get("tournament").add(r.getTournament()); + else + params.put("tournament", Arrays + .asList(new String[] { r + .getTournament() })); + } else + params.put("tournament", Arrays + .asList(new String[] { r.getTournament() })); + temp.add(r.getName()); + } + params.put("round", temp); + FilterEvent e = new FilterEvent(params); + fireEvent(e); + } + } + + }); + } + + public HandlerRegistration addFilterEventHandler(FilterEventHandler handler) { + return handlerManager.addHandler(FilterEvent.TYPE, handler); + } + + public void fireEvent(GwtEvent event) { + handlerManager.fireEvent(event); + } + + static class Round implements Comparable { + String tournament, name; + + public Round(String tournament, String name) { + this.tournament = tournament; + this.name = name; + } + + public String getTournament() { + return tournament; + } + + public String getName() { + return name; + } + + public static final ProvidesKey KEY_PROVIDER = new ProvidesKey() { + public Object getKey(Round round) { + return round == null ? null : round.getTournament() + ":" + + round.getName(); + } + }; + + @Override + public int compareTo(Round round) { + return name.compareTo(round.getName()); + } + + @Override + public boolean equals(Object o) { + if (o instanceof Round) { + return name.equals(((Round) o).getName()) + && tournament.equals(((Round) o).getTournament()); + } + return false; + } + } + + static class Tournament { + String name; + + public Tournament(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + static class Difficulty { + String name; + + public Difficulty(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + public static class DatabaseBrowseTreeModel implements TreeViewModel { + private final DefaultSelectionEventManager selectionManager = DefaultSelectionEventManager + .createCheckboxManager(); + private final MultiSelectionModel selectionModel; + private final List difficulties; + private Cell roundCell; + + public DatabaseBrowseTreeModel(JsArrayString difficulties) { + selectionModel = new MultiSelectionModel(Round.KEY_PROVIDER); + this.difficulties = new ArrayList(); + for (int i = 0; i < difficulties.length(); i++) { + this.difficulties.add(new Difficulty(difficulties.get(i))); + } + List> hasCells = new ArrayList>(); + hasCells.add(new HasCell() { + + private CheckboxCell cell = new CheckboxCell(true, false); + + public Cell getCell() { + return cell; + } + + public FieldUpdater getFieldUpdater() { + return null; + } + + public Boolean getValue(Round object) { + return selectionModel.isSelected(object); + } + }); + hasCells.add(new HasCell() { + + private Cell cell = new AbstractCell() { + + @Override + public void render( + com.google.gwt.cell.client.Cell.Context context, + Round value, SafeHtmlBuilder sb) { + if (value != null) { + sb.appendEscaped(value.getName()); + } + + } + + }; + + public Cell getCell() { + return cell; + } + + public Round getValue(Round object) { + return object; + } + + @Override + public FieldUpdater getFieldUpdater() { + return null; + } + }); + roundCell = new CompositeCell(hasCells) { + @Override + public void render(Context context, Round value, + SafeHtmlBuilder sb) { + sb.appendHtmlConstant(""); + super.render(context, value, sb); + sb.appendHtmlConstant("
"); + } + + @Override + protected Element getContainerElement(Element parent) { + // Return the first TR element in the table. + return parent.getFirstChildElement().getFirstChildElement() + .getFirstChildElement(); + } + + @Override + protected void render(Context context, Round value, + SafeHtmlBuilder sb, HasCell hasCell) { + Cell cell = hasCell.getCell(); + sb.appendHtmlConstant(""); + cell.render(context, hasCell.getValue(value), sb); + sb.appendHtmlConstant(""); + } + }; + } + + @Override + public NodeInfo getNodeInfo(T value) { + if (value == null) { + ListDataProvider dataProvider = new ListDataProvider( + difficulties); + Cell cell = new AbstractCell() { + + @Override + public void render( + com.google.gwt.cell.client.Cell.Context context, + Difficulty value, SafeHtmlBuilder sb) { + if (value != null) { + sb.appendEscaped(value.getName()); + } + + } + + }; + return new DefaultNodeInfo(dataProvider, cell); + } else if (value instanceof Difficulty) { + final Difficulty t = (Difficulty) value; + AsyncDataProvider dataProvider = new AsyncDataProvider() { + + @Override + protected void onRangeChanged(HasData display) { + final Range range = display.getVisibleRange(); + + JsonpRequestBuilder r = new JsonpRequestBuilder(); + r.requestObject( + QuizbowlUI.SERVER_URL + + "/browse?term=difficulty&value=" + + t.getName() + "&alt=json-in-script", + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + // TODO Auto-generated method stub + + } + + @Override + public void onSuccess(JsArrayString result) { + int start = range.getStart(); + List data = new ArrayList(); + for (int i = start; i < result.length(); i++) { + data.add(new Tournament(result + .get(i))); + } + updateRowData(start, data); + } + + }); + + } + + }; + Cell cell = new AbstractCell() { + + @Override + public void render( + com.google.gwt.cell.client.Cell.Context context, + Tournament value, SafeHtmlBuilder sb) { + if (value != null) { + sb.appendEscaped(value.getName()); + } + + } + + }; + return new DefaultNodeInfo(dataProvider, cell); + } else if (value instanceof Tournament) { + final Tournament t = (Tournament) value; + AsyncDataProvider dataProvider = new AsyncDataProvider() { + + @Override + protected void onRangeChanged(HasData display) { + final Range range = display.getVisibleRange(); + + JsonpRequestBuilder r = new JsonpRequestBuilder(); + r.requestObject( + QuizbowlUI.SERVER_URL + + "/browse?term=tournament&value=" + + t.getName() + "&alt=json-in-script", + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + + } + + @Override + public void onSuccess(JsArrayString result) { + selectionModel.clear(); + int start = range.getStart(); + List data = new ArrayList(); + for (int i = start; i < result.length(); i++) { + data.add(new Round(t.getName(), + result.get(i))); + } + updateRowData(start, data); + } + + }); + + } + + }; + + return new DefaultNodeInfo(dataProvider, roundCell, + selectionModel, selectionManager, null); + } + return null; + } + + @Override + public boolean isLeaf(Object value) { + return value instanceof Round; + } + + } + +} diff --git a/src/com/sharad/quizbowl/ui/client/widget/Browser.ui.xml b/src/com/sharad/quizbowl/ui/client/widget/Browser.ui.xml new file mode 100644 index 0000000..585e9ef --- /dev/null +++ b/src/com/sharad/quizbowl/ui/client/widget/Browser.ui.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + Search + + + \ No newline at end of file diff --git a/src/com/sharad/quizbowl/ui/client/widget/Search.java b/src/com/sharad/quizbowl/ui/client/widget/Search.java index 5300ea7..04c9056 100755 --- a/src/com/sharad/quizbowl/ui/client/widget/Search.java +++ b/src/com/sharad/quizbowl/ui/client/widget/Search.java @@ -33,7 +33,6 @@ import com.sharad.quizbowl.ui.client.util.guava.Joiner; import com.sharad.quizbowl.ui.client.widget.event.FilterEvent; import com.sharad.quizbowl.ui.client.widget.event.FilterEventHandler; -import com.smartgwt.client.widgets.Dialog; import com.smartgwt.client.widgets.Window; public class Search extends Composite { @@ -46,6 +45,7 @@ public class Search extends Composite { private static SimpleSearchUiBinder uiVertical = GWT .create(SimpleSearchUiBinder.class); private FilterBox advancedBox; + private Browser browseBox; @UiTemplate("SimpleSearch.ui.xml") interface SimpleSearchUiBinder extends UiBinder { @@ -93,7 +93,7 @@ public Search(JsArrayInteger years, JsArrayString tournaments, public HorizontalPanel main; @UiField(provided = true) Anchor advanced, browse; - Window advancedDialog; + Window advancedDialog, browseDialog; public TextBox getSearchBox() { return searchBox; @@ -114,7 +114,6 @@ public Search(String buttonText, JsArrayInteger years, main.setHeight("100%"); handlerManager = new HandlerManager(this); button.setText(buttonText); - loading = new Image(Resources.INSTANCE.white()); loading.setHeight("16px"); loading.setWidth("16px"); @@ -142,6 +141,7 @@ public void onTossupsReceived(FilterEvent event) { } }); + browseBox = new Browser(difficulties); advancedDialog = new Window(); advancedDialog.setTitle("Advanced Search"); advancedDialog.addItem(advancedBox); @@ -159,6 +159,42 @@ public void onClick(ClickEvent event) { } }); + browseDialog = new Window(); + browseDialog.setTitle("Browse"); + browseDialog.addItem(browseBox); + browseDialog.setAutoSize(true); + browseDialog.setCanDragReposition(true); + browseDialog.setCanDragResize(true); + + browse.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + browseDialog.show(); + browseDialog.centerInPage(); + } + + }); + browseBox.addFilterEventHandler(new FilterEventHandler() { + + @Override + public void onTossupsReceived(FilterEvent event) { + browseDialog.hide(); + String query = "", delimiter = ""; + for (Map.Entry> e : event.getParameters() + .entrySet()) { + if (e.getValue().size() > 0) { + query += delimiter + e.getKey() + ":\"" + + Joiner.on("|").join(e.getValue()) + "\""; + delimiter = " "; + } + } + searchBox.setText(query); + doSearch(); + } + + }); + } @UiHandler("button") diff --git a/src/com/sharad/quizbowl/ui/client/widget/SimpleSearch.ui.xml b/src/com/sharad/quizbowl/ui/client/widget/SimpleSearch.ui.xml index 3f35e72..0b590ec 100755 --- a/src/com/sharad/quizbowl/ui/client/widget/SimpleSearch.ui.xml +++ b/src/com/sharad/quizbowl/ui/client/widget/SimpleSearch.ui.xml @@ -1,38 +1,41 @@ + xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:my='urn:import:com.sharad.quizbowl.ui.client.widget'> .important { font-size: 20px; margin-right: 5px; } - - - - - - - - - - - - - - - - - - - Advanced Search - Browse + + + + + + + + + + + + + + + + + + + + + Advanced Search + Browse - + + + - - - - + +
+
\ No newline at end of file diff --git a/src/com/sharad/quizbowl/ui/client/widget/SimpleSearchHorizontal.ui.xml b/src/com/sharad/quizbowl/ui/client/widget/SimpleSearchHorizontal.ui.xml index c124519..546598c 100755 --- a/src/com/sharad/quizbowl/ui/client/widget/SimpleSearchHorizontal.ui.xml +++ b/src/com/sharad/quizbowl/ui/client/widget/SimpleSearchHorizontal.ui.xml @@ -7,7 +7,6 @@ margin-right: 5px; } - @@ -36,5 +35,4 @@ - \ No newline at end of file diff --git a/war/index.html b/war/index.html index ca1701c..b6f5fda 100644 --- a/war/index.html +++ b/war/index.html @@ -1,4 +1,4 @@ - +