SideBySide2: Display icon during selection to insert comment
Since double click doesn't work on CodeMirror but range selection does, display a small comment box icon above and to the right of the end of the selection region. Clicking this icon will create a new draft comment on the region. Change-Id: Id0533b698952d707b720b37fb405e78f1e54e7a8
This commit is contained in:
		@@ -37,6 +37,7 @@ class DiffTable extends Composite {
 | 
				
			|||||||
  private static final Binder uiBinder = GWT.create(Binder.class);
 | 
					  private static final Binder uiBinder = GWT.create(Binder.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  interface DiffTableStyle extends CssResource {
 | 
					  interface DiffTableStyle extends CssResource {
 | 
				
			||||||
 | 
					    String insertCommentIcon();
 | 
				
			||||||
    String fullscreen();
 | 
					    String fullscreen();
 | 
				
			||||||
    String intralineBg();
 | 
					    String intralineBg();
 | 
				
			||||||
    String diff();
 | 
					    String diff();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,11 @@ limitations under the License.
 | 
				
			|||||||
    @external .cm-keymap-fat-cursor, CodeMirror-cursor;
 | 
					    @external .cm-keymap-fat-cursor, CodeMirror-cursor;
 | 
				
			||||||
    @external .cm-searching, .cm-trailingspace, .cm-tab;
 | 
					    @external .cm-searching, .cm-trailingspace, .cm-tab;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .insertCommentIcon {
 | 
				
			||||||
 | 
					      cursor: pointer;
 | 
				
			||||||
 | 
					      position: absolute;
 | 
				
			||||||
 | 
					      z-index: 150;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    .fullscreen {
 | 
					    .fullscreen {
 | 
				
			||||||
      background-color: #f7f7f7;
 | 
					      background-color: #f7f7f7;
 | 
				
			||||||
      border-bottom: 1px solid #ddd;
 | 
					      border-bottom: 1px solid #ddd;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,7 +54,10 @@ import com.google.gwt.core.client.Scheduler.RepeatingCommand;
 | 
				
			|||||||
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 | 
					import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 | 
				
			||||||
import com.google.gwt.dom.client.Element;
 | 
					import com.google.gwt.dom.client.Element;
 | 
				
			||||||
import com.google.gwt.dom.client.NativeEvent;
 | 
					import com.google.gwt.dom.client.NativeEvent;
 | 
				
			||||||
 | 
					import com.google.gwt.dom.client.Style;
 | 
				
			||||||
import com.google.gwt.dom.client.Style.Unit;
 | 
					import com.google.gwt.dom.client.Style.Unit;
 | 
				
			||||||
 | 
					import com.google.gwt.event.dom.client.ClickEvent;
 | 
				
			||||||
 | 
					import com.google.gwt.event.dom.client.ClickHandler;
 | 
				
			||||||
import com.google.gwt.event.dom.client.KeyCodes;
 | 
					import com.google.gwt.event.dom.client.KeyCodes;
 | 
				
			||||||
import com.google.gwt.event.dom.client.KeyPressEvent;
 | 
					import com.google.gwt.event.dom.client.KeyPressEvent;
 | 
				
			||||||
import com.google.gwt.event.logical.shared.ResizeEvent;
 | 
					import com.google.gwt.event.logical.shared.ResizeEvent;
 | 
				
			||||||
@@ -65,6 +68,7 @@ import com.google.gwt.uibinder.client.UiField;
 | 
				
			|||||||
import com.google.gwt.user.client.Window;
 | 
					import com.google.gwt.user.client.Window;
 | 
				
			||||||
import com.google.gwt.user.client.rpc.AsyncCallback;
 | 
					import com.google.gwt.user.client.rpc.AsyncCallback;
 | 
				
			||||||
import com.google.gwt.user.client.ui.FlowPanel;
 | 
					import com.google.gwt.user.client.ui.FlowPanel;
 | 
				
			||||||
 | 
					import com.google.gwt.user.client.ui.Image;
 | 
				
			||||||
import com.google.gwt.user.client.ui.SimplePanel;
 | 
					import com.google.gwt.user.client.ui.SimplePanel;
 | 
				
			||||||
import com.google.gwt.user.client.ui.Widget;
 | 
					import com.google.gwt.user.client.ui.Widget;
 | 
				
			||||||
import com.google.gwtexpui.globalkey.client.GlobalKey;
 | 
					import com.google.gwtexpui.globalkey.client.GlobalKey;
 | 
				
			||||||
@@ -73,6 +77,7 @@ import com.google.gwtexpui.globalkey.client.KeyCommandSet;
 | 
				
			|||||||
import com.google.gwtexpui.globalkey.client.ShowHelpCommand;
 | 
					import com.google.gwtexpui.globalkey.client.ShowHelpCommand;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import net.codemirror.lib.CodeMirror;
 | 
					import net.codemirror.lib.CodeMirror;
 | 
				
			||||||
 | 
					import net.codemirror.lib.CodeMirror.BeforeSelectionChangeHandler;
 | 
				
			||||||
import net.codemirror.lib.CodeMirror.GutterClickHandler;
 | 
					import net.codemirror.lib.CodeMirror.GutterClickHandler;
 | 
				
			||||||
import net.codemirror.lib.CodeMirror.LineClassWhere;
 | 
					import net.codemirror.lib.CodeMirror.LineClassWhere;
 | 
				
			||||||
import net.codemirror.lib.CodeMirror.LineHandle;
 | 
					import net.codemirror.lib.CodeMirror.LineHandle;
 | 
				
			||||||
@@ -83,6 +88,7 @@ import net.codemirror.lib.KeyMap;
 | 
				
			|||||||
import net.codemirror.lib.LineCharacter;
 | 
					import net.codemirror.lib.LineCharacter;
 | 
				
			||||||
import net.codemirror.lib.LineWidget;
 | 
					import net.codemirror.lib.LineWidget;
 | 
				
			||||||
import net.codemirror.lib.ModeInjector;
 | 
					import net.codemirror.lib.ModeInjector;
 | 
				
			||||||
 | 
					import net.codemirror.lib.Rect;
 | 
				
			||||||
import net.codemirror.lib.TextMarker;
 | 
					import net.codemirror.lib.TextMarker;
 | 
				
			||||||
import net.codemirror.lib.TextMarker.FromTo;
 | 
					import net.codemirror.lib.TextMarker.FromTo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -314,6 +320,7 @@ public class SideBySide2 extends Screen {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private void registerCmEvents(final CodeMirror cm) {
 | 
					  private void registerCmEvents(final CodeMirror cm) {
 | 
				
			||||||
 | 
					    cm.on("beforeSelectionChange", onSelectionChange(cm));
 | 
				
			||||||
    cm.on("cursorActivity", updateActiveLine(cm));
 | 
					    cm.on("cursorActivity", updateActiveLine(cm));
 | 
				
			||||||
    cm.on("gutterClick", onGutterClick(cm));
 | 
					    cm.on("gutterClick", onGutterClick(cm));
 | 
				
			||||||
    cm.on("renderLine", resizeLinePadding(getSideFromCm(cm)));
 | 
					    cm.on("renderLine", resizeLinePadding(getSideFromCm(cm)));
 | 
				
			||||||
@@ -399,6 +406,47 @@ public class SideBySide2 extends Screen {
 | 
				
			|||||||
        .on("Shift-Right", flipCursorSide(cm, false)));
 | 
					        .on("Shift-Right", flipCursorSide(cm, false)));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private BeforeSelectionChangeHandler onSelectionChange(final CodeMirror cm) {
 | 
				
			||||||
 | 
					    return new BeforeSelectionChangeHandler() {
 | 
				
			||||||
 | 
					      private Image icon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @Override
 | 
				
			||||||
 | 
					      public void handle(CodeMirror cm, LineCharacter anchor, LineCharacter head) {
 | 
				
			||||||
 | 
					        if (anchor == head
 | 
				
			||||||
 | 
					            || (anchor.getLine() == head.getLine()
 | 
				
			||||||
 | 
					             && anchor.getCh() == head.getCh())) {
 | 
				
			||||||
 | 
					          if (icon != null) {
 | 
				
			||||||
 | 
					            icon.setVisible(false);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        } else if (icon == null) {
 | 
				
			||||||
 | 
					          init(anchor);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        icon.setVisible(true);
 | 
				
			||||||
 | 
					        Rect r = cm.charCoords(head, "local");
 | 
				
			||||||
 | 
					        Style s = icon.getElement().getStyle();
 | 
				
			||||||
 | 
					        s.setTop((int) (r.top() - icon.getOffsetHeight() + 2), Unit.PX);
 | 
				
			||||||
 | 
					        s.setLeft((int) (r.right() - icon.getOffsetWidth() / 2), Unit.PX);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      private void init(LineCharacter anchor) {
 | 
				
			||||||
 | 
					        icon = new Image(Gerrit.RESOURCES.draftComments());
 | 
				
			||||||
 | 
					        icon.setTitle(PatchUtil.C.commentInsert());
 | 
				
			||||||
 | 
					        icon.setStyleName(DiffTable.style.insertCommentIcon());
 | 
				
			||||||
 | 
					        icon.addClickHandler(new ClickHandler() {
 | 
				
			||||||
 | 
					          @Override
 | 
				
			||||||
 | 
					          public void onClick(ClickEvent event) {
 | 
				
			||||||
 | 
					            icon.setVisible(false);
 | 
				
			||||||
 | 
					            insertNewDraft(cm).run();
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        add(icon);
 | 
				
			||||||
 | 
					        cm.addWidget(anchor, icon.getElement(), false);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  public void registerKeys() {
 | 
					  public void registerKeys() {
 | 
				
			||||||
    super.registerKeys();
 | 
					    super.registerKeys();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -133,6 +133,7 @@ class SkipBar extends Composite {
 | 
				
			|||||||
  void expandAll() {
 | 
					  void expandAll() {
 | 
				
			||||||
    clearMarkerAndWidget();
 | 
					    clearMarkerAndWidget();
 | 
				
			||||||
    removeFromParent();
 | 
					    removeFromParent();
 | 
				
			||||||
 | 
					    updateSelection();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private void expandBefore() {
 | 
					  private void expandBefore() {
 | 
				
			||||||
@@ -148,6 +149,7 @@ class SkipBar extends Composite {
 | 
				
			|||||||
        .set("noHScroll", true);
 | 
					        .set("noHScroll", true);
 | 
				
			||||||
    setWidget(cm.addLineWidget(newStart - 1, getElement(), config));
 | 
					    setWidget(cm.addLineWidget(newStart - 1, getElement(), config));
 | 
				
			||||||
    updateSkipNum();
 | 
					    updateSkipNum();
 | 
				
			||||||
 | 
					    updateSelection();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private void expandAfter() {
 | 
					  private void expandAfter() {
 | 
				
			||||||
@@ -167,6 +169,14 @@ class SkipBar extends Composite {
 | 
				
			|||||||
      setWidget(cm.addLineWidget(newEnd + 1, getElement(), config));
 | 
					      setWidget(cm.addLineWidget(newEnd + 1, getElement(), config));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    updateSkipNum();
 | 
					    updateSkipNum();
 | 
				
			||||||
 | 
					    updateSelection();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private void updateSelection() {
 | 
				
			||||||
 | 
					    if (cm.somethingSelected()) {
 | 
				
			||||||
 | 
					      FromTo sel = cm.getSelectedRange();
 | 
				
			||||||
 | 
					      cm.setSelection(sel.getFrom(), sel.getTo());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @UiHandler("skipNum")
 | 
					  @UiHandler("skipNum")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -138,6 +138,10 @@ public class CodeMirror extends JavaScriptObject {
 | 
				
			|||||||
    return this.heightAtLine(line, mode);
 | 
					    return this.heightAtLine(line, mode);
 | 
				
			||||||
  }-*/;
 | 
					  }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public final native Rect charCoords(LineCharacter pos, String mode) /*-{
 | 
				
			||||||
 | 
					    return this.charCoords(pos, mode);
 | 
				
			||||||
 | 
					  }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public final native CodeMirrorDoc getDoc() /*-{
 | 
					  public final native CodeMirrorDoc getDoc() /*-{
 | 
				
			||||||
    return this.getDoc();
 | 
					    return this.getDoc();
 | 
				
			||||||
  }-*/;
 | 
					  }-*/;
 | 
				
			||||||
@@ -197,6 +201,12 @@ public class CodeMirror extends JavaScriptObject {
 | 
				
			|||||||
    }));
 | 
					    }));
 | 
				
			||||||
  }-*/;
 | 
					  }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public final native void on(String event, BeforeSelectionChangeHandler handler) /*-{
 | 
				
			||||||
 | 
					    this.on(event, $entry(function(cm, e) {
 | 
				
			||||||
 | 
					      handler.@net.codemirror.lib.CodeMirror.BeforeSelectionChangeHandler::handle(Lnet/codemirror/lib/CodeMirror;Lnet/codemirror/lib/LineCharacter;Lnet/codemirror/lib/LineCharacter;)(cm,e.anchor,e.head);
 | 
				
			||||||
 | 
					    }));
 | 
				
			||||||
 | 
					  }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public final native LineCharacter getCursor() /*-{
 | 
					  public final native LineCharacter getCursor() /*-{
 | 
				
			||||||
    return this.getCursor();
 | 
					    return this.getCursor();
 | 
				
			||||||
  }-*/;
 | 
					  }-*/;
 | 
				
			||||||
@@ -209,8 +219,12 @@ public class CodeMirror extends JavaScriptObject {
 | 
				
			|||||||
    return FromTo.create(getCursor("start"), getCursor("end"));
 | 
					    return FromTo.create(getCursor("start"), getCursor("end"));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public final native void setSelection(LineCharacter lineCh) /*-{
 | 
					  public final native void setSelection(LineCharacter anchor) /*-{
 | 
				
			||||||
    this.setSelection(lineCh);
 | 
					    this.setSelection(anchor);
 | 
				
			||||||
 | 
					  }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public final native void setSelection(LineCharacter anchor, LineCharacter head) /*-{
 | 
				
			||||||
 | 
					    this.setSelection(anchor, head);
 | 
				
			||||||
  }-*/;
 | 
					  }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public final native void setCursor(LineCharacter lineCh) /*-{
 | 
					  public final native void setCursor(LineCharacter lineCh) /*-{
 | 
				
			||||||
@@ -345,4 +359,8 @@ public class CodeMirror extends JavaScriptObject {
 | 
				
			|||||||
    public void handle(CodeMirror instance, int line, String gutter,
 | 
					    public void handle(CodeMirror instance, int line, String gutter,
 | 
				
			||||||
        NativeEvent clickEvent);
 | 
					        NativeEvent clickEvent);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public interface BeforeSelectionChangeHandler {
 | 
				
			||||||
 | 
					    public void handle(CodeMirror instance, LineCharacter anchor, LineCharacter head);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								gerrit-gwtui/src/main/java/net/codemirror/lib/Rect.java
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								gerrit-gwtui/src/main/java/net/codemirror/lib/Rect.java
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					// Copyright (C) 2013 The Android Open Source Project
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package net.codemirror.lib;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gwt.core.client.JavaScriptObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** {left, right, top, bottom} objects used within CodeMirror. */
 | 
				
			||||||
 | 
					public class Rect extends JavaScriptObject {
 | 
				
			||||||
 | 
					  public final native double left() /*-{ return this.left }-*/;
 | 
				
			||||||
 | 
					  public final native double right() /*-{ return this.right }-*/;
 | 
				
			||||||
 | 
					  public final native double top() /*-{ return this.top }-*/;
 | 
				
			||||||
 | 
					  public final native double bottom() /*-{ return this.bottom }-*/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected Rect() {
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user