public LinkedPosition getCurrentLinkedPosition() {
   int start = context.getSelectionOffset();
   int end = start + context.getSelectionLength();
   LinkedPosition[] positions = fLinkedPositionGroup.getPositions();
   for (int i = 0; i < positions.length; i++) {
     LinkedPosition position = positions[i];
     if (position.includes(start) && position.includes(end)) {
       return position;
     }
   }
   return null;
 }
 private void restoreFullSelection() {
   if (fOriginalSelection.y != 0) {
     int originalOffset = fOriginalSelection.x;
     LinkedPosition[] positions = fLinkedPositionGroup.getPositions();
     for (int i = 0; i < positions.length; i++) {
       LinkedPosition position = positions[i];
       if (!position.isDeleted() && position.includes(originalOffset)) {
         fEditor.getViewer().setSelectedRange(position.offset, position.length);
         return;
       }
     }
   }
 }
 public LinkedPosition getCurrentLinkedPosition() {
   Point selection = fEditor.getViewer().getSelectedRange();
   int start = selection.x;
   int end = start + selection.y;
   LinkedPosition[] positions = fLinkedPositionGroup.getPositions();
   for (int i = 0; i < positions.length; i++) {
     LinkedPosition position = positions[i];
     if (position.includes(start) && position.includes(end)) {
       return position;
     }
   }
   return null;
 }
 public boolean isOriginalName() {
   try {
     String newName = fNamePosition.getContent();
     return fOriginalName.equals(newName);
   } catch (BadLocationException e) {
     return false;
   }
 }
 public boolean isEnabled() {
   try {
     String newName = fNamePosition.getContent();
     if (fOriginalName.equals(newName)) {
       return false;
     }
     // TODO(scheglov) we may be rename not only variable, but also method, type, etc
     return NamingConventions.validateVariableName(newName).isOK();
   } catch (BadLocationException e) {
     return false;
   }
 }
  @Override
  public ExitFlags doExit(LinkedModeModel model, VerifyEvent event, int offset, int length) {
    if (length == 0 && (event.character == SWT.BS || event.character == SWT.DEL)) {
      LinkedPosition position =
          model.findPosition(new LinkedPosition(fDocument, offset, 0, LinkedPositionGroup.NO_STOP));
      if (position != null) {
        if (event.character == SWT.BS) {
          if (offset - 1 < position.getOffset()) {
            // skip backspace at beginning of linked position
            event.doit = false;
          }
        } else /* event.character == SWT.DEL */ {
          if (offset + 1 > position.getOffset() + position.getLength()) {
            // skip delete at end of linked position
            event.doit = false;
          }
        }
      }
    }

    return null; // don't change behavior
  }
  public void startFullDialog() {
    cancel();

    try {
      String newName = fNamePosition.getContent();
      RenameSupport renameSupport = undoAndCreateRenameSupport(newName);
      if (renameSupport != null) {
        renameSupport.openDialog(fEditor.getSite().getShell());
      }
    } catch (CoreException e) {
      DartToolsPlugin.log(e);
    } catch (BadLocationException e) {
      DartToolsPlugin.log(e);
    }
  }
 public boolean isEnabled() {
   try {
     String newName = fNamePosition.getContent();
     if (fOriginalName.equals(newName)) {
       return false;
     }
     /*
      * TODO: use DartRenameProcessor#checkNewElementName(String) but make sure implementations
      * don't access outdated Dart Model (cache all necessary information before starting linked
      * mode).
      */
     // TODO(scheglov) we may be rename not only variable, but also method, type, etc
     return DartConventions.validateVariableName(newName).isOK();
   } catch (BadLocationException e) {
     return false;
   }
 }
  void doRename(boolean showPreview) {
    cancel();

    Image image = null;
    Label label = null;

    fShowPreview |= showPreview;
    try {
      ISourceViewer viewer = fEditor.getViewer();
      if (viewer instanceof SourceViewer) {
        SourceViewer sourceViewer = (SourceViewer) viewer;
        Control viewerControl = sourceViewer.getControl();
        if (viewerControl instanceof Composite) {
          Composite composite = (Composite) viewerControl;
          Display display = composite.getDisplay();

          // Flush pending redraw requests:
          while (!display.isDisposed() && display.readAndDispatch()) {}

          // Copy editor area:
          GC gc = new GC(composite);
          Point size;
          try {
            size = composite.getSize();
            image = new Image(gc.getDevice(), size.x, size.y);
            gc.copyArea(image, 0, 0);
          } finally {
            gc.dispose();
            gc = null;
          }

          // Persist editor area while executing refactoring:
          label = new Label(composite, SWT.NONE);
          label.setImage(image);
          label.setBounds(0, 0, size.x, size.y);
          label.moveAbove(null);
        }
      }

      String newName = fNamePosition.getContent();
      if (fOriginalName.equals(newName)) {
        return;
      }
      RenameSupport renameSupport = undoAndCreateRenameSupport(newName);
      if (renameSupport == null) {
        return;
      }

      Shell shell = fEditor.getSite().getShell();
      if (renameSupport.hasUnresolvedNameReferences()) {
        fShowPreview = true;
      }
      boolean executed;
      if (fShowPreview) { // could have been updated by undoAndCreateRenameSupport(..)
        executed = renameSupport.openDialog(shell, true);
      } else {
        renameSupport.perform(shell, fEditor.getSite().getWorkbenchWindow());
        executed = true;
      }
      if (executed) {
        restoreFullSelection();
      }
    } catch (CoreException ex) {
      DartToolsPlugin.log(ex);
    } catch (InterruptedException ex) {
      // canceling is OK -> redo text changes in that case?
    } catch (InvocationTargetException ex) {
      DartToolsPlugin.log(ex);
    } catch (BadLocationException e) {
      DartToolsPlugin.log(e);
    } finally {
      if (label != null) {
        label.dispose();
      }
      if (image != null) {
        image.dispose();
      }
    }
  }