package kornell.gui.client.presentation.classroom.generic.notes;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.TextArea;
import kornell.api.client.KornellClient;
import kornell.gui.client.KornellConstants;
import kornell.gui.client.util.view.Positioning;
public class NotesPopup {
private KornellConstants constants = GWT.create(KornellConstants.class);
PopupPanel popup;
PopupPanel glass;
TextArea richTextArea;
KornellClient client;
String courseClassUUID;
String notes;
public NotesPopup(final KornellClient client, final String courseUUID, final String notes) {
this.courseClassUUID = courseUUID;
this.notes = notes;
this.client = client;
glass = new PopupPanel();
glass.addStyleName("gwt-PopupPanelGlass");
popup = new PopupPanel(true);
popup.addStyleName("notesPopup");
richTextArea = new TextArea();
richTextArea.setText(notes);
richTextArea.addStyleName("notesTextArea");
popup.add(richTextArea);
addHandlers();
}
private void updateNotes(){
client.enrollments().notesUpdated(courseClassUUID, richTextArea.getText());
}
private void placePopup() {
int barWidth = Positioning.BAR_WIDTH;
int left = (Window.getClientWidth() - barWidth) / 2;
left = (Window.getClientWidth() % 2 == 0) ? left : left + 1;
int top = Window.getClientHeight() - Positioning.SOUTH_BAR - Positioning.NOTES_MIN_HEIGHT;
if(Window.getClientWidth() < barWidth){
left = 0;
barWidth = Window.getClientWidth();
}
popup.setPopupPosition(Math.max(left, 0), Math.max(top, 0));
popup.setWidth(barWidth + "px");
popup.getElement().getStyle().setPropertyPx("size", Positioning.NOTES_MIN_HEIGHT);
popup.getElement().getStyle().setPropertyPx("bottom", Positioning.SOUTH_BAR);
popup.setVisible(true);
}
public void show() {
placePopup();
glass.show();
popup.show();
richTextArea.setFocus(true);
richTextArea.getElement().setAttribute("placeholder", constants.notesPopupPlaceholder());
}
private void addHandlers() {
richTextArea.addKeyUpHandler(new KeyUpHandler() {
Timer updateTimer = new Timer() {
@Override
public void run() {
updateNotes();
}
};
@Override
public void onKeyUp(KeyUpEvent event) {
updateTimer.cancel();
updateTimer.schedule(1000);
}
});
Window.addResizeHandler(new ResizeHandler() {
Timer resizeTimer = new Timer() {
@Override
public void run() {
placePopup();
}
};
@Override
public void onResize(ResizeEvent event) {
resizeTimer.cancel();
resizeTimer.schedule(250);
}
});
popup.addCloseHandler(new CloseHandler<PopupPanel>() {
@Override
public void onClose(CloseEvent<PopupPanel> event) {
updateNotes();
glass.hide();
}
});
}
}