Eclipse插件(RCP)自定义编辑器添加Dirty效果

Eclipse插件(RCP)自定义编辑器添加Dirty效果,第1张

Eclipse插件(RCP)自定义编辑添加Dirty效果 前言

前一篇文章介绍了如何自定义编辑器,这一篇介绍如何使得自定义编辑器向文本编辑器那样,如果修改了,文章标题处出现一个 * ,表示该文本已被编辑过还未保存。当保存后 * 消失。
编辑时效果如下:

关闭时提示如下:

视频效果

思路
  • 在编辑器中补充几个与dirty相关的方法
    Eclipse插件(RCP)自定义编辑器中已补充
	
	public void changeDirtyState(boolean isDirty) {
		this.isDirty = isDirty;
		firePropertyChange(PROP_DIRTY);
	}
	
	public void toDirty() {
		changeDirtyState(true);
	}

	public void clearDirty() {
		changeDirtyState(false);
	}
  • 编辑器中各表单组件数据修改后加修改dirty的值
  1. Widget 的子类可以添加addModifyListener监听器,也可以写一个工具方法
	private void addDirtyListener(Widget com) {
		com.addListener(SWT.Modify, e->{
			editor.toDirty();
		});
	}
  1. 对非Widget 子类可在修改完成时改变dirty状态,如我们可以对deleteButton做如下修改:
		delete.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				if (dogImage != null) {
					dogImage.dispose();
					dogImage = null;
					dogPhoto.redraw();
					// 新加的代码
					dogImagePath = "";
					editor.toDirty();
				}
			}
		});
最终代码

FormEditor

package com.xzbd.editors;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;

import com.xzbd.views.FormEditorViewer;

public class FormEditor extends EditorPart {

	public static String ID = "com.xzbd.editors.FormEditor";

	public boolean isDirty = false;
	private FormEditorViewer viewer;

	@Override
	public void doSave(IProgressMonitor monitor) {
		FormEditorData data = viewer.getData();
		System.out.println(data);
		clearDirty();
	}

	@Override
	public void doSaveAs() {

	}

	@Override
	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
		this.setSite(site);
		this.setInput(input);
	}

	@Override
	public boolean isDirty() {
		return isDirty;
	}

	@Override
	public boolean isSaveAsAllowed() {
		return false;
	}

	@Override
	public void createPartControl(Composite parent) {
		viewer = new FormEditorViewer(parent,this);

	}

	@Override
	public void setFocus() {

	}

	
	public void changeDirtyState(boolean isDirty) {
		this.isDirty = isDirty;
		firePropertyChange(PROP_DIRTY);
	}
	
	public void toDirty() {
		changeDirtyState(true);
	}

	public void clearDirty() {
		changeDirtyState(false);
	}
}

FormEditorViewer

package com.xzbd.views;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;

import com.xzbd.editors.FormEditor;
import com.xzbd.editors.FormEditorData;



public class FormEditorViewer {

	private FormEditor editor;
	private Composite parent;

	private Text dogName;
	private Combo dogBreed;
	private Canvas dogPhoto;
	private Image dogImage;
	private String  dogImagePath;
	private List categories;
	private Text ownerName;
	private Text ownerPhone;

	public FormEditorViewer(Composite parent, FormEditor editor) {
		this.parent = parent;
		// 缓存 Editor
		setEditor(editor);

		// 绘制UI
		buildPageUI();
	}

	// 创建UI
	private void buildPageUI() {
		// 设置 parent 布局,采用3列 GridLayout 方式布局
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 3;
		parent.setLayout(gridLayout);

		new Label(parent, SWT.NONE).setText("Dog's Name:");
		dogName = new Text(parent, SWT.SINGLE | SWT.BORDER);
		// 设置 label 布局,横向占两列满填充
		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
		gridData.horizontalSpan = 2;
		dogName.setLayoutData(gridData);
		addDirtyListener(dogName);

		new Label(parent, SWT.NONE).setText("Breed:");
		dogBreed = new Combo(parent, SWT.NONE);
		dogBreed.setItems(new String[] { "Collie", "Pitbull", "Poodle", "Scottie" });
		dogBreed.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
		addDirtyListener(dogBreed);

		Label label = new Label(parent, SWT.NONE);
		label.setText("Categories");
		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));

		new Label(parent, SWT.NONE).setText("Photo:");
		dogPhoto = new Canvas(parent, SWT.BORDER);
		gridData = new GridData(GridData.FILL_BOTH);
		gridData.widthHint = 80;
		gridData.heightHint = 80;
		gridData.verticalSpan = 3;
		dogPhoto.setLayoutData(gridData);
		dogPhoto.addPaintListener(new PaintListener() {
			public void paintControl(final PaintEvent event) {
				if (dogImage != null) {
					event.gc.drawImage(dogImage, 0, 0);
					editor.toDirty();
				}
			}
		});
		
		
		categories = new List(parent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL);
		categories.setItems(new String[] { "Best of Breed", "Prettiest Female", "Handsomest Male", "Best Dressed",
				"Fluffiest Ears", "Most Colors", "Best Performer", "Loudest Bark", "Best Behaved", "Prettiest Eyes",
				"Most Hair", "Longest Tail", "Cutest Trick" });
		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
		gridData.verticalSpan = 4;
		int listHeight = categories.getItemHeight() * 12;
		Rectangle trim = categories.computeTrim(0, 0, 0, listHeight);
		gridData.heightHint = trim.height;
		categories.setLayoutData(gridData);
		categories.addTouchListener(e->{
			editor.toDirty();
		});
		
		Button browse = new Button(parent, SWT.PUSH);
		browse.setText("Browse...");
		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
		gridData.horizontalIndent = 5;
		browse.setLayoutData(gridData);
		browse.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				String fileName = new FileDialog(parent.getShell()).open();
				if (fileName != null) {
					dogImage = new Image(parent.getDisplay(), fileName);
					dogImagePath = fileName;
					editor.toDirty();
				}
			}
		});
		
		
		Button delete = new Button(parent, SWT.PUSH);
		delete.setText("Delete");
		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
		gridData.horizontalIndent = 5;
		delete.setLayoutData(gridData);
		delete.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				if (dogImage != null) {
					dogImage.dispose();
					dogImage = null;
					dogPhoto.redraw();
					
					dogImagePath = "";
					editor.toDirty();
				}
			}
		});
		
		
		Group ownerInfo = new Group(parent, SWT.NONE);
		ownerInfo.setText("Owner Info");
		gridLayout = new GridLayout();
		gridLayout.numColumns = 2;
		ownerInfo.setLayout(gridLayout);
		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
		gridData.horizontalSpan = 2;
		ownerInfo.setLayoutData(gridData);
		new Label(ownerInfo, SWT.NONE).setText("Name:");
		ownerName = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER);
		ownerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		addDirtyListener(ownerName);
		
		new Label(ownerInfo, SWT.NONE).setText("Phone:");
		ownerPhone = new Text(ownerInfo, SWT.SINGLE | SWT.BORDER);
		ownerPhone.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		addDirtyListener(ownerPhone);
		
		
		Button enter = new Button(parent, SWT.PUSH);
		enter.setText("Enter");
		gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
		gridData.horizontalSpan = 3;
		enter.setLayoutData(gridData);
		enter.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				System.out.println("/nDog Name: " + dogName.getText());
				System.out.println("Dog Breed: " + dogBreed.getText());
				System.out.println("Owner Name: " + ownerName.getText());
				System.out.println("Owner Phone: " + ownerPhone.getText());
				System.out.println("Categories:");
				String cats[] = categories.getSelection();
				for (int i = 0; i < cats.length; i++) {
					System.out.println("/t" + cats[i]);
				}
			}
		});
		if (dogImage != null) {
			dogImage.dispose();
		}

	}

	public FormEditor getEditor() {
		return editor;
	}

	public void setEditor(FormEditor editor) {
		this.editor = editor;
	}
	
	private void addDirtyListener(Widget com) {
		com.addListener(SWT.Modify, e->{
			editor.toDirty();
		});
	}

	public FormEditorData getData() {
		String dogNameText = dogName.getText();
		String dogBreedText = dogBreed.getText();
		String ownerNameText = ownerName.getText();
		String ownerPhoneText = ownerPhone.getText();
		String[] categoriesArr = categories.getSelection();
		FormEditorData data = new FormEditorData(
				dogNameText,
				dogBreedText,
				dogImagePath,
				ownerNameText,
				ownerPhoneText,
				categoriesArr
				);
		return data;
	}
}

FormEditorData

package com.xzbd.editors;

import java.util.Arrays;

public class FormEditorData {
	
	private String dogName;
	private String dogBreed;
	private String dogImagePath;
	private String ownerName;
	private String ownerPhone;
	private String[] categories;
	
	
	public FormEditorData(String dogName, String dogBreed, String dogImagePath, 
			String ownerName, String ownerPhone,
			String[] categories) {
		super();
		this.dogName = dogName;
		this.dogBreed = dogBreed;
		this.dogImagePath = dogImagePath;
		this.ownerName = ownerName;
		this.ownerPhone = ownerPhone;
		this.categories = categories;
	}
	public String getDogName() {
		return dogName;
	}
	public void setDogName(String dogName) {
		this.dogName = dogName;
	}
	public String getDogBreed() {
		return dogBreed;
	}
	public void setDogBreed(String dogBreed) {
		this.dogBreed = dogBreed;
	}
	public String getDogImagePath() {
		return dogImagePath;
	}
	public void setDogImagePath(String dogImagePath) {
		this.dogImagePath = dogImagePath;
	}
	public String getOwnerName() {
		return ownerName;
	}
	public void setOwnerName(String ownerName) {
		this.ownerName = ownerName;
	}
	public String getOwnerPhone() {
		return ownerPhone;
	}
	public void setOwnerPhone(String ownerPhone) {
		this.ownerPhone = ownerPhone;
	}
	public String[] getCategories() {
		return categories;
	}
	public void setCategories(String[] categories) {
		this.categories = categories;
	}
	@Override
	public String toString() {
		return "FormEditorData [dogName=" + dogName + ",rn dogBreed=" + dogBreed + ",rn dogImagePath=" + dogImagePath
				+ ",rn ownerName=" + ownerName + ",、rn ownerPhone=" + ownerPhone + ",rn categories="
				+ Arrays.toString(categories) + "]";
	}

	
}

FormEditorData是表单数据对象,当按下Ctrl+S后,FormEditor的doSave方法会从viewer中获取最新的值,并打印,其相关代码如下:

	@Override
	public void doSave(IProgressMonitor monitor) {
		FormEditorData data = viewer.getData();
		System.out.println(data);
		clearDirty();
	}

打印内容示例:

FormEditorData [dogName=中华田园犬2,
 dogBreed=Pitbull,
 dogImagePath=C:UserssunPictures9958c8db-0a11-4bab-8d12-7782ed892fa1.jpg,
 ownerName=张三,、
 ownerPhone=1899999999,
 categories=[Fluffiest Ears, Best Performer, Best Behaved]]
总结

文章讲述了如何对自定义编辑器添加 dirty 效果,以使得编辑器与文本编辑器具有相同的保存、修改行为,方便客户使用。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5681553.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存