package bluej.stride.framedjava.frames;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import bluej.parser.AssistContent.Access;
import javafx.application.Platform;
import javafx.beans.binding.StringExpression;
import javafx.scene.control.TextField;
import javafx.util.Pair;
import bluej.stride.framedjava.ast.JavaFragment.PosInSourceDoc;
import bluej.stride.framedjava.ast.links.PossibleLink;
import bluej.stride.framedjava.ast.links.PossibleTypeLink;
import bluej.stride.framedjava.elements.CodeElement;
import bluej.stride.framedjava.elements.ImportElement;
import bluej.stride.framedjava.elements.ImportElement.ImportFragment;
import bluej.stride.framedjava.errors.CodeError;
import bluej.stride.generic.FrameFactory;
import bluej.stride.generic.InteractionManager;
import bluej.stride.generic.RecallableFocus;
import bluej.stride.generic.SingleLineFrame;
import bluej.stride.slots.TextSlot;
import bluej.stride.slots.HeaderItem;
import bluej.stride.slots.SlotTraversalChars;
import bluej.stride.slots.CompletionCalculator;
import bluej.stride.slots.SuggestionList;
import bluej.stride.slots.SuggestionList.SuggestionListListener;
import bluej.editor.stride.FrameCatalogue;
import bluej.utility.Utility;
import bluej.utility.javafx.FXPlatformConsumer;
import threadchecker.OnThread;
import threadchecker.Tag;
| A statement for import packages/classes
| @author Amjad Altadmri
|
public class ImportFrame extends SingleLineFrame implements CodeFrame<ImportElement>{
private static final String IMPORT_STYLE_PREFIX = "import-";
private static final List<FrameCatalogue.Hint> HINTS = Arrays.asList(
new FrameCatalogue.Hint("greenfoot.*", "Greenfoot classes"),
new FrameCatalogue.Hint("java.util.*", "Java utility classes")
);
private TextSlot<ImportFragment> importField;
private ImportElement element;
| Default constructor.
|
private ImportFrame(InteractionManager editor)
{
super(editor, "import ", IMPORT_STYLE_PREFIX);
CompletionCalculator calc = new CompletionCalculator() {
private List<Pair<SuggestionList.SuggestionShown, String>> imports;
@Override
@OnThread(Tag.FXPlatform)
public void withCalculatedSuggestionList(PosInSourceDoc pos, CodeElement codeEl,
SuggestionListListener clickListener,
FXPlatformConsumer<SuggestionList> handler)
{
Utility.runBackground(() -> {
imports = editor.getImportSuggestions().entrySet().stream().flatMap(e ->
e.getValue().stream().filter(ac ->
ac.getPackage() == null || ac.getPackage().equals("") || ac.getAccessPermission() == Access.PUBLIC
).flatMap(
ac -> (ac.getPackage() == null || ac.getPackage().equals("")) ?
Stream.of(ac.getName()) :
Stream.of(ac.getPackage() + "." + (ac.getDeclaringClass() == null ? "" : ac.getDeclaringClass() + ".") + ac.getName(), ac.getPackage() + ".*")
).sorted().distinct().map(v -> new Pair<SuggestionList.SuggestionShown, String>(e.getKey(), v))
).collect(Collectors.toList());
Platform.runLater(() -> {
SuggestionList suggestionDisplay = new SuggestionList(editor, Utility.mapList(imports, imp -> new SuggestionList.SuggestionDetails(imp.getValue(), null, null, imp.getKey())), null, SuggestionList.SuggestionShown.COMMON, null, clickListener);
handler.accept(suggestionDisplay);
});
});
}
@Override
@OnThread(Tag.FXPlatform)
public boolean execute(TextField field, int highlighted, int startOfCurWord)
{
if (highlighted >= 0)
{
field.setText(imports.get(highlighted).getValue());
return true;
}
return false;
}
};
importField = new TextSlot<ImportFragment>(editor, this, this, getHeaderRow(), calc, IMPORT_STYLE_PREFIX + "slot-", HINTS) {
@Override
protected ImportFragment createFragment(String content)
{
return new ImportFragment(content, this);
}
@Override
public void valueChangedLostFocus(String oldValue, String newValue)
{
}
@Override
@OnThread(Tag.FXPlatform)
public void addError(CodeError err)
{
editor.ensureImportsVisible();
super.addError(err);
}
@Override
public List extends PossibleLink> findLinks()
{
if (!getText().endsWith(".*"))
{
return Collections.singletonList(new PossibleTypeLink(getText(), 0, getText().length(), this));
}
return Collections.emptyList();
}
@Override
public int getStartOfCurWord()
{
return 0;
}
};
importField.setPromptText("package or class");
importField.addValueListener(new SlotTraversalChars()
{
@Override
@OnThread(Tag.FXPlatform)
public void backSpacePressedAtStart(HeaderItem slot)
{
backspaceAtStart(getHeaderRow(), slot);
}
});
setHeaderRow(importField, previewSemi);
}
| Creates an import statement with a specific class/package.
|
public ImportFrame(InteractionManager editor, ImportElement element, boolean enabled)
{
this(editor);
this.element = element;
this.importField.setText(element.getImport());
frameEnabledProperty.set(enabled);
}
public ImportFrame(InteractionManager editor, String src)
{
this(editor);
importField.setText(src);
this.element = new ImportElement(src, importField, frameEnabledProperty.get());
}
public static FrameFactory getFactory()
{
return new FrameFactory<ImportFrame>() {
@Override
public ImportFrame createBlock(InteractionManager editor)
{
return new ImportFrame(editor);
}
@Override
public Class getBlockClass()
{
return ImportFrame.class;
}
};
}
public String getImport()
{
return importField.getText();
}
@Override
public void regenerateCode()
{
element = new ImportElement(importField.getText(), importField, frameEnabledProperty.get());
}
@Override
public ImportElement getCode()
{
return element;
}
public RecallableFocus getFocusable()
{
return importField;
}
public StringExpression importProperty()
{
return importField.textProperty();
}
}
. ImportFrame
. withCalculatedSuggestionList
. execute
. createFragment
. valueChangedLostFocus
. addError
. findLinks
. getStartOfCurWord
. backSpacePressedAtStart
. ImportFrame
. ImportFrame
. getFactory
. createBlock
. getBlockClass
. getImport
. regenerateCode
. getCode
. getFocusable
. importProperty
262 neLoCode
+ 4 LoComm