Eclipse插件开发首选项篇

Stella981
• 阅读 683
  • 介绍

如果你的插件需要保存一些数据(参数),比如要设置一些ip地址等等。这时候,就要用到Eclipse提供的首选项这个扩展点。 我们这里的首选项的数据类型只包括Java中的基本数据类型。

  • 扩展点 org.eclipse.core.runtime.preferences

下面这个扩展点是用来初始化首选项值的: [codesyntax lang="xml"]

<extension point="org.eclipse.core.runtime.preferences">
<initializer
    class="org.suren.littlebird.preferences.PreferenceInitializer">
</initializer>
</extension>

[/codesyntax]

  • 初始化

[codesyntax lang="java"]

package org.suren.littlebird.preferences;

import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore;

import org.suren.littlebird.Activator;

/**
 * http://surenpi.com
 * @author suren
 * @since 2015-2-2
 */
public class PreferenceInitializer extends AbstractPreferenceInitializer
{

    public void initializeDefaultPreferences()
    {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        store.setDefault(PreferenceConstants.P_OSGI_PORT, 9789);
        store.setDefault(PreferenceConstants.P_OSGI_FILTER, "com");

        store.setDefault(PreferenceConstants.P_BUNDLE_DIR, "/opt/gridview/bundles/application");
        store.setDefault(PreferenceConstants.P_BUNDLE_WEB_RUNDIR,
                "/opt/gridview/runner/web");

        store.setDefault(PreferenceConstants.P_SSH_PORT, 22);
        store.setDefault(PreferenceConstants.P_SSH_USER, "root");
        store.setDefault(PreferenceConstants.P_SSH_PASSWD, "");

        store.setDefault(PreferenceConstants.P_LOGGER_BRIDGE_PORT, 7896);
        store.setDefault(PreferenceConstants.P_LOGGER_LAYOUT, "%d{yyyy-MM-dd HH:mm:ss} [%p]-[ %l] %m %n");
        store.setDefault(PreferenceConstants.P_LOGGER_NO_BRIDGE_HIDDEN, true);
        store.setDefault(PreferenceConstants.P_LOGGER_FILTER, "");
    }

}

[/codesyntax]

  • 获取值

[codesyntax lang="java"]

IPreferenceStore store = Activator.getDefault().getPreferenceStore();
String filter = store.getString(PreferenceConstants.P_OSGI_FILTER);

[/codesyntax] 这里的Activator当然就是本插件中的启动类了。但是,这只能获取到本插件内部的首选项值,那怎么才能获取到其他插件的值呢?例如,您写一个插件要或者到LittleBird的首选项配置,怎么办呢?请看下面的代码片段: [codesyntax lang="java"]

String node = "org.suren.littlebird";
IEclipsePreferences pref = DefaultScope.INSTANCE.getNode(node);
System.out.println(pref.get("logger_filter", "--"));

[/codesyntax] 上面的代码您要是看明白了的话,就会有一个疑问——node是从哪里来的呢,还有后面的key值? 我给您推荐一个比较暴力的办法,就是直接用Java的反编译工具把对应的插件jar文件给翻译过来,然后找到对应的初始化类。 另外也有一个温柔的办法,从您的Eclipse工作空间目录下面找(.metadata\.plugins\org.eclipse.core.runtime\.settings)。

  • 作用域

类似变量一样,首选项也有自己的作用域,例如:有的配置项是要作用在整个工作空间上,有的是要作用在某个工程上等。而首选项作用域的不同和在操作系统中保存的位置紧密相关。下面是Eclipse平台对作用域的定义:

  1. 实例,按照工作空间或者平台实例来存储
  2. 配置,根据Eclipse的按照位置来存储,多个实例之间共享
  3. 缺省项,根据某个插件的定义来存储,一般都写死在插件内部

这里既然提到了首选项有“作用域”,那么我们怎么才能获取到指定作用域下的值呢?这是个值得注意的问题。 Eclipse平台提供了三种作用域对应的实现类,如此便简单了,只要调用对应的实现类来或者值就ok了。 [codesyntax lang="java"]

private void print(String node, boolean export)
{
    try
    {
        IEclipsePreferences pref = DefaultScope.INSTANCE.getNode(node);
        System.out.println(Arrays.toString(pref.keys()));
        for(String key : pref.keys())
        {
            System.out.println(key + "===========" + pref.get(key, "--"));
        }
        if(export)
        {
            export(node, pref);
        }
        
        pref = ConfigurationScope.INSTANCE.getNode(node);
        System.out.println(Arrays.toString(pref.keys()));
        for(String key : pref.keys())
        {
            System.out.println(key + "===========" + pref.get(key, "--"));
        }
        if(export)
        {
            export(node, pref);
        }
        
        pref = InstanceScope.INSTANCE.getNode(node);
        System.out.println(Arrays.toString(pref.keys()));
        for(String key : pref.keys())
        {
            System.out.println(key + "===========" + pref.get(key, "--"));
        }
        if(export)
        {
            export(node, pref);
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

private void export(String node)
{
    IEclipsePreferences pref = DefaultScope.INSTANCE.getNode(node);
    
    export(node, pref);
}

private void export(String node, IEclipsePreferences pref)
{
    try {
        OutputStream output = new FileOutputStream(new File("d:/suren/", node)){

            @Override
            public void write(int b) throws IOException {
                System.out.println("1");
                super.write(b);
            }};
        PreferencesService.getDefault().exportPreferences(pref,
                output, null);
        
        output.close();
    } catch (FileNotFoundException | CoreException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

[/codesyntax] 从上面的代码可以看出来,一个插件所有的配置项是以上三个作用域里的值的集合。另外,默认值其实是不需要导出的。

  • 扩展点 org.eclipse.ui.preferencePages

上面的首选项扩展点只是简单的保存一些基本类型数据,页面也是固定的,那么怎么来自定义页面呢? [codesyntax lang="xml"]

<extension point="org.eclipse.ui.preferencePages">
    <page category="org.suren.littlebird.preferences.SuRenPreferencePage"
        class="org.suren.littlebird.preferences.SuRenLoggerPreferencePage"
        id="org.suren.littlebird.preferences.SuRenLoggerPreferencePage"
        name="Logger Bridge">
    </page>
</extension>
<extension point="org.eclipse.ui.preferencePages">
    <page category="org.suren.littlebird.preferences.SuRenPreferencePage"
        class="org.suren.littlebird.preferences.SuRenFileSyncPreferencePage"
        id="org.suren.littlebird.preferences.SuRenFileSyncPreferencePage"
        name="SyncFile">
    </page>
</extension>

[/codesyntax]   下面是页面的实现类: [codesyntax lang="java"]

/**
 *
 */
package org.suren.littlebird.preferences;

import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.suren.littlebird.Activator;

/**
 * @author suren
 * @since 2015-2-2
 */
public class SuRenLoggerPreferencePage extends FieldEditorPreferencePage
        implements IWorkbenchPreferencePage
{

    public SuRenLoggerPreferencePage()
    {
        super(GRID);
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
        setDescription("Little preference page implementation");
    }

    @Override
    protected void createFieldEditors()
    {
        Composite parent = getFieldEditorParent();

        addField(new StringFieldEditor(PreferenceConstants.P_LOGGER_BRIDGE_IP,
                "Bridge IP : ", parent));
        addField(new IntegerFieldEditor(PreferenceConstants.P_LOGGER_BRIDGE_PORT,
                "Bridge Port : ", parent));
        addField(new StringFieldEditor(PreferenceConstants.P_LOGGER_LAYOUT,
                "Logger Layout : ", parent));
        addField(new BooleanFieldEditor(PreferenceConstants.P_LOGGER_NO_BRIDGE_HIDDEN,
                "Hidden When No Bridge", parent));
        addField(new StringFieldEditor(PreferenceConstants.P_LOGGER_FILTER,
                "Filter : ", parent));
    }

    @Override
    public void init(IWorkbench arg0)
    {
    }

}

[/codesyntax] [codesyntax lang="java"]

package org.suren.littlebird.preferences;

import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.List;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;

/**
 * @author suren
 * @date 2015-4-3
 *
 * http://surenpi.com
 */
public class SuRenFileSyncPreferencePage extends PreferencePage
    implements IWorkbenchPreferencePage
{
    private Button addBut;
    private Button removebut;
    private List    syncList;

    @Override
    public void init(IWorkbench workbench)
    {
    }

    @Override
    protected Control createContents(final Composite parent)
    {
        Group syncListGroup = new Group(parent, 0);
        syncListGroup.setLayoutData(new GridData(4, 4, true, true, 2, 1));
        syncListGroup.setText("SyncFileList");

        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        syncListGroup.setLayout(gridLayout);

        syncList = new org.eclipse.swt.widgets.List(syncListGroup, 2050);
        syncList.setLayoutData(new GridData(4, 4, true, true, 1, 12));

        this.addBut = new Button(syncListGroup, 0);
        this.addBut.setText("Add");
        this.addBut.addSelectionListener(new SelectionAdapter(){

            @Override
            public void widgetSelected(SelectionEvent e)
            {
                ContainerSelectionDialog dialog = new ContainerSelectionDialog(parent.getShell(), null, true, "");
                if(dialog.open() == ContainerSelectionDialog.OK)
                {
                    Object[] result = dialog.getResult();
                    if(result != null)
                    {
                        for(Object path : result)
                        {
                            syncList.add(path.toString());
                        }
                    }
                }
            }
        });

        this.removebut = new Button(syncListGroup, 0);
        this.removebut.setText("Remove");
        this.removebut.addSelectionListener(new SelectionAdapter(){

            @Override
            public void widgetSelected(SelectionEvent e)
            {
                syncList.remove(syncList.getSelectionIndices());
            }
        });

        SuRenPref suRenPref = new SuRenPref();
        for(String path : suRenPref.getSyncList())
        {
            syncList.add(path);
        }

        return null;
    }

    @Override
    public boolean performOk()
    {
        String[] syncFileArray = syncList.getItems();

        return new SuRenPref().setSyncList(syncFileArray);
    }
}

[/codesyntax]  

  • 有关Eclipse的配置

Eclipse的配置其实就是首选项,作用域在workspace上的配置信息当然是在workspace目录中的.metadata中保存,全局性的配置(第一次启动时)那就应该是在Eclipse的安装根目录(configuration)中了。 configuration\.settings\org.eclipse.ui.ide.prefs这个文件描述了Eclipse在启动时寻找workspace的信息 下面介绍workspace级别的配置信息: 默认的根目录为workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings org.eclipse.m2e.core.prefs 为m2e插件的配置 org.eclipse.jdt.launching.prefs 为Eclipse中使用的JDK的配置 org.eclipse.wst.server.core.prefs 为Server的配置 org.eclipse.jst.server.tomcat.core.prefs 为Tomcat的配置

  • 参考

http://blog.csdn.net/andywangcn/article/details/8026300

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
IDEA00 IDEA知识点汇总
一、从头搭建IDEA开发环境https://mp.weixin.qq.com/s/6jXHzkU8JfubhDsQJbwl8Q(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%2F6jXHzkU8JfubhDsQJbwl8Q)1下
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Eclipse插件开发_学习_00_资源帖
一、官方资料 1.eclipseapi(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fhelp.eclipse.org%2Fmars%2Findex.jsp%3Ftopic%3D%252Forg.eclipse.platform.doc.isv%252Fguide%2
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这