Eclipse插件开发首选项篇

2023-05-16

  • 介绍
如果你的插件需要保存一些数据(参数),比如要设置一些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

转载于:https://my.oschina.net/surenpi/blog/604687

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eclipse插件开发首选项篇 的相关文章

  • Eclipse:删除无法加载的插件

    每当我启动 Eclipse 副本时 都会收到以下错误消息 我对这些插件不感兴趣 无论如何我都不能使用 Java 8 因为我不会让你厌烦 所以安装它们是没有意义的 我进入 帮助 gt 安装详细信息 菜单 正如 SO 上的各种帖子中所建议的那样
  • 必须有 Java 运行时环境 (JRE) 或 Java 开发工具包 (JDK) 才能运行 Dbeaver。没有Java虚拟机

    在系统中安装 dbeaver 工具时未找到 Java 虚拟机 该怎么做才能从中恢复 如果你安装了zip存档或tar gz的档案dbeaver then 转到 dbeaver 目录 解压存档后创建的目录 在文本编辑器中打开 dbeaver i
  • XDoclet,一个死工具?

    我正在使用最新的 Eclipse for Java EE 和最新的 JBoss Tools 插件 现在 我正在编写一些 EJB 2 x 代码 我找不到像以前一样生成 xdoclet build xml 文件的方法 经过一番调查后 我开始问自
  • JyNI Eclipse 设置

    我在 Eclipse 中有以下 Java 文件 package java python tutorial import org python core PyInstance import org python util PythonInte
  • 通过 m2e 自动更新生成的 css 文件

    我正在使用lesscss maven plugin生成不同的css文件到目标目录 target generated sources 然后使用maven war plugin将此目录添加为 webResouce 这些文件将完美生成 但是 m2
  • Eclipse 中的预构建事件

    我有一个使用 jaxb 进行一些 xml 处理的项目 如何在 eclipse 中设置预构建事件以在构建项目之前执行 xjc 转到项目 gt 属性 gt 构建器 创建您自己的构建器并启用它 并在构建器的配置中启用 自动构建期间 等 如下所示
  • JFace DialogCellEditor:如何使按钮始终出现?

    我用的是JFaceDialogCellEditor在 JFace 的一行单元格中显示一个按钮TableViewer激活时会触发一个对话框 此行为适用于以下代码 但仅当显式选择托管按钮的表的单元格时才会显示该按钮 public class C
  • 在远程 Tomcat 上自动部署 Java 应用程序

    我希望能够自动将 Java 应用程序部署到 tomcat 服务器 现在的情况 正在 Eclipse 中开发 Java 项目 Tomcat 服务器在另一台机器上运行 提供该项目的 WAR 文件 我的目标 可以轻松编译项目并将其部署到远程 To
  • 如何将 sbteclipse 插件添加到 SBT 0.10.x

    我想查看akka的源代码 似乎使用的是0 7 x版本的sbt 我将项目配置转换为0 10 x版本 当我在库依赖项中添加 sbteclipse 并运行 eclipse create src 生成 eclipse 项目时 它告诉 eclipse
  • Eclipse 调试器 - 跳转到或仅显示挂起的线程

    我有一个带有很多线程的 Java 应用程序 在调试时 当一个线程中的执行被断点停止时 在所有线程之间滚动以查找挂起的线程是非常烦人的 有没有办法 按钮 快捷键等 跳转到挂起的线程 或者更好 隐藏所有未挂起的线程 我同意这很烦人 而且答案非常
  • 部署程序集:当前显示的页面包含无效值

    我从 Sourceforge 导入了一个 Java Web 应用程序 我花了三个工作周的时间来消除项目名称和包上附加的所有红叉 但现在我无法使该应用程序在我的 Eclipse 和 tomcat6 开发环境上运行 在项目属性中 当我尝试设置部
  • 我的项目中是否会自动创建 gitignore 文件?

    我一直在尝试使用 EGit 管理我正在处理的项目的本地副本 一旦其他人推我 我就会拉 但是 有文件显示我在本地存储库中有未提交的更改 但我没有进行任何更改 我尝试通过手动识别这些更改来解决这些问题 并发现它们来自 gitignore 文件
  • 如何使用 G++ MinGW 将 Psapi.lib 添加到 Eclipse 中的 TARGETLIBS

    我正在尝试实现这个示例进程枚举器程序来自 MSDN https msdn microsoft com en us library windows desktop ms682623 v vs 85 aspx 我收到许多未解析符号的错误 包括
  • 在Eclipse中添加注释掉代码的快捷按钮

    只是想知道是否有一种方法可以在 Eclipse 编辑器中添加一个按钮 就像在 Visual Studio 中一样 在 Java 视图 中快速注释或取消注释选定的代码块 Using the keyboard shortcut isn t ea
  • 为什么android找不到com.google.gson.Gson

    我正在尝试在我的项目中使用 GSON 但我的应用程序崩溃了 logcat 说找不到 com google gson Gson 我已将 import com google gson Gson 放在我的类文件中 我的包资源管理器中有 gson
  • 删除不需要的空行 Eclipse 编辑器

    当我在 eclipse 中打开任何文件时 它在所有代码行和空白行之后显示替代空白行 我怎样才能删除它 In eclipse preference setting you can remove all the unwanted blank l
  • maven-compiler-plugin 无法编译 Eclipse 没有问题的文件[重复]

    这个问题在这里已经有答案了 Eclipse 编译以下代码没有任何问题 而当mvn尝试编译此代码 结果编译失败 try Distribution rep get id returns a java util Optional Distribu
  • 有没有办法在 Eclipse 中创建自定义警告?

    我知道明显的答案是 注意 但因为我经常在 Java 和 Javascript 之间切换 所以我总是忘记 不适用于 Java 方面的字符串比较 有什么方法可以让 Eclipse 警告我 当它看到我将两个字符串与 而不是使用 equals 方法
  • 发送短信之前显示确认对话框

    我是 Android 新手 我已经完全绑定了我的应用程序 但我希望现在对其进行更改 当有人发送短信时 我想显示一个发送短信的确认对话框 询问是否发送 我必须为此创建一个公共类 我已经编写了源代码 它工作正常 但如果用户不单击 是 或 取消
  • Eclipse、Subclipse 1.8.2、SVN 1.7.0 每次操作都要求输入密码

    我安装新的后日食靛蓝 它会要求我输入密码SVN存储库透视图 例如 浏览每个文件夹并再次询问密码 正常使用SVNKit 它要求输入密码每次会话一次 SVNKit 不支持SVN 1 7 0 yet 我该如何解决这个问题 或者这是 JavaHL

随机推荐

  • WPF RichTextBox 禁止换行

    原文 WPF RichTextBox 禁止换行 这个问题困扰了好久 xff0c 进过不断的努力 xff0c 终于解决了 lt RichTextBox Margin 61 34 0 44 10 0 34 Name 61 34 codeText
  • 浅谈微信小程序用setStorage和getStorage缓存和获取数据

    缓存数据 每个微信小程序都可以有自己的本地缓存 xff0c 可以通过 wx setStorage xff08 wx setStorageSync xff09 wx getStorage xff08 wx getStorageSync xff
  • 微信扫码登录是如何实现的?

    网页版微信刚推出时 xff0c 无数人被它的登录方式惊艳了一下 xff0c 不需要输入用户名密码 xff0c 打开手机微信扫一扫 xff0c 便自动登录 从原理上讲 xff0c 二维码只能是一段文本的编码 xff0c 如何用它实现快捷登录的
  • python - http请求带Authorization

    背景 接入公司的一个数据统计平台 xff0c 该平台的接口是带上了Authorization验证方式来保证验签计算安全 方法 其实很简单 xff0c 就是在header中加入key 61 Authorization xff0c value是
  • element设置设置日期0点到23:59:59

    2019独角兽企业重金招聘Python工程师标准 gt gt gt js方式 var start 61 new Date new Date new Date toLocaleDateString getTime 当前日期0点到23 xff1
  • 一张图看懂亮度、明度、光度、光亮度、明亮度

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 亮度 明度 光亮度 xff0c Luminance和Brightness lightness其实都是一个意思 xff0c 只是起名字太难了 提出一个颜色模型后 xff0c
  • prfpset文件怎么导入pr?pr预设如何导入?

    prfpset文件是一种可以导入到Adobe Premiere Pro中使用的预设文件 xff0c 导入后即可为你的画面进行调色 xff0c 不同的pr预设拥有不同的调色效果 xff0c 那么prfpset格式预设怎么打开 xff1f pr
  • How does java technology relate to cloud computing?

    Java Paas shootout 64 IBM developer Cloud computing is always a hot topic around IT field today How can it bring to us H
  • LCD1602A接线图

    转载于 https my oschina net surenpi blog 481697
  • 3dmax2020卸载/安装失败/如何彻底卸载清除干净3dmax2020注册表和文件的方法

    3dmax2020提示安装未完成 xff0c 某些产品无法安装该怎样解决呢 xff1f 一些朋友在win7或者win10系统下安装3dmax2020失败提示3dmax2020安装未完成 xff0c 某些产品无法安装 xff0c 也有时候想重
  • matlab练习程序(生成黑白网格)

    提供了两种生成方法 xff0c 一个是自己编程实现 xff0c 比较灵活 xff1b 另一个是调用系统的checkerboard函数 xff0c 似乎只能生成8 8网格 至于用途 xff0c 也许可以用来下国际象棋 自己函数生成 xff1a
  • git 基本操作

    配置 user name user email git config global user name 34 fatdai 34 git config global user email 34 1012607376 64 qq com 34
  • 第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数...

    前言 如果你不想要编译器帮你自动生成的拷贝机制 参考前文 xff0c 那么你应当明确的拒绝 如何拒绝 xff1f 这便是本文要解决的主要问题 问题描述 当你定义了一个类 xff0c 而这个类中各对象之间也是封装的 禁止同类对象之间的相互赋值
  • springboot开启access_log日志输出

    由于在调试时需要查看access log日志 xff0c 但是springboot默认并没有开启 xff0c 因此查看了一下文档 xff0c 在springboot的配置文件中添加如下设置 xff0c 即可将日志输出当磁盘文件中以供查看 日
  • 向论文作者要代码的邮件怎么写

    Reference 找人要代码的邮件怎么写
  • 当 better-scroll 遇见 Vue

    作者 xff1a 滴滴公共前端 黄轶 在我们日常的移动端项目开发中 xff0c 处理滚动列表是再常见不过的需求了 以滴滴为例 xff0c 可以是这样竖向滚动的列表 xff0c 如图所示 xff1a 竖向列表 也可以是横向滚动的导航栏 xff
  • elementUI中form表单的upload上传图片及校验总结

    自定义校验方法 因为我的项目是 分情况 可以选择是否有图 所以我定义了一个变量hasFmt 当他为false的时候 才会要求上传 走这个校验方法 rules里声明这个方法 var valiIcon 61 rule value callbac
  • iview Table表格组件无法拆分单元格的解决思路

    最近在开发的Vue项目中 xff0c 使用了iview第三方UI库 对于表格组件的需求是最多的 xff0c 但是在一些特定场景下 xff0c 发现iview的表格组件没有单元格合并与拆分的API xff0c 搜了一下发现很多同学提问关于iv
  • Django+Semantic-ui建立Blog网站(一、基本框架)

    Django应该算是最流行的web应用框架了吧 xff0c 而语义化的CSS框架semantic ui我觉得非常好用 xff0c 使用这个组合做一个blog站点 关于Django的详细介绍以及MTV模式的相关有优点 xff0c 请翻阅官方文
  • Eclipse插件开发首选项篇

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