Eclipse外观定制化之路

有点标题党的意思。这并非是一条完整的路,只不过是个人定制化道路的开始,更多的是心路,更多的技术线路有待后续完善。

使用过很多代码开发工具,比如Visual Studio, Visual Code, Source Insight, C++ Blocks, Sublime,Notepad++,ADS等等,当然每种工具都各有所长亦个有所短。但最终最钟爱的只有Eclipse。主要原因如下:1. 开源免费,免费的意义大家都懂的,不论是在公司内部或个人使用,都省去了版权和破解等很多事情,开源的另一个潜在优势是如果你觉得哪里不如意,可以自己修改自己构建自己的版本;2. 功能强大,足以和VS媲美,不但可以开发C/C++、Java、html等,还可以开发bash, python, js, android等应用,几乎是无所不能了,如果你开发了一种新的语言,可以很方便地为其开发一个插件,该语言就拥有了一个强大的IDE;3. 夸平台,linux和windows上都用得很爽。

一切似乎都那么美好,不过最近缺遇到点小麻烦。由于缺省的白色背景容易导致视觉疲劳,于是决定使用黑色背景。Eclipse实现这个要求很简单,只需要在window->preferences->general->Appearance中选择黑色主题即可。由于长期开发的是linux应用,所以不自觉地选择了dark[linux]主题。嗯,有的颜色不大如意,看不清楚,不过不要紧,逐一修改一下即可。几乎都快要完美了,但是发现Navigator/package explorer等树状窗口的字体颜色不能直接设置。百度一把,有热心网友说需要修改主题文件的.css配置,加入如下内容:

.MPart Tree {
font-family: Consolas;
font-size: 12;
color: #00C000;
}

意思很明显,效果也很满意。看来已经完美了,然而一个十分细小的细节困扰了我很多天。那就是树形窗口中每个Item前面的那个箭头几乎和背景一一个颜色,这个该如何修改呢?各种尝试无效,百度也无能为力了,google也没找到可行的解决办法,只是有人说他没问题,与平台有关等等。完美主义或强迫症的缘故,始终觉得这点瑕疵难以接受。开源的优越性似乎可以提现了。一个简单粗暴的想法就是修改代码,硬编码箭头的颜色就可以了。在这个简单粗暴想法的诱惑下,开始了build自己的Eclipse版本之路。此路非易,亦未走通,有待后续继续完成。此路不通,就换其它道路吧,Eclipse的GUI库是SWT,SWT的编译过程要简单些。浏览下SWT的库,确实有Tree类,该类确实是树形控件的实现类。有点激动了,赶紧看看它是如何画那个箭头的?不看不知道,一看吓一跳。Tree里面根本没有箭头颜色的相关属性设置。蒙,彻底的蒙!理论上,这是不应该的,肯定有获取颜色属性的途径。那就继续看看Tree是怎么画控件的吧。又是蒙,SWT根本就不自己画任何东西,它只不过是向native的dll库发送各种消息,native的dll库负责具体的工作。要再深究下去,就得高清楚JNI机制,以及相关的命令及其实现了。目测一下,觉得路很长、很黑。

上述思路看似正确,实则是深度优先的思维方式,即钻牛角尖的方式。因为不能保证在每一个分支上都选择了正确的方向,更不能保证每个分支上只有唯一的可行分支。所以深度优先的方法往往事倍功半。后退到起点,试试其它主题是否有同样的问题(广度优先的思路)。这次我选择了dark, 字体和颜色与dark[linux]不尽相同,但是Tree前面不再是箭头而是三角形,颜色也由深色变成了白色,完全解决了之前的问题。My God, 踏破铁鞋无觅处,得来全不费工夫, 真是进一步寸步难行,退一步海阔天空啊!

主题是通过.css文件实现的,换了个主题就是换了个.css文件。也就是说,其实Tree控件的标志是可以定制形状和颜色的。让我们来一探究竟吧。首先找到两个主题对应的.css文件,e4_dark.css和e4_dark_win.css。对比,发现e4_dark_win.css中多了如下内容:

Tree {
/**
* See Bug 434201: Dark theme: tree must respect the foreground color for items arrows
*/
swt-tree-arrows-color:#cccccc;
swt-tree-arrows-mode: triangle; /* triangle or square */

/* See Bug 434309: Customize the tree/table selection to work properly
* with the dark theme.
*
* Note that the selection foreground is a bit lighter than the regular
* foreground because our background is also a bit lighter in this case.
*/
swt-selection-foreground-color: #fcfcf9;
swt-selection-background-color: #494949;
swt-hot-background-color: #2F2F2F;
swt-selection-border-color: #7F7D68;
swt-hot-border-color: #545454;
}


Table {
/* See Bug 434309: Customize the tree/table selection to work properly
* with the dark theme.
*
* Note that the selection foreground is a bit lighter than the regular
* foreground because our background is also a bit lighter in this case.
*/
swt-selection-foreground-color: #fcfcf9;

swt-selection-background-color: #494949;
swt-hot-background-color: #2F2F2F;
swt-selection-border-color: #7F7D68;
swt-hot-border-color: #545454;
}

很明显这是Tree和Table的样式,修改相应的属性,就可以得到想要的结果。

Eclipse中主题的.css文件还有很多内容,大胆推测一样,对Eclipse外观的定制,应该都可以通过相应的配置来实现。因此正确的Eclipse定制化道路应该是研究它的主题及其相关的配置文件(.css),而非构建自己的Eclipse或SWT。实验表明把上述样式复制到dark.css文件后,即使使用dark[linux]主题,树形控件中的暗三箭头符号也变成了白色的三角形。

Eclipse中.css文件的组成及配置的结构都相当复杂,有待后续深入学习。

附1. Eclipse Platform Architecture

 

posted @ 2019-05-05 11:27  耕读编码  阅读(486)  评论(0编辑  收藏  举报