Skip to content

Commit 832cc2d

Browse files
committed
Fix(workbench): StackRenderer updates correctly when part is moved
Fixes Eclipse Bug 576186. The StackRenderer now correctly updates its UI when a part within the stack is moved. This was achieved by handling UIEvents.isMOVE events for MPartStack children in StackRenderer.java. CTabItems, which represent tabs, cannot be reordered directly and must be disposed of and recreated at the new index. The methods calcIndexFor and findItemForPart in StackRenderer were updated to accept a more generic MElementContainer<? extends MUIElement> parameter to resolve type compatibility issues with MPartStack.
1 parent 7801de7 commit 832cc2d

1 file changed

Lines changed: 64 additions & 2 deletions

File tree

  • bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt

bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,60 @@ void subscribeTopicChildrenChanged(@UIEventTopic(UIEvents.ElementContainer.TOPIC
395395
shouldTopRightAdjusted(event);
396396
}
397397

398+
@Inject
399+
@Optional
400+
void subscribeTopicChildrenMoved(@UIEventTopic(UIEvents.ElementContainer.TOPIC_CHILDREN) Event event) {
401+
if (!UIEvents.isMOVE(event)) {
402+
return;
403+
}
404+
// Ensure that this event is for a MPartStack
405+
Object element = event.getProperty(UIEvents.EventTags.ELEMENT);
406+
if (!(element instanceof MPartStack)) {
407+
return;
408+
}
409+
410+
MPartStack stack = (MPartStack) element;
411+
if (stack.getRenderer() != this) {
412+
return;
413+
}
414+
415+
MUIElement movedElement = (MUIElement) event.getProperty(UIEvents.EventTags.NEW_VALUE);
416+
417+
CTabFolder tabFolder = (CTabFolder) stack.getWidget();
418+
if (tabFolder == null || tabFolder.isDisposed()) {
419+
return;
420+
}
421+
422+
CTabItem item = findItemForPart(movedElement, stack);
423+
if (item == null || item.isDisposed()) {
424+
return;
425+
}
426+
427+
int newIndex = calcIndexFor(stack, movedElement);
428+
429+
// Remember the control, it will be disposed with the CTabItem otherwise
430+
Control control = item.getControl();
431+
item.setControl(null);
432+
433+
// As CTabItem cannot be reordered, we need to dispose and recreate it
434+
String text = item.getText();
435+
Image image = item.getImage();
436+
boolean showClose = item.getShowClose();
437+
String toolTipText = item.getToolTipText();
438+
Font font = item.getFont();
439+
Object data = item.getData();
440+
441+
item.dispose();
442+
443+
CTabItem newItem = new CTabItem(tabFolder, (showClose ? SWT.CLOSE : SWT.NONE), newIndex);
444+
newItem.setText(text);
445+
newItem.setImage(image);
446+
newItem.setToolTipText(toolTipText);
447+
newItem.setFont(font);
448+
newItem.setData(data);
449+
newItem.setControl(control);
450+
}
451+
398452
@Inject
399453
@Optional
400454
void subscribeTopicUILabelChanged(@UIEventTopic(UIEvents.UILabel.TOPIC_ALL) Event event) {
@@ -623,6 +677,14 @@ void subscribeTopicSelectedelementChanged(
623677
tabStateHandler.handleEvent(event);
624678
}
625679

680+
@Override
681+
public void removeGui(MUIElement element, Object widget) {
682+
if (widget instanceof CTabFolder tabFolder && !tabFolder.isDisposed()) {
683+
tabFolder.dispose();
684+
}
685+
element.setWidget(null);
686+
}
687+
626688
@Override
627689
protected boolean requiresFocus(MPart element) {
628690
MUIElement inStack = element.getCurSharedRef() != null ? element.getCurSharedRef() : element;
@@ -1010,7 +1072,7 @@ protected void createTab(MElementContainer<MUIElement> stack, MUIElement element
10101072
}
10111073
}
10121074

1013-
private int calcIndexFor(MElementContainer<MUIElement> stack, final MUIElement part) {
1075+
private int calcIndexFor(MElementContainer<? extends MUIElement> stack, final MUIElement part) {
10141076
int index = 0;
10151077

10161078
// Find the -visible- part before this element
@@ -1036,7 +1098,7 @@ public void childRendered(final MElementContainer<MUIElement> parentElement, MUI
10361098
createTab(parentElement, element);
10371099
}
10381100

1039-
private CTabItem findItemForPart(MUIElement element, MElementContainer<MUIElement> stack) {
1101+
private CTabItem findItemForPart(MUIElement element, MElementContainer<? extends MUIElement> stack) {
10401102
if (stack == null) {
10411103
stack = element.getParent();
10421104
}

0 commit comments

Comments
 (0)