如何使用IMemento 存储视图部分的所有信息?
How to store all the information of view part using IMemento?
我有一个使用扩展 ViewPart 的视图的 eclipse 插件。 ViewPart 有一个需要 IMemento 的 saveState 方法。我将我的代码添加到 saveState 和相应的 init-Method 并且它有效。
我创建了 3 个 hashmap。
1) hmTextONLY: 它只包含文本值。(列名(ColumnIndex):Threarname(1),categoryname(2),description(5),justification(6 ))
2) hmCOMBO1ONLY: 它只包含 combobox1 值。(列名(列索引): status(3))
3) hmCOMBO2ONLY: 它只包含 combobox2 值。(列名(列索引):Priority(4))
这里是方法说明,代码中用到了
init: 初始化视图
createPartControl: 在视图部分创建table。
fillRows: table中的数据来自该方法。一行一行。
saveState:此方法用于保存 data.saveState 仅在整个工作区关闭时调用。
saveState:关闭应用程序时保存工作空间
问题:
1) 如何使用保存状态方法保存整个 table 数据顺序(文本混合,组合框)?我在 saveState 方法中创建了一个子表单 Id1。
代码:
public class Theartview extends ViewPart implements Serializable {
Table table;
private TableViewer tableViewer;
TableViewerColumn tableViewerColumn;
TableColumnLayout tableColumnLayout;
private HashMap<Integer, String> hmTextONLY = new HashMap<>();
private HashMap<Integer, String> hmCOMBO1ONLY = new HashMap<>();
private HashMap<Integer, String> hmCOMBO2ONLY = new HashMap<>();
private static Integer hmT = 0, hmC1 = 0, hmC2 = 0;
private IMemento memento;
private Text text_1, text_2, text_3, text_4;
public void createPartControl(Composite parent) {
Composite tableComposite = new Composite(parent, SWT.NONE);
tableColumnLayout = new TableColumnLayout();
tableComposite.setLayout(tableColumnLayout);
tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
true));
tableViewer = new TableViewer(tableComposite, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
// TODO viewer.setLabelProvider(new ViewLabelProvider());
table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
String[] titles = { "Threat Name", "Category Name", "Status",
"Priority", "Description", "Justification" };
for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tblclmn = tableViewerColumn.getColumn();
tableColumnLayout.setColumnData(tblclmn, new ColumnPixelData(200,
true, true));
tblclmn.setText(titles[loopIndex]);
}
if (memento != null) {
System.out.println("Entering Restore State");
restoreState(memento);
}
memento = null;
}
private void fillRows(String shortdesc, String categ, String descp) {
TableItem ramtableitem = new TableItem(table, SWT.NONE);
// for Threat_Name
TableEditor editorTN = new TableEditor(table);
text_1 = new Text(table, SWT.NONE);
editorTN.grabHorizontal = true;
editorTN.setEditor(text_1, ramtableitem, 0);
text_1.setText(shortdesc);
Theart_Name = text_1.getText();
hmTextONLY.put(hmT++, Theart_Name);
// For Category_Name
TableEditor editorCN = new TableEditor(table);
text_2 = new Text(table, SWT.NONE);
editorCN.grabHorizontal = true;
editorCN.setEditor(text_2, ramtableitem, 1);
text_2.setText(categ);
Category_Name = text_2.getText();
hmTextONLY.put(hmT++, Category_Name);
String items[] = { "Mitigated", "Not Applicable", "Not Started",
"Needs Investigation" };
Arrays.sort(items);
final CCombo Status_Combo = new CCombo(table, SWT.NONE);
Status_Combo.setItems(items);
TableEditor editor = new TableEditor(table);
editor.grabHorizontal = true;
editor.setEditor(Status_Combo, ramtableitem, 2);
Status_Combo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Status_Name = Status_Combo.getText();
hmCOMBO1ONLY.put(hmC1, Status_Name);
}
public void widgetDefaultSelected(SelectionEvent e) {
Status_Name = Status_Combo.getText();
hmCOMBO1ONLY.put(hmC1, Status_Name);
}
});
// For Priority_Name
String itemss[] = { "High", "Medium", "Low" };
Arrays.sort(itemss);
final CCombo Priority_Combo = new CCombo(table, SWT.NONE);
Priority_Combo.setItems(itemss);
TableEditor editorP = new TableEditor(table);
editorP.grabHorizontal = true;
editorP.setEditor(Priority_Combo, ramtableitem, 3);
Priority_Combo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
System.out.println(Priority_Combo.getText());
Priority_Name = Priority_Combo.getText();
hmCOMBO2ONLY.put(hmC2, Priority_Name);
}
public void widgetDefaultSelected(SelectionEvent e) {
System.out.println(Priority_Combo.getText());
Priority_Name = Priority_Combo.getText();
hmCOMBO2ONLY.put(hmC2, Priority_Name);
}
});
// For Descrption_Name
TableEditor editorDN = new TableEditor(table);
text_3 = new Text(table, SWT.NONE);
editorDN.grabHorizontal = true;
editorDN.setEditor(text_3, ramtableitem, 4);
text_3.setText(descp);
Descrption_Name = text_3.getText();
hmTextONLY.put(hmT++, Descrption_Name);
// For justification
TableEditor editorJ = new TableEditor(table);
text_4 = new Text(table, SWT.MULTI | SWT.BORDER | SWT.WRAP
| SWT.V_SCROLL);
editorJ.grabHorizontal = true;
editorJ.setEditor(text_4, ramtableitem, 5);
Justification_Name = text_4.getText().toString().trim();
hmTextONLY.put(hmT++, Justification_Name);
}
public void saveState(IMemento memento) {
super.saveState(memento);
for (int s = 0; s <= hmTextONLY.size(); s++) {
for (int su = 0; su <= hmCOMBO1ONLY.size(); su++) {
for (int sum = 0; sum <= hmCOMBO2ONLY.size(); sum++) {
IMemento mem = memento.createChild(ID1 + "s");
mem.putString(ID1 + "s", hmTextONLY.get(s));
}
}
}
public void init(IViewSite site, IMemento memento) throws PartInitException{
super.init(site, memento);
this.memento = memento;
System.out.println("Intialize the view");
}
}
}
以上代码的当前输出:
IMemento
能够保持任意状态,只要它可以序列化为字符串和基元。您需要编写将视图状态(例如列宽、选择等)与给定 IMemento
实例相互转换的代码。
为了结构化存储的数据,mementos也可以嵌套。使用 createChild()
,创建子备忘录。
视图具有生命周期方法,即 init()
和 saveState()
,它们在
时调用
- 视图已初始化,备忘录中的状态应应用于视图
- 视图即将关闭,其状态应存储在备忘录中。
此 wiki 页面提供了更多详细信息,还列出了使用纪念品的替代方法:https://wiki.eclipse.org/FAQ_How_does_a_view_persist_its_state_between_sessions%3F
我有一个使用扩展 ViewPart 的视图的 eclipse 插件。 ViewPart 有一个需要 IMemento 的 saveState 方法。我将我的代码添加到 saveState 和相应的 init-Method 并且它有效。
我创建了 3 个 hashmap。
1) hmTextONLY: 它只包含文本值。(列名(ColumnIndex):Threarname(1),categoryname(2),description(5),justification(6 ))
2) hmCOMBO1ONLY: 它只包含 combobox1 值。(列名(列索引): status(3))
3) hmCOMBO2ONLY: 它只包含 combobox2 值。(列名(列索引):Priority(4))
这里是方法说明,代码中用到了
init: 初始化视图
createPartControl: 在视图部分创建table。
fillRows: table中的数据来自该方法。一行一行。 saveState:此方法用于保存 data.saveState 仅在整个工作区关闭时调用。
saveState:关闭应用程序时保存工作空间
问题: 1) 如何使用保存状态方法保存整个 table 数据顺序(文本混合,组合框)?我在 saveState 方法中创建了一个子表单 Id1。
代码:
public class Theartview extends ViewPart implements Serializable {
Table table;
private TableViewer tableViewer;
TableViewerColumn tableViewerColumn;
TableColumnLayout tableColumnLayout;
private HashMap<Integer, String> hmTextONLY = new HashMap<>();
private HashMap<Integer, String> hmCOMBO1ONLY = new HashMap<>();
private HashMap<Integer, String> hmCOMBO2ONLY = new HashMap<>();
private static Integer hmT = 0, hmC1 = 0, hmC2 = 0;
private IMemento memento;
private Text text_1, text_2, text_3, text_4;
public void createPartControl(Composite parent) {
Composite tableComposite = new Composite(parent, SWT.NONE);
tableColumnLayout = new TableColumnLayout();
tableComposite.setLayout(tableColumnLayout);
tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
true));
tableViewer = new TableViewer(tableComposite, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
tableViewer.setContentProvider(ArrayContentProvider.getInstance());
// TODO viewer.setLabelProvider(new ViewLabelProvider());
table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
String[] titles = { "Threat Name", "Category Name", "Status",
"Priority", "Description", "Justification" };
for (int loopIndex = 0; loopIndex < titles.length; loopIndex++) {
tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tblclmn = tableViewerColumn.getColumn();
tableColumnLayout.setColumnData(tblclmn, new ColumnPixelData(200,
true, true));
tblclmn.setText(titles[loopIndex]);
}
if (memento != null) {
System.out.println("Entering Restore State");
restoreState(memento);
}
memento = null;
}
private void fillRows(String shortdesc, String categ, String descp) {
TableItem ramtableitem = new TableItem(table, SWT.NONE);
// for Threat_Name
TableEditor editorTN = new TableEditor(table);
text_1 = new Text(table, SWT.NONE);
editorTN.grabHorizontal = true;
editorTN.setEditor(text_1, ramtableitem, 0);
text_1.setText(shortdesc);
Theart_Name = text_1.getText();
hmTextONLY.put(hmT++, Theart_Name);
// For Category_Name
TableEditor editorCN = new TableEditor(table);
text_2 = new Text(table, SWT.NONE);
editorCN.grabHorizontal = true;
editorCN.setEditor(text_2, ramtableitem, 1);
text_2.setText(categ);
Category_Name = text_2.getText();
hmTextONLY.put(hmT++, Category_Name);
String items[] = { "Mitigated", "Not Applicable", "Not Started",
"Needs Investigation" };
Arrays.sort(items);
final CCombo Status_Combo = new CCombo(table, SWT.NONE);
Status_Combo.setItems(items);
TableEditor editor = new TableEditor(table);
editor.grabHorizontal = true;
editor.setEditor(Status_Combo, ramtableitem, 2);
Status_Combo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Status_Name = Status_Combo.getText();
hmCOMBO1ONLY.put(hmC1, Status_Name);
}
public void widgetDefaultSelected(SelectionEvent e) {
Status_Name = Status_Combo.getText();
hmCOMBO1ONLY.put(hmC1, Status_Name);
}
});
// For Priority_Name
String itemss[] = { "High", "Medium", "Low" };
Arrays.sort(itemss);
final CCombo Priority_Combo = new CCombo(table, SWT.NONE);
Priority_Combo.setItems(itemss);
TableEditor editorP = new TableEditor(table);
editorP.grabHorizontal = true;
editorP.setEditor(Priority_Combo, ramtableitem, 3);
Priority_Combo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
System.out.println(Priority_Combo.getText());
Priority_Name = Priority_Combo.getText();
hmCOMBO2ONLY.put(hmC2, Priority_Name);
}
public void widgetDefaultSelected(SelectionEvent e) {
System.out.println(Priority_Combo.getText());
Priority_Name = Priority_Combo.getText();
hmCOMBO2ONLY.put(hmC2, Priority_Name);
}
});
// For Descrption_Name
TableEditor editorDN = new TableEditor(table);
text_3 = new Text(table, SWT.NONE);
editorDN.grabHorizontal = true;
editorDN.setEditor(text_3, ramtableitem, 4);
text_3.setText(descp);
Descrption_Name = text_3.getText();
hmTextONLY.put(hmT++, Descrption_Name);
// For justification
TableEditor editorJ = new TableEditor(table);
text_4 = new Text(table, SWT.MULTI | SWT.BORDER | SWT.WRAP
| SWT.V_SCROLL);
editorJ.grabHorizontal = true;
editorJ.setEditor(text_4, ramtableitem, 5);
Justification_Name = text_4.getText().toString().trim();
hmTextONLY.put(hmT++, Justification_Name);
}
public void saveState(IMemento memento) {
super.saveState(memento);
for (int s = 0; s <= hmTextONLY.size(); s++) {
for (int su = 0; su <= hmCOMBO1ONLY.size(); su++) {
for (int sum = 0; sum <= hmCOMBO2ONLY.size(); sum++) {
IMemento mem = memento.createChild(ID1 + "s");
mem.putString(ID1 + "s", hmTextONLY.get(s));
}
}
}
public void init(IViewSite site, IMemento memento) throws PartInitException{
super.init(site, memento);
this.memento = memento;
System.out.println("Intialize the view");
}
}
}
以上代码的当前输出:
IMemento
能够保持任意状态,只要它可以序列化为字符串和基元。您需要编写将视图状态(例如列宽、选择等)与给定 IMemento
实例相互转换的代码。
为了结构化存储的数据,mementos也可以嵌套。使用 createChild()
,创建子备忘录。
视图具有生命周期方法,即 init()
和 saveState()
,它们在
- 视图已初始化,备忘录中的状态应应用于视图
- 视图即将关闭,其状态应存储在备忘录中。
此 wiki 页面提供了更多详细信息,还列出了使用纪念品的替代方法:https://wiki.eclipse.org/FAQ_How_does_a_view_persist_its_state_between_sessions%3F