`
sunway
  • 浏览: 113405 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

记录swt对话框上次打开的地址

阅读更多
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

import utils.system;


/**
 * 扩展属性过滤对话框
 * 
 * @author sunway
 * 
 */
public class ExtendedAttributeFilterDialog extends WorkflowDialog implements
		SelectionListener, ISelectionChangedListener {

	private ExtendedAttributes resultExtendedAttributes;
	private ExtendedAttributes sourceExtendedAttributes;
	private TableViewer tableViewer;
	private CheckboxTableViewer ctv;
	private Table table;
	private GridData gridData;
	private Button openBtn;
	private String fileFullPath;
	private Text fileFullPathText;
	private String lastFileFullPath = "";
	private String projectPath= "";

	/**
	 * 创建c:\temp\opendDialogPath.xml文件
	 * 
	 * @return
	 */
	private File getDialogConfigFile() {
		String parent = getProjectPath() + File.separator + ".settings";
		File dir = new File(parent);
		File file = new File(parent + File.separator
				+ "opendDialogPath.xml");
		try {
			if (!dir.exists()) {
				if (dir.mkdir()) {
					if (!file.exists()) {
						file.createNewFile();

					}
				}

			}
			if (!file.exists()) {
				file.createNewFile();

			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return file;

	}

	public String getLastFileFullPath() {
		return this.lastFileFullPath;
	}

	public void setFileFullPath(String fileFullPath) {
		this.fileFullPath = fileFullPath;
	}

	public ExtendedAttributes getSourceExtendedAttributes() {
		return sourceExtendedAttributes;
	}

	public void setSourceExtendedAttributes(
			ExtendedAttributes sourceExtendedAttributes) {
		this.sourceExtendedAttributes = sourceExtendedAttributes;
	}

	public ExtendedAttributes getResultExtendedAttributes() {
		return resultExtendedAttributes;
	}

	public ExtendedAttributeFilterDialog(Shell parentShell) {
		super(parentShell);
		// TODO Auto-generated constructor stub
	}

	protected Control createDialogArea(Composite parent) {
		setTitle(DialogMessages
				.getString("ExtendedAttributeFilterDialog.title")); //$NON-NLS-1$
		setMessage(DialogMessages
				.getString("ExtendedAttributeFilterDialog.message")); //$NON-NLS-1$
		setHelpAvailable(false);
		Composite container = (Composite) super.createDialogArea(parent);

		createDialogContext(container);
		this.initTableViewer();

		return container;
	}

	private void createDialogContext(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		GridData gdGroup = new GridData(GridData.FILL_BOTH);
		// gdGroup.widthHint = 600;
		container.setLayoutData(gdGroup);
		GridLayout gridLayout = new GridLayout();
		gridLayout.verticalSpacing = 4;
		gridLayout.numColumns = 2;
		gridLayout.marginWidth = 10;
		gridLayout.marginTop = 10;
		container.setLayout(gridLayout);

		Group group = new Group(container, SWT.NONE);
		GridLayout gl = new GridLayout();
		gl.numColumns = 2;
		gl.marginWidth = 10;
		group.setLayout(gl);
		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		group.setText(DialogMessages
				.getString("ExtendedAttributeFilterDialog.xpdlFile"));//$NON-NLS-1$

		openBtn = new Button(group, SWT.OPEN);
		openBtn.setText(DialogMessages
				.getString("ExtendedAttributeFilterDialog.browserButton"));//$NON-NLS-1$
		openBtn.addSelectionListener(this);

		fileFullPathText = new Text(group, SWT.BORDER);
		fileFullPathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		// 默认选中上次打开的页面
		String fullPath = loadFileFullPath();
		if (fullPath == null || fullPath == "" || fullPath.equals("")) {
			fileFullPathText.setText(fileFullPath);
		} else {
			fileFullPathText.setText(fullPath);
		}
		fileFullPathText.addSelectionListener(this);

		tableViewer = new TableViewer(container, SWT.CHECK | SWT.MULTI
				| SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
		// checkboxViewer
		ctv = new CheckboxTableViewer(tableViewer.getTable());
		ctv.setContentProvider(new ExtendedAttributeFilterContentProvider());
		ctv.setLabelProvider(new ExtendedAttributeFilterLabelProvider());
		ctv.addSelectionChangedListener(this);
		ctv
				.setColumnProperties(new String[] {
						DialogMessages
								.getString("ExtendedAttributeFilterDialog.nameColumnProperties"), DialogMessages.getString("ExtendedAttributeFilterDialog.valueColumnProperties") }); //$NON-NLS-1$ //$NON-NLS-2$

		table = tableViewer.getTable();
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		gridData = new GridData(GridData.FILL_BOTH);
		gridData.horizontalSpan = 2;
		table.setLayoutData(gridData);
	}

	private void initTableViewer() {
		// TODO Auto-generated method stub
		final TableColumn nameCol = new TableColumn(table, SWT.NONE);
		nameCol.setText(DialogMessages
				.getString("ExtendedAttributeFilterDialog.nameTableColumn")); //$NON-NLS-1$
		nameCol.setWidth((getInitialSize().x - 35) / 2);

		final TableColumn valueCol = new TableColumn(table, SWT.NONE);
		valueCol.setText(DialogMessages
				.getString("ExtendedAttributeFilterDialog.valueTableColumn")); //$NON-NLS-1$
		valueCol.setWidth((getInitialSize().x - 35) / 2);

		CellEditor[] cellEditor = new CellEditor[table.getColumnCount() + 1];
		cellEditor[table.getColumnCount() - 1] = new CheckboxCellEditor(
				tableViewer.getTable());

		this.ctv.setCellEditors(cellEditor);
		this.table.setHeaderVisible(true);
		this.table.setLinesVisible(true);
		this.ctv.addSelectionChangedListener(this);
		this.ctv.setColumnProperties(new String[] { "name", "value" });
		String filePath = this.fileFullPathText.getText();
		if (filePath.endsWith("xml")) {// 简单处理
			this.ctv.setInput(getExtendedAttributes(filePath));

		} else {
			this.ctv
					.setInput(filterConfigExtendedAttributes(filterDuplicateExtendedAttributes(getExtendedAttributes(filePath))));
		}
	}

	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		// TODO Auto-generated method stub
		super.createButtonsForButtonBar(parent);
		dialogChanged();
		setErrorMessage(null);
	}

	@Override
	protected Point getInitialSize() {
		return new Point(520, 560);
	}

	@Override
	protected void configureShell(Shell newShell) {
		// TODO Auto-generated method stub
		super.configureShell(newShell);
		newShell.setText(DialogMessages
				.getString("ExtendedAttributeFilterDialog.shellText")); //$NON-NLS-1$
	}


	@Override
	protected void buttonPressed(int buttonId) {
		// TODO Auto-generated method stub
		this.resultExtendedAttributes = (ExtendedAttributes) this.sourceExtendedAttributes
				.clone();
		this.resultExtendedAttributes.clear();
		if (buttonId == IDialogConstants.OK_ID) {
			Object[] object = ctv.getCheckedElements();
			if (object.length > 0) {
				for (int i = 0, n = object.length; i < n; i++) {
					ExtendedAttribute bean = (ExtendedAttribute) object[i];
					this.resultExtendedAttributes.add(bean);
				}

			}
		}
		// 保存上次打开的文件路径
		saveFileFullPath();
		super.buttonPressed(buttonId);
	}

	private IDialogSettings getDialogTopSettings() {
		IDialogSettings settings = new DialogSettings("root");
		try {
			File file = getDialogConfigFile();
			settings.load(file.getAbsolutePath());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return settings;

	}

	/**
	 * 从c:\temp\dialogPath.xml文件中取出上次打开的文件路径
	 * 
	 * @return
	 */
	private String loadFileFullPath() {
		// TODO Auto-generated method stub
		String result = "";
		IDialogSettings topSettings = getDialogTopSettings();
		IDialogSettings settings = topSettings.getSection("Dialog");
		if (settings == null) {
			return result;
		} else {
			result = settings.get("path");
		}
		return result;
	}

	/**
	 * 保存上次打开的对话框路径到c:\temp\dialogPath.xml文件中
	 */
	private void saveFileFullPath() {
		// TODO Auto-generated method stub
		IDialogSettings topSettings = getDialogTopSettings();
		IDialogSettings settings = topSettings.getSection("Dialog");
		if (settings == null) {
			settings = topSettings.addNewSection("Dialog");
		}

		settings.put("path", this.fileFullPathText.getText());
		try {
			topSettings.save(getDialogConfigFile().getAbsolutePath());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	public void widgetDefaultSelected(SelectionEvent e) {
		// TODO Auto-generated method stub

	}

	public void widgetSelected(SelectionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource().equals(this.openBtn)) {
			// 打开文件选择对话框
			FileDialog fd = new FileDialog(WorkflowProjectUtils
					.getActiveShell(), SWT.OPEN);
			fd.setFilterExtensions(new String[] { "*.xpdl", "*.xml" });
			String fileFullPath = fd.open();
			fileFullPathText.setText(fileFullPath);

			if (fileFullPath.endsWith("xml")) {// 简单处理
				this.ctv.setInput(getExtendedAttributes(fileFullPath));
			} else
				this.ctv
						.setInput(filterConfigExtendedAttributes(filterDuplicateExtendedAttributes(getExtendedAttributes(this.fileFullPathText
								.getText()))));
		}
		if (e.getSource().equals(this.fileFullPathText)) {
			// 先过滤掉重复的扩展属性
			this.ctv
					.setInput(filterConfigExtendedAttributes(filterDuplicateExtendedAttributes(getExtendedAttributes(this.fileFullPathText
							.getText()))));
		}
	}

	public void selectionChanged(SelectionChangedEvent event) {
		// TODO Auto-generated method stub

	}

	/**
	 * 过滤掉配置文件里有的ExtendedAttribute
	 */
	private ExtendedAttributes filterConfigExtendedAttributes(
			ExtendedAttributes parent) {
		if (parent != null) {
			ExtendedAttributes result = (ExtendedAttributes) parent.clone();
			Set<String> set = WorkflowProjectUtils
					.getConfigExtendedAttributesName();
			Iterator<ExtendedAttribute> extendedAttributeIt = result
					.toElements().iterator();
			while (extendedAttributeIt.hasNext()) {
				ExtendedAttribute extendedAttribute = extendedAttributeIt
						.next();
				if (set.contains(extendedAttribute.getName())) {
					// 删除这个ExtendedAttribute
					result.remove(extendedAttribute);
				}
			}
			return result;
		}
		return null;
	}

	/**
	 * 过滤掉一个ExtendedAttributes重复的ExtendedAttribute
	 */
	private ExtendedAttributes filterDuplicateExtendedAttributes(
			ExtendedAttributes parent) {
		if (parent != null) {
			try {
				ArrayList<ExtendedAttribute> extendedAttributeList = parent
						.toElements();
				Iterator<ExtendedAttribute> extendedAttributeIt = extendedAttributeList
						.iterator();

				ExtendedAttributes extendedAttributes = (ExtendedAttributes) parent
						.clone();
				extendedAttributes.clear();
				while (extendedAttributeIt.hasNext()) {
					ExtendedAttribute extendedAttribute = extendedAttributeIt
							.next();
					if (!extendedAttributes.contains(extendedAttribute)) {
						extendedAttributes.add(extendedAttribute);
					}
				}
				return extendedAttributes;

			} catch (Exception ex) {
				// TODO: handle exception
				ex.printStackTrace();
			}

		}
		return null;
	}

	/**
	 * 向一个ExtendedAttributes里添加另一个ExtendedAttributes的所有元素
	 */
	private ExtendedAttributes addExtendedAttributes(ExtendedAttributes parent,
			ExtendedAttributes children) {
		if (children != null) {
			ArrayList<ExtendedAttribute> extendedAttributeList = children
					.toElements();
			Iterator<ExtendedAttribute> extendedAttributeIt = extendedAttributeList
					.iterator();
			while (extendedAttributeIt.hasNext()) {
				parent.add(extendedAttributeIt.next());
			}
		}
		return parent;
	}

	/**
	 * 根据文件路径得到所有的扩展属性
	 * 
	 * @param fileFullPath
	 * @return
	 */
	public ExtendedAttributes getExtendedAttributes(String fileFullPath) {
		ExtendedAttributes parent = null;
		if (fileFullPath.endsWith("xpdl")) {
			Package pkg = XpdlUtils.loadPageckFromFile(fileFullPath, null);
			if (pkg == null || pkg.equals("")) {
				return null;
			}

			// 如果是包的扩展属性
			if (getSourceExtendedAttributes().getParent() instanceof Package) {
				parent = (ExtendedAttributes) pkg.getExtendedAttributes()
						.clone();
			}
			// 如果是流程的扩展属性
			if (getSourceExtendedAttributes().getParent() instanceof WorkflowProcess) {
				WorkflowProcesses workflowProcesses = pkg
						.getWorkflowProcesses();
				ArrayList<WorkflowProcess> arrayList = workflowProcesses
						.toElements();
				Iterator<WorkflowProcess> it = arrayList.iterator();
				ExtendedAttributes workflowProcessParent = null;
				while (it.hasNext()) {
					WorkflowProcess workflowProcess = it.next();
					ExtendedAttributes extendedAttributes = workflowProcess
							.getExtendedAttributes();
					if (workflowProcessParent == null) {
						workflowProcessParent = (ExtendedAttributes) extendedAttributes
								.clone();
					} else {
						// workflowProcessParent.add(extendedAttributes);
						addExtendedAttributes(workflowProcessParent,
								extendedAttributes);

					}
				}
				if (workflowProcessParent != null) {
					parent = (ExtendedAttributes) workflowProcessParent.clone();
				}
			}

			// 如果是活动的扩展属性
			if (getSourceExtendedAttributes().getParent() instanceof Activity) {
				WorkflowProcesses workflowProcesses = pkg
						.getWorkflowProcesses();
				ArrayList<WorkflowProcess> arrayList = workflowProcesses
						.toElements();
				Iterator<WorkflowProcess> it = arrayList.iterator();
				ExtendedAttributes workflowProcessParent = null;
				while (it.hasNext()) {
					WorkflowProcess workflowProcess = it.next();

					Activities activities = workflowProcess.getActivities();
					ArrayList<Activity> activityArrayList = activities
							.toElements();
					Iterator<Activity> activityIt = activityArrayList
							.iterator();
					ExtendedAttributes activityParent = null;
					while (activityIt.hasNext()) {
						Activity activity = activityIt.next();
						ExtendedAttributes extendedAttributes = activity
								.getExtendedAttributes();
						if (activityParent == null) {
							activityParent = (ExtendedAttributes) extendedAttributes
									.clone();
						} else {
							addExtendedAttributes(activityParent,
									extendedAttributes);
						}

					}
					if (workflowProcessParent == null) {
						if (activityParent != null) {
							workflowProcessParent = (ExtendedAttributes) activityParent
									.clone();
						}

					} else {
						addExtendedAttributes(workflowProcessParent,
								activityParent);
					}

				}
				if (workflowProcessParent != null) {
					parent = (ExtendedAttributes) workflowProcessParent.clone();

				}
			}
			// 如果是转移的扩展属性
			if (getSourceExtendedAttributes().getParent() instanceof Transition) {
				WorkflowProcesses workflowProcesses = pkg
						.getWorkflowProcesses();
				ArrayList<WorkflowProcess> arrayList = workflowProcesses
						.toElements();
				Iterator<WorkflowProcess> it = arrayList.iterator();
				ExtendedAttributes workflowProcessParent = null;
				while (it.hasNext()) {
					WorkflowProcess workflowProcess = it.next();
					Transitions transitions = workflowProcess.getTransitions();
					ArrayList<Transition> transitionArrayList = transitions
							.toElements();
					Iterator<Transition> transitionIt = transitionArrayList
							.iterator();
					ExtendedAttributes transitionParent = null;
					while (transitionIt.hasNext()) {
						Transition transition = transitionIt.next();
						ExtendedAttributes extendedAttributes = transition
								.getExtendedAttributes();
						if (transitionParent == null) {
							transitionParent = (ExtendedAttributes) extendedAttributes
									.clone();
						} else {
							addExtendedAttributes(transitionParent,
									extendedAttributes);
						}
					}
					if (workflowProcessParent == null) {
						if (transitionParent != null) {
							workflowProcessParent = (ExtendedAttributes) transitionParent
									.clone();
						}

					} else {
						addExtendedAttributes(workflowProcessParent,
								transitionParent);
					}
				}
				if (workflowProcessParent != null) {
					parent = (ExtendedAttributes) workflowProcessParent.clone();
				}

			}
			// 如果是参与者的扩展属性
			if (getSourceExtendedAttributes().getParent() instanceof Participant) {
				WorkflowProcesses workflowProcesses = pkg
						.getWorkflowProcesses();
				ArrayList<WorkflowProcess> arrayList = workflowProcesses
						.toElements();
				Iterator<WorkflowProcess> it = arrayList.iterator();
				ExtendedAttributes workflowProcessParent = null;
				while (it.hasNext()) {
					WorkflowProcess workflowProcess = it.next();
					Participants participants = workflowProcess
							.getParticipants();
					ArrayList<Participant> participantArrayList = participants
							.toElements();
					Iterator<Participant> participantIt = participantArrayList
							.iterator();
					ExtendedAttributes participantParent = null;
					while (participantIt.hasNext()) {
						Participant participant = participantIt.next();
						ExtendedAttributes extendedAttributes = participant
								.getExtendedAttributes();
						if (participantParent == null) {
							participantParent = (ExtendedAttributes) extendedAttributes
									.clone();
						} else {
							addExtendedAttributes(participantParent,
									extendedAttributes);
						}
					}
					if (workflowProcessParent == null) {
						if (participantParent != null) {
							workflowProcessParent = (ExtendedAttributes) participantParent
									.clone();
						}

					} else {
						addExtendedAttributes(workflowProcessParent,
								participantParent);
					}
				}
				if (workflowProcessParent != null) {
					parent = (ExtendedAttributes) workflowProcessParent.clone();
				}
			}
			// 如果是数据类型的扩展属性
			if (getSourceExtendedAttributes().getParent() instanceof DataField) {
				// 如果是包级的数据类型
				if (getSourceExtendedAttributes().getParent().getParent()
						.getParent() instanceof Package) {
					DataFields dataFields = pkg.getDataFields();
					ArrayList<DataField> dataFieldArrayList = dataFields
							.toElements();
					Iterator<DataField> dataFieldIt = dataFieldArrayList
							.iterator();
					ExtendedAttributes dataFieldParent = null;
					while (dataFieldIt.hasNext()) {
						DataField dataField = dataFieldIt.next();
						ExtendedAttributes extendedAttributes = dataField
								.getExtendedAttributes();
						if (dataFieldParent == null) {
							dataFieldParent = (ExtendedAttributes) extendedAttributes
									.clone();
						} else {
							addExtendedAttributes(dataFieldParent,
									extendedAttributes);
						}
					}

					if (dataFieldParent != null) {
						parent = (ExtendedAttributes) dataFieldParent.clone();
					}
				}
				// 如果是流程级的数据类型
				if (getSourceExtendedAttributes().getParent().getParent()
						.getParent() instanceof WorkflowProcess) {
					WorkflowProcesses workflowProcesses = pkg
							.getWorkflowProcesses();
					ArrayList<WorkflowProcess> arrayList = workflowProcesses
							.toElements();
					Iterator<WorkflowProcess> it = arrayList.iterator();
					ExtendedAttributes workflowProcessParent = null;
					while (it.hasNext()) {
						WorkflowProcess workflowProcess = it.next();
						DataFields dataFields = workflowProcess.getDataFields();
						ArrayList<DataField> dataFieldArrayList = dataFields
								.toElements();
						Iterator<DataField> dataFieldIt = dataFieldArrayList
								.iterator();
						ExtendedAttributes dataFieldParent = null;
						while (dataFieldIt.hasNext()) {
							DataField dataField = dataFieldIt.next();
							ExtendedAttributes extendedAttributes = dataField
									.getExtendedAttributes();
							if (dataFieldParent == null) {
								dataFieldParent = (ExtendedAttributes) extendedAttributes
										.clone();
							} else {
								addExtendedAttributes(dataFieldParent,
										extendedAttributes);
							}
						}
						if (workflowProcessParent == null) {
							if (dataFieldParent != null) {
								workflowProcessParent = (ExtendedAttributes) dataFieldParent
										.clone();
							}

						} else {
							addExtendedAttributes(workflowProcessParent,
									dataFieldParent);
						}
					}
					if (workflowProcessParent != null) {
						parent = (ExtendedAttributes) workflowProcessParent
								.clone();
					}
				}

			}
		}
		// 如果打开的是xml文件
		if (fileFullPath.endsWith("xml")) {
			try {
				parent = (ExtendedAttributes) this.sourceExtendedAttributes
						.clone();
				parent.clear();

				SAXReader reader = new SAXReader();
				Document document = reader.read(new File(fileFullPath));

				Node root = document
						.selectSingleNode("//beans/bean/property/props");
				List<Element> list = root.selectNodes(".//prop");

				Iterator<Element> it = list.iterator();
				while (it.hasNext()) {
					Element element = it.next();
					Attribute attribute = element.attribute("key");
					String value = attribute.getValue();
					ExtendedAttribute extendedAttribute = new ExtendedAttribute(
							parent);
					extendedAttribute.setName("URL");
					extendedAttribute.setVValue(value.substring(1));// 去掉开始的斜杠
					parent.add(extendedAttribute);
				}
			} catch (DocumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return parent;
	}

	@Override
	protected void dialogChanged() {
		// TODO Auto-generated method stub

	}

	public void setProjectPath(String projectPath) {
		// TODO Auto-generated method stub
		this.projectPath = projectPath;
	}

	public String getProjectPath() {
		return projectPath;
	}

}

 

分享到:
评论
1 楼 zhaofangtao 2009-05-20  
hi
你这个示例是在 3.2还是3.4的??

我的3.4里怎么没有
org.eclipse.jface.viewers.CellEditor;
org.eclipse.jface.viewers.ICellModifier;
呢?

相关推荐

Global site tag (gtag.js) - Google Analytics