Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,13 @@ void removeItem(AbstractContributionItem item) {
}

public void updateContributionItems(Selector selector) {
boolean queued = false;
boolean doRunNow = false;
for (final AbstractContributionItem ci : itemsToCheck) {
if (ci.getModel() != null && ci.getModel().getParent() != null) {
if (selector.select(ci.getModel())) {
itemsToUpdateLater.add(ci);
queued = true;
if (timestampOfEarliestQueuedUpdate == 0) {
timestampOfEarliestQueuedUpdate = System.nanoTime();
}
Expand All @@ -61,14 +63,16 @@ public void updateContributionItems(Selector selector) {
// again and again in less than given DELAY frequency. TimerExec would then
// never be executed.
doRunNow = true;
} else {
Display.getDefault().timerExec(DELAY, this);
}
}
} else {
orphanedToolItems.add(ci);
}
}
if (queued && !doRunNow) {
// one timer for the whole batch, rescheduling it per item only costs time
Display.getDefault().timerExec(DELAY, this);
}
if (!orphanedToolItems.isEmpty()) {
itemsToCheck.removeAll(orphanedToolItems);
orphanedToolItems.clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
Expand Down Expand Up @@ -1061,12 +1062,14 @@ public EditorReference createEditorReferenceForPart(final MPart part, IEditorInp
private List<EditorReference> getOrderedEditorReferences() {

List<EditorReference> editorRefs = new ArrayList<>();
Set<EditorReference> seen = new HashSet<>();
Map<MPart, EditorReference> referencesByModel = getEditorReferencesByModel();
List<MPart> visibleEditors = modelService.findElements(window, CompatibilityEditor.MODEL_ELEMENT_ID,
MPart.class);
for (MPart editor : visibleEditors) {
if (editor.isToBeRendered()) {
EditorReference ref = getEditorReference(editor);
if (ref != null && !editorRefs.contains(ref)) {
EditorReference ref = referencesByModel.get(editor);
if (ref != null && seen.add(ref)) {
editorRefs.add(ref);
}
}
Expand All @@ -1075,23 +1078,36 @@ private List<EditorReference> getOrderedEditorReferences() {
return editorRefs;
}

/**
* Maps the model element of every editor reference of this page to its
* reference, so that callers can resolve many parts without rescanning the
* reference list for each one.
*/
private Map<MPart, EditorReference> getEditorReferencesByModel() {
Map<MPart, EditorReference> referencesByModel = new IdentityHashMap<>(editorReferences.size());
for (EditorReference ref : editorReferences) {
referencesByModel.putIfAbsent(ref.getModel(), ref);
}
return referencesByModel;
}

List<EditorReference> getSortedEditorReferences() {
return getSortedEditorReferences(false);
}

private List<EditorReference> getSortedEditorReferences(boolean allPerspectives) {
Map<MPart, EditorReference> referencesByModel = getEditorReferencesByModel();
List<EditorReference> sortedReferences = new ArrayList<>();
Set<EditorReference> seen = new HashSet<>();
for (MPart part : activationList) {
for (EditorReference ref : editorReferences) {
if (ref.getModel() == part) {
sortedReferences.add(ref);
break;
}
EditorReference ref = referencesByModel.get(part);
if (ref != null && seen.add(ref)) {
sortedReferences.add(ref);
}
}

for (EditorReference ref : editorReferences) {
if (!sortedReferences.contains(ref)) {
if (seen.add(ref)) {
sortedReferences.add(ref);
}
}
Expand All @@ -1101,13 +1117,17 @@ private List<EditorReference> getSortedEditorReferences(boolean allPerspectives)
int scope = allPerspectives ? WINDOW_SCOPE : EModelService.PRESENTATION;
List<MPart> placeholders = modelService.findElements(window, CompatibilityEditor.MODEL_ELEMENT_ID,
MPart.class, null, scope);
// only rendered placeholders are valid references
Set<MPart> rendered = Collections.newSetFromMap(new IdentityHashMap<>(placeholders.size()));
for (MPart placeholder : placeholders) {
if (placeholder.isToBeRendered()) {
rendered.add(placeholder);
}
}
List<EditorReference> visibleReferences = new ArrayList<>();
for (EditorReference reference : sortedReferences) {
for (MPart placeholder : placeholders) {
if (reference.getModel() == placeholder && placeholder.isToBeRendered()) {
// only rendered placeholders are valid references
visibleReferences.add(reference);
}
if (rendered.contains(reference.getModel())) {
visibleReferences.add(reference);
}
}

Expand Down Expand Up @@ -2318,40 +2338,44 @@ private IWorkbenchPartReference[] getSortedParts(boolean editors, boolean views,
}

List<IWorkbenchPartReference> sortedReferences = new ArrayList<>();
Set<IWorkbenchPartReference> seen = new HashSet<>();
IViewReference[] viewReferences = getViewReferences(allPerspectives);
List<EditorReference> editorReferences = getSortedEditorReferences(allPerspectives);

activationLoop: for (MPart part : activationList) {
if (views) {
for (IViewReference ref : viewReferences) {
if (((ViewReference) ref).getModel() == part) {
sortedReferences.add(ref);
continue activationLoop;
}
}
Map<MPart, IWorkbenchPartReference> viewsByModel = new IdentityHashMap<>(viewReferences.length);
if (views) {
for (IViewReference ref : viewReferences) {
viewsByModel.putIfAbsent(((ViewReference) ref).getModel(), ref);
}
}
Map<MPart, IWorkbenchPartReference> editorsByModel = new IdentityHashMap<>(editorReferences.size());
if (editors) {
for (EditorReference ref : editorReferences) {
editorsByModel.putIfAbsent(ref.getModel(), ref);
}
}

if (editors) {
for (EditorReference ref : editorReferences) {
if (ref.getModel() == part) {
sortedReferences.add(ref);
break;
}
}
for (MPart part : activationList) {
IWorkbenchPartReference ref = viewsByModel.get(part);
if (ref == null) {
ref = editorsByModel.get(part);
}
if (ref != null && seen.add(ref)) {
sortedReferences.add(ref);
}
}

if (views) {
for (IViewReference ref : viewReferences) {
if (!sortedReferences.contains(ref)) {
if (seen.add(ref)) {
sortedReferences.add(ref);
}
}
}

if (editors) {
for (EditorReference ref : editorReferences) {
if (!sortedReferences.contains(ref)) {
if (seen.add(ref)) {
sortedReferences.add(ref);
}
}
Expand Down
Loading