Skip to content

Commit

Permalink
Merge pull request #4 from konifar/consider_size
Browse files Browse the repository at this point in the history
Ellipsis too long strings
  • Loading branch information
konifar committed Aug 14, 2016
2 parents 8ba55d5 + ac04d38 commit c202372
Show file tree
Hide file tree
Showing 11 changed files with 105 additions and 82 deletions.
59 changes: 0 additions & 59 deletions src/main/java/com/konifar/stringssearch/PluginUtil.java

This file was deleted.

@@ -0,0 +1,37 @@
package main.java.com.konifar.stringssearch.models;

import com.intellij.navigation.ItemPresentation;
import org.jetbrains.annotations.Nullable;

public abstract class AbstractStringElement implements StringElement {

@Nullable
public ItemPresentation getPresentation() {
return null;
}

@Override
public void navigate(boolean canNavigate) {
// Do nothing
}

@Override
public boolean canNavigate() {
return true;
}

@Override
public boolean canNavigateToSource() {
return true;
}

@Override
public abstract String getName();

@Override
public abstract String getTag();

@Override
public abstract String getValue();

}
@@ -1,6 +1,6 @@
package main.java.com.konifar.stringssearch.models;

public final class NormalStringElement implements StringElement {
public final class NormalStringElement extends AbstractStringElement {

private final String name;

Expand Down
Expand Up @@ -3,7 +3,7 @@
import java.util.LinkedList;
import java.util.List;

public final class PluralStringElement implements StringElement {
public final class PluralStringElement extends AbstractStringElement {

private String name;

Expand Down
@@ -1,6 +1,6 @@
package main.java.com.konifar.stringssearch.models;

public final class QuantityStringElement implements StringElement {
public final class QuantityStringElement extends AbstractStringElement {

private final String quantity;

Expand Down
@@ -1,6 +1,8 @@
package main.java.com.konifar.stringssearch.models;

public interface StringElement {
import com.intellij.navigation.NavigationItem;

public interface StringElement extends NavigationItem {

String getName();

Expand Down
Expand Up @@ -17,15 +17,15 @@
name = "SearchStringConfiguration",
storages = {@Storage(file = StoragePathMacros.WORKSPACE_FILE)}
)
public final class SearchStringConfiguration extends ChooseByNameFilterConfiguration<StringElement> {
final class SearchStringConfiguration extends ChooseByNameFilterConfiguration<StringElement> {

/**
* Get configuration instance
*
* @param project a project instance
* @return a configuration instance
*/
public static SearchStringConfiguration getInstance(Project project) {
static SearchStringConfiguration getInstance(Project project) {
return ServiceManager.getService(project, SearchStringConfiguration.class);
}

Expand Down
Expand Up @@ -11,7 +11,7 @@

import java.util.Collection;

public class SearchStringItemProvider extends DefaultChooseByNameItemProvider {
public final class SearchStringItemProvider extends DefaultChooseByNameItemProvider {

public SearchStringItemProvider(@Nullable PsiElement context) {
super(context);
Expand Down
Expand Up @@ -3,12 +3,10 @@
import com.intellij.ide.util.gotoByName.FilteringGotoByModel;
import com.intellij.navigation.ChooseByNameContributor;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import main.java.com.konifar.stringssearch.models.StringElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -21,13 +19,8 @@
*/
public final class SearchStringModel extends FilteringGotoByModel<StringElement> implements DumbAware {

private final int maxWidth;

public SearchStringModel(@NotNull Project project) {
super(project, Extensions.getExtensions(ChooseByNameContributor.SYMBOL_EP_NAME));
maxWidth = ApplicationManager.getApplication().isUnitTestMode()
? Integer.MAX_VALUE
: WindowManagerEx.getInstanceEx().getFrame(project).getSize().width;
}

@Nullable
Expand Down Expand Up @@ -80,7 +73,7 @@ public String[] getSeparators() {

@Override
public ListCellRenderer getListCellRenderer() {
return new StringElementListCellRenderer(maxWidth);
return new StringElementListCellRenderer();
}

@Nullable
Expand Down
Expand Up @@ -19,13 +19,10 @@
*/
final class StringElementListCellRenderer extends JPanel implements ListCellRenderer, MatcherHolder {

private int maxWidth;

private Matcher matcher;

StringElementListCellRenderer(int maxWidth) {
StringElementListCellRenderer() {
super(new BorderLayout());
this.maxWidth = maxWidth;
}

@Override
Expand Down Expand Up @@ -76,20 +73,19 @@ protected void customizeCellRenderer(JList list, Object value, int index, boolea

if (value instanceof StringElement) {
StringElement element = (StringElement) value;
String name = element.getValue();
String stringKeyText = "(" + element.getName() + ")";
String text = new StringEllipsisPolicy().ellipsizeText(element.getValue(), matcher);

SimpleTextAttributes nameAttributes = new SimpleTextAttributes(Font.PLAIN, list.getForeground());
SpeedSearchUtil.appendColoredFragmentForMatcher(name, this, nameAttributes, matcher, bgColor, selected);
SpeedSearchUtil.appendColoredFragmentForMatcher(text, this, nameAttributes, matcher, bgColor, selected);
// TODO Change icon
setIcon(AndroidIcons.EmptyFlag);

String stringKeyText = "(" + element.getName() + ")";
append(" " + stringKeyText, new SimpleTextAttributes(Font.PLAIN, JBColor.GRAY));
}

setBackground(selected ? UIUtil.getListSelectionBackground() : bgColor);
}

}

private class RightCellRenderer extends DefaultListCellRenderer {
Expand Down
@@ -0,0 +1,54 @@
package main.java.com.konifar.stringssearch.search;

import com.intellij.openapi.util.TextRange;
import com.intellij.psi.codeStyle.MinusculeMatcher;
import com.intellij.util.containers.FList;
import com.intellij.util.text.Matcher;
import org.jetbrains.annotations.NotNull;

final class StringEllipsisPolicy {

private static final int MAX_LENGTH = 100;

private static final int ELLIPSIS_EXTRA_LENGTH = 20;

private static final String DOTS = "...";

String ellipsizeText(@NotNull String text, Matcher matcher) {
final int textLength = text.length();

if (textLength > MAX_LENGTH) {
if (matcher instanceof MinusculeMatcher) {
FList iterable = ((MinusculeMatcher) matcher).matchingFragments(text);
if (iterable != null) {
TextRange textRange = (TextRange) iterable.getHead();
int startOffset = textRange.getStartOffset();

int startIndex = 0;
int endIndex = textLength;

if (startOffset > ELLIPSIS_EXTRA_LENGTH) {
startIndex = startOffset - ELLIPSIS_EXTRA_LENGTH;
}
if (textLength > startIndex + MAX_LENGTH) {
endIndex = startIndex + MAX_LENGTH;
}

String ellipsizedText = text.substring(startIndex, endIndex);

if (startIndex > 0) {
ellipsizedText = DOTS + ellipsizedText;
}
if (endIndex < textLength) {
ellipsizedText = ellipsizedText + DOTS;
}

return ellipsizedText;
}
}
}

return text;
}

}

0 comments on commit c202372

Please sign in to comment.