package com.griddynamics.jagger.webclient.client.components; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.*; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.*; import com.griddynamics.jagger.webclient.client.SessionDataService; import com.griddynamics.jagger.dbapi.dto.SessionDataDto; import com.griddynamics.jagger.webclient.client.resources.JaggerResources; import com.sencha.gxt.core.client.GXT; import com.sencha.gxt.widget.core.client.treegrid.TreeGrid; public class UserCommentBox extends AbstractWindow { private int maxlength = 250; private VerticalPanel vp; private TextArea textArea; private TreeGrid<SessionComparisonPanel.TreeItem> treeGrid; private Label remainingCharsLabel; /** * Extended TextArea class to customize onPaste event */ private class FeaturedTextArea extends TextArea { public FeaturedTextArea() { super(); sinkEvents(Event.ONPASTE); } @Override public void onBrowserEvent(Event event){ super.onBrowserEvent(event); switch (event.getTypeInt()){ case Event.ONPASTE: { Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { ValueChangeEvent.fire(FeaturedTextArea.this, getText()); } }); break; } } } } public UserCommentBox(int maxlength) { super(); defaultButtonInitialization(); this.maxlength = maxlength; setTitle("User Comment"); vp = new VerticalPanel(); vp.setPixelSize(width,height); textArea = new FeaturedTextArea(); textArea.addStyleName(JaggerResources.INSTANCE.css().textAreaPanel()); textArea.setPixelSize(width, 440); textArea.getElement().setAttribute("maxlength", String.valueOf(maxlength)); remainingCharsLabel = new Label(String.valueOf(maxlength)); remainingCharsLabel.getElement().getStyle().setFontSize(12, Style.Unit.PX); HorizontalPanel remainCharsPanel = new HorizontalPanel(); remainCharsPanel.setSpacing(5); remainCharsPanel.setWidth("100%"); remainCharsPanel.setHorizontalAlignment(HasAlignment.ALIGN_LEFT); remainCharsPanel.add(remainingCharsLabel); textArea.addKeyPressHandler(new KeyPressHandler() { @Override public void onKeyPress(KeyPressEvent event){ onTextAreaContentChanged(); } }); textArea.addKeyDownHandler(new KeyDownHandler() { @Override public void onKeyDown(KeyDownEvent event) { onTextAreaContentChanged(); } }); textArea.addKeyUpHandler(new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { onTextAreaContentChanged(); } }); textArea.addValueChangeHandler(new ValueChangeHandler<String>() { @Override public void onValueChange(ValueChangeEvent<String> event) { onTextAreaContentChanged(); } }); vp.add(textArea); DockPanel dp = new DockPanel(); dp.setPixelSize(width,60); dp.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT); dp.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); dp.add(getDefaultButtonBar(), DockPanel.EAST); dp.add(new Label(""), DockPanel.CENTER); dp.add(remainCharsPanel, DockPanel.WEST); vp.add(dp); setAutoHideEnabled(true); add(vp); } @Override protected void onCancelButtonClick(){ hide(); } @Override protected void onApplyButtonClick() {} @Override protected void onSaveButtonClick(){ final String resultComment = textArea.getText().trim(); SessionDataService.Async.getInstance().saveUserComment(currentSessionDataDto.getId(), resultComment, new AsyncCallback<Void>() { @Override public void onFailure(Throwable caught) { new ExceptionPanel("Fail to save data : " + caught.getMessage()); hide(); } @Override public void onSuccess(Void result) { currentSessionDataDto.setUserComment(resultComment); currentTreeItem.put(getText(), resultComment); treeGrid.getTreeView().refresh(false); hide(); } }); } public void setTreeGrid(TreeGrid<SessionComparisonPanel.TreeItem> treeGrid) { this.treeGrid = treeGrid; } private void onTextAreaContentChanged() { int counter = textArea.getText().length(); if (GXT.isChrome()) { for (char c : textArea.getText().toCharArray()) { if (c == '\n') { counter ++; } } if (counter > maxlength) counter = maxlength; } int charsRemaining = maxlength - counter; remainingCharsLabel.setHorizontalAlignment(HasAlignment.ALIGN_LEFT); remainingCharsLabel.setText(Integer.toString(charsRemaining)); } private SessionComparisonPanel.TreeItem currentTreeItem; private SessionDataDto currentSessionDataDto; public void popUp(SessionDataDto sessionDataDto, String userComment, SessionComparisonPanel.TreeItem item) { if (sessionDataDto==null){ new ExceptionPanel("The session data has a value null. The session's id is wrong."); } getApplyButton().removeFromParent(); currentTreeItem = item; currentSessionDataDto = sessionDataDto; setText("Session " + sessionDataDto.getSessionId()); textArea.setText(userComment); onTextAreaContentChanged(); show(); textArea.setFocus(true); } }