/* * Copyright 2003-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.nodeEditor; import jetbrains.mps.nodeEditor.cellMenu.OldNewSubstituteUtil; import jetbrains.mps.openapi.editor.cells.SubstituteAction; import jetbrains.mps.smodel.presentation.NodePresentationUtil; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.module.SRepository; import java.util.Comparator; public class SubstituteActionComparator implements Comparator<SubstituteAction> { private String myPattern; public SubstituteActionComparator(String pattern) { this.myPattern = pattern; } protected int getLocalSortPriority(SubstituteAction action) { final Object parameterObject = action.getParameterObject(); if (parameterObject instanceof SNode) { return NodePresentationUtil.getSortPriority(action.getSourceNode(), (SNode) parameterObject); } else { return 0; } } protected String getVisibleMatchingText(SubstituteAction action) { return action.getVisibleMatchingText(myPattern); } protected boolean canSubstituteStrictly(SubstituteAction action) { return action.canSubstituteStrictly(myPattern); } protected int getRate(SubstituteAction action) { return SubstituteActionUtil.getSubstituteRate(action, myPattern); } protected boolean startsWith(SubstituteAction action) { return myPattern != null && getVisibleMatchingText(action).startsWith(myPattern); } protected boolean startsWithLowerCase(SubstituteAction action) { return myPattern != null && getVisibleMatchingText(action).toLowerCase().startsWith(myPattern.toLowerCase()); } private int compareByRate(SubstituteAction firstAction, SubstituteAction secondAction) { if (myPattern == null || myPattern.length() == 0) { return 0; } int firstSubstituteRate = getRate(firstAction); int secondSubstituteRate = getRate(secondAction); return secondSubstituteRate - firstSubstituteRate; } private int compareByStrictly(SubstituteAction i1, SubstituteAction i2) { boolean strictly1 = canSubstituteStrictly(i1); boolean strictly2 = canSubstituteStrictly(i2); if (strictly1 != strictly2) { return strictly1 ? -1 : 1; } return 0; } private int compareByLocalPriority(SubstituteAction i1, SubstituteAction i2) { int p1 = getLocalSortPriority(i1); int p2 = getLocalSortPriority(i2); return p1 - p2; } private int compareByStartsWith(SubstituteAction i1, SubstituteAction i2) { boolean startsWith1 = startsWith(i1); boolean startsWith2 = startsWith(i2); if (startsWith1 != startsWith2) { return startsWith1 ? -1 : 1; } return 0; } private int compareByStartsWithLowerCase(SubstituteAction i1, SubstituteAction i2) { boolean startsWithLowerCase1 = startsWithLowerCase(i1); boolean startsWithLowerCase2 = startsWithLowerCase(i2); if (startsWithLowerCase1 != startsWithLowerCase2) { return startsWithLowerCase1 ? -1 : 1; } return 0; } @Override public int compare(SubstituteAction action1, SubstituteAction action2) { int result = compareByStrictly(action1, action2); if (result != 0) return result; String s1 = getVisibleMatchingText(action1); String s2 = getVisibleMatchingText(action2); boolean null_s1 = (s1 == null || s1.length() == 0); boolean null_s2 = (s2 == null || s2.length() == 0); if (null_s1 && null_s2) return compareByLocalPriority(action1, action2); if (null_s1) return 1; if (null_s2) return -1; result = compareByStartsWith(action1, action2); if (result != 0) return result; result = compareByRate(action1, action2); if (result != 0) return result; result = compareByLocalPriority(action1, action2); if (result != 0) return result; if (getRate(action1) == SubstituteActionUtil.CAN_SUBSTITUTE_VIA_SEARCH && getRate(action2) == SubstituteActionUtil.CAN_SUBSTITUTE_VIA_SEARCH) { result = compareByStartsWithLowerCase(action1, action2); if (result != 0) return result; } return s1.compareTo(s2); } }