2016-09-27 56 views
0

我有eclipse插件,它使用了一個擴展ViewPart的視圖。 ViewPart有一個需要IMemento的saveState方法。我將我的代碼添加到saveState和相應的init-Method,並且它可以工作。如何使用IMemento存儲視圖部分的所有信息?

我已經創建了3個hashmap。

1)hmTextONLY:其只包含文本值(列名(ColumnIndex):Threarname(1)中,類別名(2),描述(5),理由(6))

2) hmCOMBO1ONLY:其只含有combobox1值(列名(列指數):狀態(3))。

3)hmCOMBO2ONLY:其只含有combobox2值(列名(列指數):優先級(4) )

方法描述這裏,在代碼中使用。

init:初始化視圖。

createPartControl:在視圖部分中創建表。

fillRows:表中的數據來自此方法。逐行。saveState:此方法對於保存data.saveState非常有用,只有在整個工作空間關閉時纔會調用該方法。

saveState:這用於關閉應用程序時保存工作區。

問題: 1)如何保存整個表數據的順序使用保存狀態的方法(混合文本,組合框)?我在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"); 

} 


} 

} 

電流上面的代碼輸出:

+0

這是過於廣泛。你需要告訴我們你已經做了一些研究,使用'IMemento'和你卡住的地方。 –

+0

@ greg-449:是否可以使用IMemento保存所有零件? –

+0

如果你足夠努力,那麼你可以節省幾乎所有的東西。 –

回答

0

IMemento可以,只要它可以被序列化到字符串和原語持有任意狀態。您需要編寫翻譯視圖狀態的代碼(例如列寬,選擇等)到給定的IMemento實例。

爲了構造要存儲的數據,紀念品也可以嵌套。使用createChild(),創建子紀念品。

甲視圖具有生命週期方法,即init()saveState()

  • 一個視圖被初始化,並從紀念品狀態應該被應用於視圖
  • 的圖將要被關閉,並且被稱爲其狀態應該存儲在紀念品中。

本wiki頁面提供進一步的細節,還列出了使用紀念品替代:https://wiki.eclipse.org/FAQ_How_does_a_view_persist_its_state_between_sessions%3F

+0

@RüdigerHerrmann非常感謝你。 –

+0

@RüdigerHerrmann:我修改了代碼,更具體地描述了我現在面臨的實際問題。請參閱上面的代碼。 –

+0

你沒有說明你面對的確切問題是什麼。 –