@Override public void handleMessage(int code, Object data) { switch (code) { // First re-check visibility of all tabs. // While tab deletion can be made on the fly, // tabs adding will be made by re-creation // of all elements, to preserve their order case ICPropertyTab.MANAGEDBUILDSTATE: if (folder == null) { if (itabs == null || itabs.size() == 0) return; ICPropertyTab t = itabs.get(0).tab; if (!t.canBeVisible()) t.handleTabEvent(ICPropertyTab.VISIBLE, null); return; } boolean willAdd = false; TabItem[] ts = folder.getItems(); int x = folder.getSelectionIndex(); String currHeader = (x == -1) ? null : ts[x].getText(); for (int i = 0; i < itabs.size(); i++) { InternalTab itab = itabs.get(i); TabItem ti = null; for (TabItem element2 : ts) { if (element2.isDisposed()) continue; if (element2.getData() == itab.tab) { ti = element2; break; } } if (itab.tab.canBeVisible()) { if (ti == null) { willAdd = true; break; } } else { if (ti != null) ti.dispose(); } } // in case of new tab added, // we have to dispose and re-create all tabs if (willAdd) { for (int j = 0; j < ts.length; j++) if (ts[j] != null && !ts[j].isDisposed()) ts[j].dispose(); TabItem ti = null; for (int i = 0; i < itabs.size(); i++) { InternalTab itab = itabs.get(i); if (itab.tab.canBeVisible()) { TabItem currTI = itab.createOn(folder); if (currHeader != null && currHeader.equals(itab.text)) ti = currTI; } } if (ti != null) folder.setSelection(ti); } break; } }
void releaseChildren(boolean destroy) { if (items != null) { for (int i = 0; i < items.length; i++) { TabItem item = items[i]; if (item != null && !item.isDisposed()) { item.release(false); } } items = null; } super.releaseChildren(destroy); }