Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2014-04-06) 自己动手写IDEA plugin – PubEditor (2) Scala改写Hello world

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

本篇目标

使用Scala改写上次的HelloWorldAction,以确认用Scala写插件会不会有什么问题。

安装Scala插件

首先需要到http://www.scala-lang.org上下载最新的scala安装包,并在IDEA中安装好Scala插件

在项目中添加Scala支持

首先打开项目属性,在"Facets"中添加Scala:

QQ20140406-25

然后在Modules中选择PubEditor的module,添加上scala-library相应的依赖:

QQ20140406-26

如果你对Idea下的scala配置不熟悉,需要多一些时间摸索,我也是连蒙带猜弄好的。

用Scala重写

删除原来的HelloWorldAction.java,新建一个HelloWorldAction.scala,内容如下:

package com.thoughtworks.pli.pub_editor

import com.intellij.openapi.actionSystem.{CommonDataKeys, AnAction, AnActionEvent}
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages

class HelloWorldAction extends AnAction {

  def actionPerformed(event: AnActionEvent) {
    val project = event.getData(CommonDataKeys.PROJECT)
    val userName = askForName(project)
    sayHello(project, userName)
  }

  private def askForName(project: Project) = {
    Messages.showInputDialog(project, "What is your name?", "Input Your Name", Messages.getQuestionIcon)
  }

  private def sayHello(project: Project, userName: String) {
    Messages.showMessageDialog(project,
      s"Hello, $userName!\n Welcome to PubEditor.", "Information",
      Messages.getInformationIcon)
  }

}

可以看到代码跟以前很相似,有一个重要的不同是这一行:

val project = event.getData(CommonDataKeys.PROJECT)

以前的Java版是这样的:

Project project = event.getData(PlatformDataKeys.PROJECT);

其中PROJECT的确是在CommonDataKeys类中声明的,而PlatformDataKeys继承了CommonDataKeys。在Java中可以在子类中访问父类中的static属性,而Scala中就不行。

运行

运行方式跟上一篇一样,一切正常。通过这个尝试,发现的确可以用scala代替Java来写Idea插件。

本文所对应的tag为2_hello_world_scala,源代码地址在:

https://github.com/freewind/PubEditor

下一篇我们将把'.pub'文件与我们的插件关联起来。

comments powered by Disqus