Example usage for com.google.gwt.user.client.ui MenuBar focus

List of usage examples for com.google.gwt.user.client.ui MenuBar focus

Introduction

In this page you can find the example usage for com.google.gwt.user.client.ui MenuBar focus.

Prototype

public void focus() 

Source Link

Document

Give this MenuBar focus.

Usage

From source file:org.unitime.timetable.gwt.client.curricula.CourseCurriculaTable.java

License:Apache License

public CourseCurriculaTable(boolean editable, final boolean showHeader) {
    iEditable = editable;//  www .  j  av  a 2 s  . c om

    iCurriculaPanel = new SimpleForm();
    iCurriculaPanel.removeStyleName("unitime-NotPrintableBottomLine");

    iMenu = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            PopupPanel popup = new PopupPanel(true);
            MenuBar menu = createMenu(popup, showHeader);
            popup.add(menu);
            popup.showRelativeTo((Widget) event.getSource());
            menu.focus();
        }
    };

    iHeader = new UniTimeHeaderPanel(showHeader ? MESSAGES.headerCurricula() : "");
    iHeader.setCollapsible(showHeader ? CurriculumCookie.getInstance().getCurriculaCoursesDetails() : null);
    iHeader.setTitleStyleName("unitime3-HeaderTitle");
    if (showHeader) {
        iHeader.addButton("operations", MESSAGES.buttonCurriculaOperations(), (Integer) null, iMenu);
        iHeader.setEnabled("operations", false);
        iHeader.getElement().getStyle().setMarginTop(10, Unit.PX);
    }
    iHeader.addCollapsibleHandler(new ValueChangeHandler<Boolean>() {
        @Override
        public void onValueChange(ValueChangeEvent<Boolean> event) {
            CurriculumCookie.getInstance().setCurriculaCoursesDetails(event.getValue());
            if (iCurricula.getRowCount() == 0) {
                refresh();
            } else if (iCurricula.getRowCount() > 2) {
                for (int row = 1; row < iCurricula.getRowCount() - 1; row++) {
                    int rowType = iRowTypes.get(row);
                    if (CurriculumCookie.getInstance().getCurriculaCoursesDetails()
                            && (rowType == sRowTypeCurriculum || rowType == sRowTypeOtherArea))
                        continue;
                    iCurricula.getRowFormatter().setVisible(row,
                            CurriculumCookie.getInstance().getCurriculaCoursesDetails());
                }
                for (int col = 0; col < iClassifications.size() + 2; col++) {
                    iCurricula.getCellFormatter().setStyleName(iCurricula.getRowCount() - 1, col,
                            CurriculumCookie.getInstance().getCurriculaCoursesDetails() ? "unitime-TotalRow"
                                    : null);
                }
            }
        }
    });

    if (showHeader)
        iCurriculaPanel.addHeaderRow(iHeader);

    VerticalPanel tableAndHint = new VerticalPanel();

    iCurricula = new MyFlexTable();
    tableAndHint.add(iCurricula);

    iHint = new Label(MESSAGES
            .hintEnrollmentOfType(CurriculumCookie.getInstance().getCourseCurriculaTableType().getName()));
    iHint.setStyleName("unitime-Hint");
    iHint.setVisible(false);
    tableAndHint.add(iHint);
    tableAndHint.setCellHorizontalAlignment(iHint, HasHorizontalAlignment.ALIGN_RIGHT);
    iCurriculaPanel.addRow(tableAndHint);
    iHint.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            for (int i = 1; i < Type.values().length; i++) {
                Type type = Type
                        .values()[(CurriculumCookie.getInstance().getCourseCurriculaTableType().ordinal() + i)
                                % Type.values().length];
                if (isAvailable(type)) {
                    CurriculumCookie.getInstance().setCourseCurriculaTableType(type);
                    break;
                }
            }
            iHint.setText(MESSAGES.hintEnrollmentOfType(
                    CurriculumCookie.getInstance().getCourseCurriculaTableType().getName()));
            if (iCurricula.getRowCount() > 1) {
                for (int row = 1; row < iCurricula.getRowCount(); row++) {
                    for (int col = 0; col <= iClassifications.size(); col++) {
                        ((MyLabel) iCurricula.getWidget(row, getHeaderCols(row) + col)).refresh();
                    }
                }
                //((MyLabel)iCurricula.getWidget(iCurricula.getRowCount() - 1, 1)).refresh();
                ((Label) iCurricula.getWidget(iCurricula.getRowCount() - 1, 0))
                        .setText(MESSAGES.totalEnrollmentOfType(
                                CurriculumCookie.getInstance().getCourseCurriculaTableType().getName()));
            }
        }
    });

    if (!showHeader)
        iCurriculaPanel.addRow(iHeader);

    initWidget(iCurriculaPanel);
}

From source file:org.unitime.timetable.gwt.client.events.AddMeetingsDialog.java

License:Apache License

public AddMeetingsDialog(AcademicSessionProvider session, EventPropertiesProvider propeties,
        AsyncCallback<List<MeetingInterface>> callback) {
    super(true, true);
    setAnimationEnabled(false);/*  w  ww.ja  v  a 2  s .com*/

    iCallback = callback;
    iSession = session;
    iProperties = propeties;

    setText(MESSAGES.dialogAddMeetings());
    setEscapeToHide(true);

    iDatesForm = new SimpleForm();

    iDatesHeader = new UniTimeHeaderPanel();
    iDatesHeader.setRotateFocus(true);
    iDatesHeader.addButton("next", MESSAGES.buttonNext(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            if (iDates.getSelectedDaysCount() == 0) {
                iDatesHeader.setErrorMessage(MESSAGES.errorNoDateSelected());
                AriaStatus.getInstance().setText(MESSAGES.errorNoDateSelected());
                return;
            } else if (getStartSlot() == null) {
                iDatesHeader.setErrorMessage(MESSAGES.errorNoStartTime());
                AriaStatus.getInstance().setText(MESSAGES.errorNoStartTime());
                return;
            } else if (getEndSlot() == null) {
                iDatesHeader.setErrorMessage(MESSAGES.errorNoEndTime());
                AriaStatus.getInstance().setText(MESSAGES.errorNoEndTime());
                return;
            }
            LoadingWidget.getInstance().show(MESSAGES.waitCheckingRoomAvailability());
            iRooms.getElements(new AsyncCallback<List<Entity>>() {
                @Override
                public void onFailure(Throwable caught) {
                    LoadingWidget.getInstance().hide();
                    iDatesHeader.setErrorMessage(caught.getMessage());
                    AriaStatus.getInstance().setText(caught.getMessage());
                }

                @Override
                public void onSuccess(List<Entity> result) {
                    iMatchingRooms = result;
                    if (result == null || result.isEmpty()) {
                        LoadingWidget.getInstance().hide();
                        iDatesHeader.setErrorMessage(MESSAGES.errorNoMatchingRooms());
                        AriaStatus.getInstance().setText(MESSAGES.errorNoMatchingRooms());
                    } else if (iDates.getSelectedDaysCount() > 0) {
                        iDatesHeader.clearMessage();
                        if (iProperties != null && iProperties.isTooEarly(getStartSlot(), getEndSlot())) {
                            iAvailabilityHeader.setWarningMessage(
                                    MESSAGES.warnMeetingTooEarly(TimeUtils.slot2time(getStartSlot()) + " - "
                                            + TimeUtils.slot2time(getEndSlot())));
                            AriaStatus.getInstance()
                                    .setText(MESSAGES.warnMeetingTooEarly(TimeUtils.slot2aria(getStartSlot())
                                            + " - " + TimeUtils.slot2aria(getEndSlot())));
                        } else {
                            iAvailabilityHeader.clearMessage();
                        }
                        RPC.execute(
                                EventRoomAvailabilityRpcRequest.checkAvailability(getStartSlot(), getEndSlot(),
                                        getDates(), getRooms(), iEventId, iSession.getAcademicSessionId()),
                                new AsyncCallback<EventRoomAvailabilityRpcResponse>() {
                                    @Override
                                    public void onFailure(Throwable caught) {
                                        LoadingWidget.getInstance().hide();
                                        iDatesHeader.setErrorMessage(caught.getMessage());
                                        AriaStatus.getInstance().setText(caught.getMessage());
                                    }

                                    @Override
                                    public void onSuccess(EventRoomAvailabilityRpcResponse result) {
                                        LoadingWidget.getInstance().hide();
                                        iResponse = result;
                                        populate(0, EventCookie.getInstance().getRoomsSortBy());
                                        setWidget(iAvailabilityForm);
                                        recenter();
                                        iText.setFocus(true);
                                    }
                                });
                    }
                }
            });
        }
    });

    iDatesForm.addHeaderRow(iDatesHeader);

    SimpleForm form = new SimpleForm();
    form.removeStyleName("unitime-NotPrintableBottomLine");

    iDates = new SessionDatesSelector(session);
    form.addRow(MESSAGES.propDates(), iDates);

    iTimes = new StartEndTimeSelector();
    form.addRow(MESSAGES.propTimes(), iTimes);

    iRooms = new RoomFilterBox(session);
    form.addRow(MESSAGES.propLocations(), iRooms);

    iScrollDates = new ScrollPanel(form);
    iScrollDates.setStyleName("unitime-VerticalScrollPanel");

    iDatesForm.addRow(iScrollDates);

    iDatesForm.addBottomRow(iDatesHeader.clonePanel());

    iAvailabilityForm = new SimpleForm();

    iAvailabilityHeader = new UniTimeHeaderPanel();
    iAvailabilityHeader.setRotateFocus(true);

    iAvailabilityHeader.addButton("dates", MESSAGES.buttonPrevious(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            setWidget(iDatesForm);
            recenter();
            iResponse = null;
            Scheduler.get().scheduleDeferred(new ScheduledCommand() {
                @Override
                public void execute() {
                    iDates.setFocus(true);
                }
            });
        }
    });
    iAvailabilityHeader.addButton("prev", MESSAGES.buttonLeft(), new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            populate(iIndex - iStep, null);
            recenter();
        }
    });
    iAvailabilityHeader.addButton("next", MESSAGES.buttonRight(), new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            populate(iIndex + iStep, null);
            recenter();
        }
    });
    iAvailabilityHeader.addButton("more", MESSAGES.buttonMoreOperations(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            final PopupPanel popup = new PopupPanel(true);
            MenuBar menu = new MenuBar(true);
            for (final SortRoomsBy sortBy : SortRoomsBy.values()) {
                if (sortBy == SortRoomsBy.DISTANCE && !iRooms.hasChip(new Chip("flag", "Nearby")))
                    continue;
                MenuItem item = new MenuItem(
                        (sortBy.ordinal() == EventCookie.getInstance().getRoomsSortBy() ? "&uarr; "
                                : (sortBy.ordinal() + SortRoomsBy.values().length == EventCookie.getInstance()
                                        .getRoomsSortBy()) ? "&darr; " : "")
                                + MESSAGES.opSortBy(getSortRoomsByName(sortBy)),
                        true, new Command() {
                            @Override
                            public void execute() {
                                popup.hide();
                                if (sortBy.ordinal() == EventCookie.getInstance().getRoomsSortBy()) {
                                    EventCookie.getInstance()
                                            .setSortRoomsBy(SortRoomsBy.values().length + sortBy.ordinal());
                                } else {
                                    EventCookie.getInstance().setSortRoomsBy(sortBy.ordinal());
                                }
                                populate(0, EventCookie.getInstance().getRoomsSortBy());
                                recenter();
                            }
                        });
                item.getElement().getStyle().setCursor(Cursor.POINTER);
                menu.addItem(item);
            }
            menu.addSeparator();
            MenuItem swapItem = new MenuItem(MESSAGES.opSwapAxes(), true, new Command() {
                @Override
                public void execute() {
                    popup.hide();
                    EventCookie.getInstance()
                            .setRoomsHorizontal(!EventCookie.getInstance().areRoomsHorizontal());
                    populate(0, EventCookie.getInstance().getRoomsSortBy());
                    recenter();
                }
            });
            swapItem.getElement().getStyle().setCursor(Cursor.POINTER);
            menu.addItem(swapItem);
            MenuItem expandOrCollapseAll = new MenuItem(
                    EventCookie.getInstance().isExpandRoomConflicts() ? MESSAGES.opCollapseAll()
                            : MESSAGES.opExpandAll(),
                    true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            EventCookie.getInstance()
                                    .setExpandRoomConflicts(!EventCookie.getInstance().isExpandRoomConflicts());
                            populate(iIndex, EventCookie.getInstance().getRoomsSortBy());
                            recenter();
                        }
                    });
            expandOrCollapseAll.getElement().getStyle().setCursor(Cursor.POINTER);
            menu.addItem(expandOrCollapseAll);
            menu.setVisible(true);
            menu.setFocusOnHoverEnabled(true);
            popup.add(menu);
            popup.showRelativeTo((UIObject) event.getSource());
            if (event.getSource() instanceof Focusable) {
                final Focusable focusable = (Focusable) event.getSource();
                popup.addCloseHandler(new CloseHandler<PopupPanel>() {
                    @Override
                    public void onClose(CloseEvent<PopupPanel> event) {
                        focusable.setFocus(true);
                    }
                });
            }
            menu.focus();
        }
    });
    iAvailabilityHeader.addButton("select", MESSAGES.buttonSelect(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            hide();
            List<MeetingInterface> meetings = new ArrayList<MeetingInterface>();

            for (Integer date : getDates()) {
                for (Entity room : getRooms()) {
                    if (isSelected(date, room)) {
                        MeetingInterface meeting = new MeetingInterface();

                        meeting.setDayOfYear(date);
                        meeting.setStartSlot(getStartSlot());
                        meeting.setEndSlot(getEndSlot());
                        meeting.setStartOffset(0);
                        meeting.setEndOffset(-Integer.parseInt(room.getProperty("breakTime", "0")));

                        meeting.setLocation(new ResourceInterface(room));

                        meeting.setConflicts(getConflicts(date, room));

                        meetings.add(meeting);
                    }
                }
            }

            iCallback.onSuccess(meetings);
        }
    });

    iAvailabilityForm.addHeaderRow(iAvailabilityHeader);

    iRoomAvailability = new P("unitime-MeetingSelection");

    iText = new AriaTextBox();
    iText.setStyleName("text");

    iScrollRooms = new ScrollPanel(iRoomAvailability);

    iAvailabilityForm.addRow(iScrollRooms);

    iAvailabilityForm.addNotPrintableBottomRow(iAvailabilityHeader.clonePanel());

    setWidget(iDatesForm);

    addCloseHandler(new CloseHandler<PopupPanel>() {
        @Override
        public void onClose(CloseEvent<PopupPanel> event) {
            RootPanel.getBodyElement().getStyle().setOverflow(Overflow.AUTO);
        }
    });

    iText.addKeyUpHandler(new KeyUpHandler() {
        @Override
        public void onKeyUp(KeyUpEvent event) {
            if (iResponse == null)
                return;
            if (EventCookie.getInstance().areRoomsHorizontal()) {
                int min = iIndex, max = Math.min(iIndex + iStep, getRooms().size()) - 1;
                switch (event.getNativeKeyCode()) {
                case KeyCodes.KEY_DOWN:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(0, getDates().indexOf(iHoverDate) + 1),
                                getDates().size() - 1);
                        iHoverDate = getDates().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(0);
                        iHoverLoc = getRooms().get(min);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    iScrollRooms.ensureVisible(iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()));
                    break;
                case KeyCodes.KEY_UP:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(0, getDates().indexOf(iHoverDate) - 1),
                                getDates().size() - 1);
                        iHoverDate = getDates().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(getDates().size() - 1);
                        iHoverLoc = getRooms().get(min);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    iScrollDates.ensureVisible(iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()));
                    break;
                case KeyCodes.KEY_RIGHT:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(min, getRooms().indexOf(iHoverLoc) + 1), max);
                        iHoverLoc = getRooms().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(0);
                        iHoverLoc = getRooms().get(min);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    break;
                case KeyCodes.KEY_LEFT:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(min, getRooms().indexOf(iHoverLoc) - 1), max);
                        iHoverLoc = getRooms().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(0);
                        iHoverLoc = getRooms().get(max);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    break;
                case KeyCodes.KEY_PAGEDOWN:
                    if (iIndex + iStep < getRooms().size())
                        populate(iIndex + iStep, null);
                    break;
                case KeyCodes.KEY_PAGEUP:
                    if (iIndex > 0)
                        populate(iIndex - iStep, null);
                    break;
                case 32:
                case KeyCodes.KEY_ENTER:
                    if (iHoverDate != null && iHoverLoc != null) {
                        setSelected(iHoverDate, iHoverLoc, !isSelected(iHoverDate, iHoverLoc));
                    }
                    break;
                }
            } else {
                int min = iIndex, max = Math.min(iIndex + iStep, getDates().size()) - 1;
                switch (event.getNativeKeyCode()) {
                case KeyCodes.KEY_RIGHT:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(min, getDates().indexOf(iHoverDate) + 1), max);
                        iHoverDate = getDates().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(min);
                        iHoverLoc = getRooms().get(0);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    iScrollRooms.ensureVisible(iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()));
                    break;
                case KeyCodes.KEY_LEFT:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(min, getDates().indexOf(iHoverDate) - 1), max);
                        iHoverDate = getDates().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(max);
                        iHoverLoc = getRooms().get(0);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    iScrollDates.ensureVisible(iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()));
                    break;
                case KeyCodes.KEY_DOWN:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(0, getRooms().indexOf(iHoverLoc) + 1),
                                getRooms().size() - 1);
                        iHoverLoc = getRooms().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(min);
                        iHoverLoc = getRooms().get(0);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    break;
                case KeyCodes.KEY_UP:
                    if (iHoverDate != null && iHoverLoc != null) {
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
                        int idx = Math.min(Math.max(0, getRooms().indexOf(iHoverLoc) - 1),
                                getRooms().size() - 1);
                        iHoverLoc = getRooms().get(idx);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    } else {
                        iHoverDate = getDates().get(min);
                        iHoverLoc = getRooms().get(getRooms().size() - 1);
                        iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
                    }
                    break;
                case KeyCodes.KEY_PAGEDOWN:
                    if (iIndex + iStep < getDates().size())
                        populate(iIndex + iStep, null);
                    break;
                case KeyCodes.KEY_PAGEUP:
                    if (iIndex > 0)
                        populate(iIndex - iStep, null);
                    break;
                case 32:
                case KeyCodes.KEY_ENTER:
                    if (iHoverDate != null && iHoverLoc != null) {
                        setSelected(iHoverDate, iHoverLoc, !isSelected(iHoverDate, iHoverLoc));
                    }
                    break;
                }
            }
            iText.setAriaLabel(toAriaLabel(true, true, false));
        }
    });
    iText.addKeyDownHandler(new KeyDownHandler() {
        @Override
        public void onKeyDown(KeyDownEvent event) {
            switch (event.getNativeEvent().getKeyCode()) {
            case KeyCodes.KEY_RIGHT:
            case KeyCodes.KEY_LEFT:
            case KeyCodes.KEY_UP:
            case KeyCodes.KEY_DOWN:
            case KeyCodes.KEY_PAGEDOWN:
            case KeyCodes.KEY_PAGEUP:
                event.preventDefault();
            }
        }
    });
    iText.addKeyPressHandler(new KeyPressHandler() {
        @Override
        public void onKeyPress(KeyPressEvent event) {
            switch (event.getNativeEvent().getKeyCode()) {
            case 32:
                if (iText.getValue().isEmpty())
                    event.preventDefault();
                return;
            case KeyCodes.KEY_ENTER:
                event.preventDefault();
                return;
            }
        }
    });
    iText.addFocusHandler(new FocusHandler() {
        @Override
        public void onFocus(FocusEvent event) {
            if (iHoverDate != null && iHoverLoc != null)
                iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).addStyleName("hover");
            iText.setAriaLabel(toAriaLabel(true, true, false));
        }
    });
    iText.addBlurHandler(new BlurHandler() {
        @Override
        public void onBlur(BlurEvent event) {
            if (iHoverDate != null && iHoverLoc != null) {
                iPanels.get(iHoverDate + ":" + iHoverLoc.getUniqueId()).removeStyleName("hover");
            }
        }
    });
}

From source file:org.unitime.timetable.gwt.client.events.EventResourceTimetable.java

License:Apache License

public EventResourceTimetable(PageType type) {
    iHistoryToken = new HistoryToken(type);
    iType = type;//from w  w  w . j a  v a  2 s  .com

    iFilter = new SimpleForm(2);
    iFilter.removeStyleName("unitime-NotPrintableBottomLine");
    iFilter.getColumnFormatter().setWidth(0, "120px");

    iFilterHeader = new UniTimeHeaderPanel(MESSAGES.sectFilter());
    iLookup = new Lookup();
    iLookup.setOptions("mustHaveExternalId");
    iLookup.addValueChangeHandler(new ValueChangeHandler<PersonInterface>() {
        @Override
        public void onValueChange(ValueChangeEvent<PersonInterface> event) {
            if (event.getValue() != null) {
                iResources.setText(event.getValue().getId());
                resourceTypeChanged(true);
            }
        }
    });
    iFilterHeader.addButton("lookup", MESSAGES.buttonLookup(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            iLookup.center();
        }
    });
    iFilterHeader.setEnabled("lookup", false);
    iFilterHeader.addButton("add", MESSAGES.buttonAddEvent(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            iEventAdd.setEvent(null);
            iEventAdd.show();
        }
    });
    iFilterHeader.setEnabled("add", false);
    iFilter.addHeaderRow(iFilterHeader);
    iFilterHeader.addButton("clear", MESSAGES.buttonClear(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            // Event filter
            iEvents.setValue(iHistoryToken.getDefaultParameter("events", ""), true);

            // Room filter
            iRooms.setValue(iHistoryToken.getDefaultParameter("rooms", ""), true);

            // Resource type
            if (!"true".equals(iHistoryToken.getParameter("fixedType", "false"))) {
                String typeString = iHistoryToken.getDefaultParameter("type", "room");
                if (typeString != null)
                    for (int idx = 0; idx < iResourceTypes.getItemCount(); idx++) {
                        if (iResourceTypes.getValue(idx).equalsIgnoreCase(typeString)) {
                            iResourceTypes.setSelectedIndex(idx);
                        }
                    }
            }

            // Subject, curriculum, department, etc.
            iResources.setValue(iHistoryToken.getDefaultParameter("name", ""));

            // Room selection
            iLocRoom = iHistoryToken.getDefaultParameter("room", "");

            // Week selection
            iLocDate = iHistoryToken.getDefaultParameter("date", "");

            hideResults();
            changeUrl();
            UniTimePageLabel.getInstance().setPageName(getPageName());
            resourceTypeChanged(false);
        }
    });
    iFilterHeader.setEnabled("clear", "true".equals(iHistoryToken.getParameter("showClear", "true")));
    iFilterHeader.addButton("search", MESSAGES.buttonSearch(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            resourceTypeChanged(true);
        }
    });

    iSession = new AcademicSessionSelectionBox(iHistoryToken.getParameter("term"), "Events") {
        @Override
        protected void onInitializationSuccess(List<AcademicSession> sessions) {
            iFilter.setVisible(sessions != null && !sessions.isEmpty());
            UniTimePageHeader.getInstance().getRight().setVisible(false);
            UniTimePageHeader.getInstance().getRight().setPreventDefault(true);
        }

        @Override
        protected void onInitializationFailure(Throwable caught) {
            UniTimeNotifications.error(MESSAGES.failedLoadSessions(caught.getMessage()), caught);
        }
    };
    iSession.setFilter(this);
    iSessionRow = iFilter.addRow(MESSAGES.propAcademicSession(), iSession);

    iEvents = new EventFilterBox(iSession);
    if ("true".equals(iHistoryToken.getParameter("showFilter", "true")))
        iFilter.addRow(MESSAGES.propEventFilter(), iEvents);

    iRooms = new RoomFilterBox(iSession);
    if ("true".equals(iHistoryToken.getParameter("showFilter", "true")))
        iFilter.addRow(MESSAGES.propRoomFilter(), iRooms);

    iResourceTypes = new ListBox();
    for (ResourceType resource : ResourceType.values()) {
        if (resource.isVisible())
            iResourceTypes.addItem(resource.getResourceType(CONSTANTS), resource.name());
    }

    iResourceTypes.addChangeHandler(new ChangeHandler() {
        @Override
        public void onChange(ChangeEvent event) {
            iResources.setText("");
            UniTimePageLabel.getInstance().setPageName(getPageName());
            hideResults();
            if (iProperties != null)
                resourceTypeChanged(isShowingResults());
        }
    });
    int row = iFilter.addRow(MESSAGES.propResourceType(), iResourceTypes);
    if ("true".equals(iHistoryToken.getParameter("fixedType", "false")))
        iFilter.getRowFormatter().setVisible(row, false);

    iResources = new SuggestBox(new SuggestOracle() {
        @Override
        public void requestDefaultSuggestions(Request request, Callback callback) {
            requestSuggestions(request, callback);
        }

        @Override
        public void requestSuggestions(final Request request, final Callback callback) {
            if (iSession.getAcademicSessionId() != null) {
                RPC.execute(
                        ResourceLookupRpcRequest.findResources(iSession.getAcademicSessionId(),
                                ResourceType
                                        .valueOf(iResourceTypes.getValue(iResourceTypes.getSelectedIndex())),
                                request.getQuery(), request.getLimit()),
                        new AsyncCallback<GwtRpcResponseList<ResourceInterface>>() {
                            @Override
                            public void onFailure(final Throwable caught) {
                                ArrayList<Suggestion> suggestions = new ArrayList<Suggestion>();
                                suggestions.add(new Suggestion() {
                                    @Override
                                    public String getDisplayString() {
                                        return "<font color='red'>" + caught.getMessage() + "</font>";
                                    }

                                    @Override
                                    public String getReplacementString() {
                                        return "";
                                    }
                                });
                                callback.onSuggestionsReady(request, new Response(suggestions));
                                ToolBox.checkAccess(caught);
                            }

                            @Override
                            public void onSuccess(GwtRpcResponseList<ResourceInterface> result) {
                                ArrayList<Suggestion> suggestions = new ArrayList<Suggestion>();
                                for (ResourceInterface resource : result) {
                                    suggestions.add(new ResourceSuggestion(resource));
                                }
                                callback.onSuggestionsReady(request, new Response(suggestions));
                            }
                        });
            }
        }

        @Override
        public boolean isDisplayStringHTML() {
            return true;
        }
    });
    iResources.getValueBox().addFocusHandler(new FocusHandler() {
        @Override
        public void onFocus(FocusEvent event) {
            iResources.showSuggestionList();
        }
    });
    iResourcesRow = iFilter.addRow(MESSAGES.propResource(), iResources);
    iResources.addSelectionHandler(new SelectionHandler<Suggestion>() {
        public void onSelection(SelectionEvent<Suggestion> event) {
            if (event.getSelectedItem() instanceof ResourceSuggestion) {
                resourceChanged(((ResourceSuggestion) event.getSelectedItem()).getResource());
            }
        }
    });
    iFilter.getRowFormatter().setVisible(iResourcesRow, false);

    iResourceTypes.setSelectedIndex(ResourceType.ROOM.ordinal());

    iPanel = new SimpleForm(2);
    iPanel.removeStyleName("unitime-NotPrintableBottomLine");
    iPanel.addRow(iFilter);
    iHeader = new UniTimeHeaderPanel();
    iPanel.addHeaderRow(iHeader);
    iWeekPanel = new WeekSelector(iSession);
    iWeekPanel.addValueChangeHandler(new ValueChangeHandler<WeekSelector.Interval>() {
        @Override
        public void onValueChange(ValueChangeEvent<WeekSelector.Interval> e) {
            iLocDate = iWeekPanel.getSelection();
            tabOrDataChanged(true);
        }
    });
    iWeekPanel.setFilter(new WeekSelector.Filter<WeekInterface>() {
        @Override
        public boolean filter(WeekInterface week) {
            return !iMatchingWeeks.contains(week.getDayOfYear());
        }

        @Override
        public boolean isEmpty() {
            return iMatchingRooms.isEmpty();
        }
    });
    iRoomPanel = new RoomSelector();
    iRoomPanel.setFilter(new WeekSelector.Filter<ResourceInterface>() {
        @Override
        public boolean filter(ResourceInterface room) {
            return !iMatchingRooms.contains(room.getId());
        }

        @Override
        public boolean isEmpty() {
            return iMatchingRooms.isEmpty();
        }
    });

    iTabBar = new AriaTabBar();
    iTabBar.addTab(MESSAGES.tabGrid(), true);
    iTabBar.addTab(MESSAGES.tabEventTable(), true);
    iTabBar.addTab(MESSAGES.tabMeetingTable(), true);
    iTabBar.addSelectionHandler(new SelectionHandler<Integer>() {
        @Override
        public void onSelection(SelectionEvent<Integer> event) {
            tabOrDataChanged(true);
        }
    });

    iGridOrTablePanel = new SimplePanel();
    iGridOrTablePanel.setStyleName("unitime-TabPanel");

    final Character gridAccessKey = UniTimeHeaderPanel.guessAccessKey(MESSAGES.tabGrid());
    final Character eventsAccessKey = UniTimeHeaderPanel.guessAccessKey(MESSAGES.tabEventTable());
    final Character meetingsAccessKey = UniTimeHeaderPanel.guessAccessKey(MESSAGES.tabMeetingTable());
    if (gridAccessKey != null || eventsAccessKey != null || meetingsAccessKey != null) {
        RootPanel.get().addDomHandler(new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                if (!iRootPanel.getWidget().equals(iPanel))
                    return;
                int tab = -1;
                if (gridAccessKey != null && event.getNativeEvent().getCtrlKey()
                        && (event.getNativeKeyCode() == gridAccessKey
                                || event.getNativeKeyCode() == Character.toUpperCase(gridAccessKey))) {
                    tab = 0;
                }
                if (eventsAccessKey != null && event.getNativeEvent().getCtrlKey()
                        && (event.getNativeKeyCode() == eventsAccessKey
                                || event.getNativeKeyCode() == Character.toUpperCase(eventsAccessKey))) {
                    tab = 1;
                }
                if (meetingsAccessKey != null && event.getNativeEvent().getCtrlKey()
                        && (event.getNativeKeyCode() == meetingsAccessKey
                                || event.getNativeKeyCode() == Character.toUpperCase(meetingsAccessKey))) {
                    tab = 2;
                }
                if (tab >= 0) {
                    iTabBar.selectTab(tab);
                    event.preventDefault();
                }
            }
        }, KeyUpEvent.getType());
    }

    iDockPanel = new DockPanel();
    iDockPanel.setStyleName("unitime-EventResults");
    iDockPanel.setSpacing(0);
    iDockPanel.add(iGridOrTablePanel, DockPanel.SOUTH);
    iDockPanel.add(iRoomPanel, DockPanel.WEST);
    iDockPanel.setCellHorizontalAlignment(iRoomPanel, HasHorizontalAlignment.ALIGN_LEFT);
    iDockPanel.add(iTabBar, DockPanel.CENTER);
    iDockPanel.setCellVerticalAlignment(iTabBar, HasVerticalAlignment.ALIGN_BOTTOM);
    iDockPanel.setCellHorizontalAlignment(iTabBar, HasHorizontalAlignment.ALIGN_CENTER);
    iDockPanel.add(iWeekPanel, DockPanel.EAST);
    iDockPanel.setCellHorizontalAlignment(iWeekPanel, HasHorizontalAlignment.ALIGN_RIGHT);
    Roles.getTabpanelRole().set(iDockPanel.getElement());
    Roles.getTabpanelRole().setAriaOwnsProperty(iDockPanel.getElement(), Id.of(iTabBar.getElement()));

    iPanel.addRow(iDockPanel);

    hideResults();

    iFooter = iHeader.clonePanel();
    iPanel.addRow(iFooter);
    iRootPanel = new SimplePanel(iPanel);
    initWidget(iRootPanel);

    iRoomPanel.addValueChangeHandler(new ValueChangeHandler<IntervalSelector<ResourceInterface>.Interval>() {
        @Override
        public void onValueChange(ValueChangeEvent<IntervalSelector<ResourceInterface>.Interval> e) {
            iLocRoom = iRoomPanel.getSelection();
            tabOrDataChanged(true);
        }
    });

    for (int i = 1; i < iPanel.getRowCount(); i++)
        iPanel.getRowFormatter().setVisible(i, false);

    iHeader.addButton("add", MESSAGES.buttonAddEvent(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            iEventAdd.setEvent(null);
            iEventAdd.show();
        }
    });
    iHeader.setEnabled("add", false);
    iHeader.addButton("print", MESSAGES.buttonPrint(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent clickEvent) {
            final EventMeetingTable table = new EventMeetingTable(
                    getSelectedTab() <= 1 ? EventMeetingTable.Mode.ListOfEvents
                            : EventMeetingTable.Mode.ListOfMeetings,
                    false, EventResourceTimetable.this);
            table.setMeetingFilter(EventResourceTimetable.this);
            table.setShowMainContact(iProperties != null && iProperties.isCanLookupMainContact());
            table.setEvents(iData);
            table.setSortBy(iTable.getSortBy());
            table.getElement().getStyle().setWidth(1040, Unit.PX);

            int firstSlot = 84, lastSlot = 216;
            boolean skipDays = iEvents.hasChip(new FilterBox.Chip("day", null));
            boolean hasDay[] = new boolean[] {
                    !skipDays || iEvents.hasChip(new FilterBox.Chip("day", CONSTANTS.longDays()[0])),
                    !skipDays || iEvents.hasChip(new FilterBox.Chip("day", CONSTANTS.longDays()[1])),
                    !skipDays || iEvents.hasChip(new FilterBox.Chip("day", CONSTANTS.longDays()[2])),
                    !skipDays || iEvents.hasChip(new FilterBox.Chip("day", CONSTANTS.longDays()[3])),
                    !skipDays || iEvents.hasChip(new FilterBox.Chip("day", CONSTANTS.longDays()[4])),
                    iEvents.hasChip(new FilterBox.Chip("day", CONSTANTS.longDays()[5])),
                    iEvents.hasChip(new FilterBox.Chip("day", CONSTANTS.longDays()[6])) };
            for (EventInterface event : iData) {
                if (event.getType() == EventType.Unavailabile
                        && !iEvents.hasChip(new Chip("type", "Not Available")))
                    continue;
                for (MeetingInterface meeting : event.getMeetings()) {
                    if (filterEvent(event, meeting))
                        continue;
                    if (meeting.getApprovalStatus() != ApprovalStatus.Pending
                            && meeting.getApprovalStatus() != ApprovalStatus.Approved)
                        continue;
                    if (firstSlot > meeting.getStartSlot())
                        firstSlot = meeting.getStartSlot();
                    if (lastSlot < meeting.getEndSlot())
                        lastSlot = meeting.getEndSlot();
                    hasDay[meeting.getDayOfWeek()] = true;
                }
            }
            Chip after = iEvents.getChip("after");
            if (after != null) {
                Integer slot = TimeUtils.parseTime(CONSTANTS, after.getValue(), null);
                if (slot != null && firstSlot > slot)
                    firstSlot = slot;
            }
            Chip before = iEvents.getChip("before");
            if (before != null) {
                Integer slot = TimeUtils.parseTime(CONSTANTS, before.getValue(), firstSlot);
                if (slot != null && lastSlot < slot)
                    lastSlot = slot;
            }
            int nrDays = 0;
            for (boolean d : hasDay)
                if (d)
                    nrDays++;
            int days[] = new int[nrDays];
            int d = 0;
            for (int i = 0; i < 7; i++)
                if (hasDay[i])
                    days[d++] = i;
            int firstHour = firstSlot / 12;
            int lastHour = 1 + (lastSlot - 1) / 12;
            if (firstHour <= 7 && firstHour > 0 && ((firstSlot % 12) <= 6))
                firstHour--;
            HashMap<Long, String> colors = new HashMap<Long, String>();

            final TimeGrid tg = new TimeGrid(colors, days, (int) (1000 / nrDays), 55, true, false,
                    (firstHour < 7 ? firstHour : 7), (lastHour > 18 ? lastHour : 18),
                    EventResourceTimetable.this);
            tg.setResourceType(getResourceType());
            tg.setSelectedWeeks(iWeekPanel.getSelected());
            tg.setRoomResources(iRoomPanel.getSelected());
            tg.setMode(gridMode());
            tg.showVerticalSplit();

            for (EventInterface event : sortedEvents()) {
                List<MeetingInterface> meetings = new ArrayList<MeetingInterface>();
                for (MeetingInterface meeting : event.getMeetings()) {
                    if (meeting.getApprovalStatus() != ApprovalStatus.Pending
                            && meeting.getApprovalStatus() != ApprovalStatus.Approved)
                        continue;
                    if (meeting.getMeetingDate() != null && !filterEvent(event, meeting))
                        meetings.add(meeting);
                }
                if (!meetings.isEmpty())
                    tg.addEvent(event, meetings);
            }
            if (iWeekPanel.getValue() != null)
                tg.labelDays(iWeekPanel.getValue().getFirst(), iWeekPanel.getValue().getLast());

            // Move header row to thead
            Element headerRow = table.getRowFormatter().getElement(0);
            Element tableElement = table.getElement();
            Element thead = DOM.createTHead();
            tableElement.insertFirst(thead);
            headerRow.getParentElement().removeChild(headerRow);
            thead.appendChild(headerRow);

            ToolBox.print(new ToolBox.Page() {
                @Override
                public String getName() {
                    return iHeader.getHeaderTitle();
                }

                @Override
                public String getUser() {
                    return iRoomPanel.getValue().toString();
                }

                @Override
                public String getSession() {
                    return iWeekPanel.getValue().toString();
                }

                @Override
                public Element getBody() {
                    return tg.getElement();
                }
            }, new ToolBox.Page() {
                @Override
                public String getName() {
                    return iHeader.getHeaderTitle();
                }

                @Override
                public String getUser() {
                    return iRoomPanel.getValue().toString();
                }

                @Override
                public String getSession() {
                    return iWeekPanel.getValue().toString();
                }

                @Override
                public Element getBody() {
                    return table.getElement();
                }
            });
        }
    });

    iHeader.addButton("export", MESSAGES.buttonExport(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent clickEvent) {
            if (iProperties != null && iProperties.isCanExportCSV()) {
                final PopupPanel popup = new PopupPanel(true);
                MenuBar menu = new MenuBar(true);
                MenuItem exportPdf = new MenuItem(MESSAGES.opExportPDF(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        export("output=" + (getSelectedTab() <= 1 ? "events" : "meetings") + ".pdf&flags="
                                + EventCookie.getInstance().getFlags(), true);
                    }
                });
                exportPdf.getElement().getStyle().setCursor(Cursor.POINTER);
                menu.addItem(exportPdf);
                MenuItem exportCsv = new MenuItem(MESSAGES.opExportCSV(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        export("output=" + (getSelectedTab() <= 1 ? "events" : "meetings") + ".csv&flags="
                                + EventCookie.getInstance().getFlags(), true);
                    }
                });
                exportCsv.getElement().getStyle().setCursor(Cursor.POINTER);
                menu.addItem(exportCsv);
                MenuItem exportIcs = new MenuItem(MESSAGES.opExportICalendar(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        copyToClipboard(
                                "output=events.ics"
                                        + (iType == PageType.Personal ? "&e:flag=All+Sessions" : ""),
                                iType == PageType.Personal);
                    }
                });
                exportIcs.getElement().getStyle().setCursor(Cursor.POINTER);
                menu.addItem(exportIcs);
                popup.add(menu);
                popup.showRelativeTo((UIObject) clickEvent.getSource());
                menu.focus();
            } else {
                export("output=events.ics", false);
            }
        }
    });
    iHeader.addButton("operations", MESSAGES.buttonMoreOperations(), 75, new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            final PopupPanel popup = new PopupPanel(true);
            iTable.getHeader(0).setMenu(popup);
            popup.showRelativeTo((UIObject) event.getSource());
            ((MenuBar) popup.getWidget()).focus();
        }
    });
    iHeader.setEnabled("print", false);
    iHeader.setEnabled("export", false);
    iHeader.setEnabled("operations", false);

    iSession.addAcademicSessionChangeHandler(new AcademicSessionChangeHandler() {
        @Override
        public void onAcademicSessionChange(AcademicSessionChangeEvent event) {
            loadProperties(new AsyncCallback<EventPropertiesRpcResponse>() {
                @Override
                public void onFailure(Throwable caught) {
                }

                @Override
                public void onSuccess(EventPropertiesRpcResponse result) {
                    if (!iInitialized)
                        setup(true);
                    else
                        resourceTypeChanged(isShowingResults());
                }
            });
        }
    });

    iEventDetail = new EventDetail(this) {
        @Override
        protected void onHide() {
            iRootPanel.setWidget(iPanel);
            UniTimePageLabel.getInstance().setPageName(getPageName());
            if (!isShowingResults())
                resourceTypeChanged(true);
            changeUrl();
        }

        @Override
        protected void onShow() {
            iBack.clear();
            if (iTable != null)
                iTable.clearHover();
            iRootPanel.setWidget(iEventDetail);
            changeUrl();
        }

        @Override
        protected void edit() {
            super.hide();
            iEventAdd.setEvent(getEvent());
            iEventAdd.show();
        }

        @Override
        protected EventInterface getPrevious(Long eventId) {
            return iTable.previous(eventId);
        }

        @Override
        protected EventInterface getNext(Long eventId) {
            return iTable.next(eventId);
        }

        @Override
        protected void previous(final EventInterface event) {
            iBack.add(getEvent());
            LoadingWidget.execute(
                    EventDetailRpcRequest.requestEventDetails(iSession.getAcademicSessionId(), event.getId()),
                    new AsyncCallback<EventInterface>() {
                        @Override
                        public void onFailure(Throwable caught) {
                            UniTimeNotifications
                                    .error(MESSAGES.failedLoad(event.getName(), caught.getMessage()), caught);
                        }

                        @Override
                        public void onSuccess(EventInterface result) {
                            LoadingWidget.getInstance().hide();
                            setEvent(result);
                            changeUrl();
                        }
                    }, MESSAGES.waitLoading(event.getName()));
        }

        @Override
        protected void next(final EventInterface event) {
            previous(event);
        }

        @Override
        public void hide() {
            if (!iBack.isEmpty()) {
                EventInterface last = iBack.remove(iBack.size() - 1);
                setEvent(last);
            } else {
                super.hide();
            }
        }

        @Override
        protected void onApprovalOrReject(Long eventId, EventInterface event) {
            if (iData != null)
                populate(tinker(new GwtRpcResponseList<EventInterface>(iData), eventId, event));
        }
    };

    iEventAdd = new EventAdd(iSession, this) {
        @Override
        protected void onHide() {
            iSession.setFilter(EventResourceTimetable.this);
            iFilter.setWidget(iSessionRow, 1, iSession);
            final EventInterface modified = iEventAdd.getEvent(), detail = iEventDetail.getEvent(),
                    saved = iEventAdd.getSavedEvent();
            if (saved != null) {
                if (iData != null)
                    populate(tinker(new GwtRpcResponseList<EventInterface>(iData),
                            (saved.getId() == null ? modified.getId() : saved.getId()), saved));
                if (saved.getId() != null) {
                    iEventDetail.setEvent(saved);
                    iEventDetail.show();
                } else {
                    iRootPanel.setWidget(iPanel);
                    UniTimePageLabel.getInstance().setPageName(getPageName());
                }
            } else if (modified != null && detail != null && detail.getId().equals(modified.getId())) {
                LoadingWidget.execute(EventDetailRpcRequest.requestEventDetails(iSession.getAcademicSessionId(),
                        modified.getId()), new AsyncCallback<EventInterface>() {
                            @Override
                            public void onFailure(Throwable caught) {
                                UniTimeNotifications.error(
                                        MESSAGES.failedLoad(detail.getName(), caught.getMessage()), caught);
                            }

                            @Override
                            public void onSuccess(EventInterface result) {
                                LoadingWidget.getInstance().hide();
                                if (result == null) {
                                    iRootPanel.setWidget(iPanel);
                                    UniTimePageLabel.getInstance().setPageName(getPageName());
                                } else {
                                    iEventDetail.setEvent(result);
                                    iEventDetail.show();
                                }
                            }
                        }, MESSAGES.waitLoading(detail.getName()));
            } else {
                iRootPanel.setWidget(iPanel);
                UniTimePageLabel.getInstance().setPageName(getPageName());
            }
            changeUrl();
        }

        @Override
        protected void onShow() {
            if (iTable != null)
                iTable.clearHover();
            iRootPanel.setWidget(iEventAdd);
            changeUrl();
        }
    };

    iMeetingClickHandler = new MeetingClickHandler() {
        @Override
        public void onMeetingClick(final MeetingClickEvent event) {
            if (!event.getEvent().isCanView())
                return;
            LoadingWidget.execute(EventDetailRpcRequest.requestEventDetails(iSession.getAcademicSessionId(),
                    event.getEvent().getId()), new AsyncCallback<EventInterface>() {
                        @Override
                        public void onFailure(Throwable caught) {
                            UniTimeNotifications.error(
                                    MESSAGES.failedLoad(event.getEvent().getName(), caught.getMessage()),
                                    caught);
                        }

                        @Override
                        public void onSuccess(EventInterface result) {
                            LoadingWidget.getInstance().hide();
                            iEventDetail.setEvent(result);
                            iEventDetail.show();
                        }
                    }, MESSAGES.waitLoading(event.getEvent().getName()));
        }
    };

    iTable = new EventMeetingTable(EventMeetingTable.Mode.ListOfEvents, true, this) {
        @Override
        protected void onSortByChanded(EventComparator.EventMeetingSortBy sortBy, boolean asc) {
            changeUrl();
        }

        @Override
        protected void onColumnShownOrHid(int eventCookieFlags) {
            changeUrl();
        }
    };
    iTable.setMeetingFilter(this);
    iTable.addMouseClickListener(new MouseClickListener<EventMeetingRow>() {
        @Override
        public void onMouseClick(final TableEvent<EventMeetingRow> event) {
            if (event.getData() == null)
                return;
            final EventInterface e = event.getData().getEvent();
            if (e == null || !e.isCanView())
                return;
            LoadingWidget.execute(
                    EventDetailRpcRequest.requestEventDetails(iSession.getAcademicSessionId(), e.getId()),
                    new AsyncCallback<EventInterface>() {
                        @Override
                        public void onFailure(Throwable caught) {
                            UniTimeNotifications.error(MESSAGES.failedLoad(e.getName(), caught.getMessage()),
                                    caught);
                        }

                        @Override
                        public void onSuccess(EventInterface result) {
                            LoadingWidget.getInstance().hide();
                            iEventDetail.setEvent(result);
                            iEventDetail.show();
                        }
                    }, MESSAGES.waitLoading(e.getName()));
        }
    });

    iApproveDialog = new ApproveDialog(this) {
        @Override
        protected void onSubmit(ApproveEventRpcRequest.Operation operation, List<EventMeetingRow> data,
                String message, boolean emailConfirmation) {
            Map<EventInterface, List<MeetingInterface>> event2meetings = new HashMap<EventInterface, List<MeetingInterface>>();
            List<EventInterface> events = new ArrayList<EventInterface>();
            for (EventMeetingRow row : data) {
                if (row.getMeeting() != null) {
                    List<MeetingInterface> meetings = event2meetings.get(row.getEvent());
                    if (meetings == null) {
                        meetings = new ArrayList<EventInterface.MeetingInterface>();
                        event2meetings.put(row.getEvent(), meetings);
                        events.add(row.getEvent());
                    }
                    meetings.add(row.getMeeting());
                } else {
                    events.add(row.getEvent());
                }
            }
            onSubmit(operation, events.iterator(), event2meetings, message, emailConfirmation,
                    new GwtRpcResponseList<EventInterface>(iData));
        }

        protected void onSubmit(final ApproveEventRpcRequest.Operation operation,
                final Iterator<EventInterface> events,
                final Map<EventInterface, List<MeetingInterface>> event2meetings, final String message,
                final boolean emailConfirmation, final GwtRpcResponseList<EventInterface> data) {
            if (events.hasNext()) {
                final EventInterface event = events.next();
                List<MeetingInterface> meetings = event2meetings.get(event);
                if (meetings == null) {
                    meetings = new ArrayList<MeetingInterface>();
                    for (MeetingInterface meeting : event.getMeetings()) {
                        switch (operation) {
                        case APPROVE:
                        case REJECT:
                            if (meeting.isCanApprove() && !filter(event, meeting))
                                meetings.add(meeting);
                            break;
                        case CANCEL:
                            if (meeting.isCanCancel() && !filter(event, meeting))
                                meetings.add(meeting);
                            break;
                        case INQUIRE:
                            if (meeting.isCanInquire() && !filter(event, meeting))
                                meetings.add(meeting);
                            break;
                        }
                    }
                }
                if (meetings.isEmpty()) {
                    onSubmit(operation, events, event2meetings, message, emailConfirmation, data);
                } else {
                    switch (operation) {
                    case APPROVE:
                        LoadingWidget.getInstance().show(MESSAGES.waitForApproval(event.getName()));
                        break;
                    case INQUIRE:
                        LoadingWidget.getInstance().show(MESSAGES.waitForInquiry(event.getName()));
                        break;
                    case REJECT:
                        LoadingWidget.getInstance().show(MESSAGES.waitForRejection(event.getName()));
                        break;
                    case CANCEL:
                        LoadingWidget.getInstance().show(MESSAGES.waitForCancellation(event.getName()));
                        break;
                    }
                    RPC.execute(
                            ApproveEventRpcRequest.createRequest(operation, iSession.getAcademicSessionId(),
                                    event, meetings, message, emailConfirmation),
                            new AsyncCallback<SaveOrApproveEventRpcResponse>() {
                                @Override
                                public void onFailure(Throwable caught) {
                                    LoadingWidget.getInstance().hide();
                                    UniTimeNotifications.error(caught);
                                    onSubmit(operation, events, event2meetings, message, emailConfirmation,
                                            data);
                                }

                                @Override
                                public void onSuccess(SaveOrApproveEventRpcResponse result) {
                                    LoadingWidget.getInstance().hide();
                                    if (result.hasMessages())
                                        for (MessageInterface m : result.getMessages()) {
                                            if (m.isError())
                                                UniTimeNotifications.warn(m.getMessage());
                                            else if (m.isWarning())
                                                UniTimeNotifications.error(m.getMessage());
                                            else
                                                UniTimeNotifications.info(m.getMessage());
                                        }
                                    switch (operation) {
                                    case APPROVE:
                                    case REJECT:
                                    case CANCEL:
                                        tinker(data, event.getId(), result.getEvent());
                                    }
                                    onSubmit(operation, events, event2meetings, message, emailConfirmation,
                                            data);
                                }
                            });
                }
            } else {
                LoadingWidget.getInstance().hide();
                populate(data);
            }
        }
    };
    iTable.setOperation(EventMeetingTable.OperationType.Approve, iApproveDialog);
    iTable.setOperation(EventMeetingTable.OperationType.Reject, iApproveDialog);
    iTable.setOperation(EventMeetingTable.OperationType.Inquire, iApproveDialog);
    iTable.setOperation(EventMeetingTable.OperationType.Cancel, iApproveDialog);

    History.addValueChangeHandler(new ValueChangeHandler<String>() {
        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            if (iInitialized) {
                if ("event=add".equals(event.getValue()))
                    iHistoryToken.parse(event.getValue());
                else
                    iHistoryToken.reset(event.getValue());
                setup(false);
                if (LoadingWidget.getInstance().isShowing())
                    LoadingWidget.getInstance().hide();
            }
        }
    });
}

From source file:org.unitime.timetable.gwt.client.rooms.RoomFeaturesPage.java

License:Apache License

public RoomFeaturesPage() {
    if (Location.getParameter("mode") != null)
        iMode = RoomsPageMode.valueOf(Location.getParameter("mode").toUpperCase());
    iHistoryToken = new HistoryToken(iMode);

    iPanel = new SimplePanel();

    iFeaturesPanel = new SimpleForm();
    iFeaturesPanel.setWidth("100%");

    ClickHandler clickSearch = new ClickHandler() {
        @Override//from   www .  j a  v  a2s . c o m
        public void onClick(ClickEvent event) {
            changeUrl();
            search(null);
        }
    };

    ClickHandler clickMore = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            final PopupPanel popup = new PopupPanel(true);
            MenuBar menu = new UniTimeTableHeader.MenuBarWithAccessKeys();

            if (iProperties != null && iProperties.isCanSaveFilterDefaults()) {
                MenuItem item = new MenuItem(MESSAGES.buttonClear(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        iFilter.setValue(iHistoryToken.getDefaultParameter("q", ""), true);
                        hideResults();
                        changeUrl();
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                        UniTimeHeaderPanel.stripAccessKey(MESSAGES.buttonClear()));
                menu.addItem(item);
                menu.addSeparator();
            }

            MenuBar sortItems = new MenuBar(true);
            for (final RoomFeaturesColumn column : RoomFeaturesColumn.values()) {
                if (RoomFeaturesComparator.isApplicable(column)) {
                    if ((iGlobalFeaturesTable.getRowCount() <= 1
                            || iGlobalFeaturesTable.getNbrCells(column) == 0)
                            && (iDepartmentalFeaturesTable.getRowCount() <= 1
                                    || iDepartmentalFeaturesTable.getNbrCells(column) == 0))
                        continue;
                    String name = iGlobalFeaturesTable.getColumnName(column, 0).replace("<br>", " ");
                    MenuItem item = new MenuItem(name, true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            int sortBy = RoomCookie.getInstance().getRoomFeaturesSortBy();
                            if (sortBy == (1 + column.ordinal()) || sortBy == (-1 - column.ordinal())) {
                                sortBy = -sortBy;
                            } else {
                                sortBy = 1 + column.ordinal();
                            }
                            RoomCookie.getInstance().setSortRoomFeaturesBy(sortBy);
                            iGlobalFeaturesTable.setSortBy(sortBy);
                            iDepartmentalFeaturesTable.setSortBy(sortBy);
                        }
                    });
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            UniTimeHeaderPanel.stripAccessKey(MESSAGES.opSortBy(name)));
                    sortItems.addItem(item);
                }
            }
            MenuItem sortMenu = new MenuItem(MESSAGES.opSort(), sortItems);
            sortMenu.getElement().getStyle().setCursor(Cursor.POINTER);
            menu.addItem(sortMenu);

            MenuBar deptItems = new MenuBar(true);
            for (final DeptMode d : DeptMode.values()) {
                String name = (RoomCookie.getInstance().getDeptMode() == d.ordinal()
                        ? MESSAGES.opUncheck(d.getName())
                        : MESSAGES.opCheck(d.getName()));
                MenuItem item = new MenuItem(name, true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        RoomCookie.getInstance().setDeptMode(d.ordinal());
                        iGlobalFeaturesTable.refreshTable();
                        iDepartmentalFeaturesTable.refreshTable();
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(), d.getName());
                deptItems.addItem(item);
            }
            MenuItem deptMenu = new MenuItem(MESSAGES.opDepartmentFormat(), deptItems);
            deptMenu.getElement().getStyle().setCursor(Cursor.POINTER);
            menu.addItem(deptMenu);

            if (iProperties.isCanExportRoomFeatures()) {
                menu.addSeparator();

                MenuItem exportPdf = new MenuItem(MESSAGES.opExportPDF(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        export("roomfeatures.pdf");
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(exportPdf.getElement(), MESSAGES.opExportPDF());
                menu.addItem(exportPdf);

                MenuItem exportCsv = new MenuItem(MESSAGES.opExportCSV(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        export("roomfeatures.csv");
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(exportCsv.getElement(), MESSAGES.opExportCSV());
                menu.addItem(exportCsv);
            }

            popup.add(menu);
            popup.showRelativeTo((UIObject) event.getSource());
            menu.focus();
        }
    };

    ClickHandler clickNew = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            edit(null);
        }
    };

    iRoomFeatureEdit = new RoomFeatureEdit(iMode) {
        @Override
        protected void onShow() {
            RoomHint.hideHint();
            iRootPanel.setWidget(iRoomFeatureEdit);
            changeUrl();
        }

        @Override
        protected void onHide(boolean refresh, FeatureInterface feature) {
            iRootPanel.setWidget(iFeaturesPanel);
            UniTimePageLabel.getInstance().setPageName(MESSAGES.pageRoomFeatures());
            changeUrl();
            if (refresh && (iFeaturesPanel.getRowFormatter().isVisible(iGlobalFeaturesRow)
                    || iFeaturesPanel.getRowFormatter().isVisible(iDepartmentalFeaturesRow)))
                search(feature == null ? null : feature.getId());
        }
    };

    if (iMode.hasSessionSelection()) {
        iHeaderPanel = new UniTimeHeaderPanel(MESSAGES.sectFilter());
        iFeaturesPanel.addHeaderRow(iHeaderPanel);

        iSession = new AcademicSessionSelectionBox(iHistoryToken.getParameter("term"), "RoomFeatures") {
            @Override
            protected void onInitializationSuccess(List<AcademicSession> sessions) {
                UniTimePageHeader.getInstance().getRight().setVisible(false);
                UniTimePageHeader.getInstance().getRight().setPreventDefault(true);
                setup(getAcademicSessionId(), CONSTANTS.searchWhenPageIsLoaded()
                        && (iHistoryToken.hasParameter("id") || iHistoryToken.hasParameter("q")));
            }

            @Override
            protected void onInitializationFailure(Throwable caught) {
                UniTimeNotifications.error(MESSAGES.failedLoadSessions(caught.getMessage()), caught);
            }
        };
        iSession.addAcademicSessionChangeHandler(new AcademicSessionChangeHandler() {
            @Override
            public void onAcademicSessionChange(AcademicSessionChangeEvent event) {
                setup(event.getNewAcademicSessionId(),
                        iDepartmentalFeaturesTable.getRowCount() > 1 || iGlobalFeaturesTable.getRowCount() > 1);
            }
        });
        ;
        iFeaturesPanel.addRow(MESSAGES.propAcademicSession(), (Widget) iSession);

        iFilter = new RoomFilterBox(iSession);
        iFeaturesPanel.addRow(MESSAGES.propRoomFilter(), iFilter);

        iHeaderPanel.addButton("search", MESSAGES.buttonSearch(), clickSearch);
        iHeaderPanel.addButton("more", MESSAGES.buttonMoreOperations(), clickMore);
        iHeaderPanel.addButton("new", MESSAGES.buttonAddNewRoom(), clickNew);
        iHeaderPanel.setEnabled("more", false);
        iHeaderPanel.setEnabled("new", false);
    } else {
        iFilterPanel = new HorizontalPanel();
        iFilterPanel.setSpacing(3);

        Label filterLabel = new Label(MESSAGES.propFilter());
        iFilterPanel.add(filterLabel);
        iFilterPanel.setCellVerticalAlignment(filterLabel, HasVerticalAlignment.ALIGN_MIDDLE);

        iSession = new Session();
        iFilter = new RoomFilterBox(iSession);
        iFilterPanel.add(iFilter);

        iSearch = new AriaButton(MESSAGES.buttonSearch());
        iSearch.addStyleName("unitime-NoPrint");
        iSearch.addClickHandler(clickSearch);
        iFilterPanel.add(iSearch);

        iMore = new AriaButton(MESSAGES.buttonMoreOperations());
        iMore.setEnabled(false);
        iMore.addStyleName("unitime-NoPrint");
        iMore.addClickHandler(clickMore);
        iFilterPanel.add(iMore);

        iNew = new AriaButton(MESSAGES.buttonAddNewRoomFeature());
        iNew.setEnabled(false);
        iNew.addStyleName("unitime-NoPrint");
        iNew.addClickHandler(clickNew);
        iFilterPanel.add(iNew);

        int filterRow = iFeaturesPanel.addRow(iFilterPanel);
        iFeaturesPanel.getCellFormatter().setHorizontalAlignment(filterRow, 0,
                HasHorizontalAlignment.ALIGN_CENTER);

        setup(null, CONSTANTS.searchWhenPageIsLoaded()
                && (iHistoryToken.hasParameter("id") || iHistoryToken.hasParameter("q")));
    }

    iGlobalFeaturesHeader = new UniTimeHeaderPanel(MESSAGES.headerGlobalRoomFeatures());
    iGlobalFeaturesRow = iFeaturesPanel.addHeaderRow(iGlobalFeaturesHeader);
    iGlobalFeaturesTable = new RoomFeaturesTable(true) {
        protected void doSort(RoomFeaturesColumn column) {
            super.doSort(column);
            iDepartmentalFeaturesTable.setSortBy(RoomCookie.getInstance().getRoomFeaturesSortBy());
        }
    };
    iFeaturesPanel.addRow(iGlobalFeaturesTable);
    iFeaturesPanel.getRowFormatter().setVisible(iGlobalFeaturesRow, false);
    iFeaturesPanel.getRowFormatter().setVisible(iGlobalFeaturesRow + 1, false);

    iDepartmentalFeaturesHeader = new UniTimeHeaderPanel(MESSAGES.headerDepartmentalRoomFeatures());
    iDepartmentalFeaturesRow = iFeaturesPanel.addHeaderRow(iDepartmentalFeaturesHeader);
    iDepartmentalFeaturesTable = new RoomFeaturesTable(false) {
        protected void doSort(RoomFeaturesColumn column) {
            super.doSort(column);
            iGlobalFeaturesTable.setSortBy(RoomCookie.getInstance().getRoomFeaturesSortBy());
        }
    };
    iFeaturesPanel.addRow(iDepartmentalFeaturesTable);
    iFeaturesPanel.getRowFormatter().setVisible(iDepartmentalFeaturesRow, false);
    iFeaturesPanel.getRowFormatter().setVisible(iDepartmentalFeaturesRow + 1, false);

    iRootPanel = new SimplePanel(iFeaturesPanel);
    iPanel.setWidget(iRootPanel);

    iGlobalFeaturesTable.addMouseClickListener(new MouseClickListener<FeatureInterface>() {
        @Override
        public void onMouseClick(final TableEvent<FeatureInterface> event) {
            if (event.getData() != null && (event.getData().canEdit() || event.getData().canDelete()))
                edit(event.getData());
        }
    });

    iDepartmentalFeaturesTable.addMouseClickListener(new MouseClickListener<FeatureInterface>() {
        @Override
        public void onMouseClick(final TableEvent<FeatureInterface> event) {
            if (event.getData() != null && (event.getData().canEdit() || event.getData().canDelete()))
                edit(event.getData());
        }
    });

    initWidget(iPanel);

    History.addValueChangeHandler(new ValueChangeHandler<String>() {
        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            if (!iInitialized)
                return;
            iHistoryToken.reset(event.getValue());
            updateFilter(iFeaturesPanel.getRowFormatter().isVisible(iGlobalFeaturesRow)
                    || iFeaturesPanel.getRowFormatter().isVisible(iDepartmentalFeaturesRow));
        }
    });
}

From source file:org.unitime.timetable.gwt.client.rooms.RoomGroupsPage.java

License:Apache License

public RoomGroupsPage() {
    if (Location.getParameter("mode") != null)
        iMode = RoomsPageMode.valueOf(Location.getParameter("mode").toUpperCase());
    iHistoryToken = new HistoryToken(iMode);

    iPanel = new SimplePanel();

    iGroupsPanel = new SimpleForm();
    iGroupsPanel.setWidth("100%");

    ClickHandler clickSearch = new ClickHandler() {
        @Override/*  www .jav a2 s .  co  m*/
        public void onClick(ClickEvent event) {
            changeUrl();
            search(null);
        }
    };

    ClickHandler clickMore = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            final PopupPanel popup = new PopupPanel(true);
            MenuBar menu = new UniTimeTableHeader.MenuBarWithAccessKeys();

            if (iProperties != null && iProperties.isCanSaveFilterDefaults()) {
                MenuItem item = new MenuItem(MESSAGES.buttonClear(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        iFilter.setValue(iHistoryToken.getDefaultParameter("q", ""), true);
                        hideResults();
                        changeUrl();
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                        UniTimeHeaderPanel.stripAccessKey(MESSAGES.buttonClear()));
                menu.addItem(item);
                menu.addSeparator();
            }

            MenuBar sortItems = new MenuBar(true);
            for (final RoomGroupsColumn column : RoomGroupsColumn.values()) {
                if (RoomGroupsComparator.isApplicable(column)) {
                    if ((iGlobalGroupsTable.getRowCount() <= 1 || iGlobalGroupsTable.getNbrCells(column) == 0)
                            && (iDepartmentalGroupsTable.getRowCount() <= 1
                                    || iDepartmentalGroupsTable.getNbrCells(column) == 0))
                        continue;
                    String name = iGlobalGroupsTable.getColumnName(column, 0).replace("<br>", " ");
                    MenuItem item = new MenuItem(name, true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            int sortBy = RoomCookie.getInstance().getRoomGroupsSortBy();
                            if (sortBy == (1 + column.ordinal()) || sortBy == (-1 - column.ordinal())) {
                                sortBy = -sortBy;
                            } else {
                                sortBy = 1 + column.ordinal();
                            }
                            RoomCookie.getInstance().setSortRoomGroupsBy(sortBy);
                            iGlobalGroupsTable.setSortBy(sortBy);
                            iDepartmentalGroupsTable.setSortBy(sortBy);
                        }
                    });
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            UniTimeHeaderPanel.stripAccessKey(MESSAGES.opSortBy(name)));
                    sortItems.addItem(item);
                }
            }
            MenuItem sortMenu = new MenuItem(MESSAGES.opSort(), sortItems);
            sortMenu.getElement().getStyle().setCursor(Cursor.POINTER);
            menu.addItem(sortMenu);

            MenuBar deptItems = new MenuBar(true);
            for (final DeptMode d : DeptMode.values()) {
                String name = (RoomCookie.getInstance().getDeptMode() == d.ordinal()
                        ? MESSAGES.opUncheck(d.getName())
                        : MESSAGES.opCheck(d.getName()));
                MenuItem item = new MenuItem(name, true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        RoomCookie.getInstance().setDeptMode(d.ordinal());
                        iGlobalGroupsTable.refreshTable();
                        iDepartmentalGroupsTable.refreshTable();
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(), d.getName());
                deptItems.addItem(item);
            }
            MenuItem deptMenu = new MenuItem(MESSAGES.opDepartmentFormat(), deptItems);
            deptMenu.getElement().getStyle().setCursor(Cursor.POINTER);
            menu.addItem(deptMenu);

            if (iProperties.isCanExportRoomGroups()) {
                menu.addSeparator();

                MenuItem exportPdf = new MenuItem(MESSAGES.opExportPDF(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        export("roomgroups.pdf");
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(exportPdf.getElement(), MESSAGES.opExportPDF());
                menu.addItem(exportPdf);

                MenuItem exportCsv = new MenuItem(MESSAGES.opExportCSV(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        export("roomgroups.csv");
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(exportCsv.getElement(), MESSAGES.opExportCSV());
                menu.addItem(exportCsv);
            }

            popup.add(menu);
            popup.showRelativeTo((UIObject) event.getSource());
            menu.focus();
        }
    };

    ClickHandler clickNew = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            edit(null);
        }
    };

    iRoomGroupEdit = new RoomGroupEdit(iMode) {
        @Override
        protected void onShow() {
            RoomHint.hideHint();
            iRootPanel.setWidget(iRoomGroupEdit);
            changeUrl();
        }

        @Override
        protected void onHide(boolean refresh, GroupInterface group) {
            iRootPanel.setWidget(iGroupsPanel);
            UniTimePageLabel.getInstance().setPageName(MESSAGES.pageRoomGroups());
            changeUrl();
            if (refresh && (iGroupsPanel.getRowFormatter().isVisible(iGlobalGroupsRow)
                    || iGroupsPanel.getRowFormatter().isVisible(iDepartmentalGroupsRow)))
                search(group == null ? null : group.getId());
        }
    };

    if (iMode.hasSessionSelection()) {
        iHeaderPanel = new UniTimeHeaderPanel(MESSAGES.sectFilter());
        iGroupsPanel.addHeaderRow(iHeaderPanel);

        iSession = new AcademicSessionSelectionBox(iHistoryToken.getParameter("term"), "RoomGroups") {
            @Override
            protected void onInitializationSuccess(List<AcademicSession> sessions) {
                UniTimePageHeader.getInstance().getRight().setVisible(false);
                UniTimePageHeader.getInstance().getRight().setPreventDefault(true);
                setup(getAcademicSessionId(), CONSTANTS.searchWhenPageIsLoaded()
                        && (iHistoryToken.hasParameter("id") || iHistoryToken.hasParameter("q")));
            }

            @Override
            protected void onInitializationFailure(Throwable caught) {
                UniTimeNotifications.error(MESSAGES.failedLoadSessions(caught.getMessage()), caught);
            }
        };
        iSession.addAcademicSessionChangeHandler(new AcademicSessionChangeHandler() {
            @Override
            public void onAcademicSessionChange(AcademicSessionChangeEvent event) {
                setup(event.getNewAcademicSessionId(),
                        iDepartmentalGroupsTable.getRowCount() > 1 || iGlobalGroupsTable.getRowCount() > 1);
            }
        });
        ;
        iGroupsPanel.addRow(MESSAGES.propAcademicSession(), (Widget) iSession);

        iFilter = new RoomFilterBox(iSession);
        iGroupsPanel.addRow(MESSAGES.propRoomFilter(), iFilter);

        iHeaderPanel.addButton("search", MESSAGES.buttonSearch(), clickSearch);
        iHeaderPanel.addButton("more", MESSAGES.buttonMoreOperations(), clickMore);
        iHeaderPanel.addButton("new", MESSAGES.buttonAddNewRoom(), clickNew);
        iHeaderPanel.setEnabled("more", false);
        iHeaderPanel.setEnabled("new", false);
    } else {
        iFilterPanel = new HorizontalPanel();
        iFilterPanel.setSpacing(3);

        Label filterLabel = new Label(MESSAGES.propFilter());
        iFilterPanel.add(filterLabel);
        iFilterPanel.setCellVerticalAlignment(filterLabel, HasVerticalAlignment.ALIGN_MIDDLE);

        iSession = new Session();
        iFilter = new RoomFilterBox(iSession);
        iFilterPanel.add(iFilter);

        iSearch = new AriaButton(MESSAGES.buttonSearch());
        iSearch.addStyleName("unitime-NoPrint");
        iSearch.addClickHandler(clickSearch);
        iFilterPanel.add(iSearch);

        iMore = new AriaButton(MESSAGES.buttonMoreOperations());
        iMore.setEnabled(false);
        iMore.addStyleName("unitime-NoPrint");
        iMore.addClickHandler(clickMore);
        iFilterPanel.add(iMore);

        iNew = new AriaButton(MESSAGES.buttonAddNewRoomGroup());
        iNew.setEnabled(false);
        iNew.addStyleName("unitime-NoPrint");
        iNew.addClickHandler(clickNew);
        iFilterPanel.add(iNew);

        int filterRow = iGroupsPanel.addRow(iFilterPanel);
        iGroupsPanel.getCellFormatter().setHorizontalAlignment(filterRow, 0,
                HasHorizontalAlignment.ALIGN_CENTER);

        setup(null, CONSTANTS.searchWhenPageIsLoaded()
                && (iHistoryToken.hasParameter("id") || iHistoryToken.hasParameter("q")));
    }

    iGlobalGroupsHeader = new UniTimeHeaderPanel(MESSAGES.headerGlobalRoomGroups());
    iGlobalGroupsRow = iGroupsPanel.addHeaderRow(iGlobalGroupsHeader);
    iGlobalGroupsTable = new RoomGroupsTable(true) {
        protected void doSort(RoomGroupsColumn column) {
            super.doSort(column);
            iDepartmentalGroupsTable.setSortBy(RoomCookie.getInstance().getRoomGroupsSortBy());
        }
    };
    iGroupsPanel.addRow(iGlobalGroupsTable);
    iGroupsPanel.getRowFormatter().setVisible(iGlobalGroupsRow, false);
    iGroupsPanel.getRowFormatter().setVisible(iGlobalGroupsRow + 1, false);

    iDepartmentalGroupsHeader = new UniTimeHeaderPanel(MESSAGES.headerDepartmentalRoomGroups());
    iDepartmentalGroupsRow = iGroupsPanel.addHeaderRow(iDepartmentalGroupsHeader);
    iDepartmentalGroupsTable = new RoomGroupsTable(false) {
        protected void doSort(RoomGroupsColumn column) {
            super.doSort(column);
            iGlobalGroupsTable.setSortBy(RoomCookie.getInstance().getRoomGroupsSortBy());
        }
    };
    iGroupsPanel.addRow(iDepartmentalGroupsTable);
    iGroupsPanel.getRowFormatter().setVisible(iDepartmentalGroupsRow, false);
    iGroupsPanel.getRowFormatter().setVisible(iDepartmentalGroupsRow + 1, false);

    iRootPanel = new SimplePanel(iGroupsPanel);
    iPanel.setWidget(iRootPanel);

    iGlobalGroupsTable.addMouseClickListener(new MouseClickListener<GroupInterface>() {
        @Override
        public void onMouseClick(final TableEvent<GroupInterface> event) {
            if (event.getData() != null && (event.getData().canDelete() || event.getData().canEdit()))
                edit(event.getData());
        }
    });

    iDepartmentalGroupsTable.addMouseClickListener(new MouseClickListener<GroupInterface>() {
        @Override
        public void onMouseClick(final TableEvent<GroupInterface> event) {
            if (event.getData() != null && (event.getData().canDelete() || event.getData().canEdit()))
                edit(event.getData());
        }
    });

    initWidget(iPanel);

    History.addValueChangeHandler(new ValueChangeHandler<String>() {
        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            if (!iInitialized)
                return;
            iHistoryToken.reset(event.getValue());
            updateFilter(iGroupsPanel.getRowFormatter().isVisible(iGlobalGroupsRow)
                    || iGroupsPanel.getRowFormatter().isVisible(iDepartmentalGroupsRow));
        }
    });
}

From source file:org.unitime.timetable.gwt.client.rooms.RoomsPage.java

License:Apache License

public RoomsPage() {
    if (Location.getParameter("mode") != null)
        iMode = RoomsPageMode.valueOf(Location.getParameter("mode").toUpperCase());
    iHistoryToken = new HistoryToken(iMode);

    iPanel = new SimplePanel();

    iRoomsPanel = new VerticalPanel();
    iRoomsPanel.setWidth("100%");

    ClickHandler clickSearch = new ClickHandler() {
        @Override//from w w w.  ja v a  2 s.  c om
        public void onClick(ClickEvent event) {
            changeUrl();
            search(null);
        }
    };

    ClickHandler clickNew = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            iRoomEdit.setRoom(null);
            iRoomEdit.show();
        }
    };

    ClickHandler clickMore = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            if (iRoomsTable == null)
                return;

            final PopupPanel popup = new PopupPanel(true);
            MenuBar menu = new UniTimeTableHeader.MenuBarWithAccessKeys();

            if (iProperties != null && iProperties.isCanSaveFilterDefaults()) {
                MenuItem item = new MenuItem(MESSAGES.buttonClear(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        iFilter.setValue(iHistoryToken.getDefaultParameter("q", ""), true);
                        hideResults();
                        changeUrl();
                    }
                });
                Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                        UniTimeHeaderPanel.stripAccessKey(MESSAGES.buttonClear()));
                menu.addItem(item);
                menu.addSeparator();
            }

            boolean first = true;
            List<Operation> showHide = iRoomsTable.getShowHideOperations();
            if (!showHide.isEmpty()) {
                MenuBar submenu = new MenuBar(true);
                for (final Operation op : showHide) {
                    MenuItem item = new MenuItem(op.getName(), true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            op.execute();
                        }
                    });
                    if (op instanceof AriaOperation)
                        Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                                ((AriaOperation) op).getAriaLabel());
                    else
                        Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                                UniTimeHeaderPanel.stripAccessKey(op.getName()));
                    submenu.addItem(item);
                }
                MenuItem columns = new MenuItem(MESSAGES.opColumns(), submenu);
                columns.getElement().getStyle().setCursor(Cursor.POINTER);
                menu.addItem(columns);
                first = false;
            }

            List<Operation> sorts = iRoomsTable.getSortOperations();
            if (!sorts.isEmpty()) {
                MenuBar submenu = new MenuBar(true);
                for (final Operation op : sorts) {
                    String name = op.getName();
                    if (op instanceof HasColumnName)
                        name = ((HasColumnName) op).getColumnName();
                    MenuItem item = new MenuItem(name, true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            op.execute();
                        }
                    });
                    if (op instanceof AriaOperation)
                        Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                                ((AriaOperation) op).getAriaLabel());
                    else
                        Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                                UniTimeHeaderPanel.stripAccessKey(op.getName()));
                    submenu.addItem(item);
                }
                MenuItem columns = new MenuItem(MESSAGES.opSort(), submenu);
                columns.getElement().getStyle().setCursor(Cursor.POINTER);
                menu.addItem(columns);
                first = false;
            }

            if (iRoomsTable.hasDepartmentOperations()) {
                List<Operation> depts = iRoomsTable.getDepartmentOperations();
                if (!depts.isEmpty()) {
                    MenuBar submenu = new MenuBar(true);
                    for (final Operation op : depts) {
                        MenuItem item = new MenuItem(op.getName(), true, new Command() {
                            @Override
                            public void execute() {
                                popup.hide();
                                op.execute();
                            }
                        });
                        if (op instanceof AriaOperation)
                            Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                                    ((AriaOperation) op).getAriaLabel());
                        else
                            Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                                    UniTimeHeaderPanel.stripAccessKey(op.getName()));
                        submenu.addItem(item);
                    }
                    MenuItem columns = new MenuItem(MESSAGES.opDepartmentFormat(), submenu);
                    columns.getElement().getStyle().setCursor(Cursor.POINTER);
                    menu.addItem(columns);
                    first = false;
                }
            }

            if (iRoomsTable.hasOrientationOperations()) {
                MenuBar orientation = null;
                if (!RoomCookie.getInstance().isGridAsText()) {
                    if (orientation == null)
                        orientation = new MenuBar(true);
                    MenuItem item = new MenuItem(MESSAGES.opOrientationAsText(), true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            RoomCookie.getInstance().setOrientation(true,
                                    RoomCookie.getInstance().areRoomsHorizontal());
                            iRoomsTable.refreshTable();
                        }
                    });
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            MESSAGES.opOrientationAsText());
                    orientation.addItem(item);
                }
                if (RoomCookie.getInstance().isGridAsText()) {
                    if (orientation == null)
                        orientation = new MenuBar(true);
                    MenuItem item = new MenuItem(MESSAGES.opOrientationAsGrid(), true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            RoomCookie.getInstance().setOrientation(false,
                                    RoomCookie.getInstance().areRoomsHorizontal());
                            iRoomsTable.refreshTable();
                        }
                    });
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            MESSAGES.opOrientationAsGrid());
                    orientation.addItem(item);
                }
                if (!RoomCookie.getInstance().isGridAsText() && RoomCookie.getInstance().areRoomsHorizontal()) {
                    if (orientation == null)
                        orientation = new MenuBar(true);
                    MenuItem item = new MenuItem(MESSAGES.opOrientationVertical(), true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            RoomCookie.getInstance().setOrientation(false, false);
                            iRoomsTable.refreshTable();
                        }
                    });
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            MESSAGES.opOrientationVertical());
                    orientation.addItem(item);
                }
                if (!RoomCookie.getInstance().isGridAsText()
                        && !RoomCookie.getInstance().areRoomsHorizontal()) {
                    if (orientation == null)
                        orientation = new MenuBar(true);
                    MenuItem item = new MenuItem(MESSAGES.opOrientationHorizontal(), true, new Command() {
                        @Override
                        public void execute() {
                            popup.hide();
                            RoomCookie.getInstance().setOrientation(false, true);
                            iRoomsTable.refreshTable();
                        }
                    });
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            MESSAGES.opOrientationHorizontal());
                    orientation.addItem(item);
                }
                if (iProperties != null && iProperties.hasModes() && !RoomCookie.getInstance().isGridAsText()) {
                    boolean firstMode = true;
                    for (final RoomSharingDisplayMode mode : iProperties.getModes()) {
                        if (!mode.toHex().equals(RoomCookie.getInstance().getMode())) {
                            if (orientation == null)
                                orientation = new MenuBar(true);
                            else if (firstMode)
                                orientation.addSeparator();
                            firstMode = false;
                            MenuItem item = new MenuItem(mode.getName(), true, new Command() {
                                @Override
                                public void execute() {
                                    popup.hide();
                                    RoomCookie.getInstance().setMode(
                                            RoomCookie.getInstance().areRoomsHorizontal(), mode.toHex());
                                    iRoomsTable.refreshTable();
                                }
                            });
                            Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(), mode.getName());
                            orientation.addItem(item);
                        }
                    }
                }
                if (orientation != null) {
                    MenuItem columns = new MenuItem(MESSAGES.opOrientation(), orientation);
                    columns.getElement().getStyle().setCursor(Cursor.POINTER);
                    menu.addItem(columns);
                    first = false;
                }
                ;
            }

            for (final Operation op : iRoomsTable.getOtherOperations()) {
                MenuItem item = new MenuItem(op.getName(), true, new Command() {
                    @Override
                    public void execute() {
                        popup.hide();
                        op.execute();
                    }
                });
                if (op instanceof AriaOperation)
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            ((AriaOperation) op).getAriaLabel());
                else
                    Roles.getMenuitemRole().setAriaLabelProperty(item.getElement(),
                            UniTimeHeaderPanel.stripAccessKey(op.getName()));
                if (op.hasSeparator() && !first)
                    menu.addSeparator();
                menu.addItem(item);
                first = false;
            }

            popup.add(menu);
            popup.showRelativeTo((UIObject) event.getSource());
            menu.focus();
        }
    };

    ClickHandler clickEditRoomSharing = new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            RoomFilterRpcRequest request = iFilter.getElementsRequest();
            request.getOptions().remove("department");
            LoadingWidget.execute(request, new AsyncCallback<FilterRpcResponse>() {
                @Override
                public void onFailure(Throwable caught) {
                    iFilter.setErrorHint(MESSAGES.failedToLoadRooms(caught.getMessage()));
                    UniTimeNotifications.error(MESSAGES.failedToLoadRooms(caught.getMessage()), caught);
                }

                @Override
                public void onSuccess(FilterRpcResponse result) {
                    iFilter.clearHint();
                    if (result == null || result.getResults() == null || result.getResults().isEmpty()) {
                        iFilter.setErrorHint(MESSAGES.errorNoRoomsMatchingFilter());
                        UniTimeNotifications.error(MESSAGES.errorNoRoomsMatchingFilter());
                    } else {
                        iRoomDepartmentsEdit.setRooms(result.getResults(),
                                iRoomsTable.hasSortBy() ? new Integer(iRoomsTable.getSortBy()) : null);
                        iRoomDepartmentsEdit.show();
                    }
                }
            }, MESSAGES.waitLoadingRooms());

        }
    };

    if (iMode.hasSessionSelection()) {
        iFilterForm = new SimpleForm();

        iHeaderPanel = new UniTimeHeaderPanel(MESSAGES.sectFilter());
        iFilterForm.addHeaderRow(iHeaderPanel);

        iSession = new AcademicSessionSelectionBox(iHistoryToken.getParameter("term"), "Rooms") {
            @Override
            protected void onInitializationSuccess(List<AcademicSession> sessions) {
                iFilterForm.setVisible(sessions != null && !sessions.isEmpty());
                UniTimePageHeader.getInstance().getRight().setVisible(false);
                UniTimePageHeader.getInstance().getRight().setPreventDefault(true);
                setup(getAcademicSessionId(), CONSTANTS.searchWhenPageIsLoaded()
                        && (iHistoryToken.hasParameter("id") || iHistoryToken.hasParameter("q")));
            }

            @Override
            protected void onInitializationFailure(Throwable caught) {
                UniTimeNotifications.error(MESSAGES.failedLoadSessions(caught.getMessage()), caught);
            }
        };
        iSession.addAcademicSessionChangeHandler(new AcademicSessionChangeHandler() {
            @Override
            public void onAcademicSessionChange(AcademicSessionChangeEvent event) {
                setup(event.getNewAcademicSessionId(),
                        iRoomsTable != null && iRoomsTable.isVisible() && iRoomsTable.getRowCount() > 1);
            }
        });
        ;
        iFilterForm.addRow(MESSAGES.propAcademicSession(), (Widget) iSession);

        iFilter = new RoomFilterBox(iSession);
        iFilterForm.addRow(MESSAGES.propRoomFilter(), iFilter);

        iRoomsPanel.add(iFilterForm);

        iHeaderPanel.addButton("search", MESSAGES.buttonSearch(), clickSearch);
        iHeaderPanel.addButton("more", MESSAGES.buttonMoreOperations(), clickMore);
        iHeaderPanel.addButton("new", MESSAGES.buttonAddNewRoom(), clickNew);
        iHeaderPanel.addButton("sharing", MESSAGES.buttonEditRoomSharing(), clickEditRoomSharing);
        iHeaderPanel.setEnabled("more", false);
        iHeaderPanel.setEnabled("new", false);
        iHeaderPanel.setEnabled("sharing", false);
    } else {
        iFilterPanel = new HorizontalPanel();
        iFilterPanel.setSpacing(3);

        Label filterLabel = new Label(MESSAGES.propFilter());
        iFilterPanel.add(filterLabel);
        iFilterPanel.setCellVerticalAlignment(filterLabel, HasVerticalAlignment.ALIGN_MIDDLE);

        iSession = new Session();
        iFilter = new RoomFilterBox(iSession);
        iFilterPanel.add(iFilter);

        iSearch = new AriaButton(MESSAGES.buttonSearch());
        iSearch.addStyleName("unitime-NoPrint");
        iSearch.addClickHandler(clickSearch);
        iFilterPanel.add(iSearch);

        iMore = new AriaButton(MESSAGES.buttonMoreOperations());
        iMore.setEnabled(false);
        iMore.addStyleName("unitime-NoPrint");
        iMore.addClickHandler(clickMore);
        iFilterPanel.add(iMore);

        iNew = new AriaButton(MESSAGES.buttonAddNewRoom());
        iNew.setEnabled(false);
        iNew.addStyleName("unitime-NoPrint");
        iNew.addClickHandler(clickNew);
        iFilterPanel.add(iNew);

        iEditRoomSharing = new AriaButton(MESSAGES.buttonEditRoomSharing());
        iEditRoomSharing.setEnabled(false);
        iEditRoomSharing.setVisible(false);
        iEditRoomSharing.addStyleName("unitime-NoPrint");
        iEditRoomSharing.addClickHandler(clickEditRoomSharing);
        iFilterPanel.add(iEditRoomSharing);

        iRoomsPanel.add(iFilterPanel);
        iRoomsPanel.setCellHorizontalAlignment(iFilterPanel, HasHorizontalAlignment.ALIGN_CENTER);

        setup(null, CONSTANTS.searchWhenPageIsLoaded()
                && (iHistoryToken.hasParameter("id") || iHistoryToken.hasParameter("q")));
    }

    iRoomsTable = new RoomsTable(iMode);
    iRoomsTable.getElement().getStyle().setMarginTop(10, Unit.PX);
    iRoomsPanel.add(iRoomsTable);

    iRootPanel = new SimplePanel(iRoomsPanel);
    iPanel.setWidget(iRootPanel);

    initWidget(iPanel);

    History.addValueChangeHandler(new ValueChangeHandler<String>() {
        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            if (!iInitialized)
                return;
            if ("id=add".equals(event.getValue()))
                iHistoryToken.parse(event.getValue());
            else
                iHistoryToken.reset(event.getValue());
            updateFilter(iRoomsTable.isVisible());
        }
    });

    iRoomsTable.addOperation(new Operation() {
        @Override
        public void execute() {
            export("rooms.pdf");
        }

        @Override
        public boolean isApplicable() {
            return iRoomsTable.getRowCount() > 0 && (iProperties != null && iProperties.isCanExportPdf());
        }

        @Override
        public boolean hasSeparator() {
            return false;
        }

        @Override
        public String getName() {
            return MESSAGES.opExportPDF();
        }
    });

    iRoomsTable.addOperation(new Operation() {
        @Override
        public void execute() {
            export("rooms.csv");
        }

        @Override
        public boolean isApplicable() {
            return iRoomsTable.getRowCount() > 0 && (iProperties != null && iProperties.isCanExportCsv());
        }

        @Override
        public boolean hasSeparator() {
            return false;
        }

        @Override
        public String getName() {
            return MESSAGES.opExportCSV();
        }
    });

    iRoomsTable.addMouseClickListener(new MouseClickListener<RoomDetailInterface>() {
        @Override
        public void onMouseClick(final TableEvent<RoomDetailInterface> event) {
            if (event.getData() == null || !event.getData().isCanShowDetail())
                return;
            iRoomDetail.setRoom(event.getData());
            iRoomDetail.show();
        }
    });

    iRoomDetail = new RoomDetail(iMode) {
        @Override
        protected void onHide() {
            iRootPanel.setWidget(iRoomsPanel);
            UniTimePageLabel.getInstance().setPageName(MESSAGES.pageRooms());
            if (iRoomsTable != null && iRoomsTable.isVisible())
                search(getRoom() == null ? null : getRoom().getUniqueId());
            changeUrl();
        }

        @Override
        protected void onShow() {
            iRootPanel.setWidget(iRoomDetail);
            changeUrl();
        }

        @Override
        protected void edit() {
            final Long roomId = (getRoom() == null ? null : getRoom().getUniqueId());
            if (roomId != null) {
                FilterRpcRequest rooms = iFilter.createRpcRequest();
                rooms.setCommand(FilterRpcRequest.Command.ENUMERATE);
                rooms.addOption("id", getRoom().getUniqueId().toString());
                rooms.setSessionId(iProperties.getAcademicSessionId());
                LoadingWidget.execute(rooms, new AsyncCallback<FilterRpcResponse>() {
                    @Override
                    public void onFailure(Throwable caught) {
                        UniTimeNotifications.error(MESSAGES.failedToLoadRoomDetails(caught.getMessage()),
                                caught);
                    }

                    @Override
                    public void onSuccess(FilterRpcResponse result) {
                        if (result == null || result.getResults() == null || result.getResults().isEmpty()) {
                            UniTimeNotifications.error(MESSAGES.errorRoomDoesNotExist(roomId.toString()));
                        } else {
                            iRoomEdit.setRoom((RoomDetailInterface) result.getResults().get(0));
                            iRoomEdit.show();
                        }
                    }
                }, MESSAGES.waitLoadingRoomDetails());
            } else {
                hide();
            }
        }

        @Override
        protected RoomDetailInterface getPrevious(Long roomId) {
            return iRoomsTable == null ? null : iRoomsTable.getPrevious(roomId);
        }

        @Override
        protected RoomDetailInterface getNext(Long roomId) {
            return iRoomsTable == null ? null : iRoomsTable.getNext(roomId);
        }

        @Override
        protected void previous(final RoomDetailInterface room) {
            setRoom(room);
            changeUrl();
        }

        @Override
        protected void next(final RoomDetailInterface room) {
            setRoom(room);
            changeUrl();
        }

        @Override
        public void hide() {
            super.hide();
        }
    };

    iRoomEdit = new RoomEdit(iMode) {
        @Override
        protected void onShow() {
            iRootPanel.setWidget(iRoomEdit);
            changeUrl();
        }

        @Override
        protected void onHide(RoomDetailInterface detail, boolean canShowDetail, String message) {
            if (!canShowDetail || (detail == null && getRoom().getUniqueId() == null)) {
                iRootPanel.setWidget(iRoomsPanel);
                UniTimePageLabel.getInstance().setPageName(MESSAGES.pageRooms());
                if (iRoomsTable.isVisible())
                    search(detail == null ? null : detail.getUniqueId());
            } else {
                if (detail != null)
                    iRoomDetail.setRoom(detail);
                iRoomDetail.show(message);
            }
            changeUrl();
        }
    };

    iRoomDepartmentsEdit = new RoomDepartmentsEdit() {
        @Override
        protected void onShow() {
            iRootPanel.setWidget(iRoomDepartmentsEdit);
        }

        @Override
        protected void onHide(boolean refresh) {
            iRootPanel.setWidget(iRoomsPanel);
            UniTimePageLabel.getInstance().setPageName(MESSAGES.pageRooms());
            if (refresh && iRoomsTable.isVisible())
                search(null);
        }
    };

    iFilter.addValueChangeHandler(new ValueChangeHandler<String>() {
        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            if (iEditRoomSharing != null)
                iEditRoomSharing.setEnabled(iRoomDepartmentsEdit.setDepartmentOrExamType(iFilter)
                        && iRoomDepartmentsEdit.canEdit());
            if (iHeaderPanel != null)
                iHeaderPanel.setEnabled("sharing",
                        iProperties != null
                                && (iProperties.isCanEditRoomExams() || iProperties.isCanEditDepartments())
                                && iRoomDepartmentsEdit.setDepartmentOrExamType(iFilter)
                                && iRoomDepartmentsEdit.canEdit());
        }
    });
}