@Nullable
    public GutterIconRenderer createRenderer() {
      myCtrlPressed = myViewer.getModifierProvider().isCtrlPressed();

      boolean isEditable = DiffUtil.isEditable(myViewer.getEditor(mySide));
      boolean isOtherEditable = DiffUtil.isEditable(myViewer.getEditor(mySide.other()));
      boolean isAppendable =
          myFragment.getStartLine1() != myFragment.getEndLine1()
              && myFragment.getStartLine2() != myFragment.getEndLine2();

      if (isOtherEditable && isEditable) {
        if (myCtrlPressed && isAppendable) {
          return createAppendRenderer(mySide);
        } else {
          return createApplyRenderer(mySide);
        }
      } else if (isEditable) {
        return createRevertRenderer(mySide);
      } else if (isOtherEditable) {
        if (isAppendable) {
          return createAppendRenderer(mySide);
        }
      }
      return null;
    }
  @Nullable
  State processBaseChange(int oldLine1, int oldLine2, int shift) {
    int line1 = getStartLine();
    int line2 = getEndLine();

    UpdatedLineRange newRange =
        DiffUtil.updateRangeOnModification(line1, line2, oldLine1, oldLine2, shift);

    boolean rangeAffected =
        newRange.damaged
            || (oldLine2 >= line1
                && oldLine1 <= line2); // RangeMarker can be updated in a different way
    State oldState = rangeAffected ? storeState() : null;

    if (newRange.startLine == newRange.endLine
        && getDiffType() == TextDiffType.DELETED
        && !isResolved()) {
      if (oldState == null) oldState = storeState();
      myViewer.markChangeResolved(this);
    }

    setStartLine(newRange.startLine);
    setEndLine(newRange.endLine);

    return oldState;
  }
 @Nullable
 private GutterIconRenderer createIconRenderer(
     @NotNull final Side sourceSide,
     @NotNull final String tooltipText,
     @NotNull final Icon icon,
     @NotNull final Runnable perform) {
   if (!DiffUtil.isEditable(myViewer.getEditor(sourceSide.other()))) return null;
   return new DiffGutterRenderer(icon, tooltipText) {
     @Override
     protected void performAction(AnActionEvent e) {
       if (!myIsValid) return;
       final Project project = e.getProject();
       final Document document = myViewer.getEditor(sourceSide.other()).getDocument();
       DiffUtil.executeWriteCommand(
           document,
           project,
           "Replace change",
           new Runnable() {
             @Override
             public void run() {
               perform.run();
             }
           });
     }
   };
 }
  private void createHighlighter(@NotNull Side side, boolean ignored) {
    Editor editor = myViewer.getEditor(side);

    TextDiffType type = DiffUtil.getLineDiffType(myFragment);
    int startLine = side.getStartLine(myFragment);
    int endLine = side.getEndLine(myFragment);

    myHighlighters.addAll(
        DiffDrawUtil.createHighlighter(editor, startLine, endLine, type, ignored));
    myHighlighters.addAll(DiffDrawUtil.createLineMarker(editor, startLine, endLine, type, false));
  }
  private void createInlineHighlighter(@NotNull DiffFragment fragment, @NotNull Side side) {
    int start = side.getStartOffset(fragment);
    int end = side.getEndOffset(fragment);
    TextDiffType type = DiffUtil.getDiffType(fragment);

    int startOffset = side.getStartOffset(myFragment);
    start += startOffset;
    end += startOffset;

    Editor editor = myViewer.getEditor(side);
    myHighlighters.addAll(DiffDrawUtil.createInlineHighlighter(editor, start, end, type));
  }
 @Nullable
 private GutterIconRenderer createAppendRenderer(@NotNull final Side side) {
   return createIconRenderer(
       side,
       "Append",
       DiffUtil.getArrowDownIcon(side),
       new Runnable() {
         @Override
         public void run() {
           myViewer.appendChange(SimpleDiffChange.this, side);
         }
       });
 }
 @Nullable
 private GutterIconRenderer createIconRenderer(
     @NotNull final String text,
     @NotNull final Icon icon,
     boolean ctrlClickVisible,
     @NotNull final Runnable perform) {
   final String tooltipText =
       DiffUtil.createTooltipText(text, ctrlClickVisible ? CTRL_CLICK_TO_RESOLVE : null);
   return new DiffGutterRenderer(icon, tooltipText) {
     @Override
     protected void performAction(AnActionEvent e) {
       perform.run();
     }
   };
 }
 @Nullable
 private GutterIconRenderer createApplyRenderer(@NotNull final Side side, final boolean modifier) {
   if (isResolved(side)) return null;
   Icon icon =
       isOnesideAppliedConflict() ? DiffUtil.getArrowDownIcon(side) : DiffUtil.getArrowIcon(side);
   return createIconRenderer(
       DiffBundle.message("merge.dialog.apply.change.action.name"),
       icon,
       isConflict(),
       new Runnable() {
         @Override
         public void run() {
           myViewer.executeMergeCommand(
               "Accept change",
               Collections.singletonList(TextMergeChange.this),
               new Runnable() {
                 @Override
                 public void run() {
                   myViewer.replaceChange(TextMergeChange.this, side, modifier);
                 }
               });
         }
       });
 }
  private void createInnerHighlighter(@NotNull ThreeSide side) {
    if (isResolved(side)) return;
    if (myInnerFragments == null) return;

    Editor editor = myViewer.getEditor(side);
    int start =
        DiffUtil.getLinesRange(editor.getDocument(), getStartLine(side), getEndLine(side))
            .getStartOffset();
    for (MergeWordFragment fragment : myInnerFragments) {
      int innerStart = start + fragment.getStartOffset(side);
      int innerEnd = start + fragment.getEndOffset(side);
      myInnerHighlighters.addAll(
          DiffDrawUtil.createInlineHighlighter(editor, innerStart, innerEnd, getDiffType()));
    }
  }
  public boolean processChange(int oldLine1, int oldLine2, int shift, @NotNull Side side) {
    int line1 = getStartLine(side);
    int line2 = getEndLine(side);
    int sideIndex = side.getIndex();

    DiffUtil.UpdatedLineRange newRange =
        DiffUtil.updateRangeOnModification(line1, line2, oldLine1, oldLine2, shift);
    myLineStartShifts[sideIndex] += newRange.startLine - line1;
    myLineEndShifts[sideIndex] += newRange.endLine - line2;

    if (newRange.damaged) {
      for (MyGutterOperation operation : myOperations) {
        operation.dispose();
      }
      myOperations.clear();

      myIsValid = false;
    }

    return newRange.damaged;
  }
  @Nullable
  private MyGutterOperation createOperation(@NotNull ThreeSide side, @NotNull OperationType type) {
    if (isResolved(side)) return null;

    EditorEx editor = myViewer.getEditor(side);
    Document document = editor.getDocument();

    int line = getStartLine(side);
    int offset =
        line == DiffUtil.getLineCount(document)
            ? document.getTextLength()
            : document.getLineStartOffset(line);

    RangeHighlighter highlighter =
        editor
            .getMarkupModel()
            .addRangeHighlighter(
                offset,
                offset,
                HighlighterLayer.ADDITIONAL_SYNTAX,
                null,
                HighlighterTargetArea.LINES_IN_RANGE);
    return new MyGutterOperation(side, highlighter, type);
  }
Ejemplo n.º 12
0
  /* (non-Javadoc)
   * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
   */
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setHeader("Content-Type", "application/x-javascript");
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setCharacterEncoding("utf-8");
    String url = request.getRequestURI();
    // System.out.println(this.diffAlg);

    String[] pathArray = url.split("storeinc");
    url = pathArray[1];
    String fullName = url;
    // 如果内存已经有处理过的内容,则直接返回
    if (fileContentMap.containsKey(fullName)) {
      response.getWriter().print(fileContentMap.get(fullName));
      response.getWriter().close();
      return;
    }
    // System.out.println("sssssss:"+url);
    ArrayList<String> fileList = getFileArray(url);
    String baseDir = getBaseDir(url);
    JSONArray iArray = new JSONArray();
    for (int i = 0; i < fileList.size(); i++) {
      // System.out.println("ssssssssssee:"+url);
      // url=fileList.get(i);
      String js = fileList.get(i);
      url = baseDir + js;
      // System.out.println("ssssssssssee:"+url);
      String[] urlArray = url.split("/");
      int len = urlArray.length;
      String pathName = "";
      String lastver = "";
      String ver = "";
      String jsFileName = "";
      String verStr = "";
      boolean isFull = false;
      if (len >= 2) {
        // 获取最终文件名 name-ver1_ver2.js的形式
        String filename = urlArray[len - 1];
        pathName = url.replace(filename, "");
        String[] sArray = filename.split("-");
        try {
          jsFileName = sArray[0];
          verStr = sArray[1];
        } catch (Exception ex) {
          System.out.print("exception ex:" + ex.toString());
        }
        // 包含_说明请求的是增量文件
        if (verStr.contains("_")) {
          String[] verArray = verStr.split("_");
          lastver = verArray[0];
          ver = verArray[1].replace(".js", "");
        } else {
          ver = verStr.replace(".js", "");
          isFull = true;
        }
      }
      // 分别获取新版和老版文件路径名

      String fullFile = jsPath + "/" + pathName + "/" + jsFileName + "-" + ver + ".js";
      String oldPath = pathName.replace(ver, lastver);
      String oldFile = jsPath + "/" + oldPath + "/" + jsFileName + "-" + lastver + ".js";
      // System.out.println(oldFile);
      // System.out.println(fullFile);
      // 如果是全量
      DiffUtil dUtil = new DiffUtil();
      if (isFull) {
        String fullContent = dUtil.readFile(fullFile, "utf-8");
        JSONObject resultFile = new JSONObject();
        resultFile.put("modify", true);
        // resultFile.modify=true;
        resultFile.put("chunkSize", 12);
        resultFile.put("diffAlg", this.diffAlg);
        resultFile.put("inc", false);
        resultFile.put("data", fullContent);
        resultFile.put("js", js);
        //  resultFile.js=fileitem.file;
        iArray.add(resultFile);
        // response.getWriter().print(fullContent);
      } else {

        if (!"lcs".equals(this.diffAlg)) {

          JSONObject resultFile = dUtil.makeIncDataFromFile(oldFile, fullFile, this.chunkSize);
          resultFile.put("js", js);
          resultFile.put("inc", true);
          // fileContentMap.put(fullName, resultFile.toJSONString());
          iArray.add(resultFile);
          // response.getWriter().print(resultFile.toJSONString());
        } else {
          LcsDiff lcfDiff = new LcsDiff();
          JSONObject resultFile = lcfDiff.makeIncDataFromFile(oldFile, fullFile);
          resultFile.put("js", js);
          resultFile.put("inc", true);
          // fileContentMap.put(fullName, resultFile.toJSONString());
          iArray.add(resultFile);
          // System.out.println();
          // response.getWriter().print(resultFile.toJSONString());
        }
      }
    }
    fileContentMap.put(fullName, iArray.toJSONString());
    if (iArray.size() > 0) {
      response.getWriter().print(iArray.toJSONString());
    } else {
      response.setStatus(404);
      response.getWriter().print("");
    }

    // response.getWriter().print("s:"+url+" "+pathName+" "+lastver+" "+ver+" "+jsFileName);
    response.getWriter().close();

    // TODO Auto-generated method stub
  }
  public boolean isSelectedByLine(int line, @NotNull Side side) {
    int line1 = getStartLine(side);
    int line2 = getEndLine(side);

    return DiffUtil.isSelectedByLine(line, line1, line2);
  }
 @NotNull
 public TextDiffType getDiffType() {
   return DiffUtil.getLineDiffType(myFragment);
 }