package kornell.gui.client.presentation.admin.course.courses.generic; import static com.google.gwt.dom.client.BrowserEvents.CLICK; import java.util.LinkedList; import java.util.List; import com.github.gwtbootstrap.client.ui.Button; import com.github.gwtbootstrap.client.ui.CellTable; import com.github.gwtbootstrap.client.ui.ListBox; import com.github.gwtbootstrap.client.ui.Tab; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.constants.IconType; import com.github.gwtbootstrap.client.ui.resources.ButtonSize; import com.google.gwt.cell.client.ActionCell; import com.google.gwt.cell.client.ActionCell.Delegate; import com.google.gwt.cell.client.Cell; 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.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.EventTarget; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.place.shared.PlaceChangeEvent; import com.google.gwt.place.shared.PlaceController; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy; import com.google.gwt.user.cellview.client.TextColumn; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import com.google.web.bindery.event.shared.EventBus; import kornell.api.client.KornellSession; import kornell.core.entity.Course; import kornell.core.entity.EnrollmentState; import kornell.core.util.StringUtils; import kornell.gui.client.ViewFactory; import kornell.gui.client.presentation.admin.course.course.AdminCoursePlace; import kornell.gui.client.presentation.admin.course.course.AdminCourseView; import kornell.gui.client.presentation.admin.course.courses.AdminCoursesView; import kornell.gui.client.util.AsciiUtils; import kornell.gui.client.util.view.KornellPagination; public class GenericAdminCoursesView extends Composite implements AdminCoursesView { interface MyUiBinder extends UiBinder<Widget, GenericAdminCoursesView> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); private PlaceController placeCtrl; final CellTable<Course> table; private AdminCoursesView.Presenter presenter; private KornellPagination pagination; private TextBox txtSearch; private Button btnSearch; private Timer updateTimer; @UiField FlowPanel adminHomePanel; @UiField FlowPanel coursesPanel; @UiField FlowPanel coursesWrapper; @UiField FlowPanel createCoursePanel; @UiField Button btnAddCourse; Tab adminsTab; FlowPanel adminsPanel; private AdminCourseView view; public GenericAdminCoursesView(final KornellSession session, final EventBus bus, final PlaceController placeCtrl, final ViewFactory viewFactory) { this.placeCtrl = placeCtrl; initWidget(uiBinder.createAndBindUi(this)); table = new CellTable<Course>(); btnAddCourse.setText("Criar Novo Curso"); bus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() { @Override public void onPlaceChange(PlaceChangeEvent event) { if(createCoursePanel.getWidgetCount() > 0){ createCoursePanel.clear(); } coursesPanel.setVisible(true); coursesWrapper.setVisible(true); view = null; } }); btnAddCourse.setVisible(session.isInstitutionAdmin()); btnAddCourse.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (session.isInstitutionAdmin()) { coursesPanel.setVisible(false); coursesWrapper.setVisible(false); view = viewFactory.getAdminCourseView(); view.setPresenter(viewFactory.getAdminCoursePresenter()); view.init(); createCoursePanel.add(view); } } }); updateTimer = new Timer() { @Override public void run() { filter(); } }; } private void scheduleFilter() { updateTimer.cancel(); updateTimer.schedule(500); } private void filter() { String newSearchTerm = AsciiUtils.convertNonAscii(txtSearch.getText().trim()).toLowerCase(); if(!presenter.getSearchTerm().equals(newSearchTerm)){ presenter.setPageNumber("1"); presenter.setSearchTerm(newSearchTerm); presenter.updateData(); } } private void initSearch() { if (txtSearch == null) { txtSearch = new TextBox(); txtSearch.addStyleName("txtSearch"); txtSearch.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { scheduleFilter(); } }); txtSearch.addKeyUpHandler(new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { scheduleFilter(); } }); txtSearch.addValueChangeHandler(new ValueChangeHandler<String>() { @Override public void onValueChange(ValueChangeEvent<String> event) { scheduleFilter(); } }); btnSearch = new Button("Pesquisar"); btnSearch.setSize(ButtonSize.MINI); btnSearch.setIcon(IconType.SEARCH); btnSearch.addStyleName("btnNotSelected btnSearch"); btnSearch.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { scheduleFilter(); } }); } txtSearch.setValue(presenter.getSearchTerm()); txtSearch.setTitle("insira o nome da turma, da versão ou do curso"); } private void initTable() { table.addStyleName("adminCellTable"); table.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); for (int i = 0; table.getColumnCount() > 0;) { table.removeColumn(i); } table.addColumn(new TextColumn<Course>() { @Override public String getValue(Course course) { return course.getCode(); } }, "Código"); table.addColumn(new TextColumn<Course>() { @Override public String getValue(Course course) { return course.getTitle(); } }, "Nome"); table.addColumn(new TextColumn<Course>() { @Override public String getValue(Course course) { return course.getDescription(); } }, "Descrição"); List<HasCell<Course, ?>> cells = new LinkedList<HasCell<Course, ?>>(); cells.add(new EnrollmentActionsHasCell("Gerenciar", getManageCourseDelegate(EnrollmentState.enrolled))); CompositeCell<Course> cell = new CompositeCell<Course>(cells); table.addColumn(new Column<Course, Course>(cell) { @Override public Course getValue(Course course) { return course; } }, "Ações"); // Add a selection model to handle user selection. final SingleSelectionModel<Course> selectionModel = new SingleSelectionModel<Course>(); table.setSelectionModel(selectionModel); selectionModel .addSelectionChangeHandler(new SelectionChangeEvent.Handler() { public void onSelectionChange(SelectionChangeEvent event) { Course selected = selectionModel.getSelectedObject(); if (selected != null) { placeCtrl.goTo(new AdminCoursePlace(selected.getUUID())); } } }); } @Override public void setPresenter(Presenter presenter) { this.presenter = presenter; pagination = new KornellPagination(table, presenter); } private Delegate<Course> getManageCourseDelegate(final EnrollmentState state) { return new Delegate<Course>() { @Override public void execute(Course course) { placeCtrl.goTo(new AdminCoursePlace(course.getUUID())); } }; } @SuppressWarnings("hiding") private class EnrollmentActionsActionCell<Course> extends ActionCell<Course> { public EnrollmentActionsActionCell(String message, Delegate<Course> delegate) { super(message, delegate); } @Override public void onBrowserEvent(Context context, Element parent, Course value, NativeEvent event, ValueUpdater<Course> valueUpdater) { event.stopPropagation(); event.preventDefault(); super.onBrowserEvent(context, parent, value, event, valueUpdater); if (CLICK.equals(event.getType())) { EventTarget eventTarget = event.getEventTarget(); if (!Element.is(eventTarget)) { return; } if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) { // Ignore clicks that occur outside of the main element. onEnterKeyDown(context, parent, value, event, valueUpdater); } } } } private class EnrollmentActionsHasCell implements HasCell<Course, Course> { private EnrollmentActionsActionCell<Course> cell; public EnrollmentActionsHasCell(String text, Delegate<Course> delegate) { final String actionName = text; cell = new EnrollmentActionsActionCell<Course>(text, delegate) { @Override public void render(com.google.gwt.cell.client.Cell.Context context, Course object, SafeHtmlBuilder sb) { SafeHtml html = SafeHtmlUtils.fromTrustedString(buildButtonHTML(actionName)); sb.append(html); } private String buildButtonHTML(String actionName){ Button btn = new Button(); btn.setSize(ButtonSize.SMALL); btn.setTitle(actionName); if("Gerenciar".equals(actionName)){ btn.setIcon(IconType.COG); btn.addStyleName("btnAction"); } btn.addStyleName("btnIconSolo"); return btn.toString(); } }; } @Override public Cell<Course> getCell() { return cell; } @Override public FieldUpdater<Course, Course> getFieldUpdater() { return null; } @Override public Course getValue(Course object) { return object; } } @Override public void setCourses(List<Course> courses, Integer count, Integer searchCount) { coursesWrapper.clear(); VerticalPanel panel = new VerticalPanel(); panel.setWidth("400"); panel.add(table); final ListBox pageSizeListBox = new ListBox(); // pageSizeListBox.addItem("1"); // pageSizeListBox.addItem("10"); pageSizeListBox.addStyleName("pageSizeListBox"); pageSizeListBox.addItem("20"); pageSizeListBox.addItem("50"); pageSizeListBox.addItem("100"); pageSizeListBox.setSelectedValue(presenter.getPageSize()); pageSizeListBox.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { if (pageSizeListBox.getValue().matches("[0-9]*")){ presenter.setPageNumber("1"); presenter.setPageSize(pageSizeListBox.getValue()); presenter.updateData(); } } }); initSearch(); FlowPanel tableTools = new FlowPanel(); tableTools.addStyleName("marginTop25"); tableTools.add(txtSearch); tableTools.add(btnSearch); tableTools.add(pageSizeListBox); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { txtSearch.setFocus(true); } }); coursesWrapper.add(tableTools); coursesWrapper.add(panel); coursesWrapper.add(pagination); pagination.setRowData(courses, StringUtils.isSome(presenter.getSearchTerm()) ? searchCount : count); initTable(); adminHomePanel.setVisible(true); } }