X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.browsing.ui.common%2Fsrc%2Forg%2Fsimantics%2Fbrowsing%2Fui%2Fcommon%2Fprocessors%2FDefaultPrunedChildrenProcessor.java;fp=bundles%2Forg.simantics.browsing.ui.common%2Fsrc%2Forg%2Fsimantics%2Fbrowsing%2Fui%2Fcommon%2Fprocessors%2FDefaultPrunedChildrenProcessor.java;h=e7b9e0454d57917c082da51806f2f2e53dd49110;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 diff --git a/bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/processors/DefaultPrunedChildrenProcessor.java b/bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/processors/DefaultPrunedChildrenProcessor.java new file mode 100644 index 000000000..e7b9e0454 --- /dev/null +++ b/bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/processors/DefaultPrunedChildrenProcessor.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.browsing.ui.common.processors; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.simantics.browsing.ui.BuiltinKeys; +import org.simantics.browsing.ui.NodeContext; +import org.simantics.browsing.ui.NodeQueryManager; +import org.simantics.browsing.ui.SelectionRequest; +import org.simantics.browsing.ui.Tester; +import org.simantics.browsing.ui.NodeContext.QueryKey; +import org.simantics.browsing.ui.content.PrunedChildrenResult; +import org.simantics.browsing.ui.content.ViewpointContribution; + +public class DefaultPrunedChildrenProcessor extends AbstractNodeQueryProcessor { + + @Override + public QueryKey getIdentifier() { + return BuiltinKeys.PRUNED_CHILDREN; + } + + @Override + public PrunedChildrenResult query(NodeQueryManager manager, NodeContext context) { + + Collection contributions = manager.query(context, BuiltinKeys.VIEWPOINT_CONTRIBUTIONS); + if (contributions == null) + return PrunedChildrenResult.EMPTY; + + Set childSet = new HashSet(); + ArrayList children = new ArrayList(); + + // Gather NodeContexts from all viewpoint contributions + // into the 'children' result list to preserve the order. + // 'childSet' is used to prevent duplicate contributions. + for (ViewpointContribution contribution : contributions) { + Class clazz = contribution.getInputClass(); + if (clazz.isInstance(context.getConstant(BuiltinKeys.INPUT))) { + Tester test = contribution.getNodeContextTester(); + if (test == null || test.test(manager, context)) { + Collection contrib = contribution.getContribution(); + children.ensureCapacity(children.size() + contrib.size()); + for (NodeContext nc : contrib) + if (childSet.add(nc)) + children.add(nc); + } + } + } + +// Viewpoint viewpoint = manager.query(context, BuiltinKeys.SELECTED_VIEWPOINT); +// if (viewpoint == null) +// return PrunedChildrenResult.EMPTY; +// +// INodeContext[] children = viewpoint.getChildren(); + + Collection selectionRequests = manager.query(context, BuiltinKeys.SELECTION_REQUESTS); + if (selectionRequests == null) + return new PrunedChildrenResult(children.size(), children.toArray(NodeContext.NONE)); + + SelectionRequest[] reqs = selectionRequests.toArray(new SelectionRequest[selectionRequests.size()]); + + ArrayList pruned = new ArrayList(); + for (NodeContext ctx : children) { + boolean add = true; + + if (selectionRequests != null) { + for(SelectionRequest req : reqs) { + if (req.getRequest() == SelectionRequest.Request.FILTER) { + if (req.isIncluded(manager, ctx)) { + add = false; + break; + } + } + } + } + + if (add) + pruned.add(ctx); + } + return new PrunedChildrenResult(children.size(), pruned.toArray(NodeContext.NONE)); + } + + @Override + public String toString() { + return "PrunedChildrenProcessor"; + } + +} \ No newline at end of file