Skip to content

Instantly share code, notes, and snippets.

@dkandalov
Created September 27, 2013 13:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dkandalov/6728950 to your computer and use it in GitHub Desktop.
Save dkandalov/6728950 to your computer and use it in GitHub Desktop.
Really lame code to show text diff using IntelliJ diff tool (this code is for https://github.com/dkandalov/live-plugin)
import com.intellij.icons.AllIcons
import com.intellij.openapi.diff.DiffContent
import com.intellij.openapi.diff.DiffRequest
import com.intellij.openapi.diff.DiffTool
import com.intellij.openapi.diff.SimpleContent
import com.intellij.openapi.diff.impl.DiffPanelImpl
import com.intellij.openapi.fileTypes.FileType
import com.intellij.openapi.fileTypes.FileTypes
import com.intellij.openapi.project.Project
import com.intellij.openapi.wm.WindowManager
import com.intellij.openapi.wm.ex.WindowManagerEx
import javax.swing.JComponent
import javax.swing.JFrame
import javax.swing.JPanel
import java.awt.*
import java.awt.event.KeyEvent
import java.awt.event.KeyListener
import static liveplugin.PluginUtil.*
if (isIdeStartup) return
def left = """same text
different text
only on the left side
"""
def right = """same text
a bit different text
only on the right side
"""
showDiff(project, left, right)
def showDiff(Project project, String left, String right, FileType leftFileType = FileTypes.PLAIN_TEXT, FileType rightFileType = FileTypes.PLAIN_TEXT,
String leftTitle = "", String rightTitle = "", String windowTitle = "") {
def leftContent = new SimpleContent(left, FileTypes.PLAIN_TEXT)
def rightContent = new SimpleContent(right, FileTypes.PLAIN_TEXT)
def diffPanel = new DiffPanelImpl((Window) null, project, (boolean) true, (boolean) true, (int) 0, (DiffTool) null)
diffPanel.enableToolbar(false)
diffPanel.requestFocus = false
diffPanel.diffRequest = new MyDiffRequest(leftContent, rightContent, leftTitle, rightTitle, windowTitle)
JFrame jframe = new JFrame().with {
add(new JPanel().with {
layout = new BorderLayout()
add(diffPanel.component, BorderLayout.CENTER)
it
})
preferredSize = WindowManagerEx.instance.getFrame(project).size
pack()
requestFocus()
visible = true
iconImage = WindowManagerEx.instance.getFrame(project)?.iconImage
it
}
addKeyHandlerRecursivelyTo(jframe.rootPane, jframe)
jframe
}
class MyDiffRequest extends DiffRequest {
private final leftContent
private final rightContent
private final leftTitle
private final rightTitle
private final windowTitle
MyDiffRequest(leftContent, rightContent, leftTitle = "", rightTitle = "", windowTitle = "") {
super(null)
this.leftContent = leftContent
this.rightContent = rightContent
this.leftTitle = leftTitle
this.rightTitle = rightTitle
this.windowTitle = windowTitle
}
@Override DiffContent[] getContents() { [leftContent, rightContent] }
@Override String[] getContentTitles() { [leftTitle, rightTitle] }
@Override String getWindowTitle() { windowTitle }
}
def addKeyHandlerRecursivelyTo(JComponent component, JFrame jframe) {
component.addKeyListener(new KeyListener() {
@Override void keyReleased(KeyEvent keyEvent) {
if (keyEvent.keyCode == KeyEvent.VK_ESCAPE) {
show("enter")
jframe.dispose()
}
}
@Override void keyTyped(KeyEvent e) {}
@Override void keyPressed(KeyEvent e) {}
})
component.components.each{ addKeyHandlerRecursivelyTo(it, jframe) }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment