mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
cleanup
This commit is contained in:
@@ -45,7 +45,7 @@ import com.intellij.openapi.wm.ToolWindowManager;
|
||||
import com.intellij.pom.Navigatable;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.util.PsiUtilBase;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.ui.*;
|
||||
import com.intellij.ui.components.JBList;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
@@ -60,6 +60,7 @@ import javax.swing.border.BevelBorder;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -91,7 +92,7 @@ public class CommanderPanel extends JPanel {
|
||||
private boolean myActive = true;
|
||||
private final List<CommanderHistoryListener> myHistoryListeners = ContainerUtil.createEmptyCOWList();
|
||||
private boolean myMoveFocus = false;
|
||||
private boolean myEnableSearchHighlighting;
|
||||
private final boolean myEnableSearchHighlighting;
|
||||
|
||||
public CommanderPanel(final Project project, final boolean enablePopupMenu, final boolean enableSearchHighlighting) {
|
||||
super(new BorderLayout());
|
||||
@@ -103,6 +104,7 @@ public class CommanderPanel extends JPanel {
|
||||
|
||||
if (enablePopupMenu) {
|
||||
myCopyPasteDelegator = new CopyPasteDelegator(myProject, myList) {
|
||||
@Override
|
||||
@NotNull
|
||||
protected PsiElement[] getSelectedElements() {
|
||||
return CommanderPanel.this.getSelectedElements();
|
||||
@@ -116,16 +118,18 @@ public class CommanderPanel extends JPanel {
|
||||
ListScrollingUtil.installActions(myList);
|
||||
|
||||
myList.registerKeyboardAction(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
if (myBuilder == null) return;
|
||||
myBuilder.buildRoot();
|
||||
}
|
||||
}, KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SLASH, SystemInfo.isMac ? KeyEvent.META_MASK : KeyEvent.CTRL_MASK), JComponent.WHEN_FOCUSED);
|
||||
}, KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SLASH, SystemInfo.isMac ? InputEvent.META_MASK : InputEvent.CTRL_MASK), JComponent.WHEN_FOCUSED);
|
||||
|
||||
myList.getInputMap(WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), ACTION_DRILL_DOWN);
|
||||
myList.getInputMap(WHEN_FOCUSED)
|
||||
.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, SystemInfo.isMac ? KeyEvent.META_MASK : KeyEvent.CTRL_MASK), ACTION_DRILL_DOWN);
|
||||
.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, SystemInfo.isMac ? InputEvent.META_MASK : InputEvent.CTRL_MASK), ACTION_DRILL_DOWN);
|
||||
myList.getActionMap().put(ACTION_DRILL_DOWN, new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
drillDown();
|
||||
}
|
||||
@@ -139,15 +143,17 @@ public class CommanderPanel extends JPanel {
|
||||
}.installOn(myList);
|
||||
|
||||
myList.getInputMap(WHEN_FOCUSED)
|
||||
.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, SystemInfo.isMac ? KeyEvent.META_MASK : KeyEvent.CTRL_MASK), ACTION_GO_UP);
|
||||
.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, SystemInfo.isMac ? InputEvent.META_MASK : InputEvent.CTRL_MASK), ACTION_GO_UP);
|
||||
myList.getInputMap(WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), ACTION_GO_UP);
|
||||
myList.getActionMap().put(ACTION_GO_UP, new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
goUp();
|
||||
}
|
||||
});
|
||||
|
||||
myList.getActionMap().put("selectAll", new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
}
|
||||
});
|
||||
@@ -155,6 +161,7 @@ public class CommanderPanel extends JPanel {
|
||||
|
||||
if (enablePopupMenu) {
|
||||
myList.addMouseListener(new PopupHandler() {
|
||||
@Override
|
||||
public void invokePopup(final Component comp, final int x, final int y) {
|
||||
CommanderPanel.this.invokePopup(comp, x, y);
|
||||
}
|
||||
@@ -162,10 +169,12 @@ public class CommanderPanel extends JPanel {
|
||||
}
|
||||
|
||||
myList.addFocusListener(new FocusAdapter() {
|
||||
@Override
|
||||
public void focusGained(final FocusEvent e) {
|
||||
setActive(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void focusLost(final FocusEvent e) {
|
||||
setActive(false);
|
||||
}
|
||||
@@ -177,15 +186,11 @@ public class CommanderPanel extends JPanel {
|
||||
return myEnableSearchHighlighting;
|
||||
}
|
||||
|
||||
public ListSpeedSearch getListSpeedSearch() {
|
||||
return myListSpeedSearch;
|
||||
}
|
||||
|
||||
public void addHistoryListener(CommanderHistoryListener listener) {
|
||||
void addHistoryListener(@NotNull CommanderHistoryListener listener) {
|
||||
myHistoryListeners.add(listener);
|
||||
}
|
||||
|
||||
public void removeHistoryListener(CommanderHistoryListener listener) {
|
||||
private void removeHistoryListener(CommanderHistoryListener listener) {
|
||||
myHistoryListeners.remove(listener);
|
||||
}
|
||||
|
||||
@@ -227,7 +232,7 @@ public class CommanderPanel extends JPanel {
|
||||
}
|
||||
|
||||
final AbstractTreeNode element = getSelectedNode();
|
||||
if (element.getChildren().size() == 0) {
|
||||
if (element.getChildren().isEmpty()) {
|
||||
if (!shouldDrillDownOnEmptyElement(element)) {
|
||||
navigateSelectedElement();
|
||||
return;
|
||||
@@ -292,10 +297,12 @@ public class CommanderPanel extends JPanel {
|
||||
|
||||
// TODO[vova,anton] it seems that the code below performs double focus request. Is it OK?
|
||||
myTitlePanel.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(final MouseEvent e) {
|
||||
myList.requestFocus();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mousePressed(final MouseEvent e) {
|
||||
myList.requestFocus();
|
||||
}
|
||||
@@ -327,8 +334,9 @@ public class CommanderPanel extends JPanel {
|
||||
return elementAtIndex instanceof AbstractTreeNode ? (AbstractTreeNode)elementAtIndex : null;
|
||||
}
|
||||
|
||||
private ArrayList<AbstractTreeNode> getSelectedNodes() {
|
||||
if (myBuilder == null) return null;
|
||||
@NotNull
|
||||
private List<AbstractTreeNode> getSelectedNodes() {
|
||||
if (myBuilder == null) return Collections.emptyList();
|
||||
final int[] indices = myList.getSelectedIndices();
|
||||
ArrayList<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
|
||||
for (int index : indices) {
|
||||
@@ -359,7 +367,7 @@ public class CommanderPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
return PsiUtilBase.toPsiElementArray(elements);
|
||||
return PsiUtilCore.toPsiElementArray(elements);
|
||||
}
|
||||
|
||||
private static Object getValueAtIndex(AbstractTreeNode node) {
|
||||
@@ -440,39 +448,39 @@ public class CommanderPanel extends JPanel {
|
||||
if (LangDataKeys.PSI_ELEMENT_ARRAY.is(dataId)) {
|
||||
return filterInvalidElements(getSelectedElements());
|
||||
}
|
||||
else if (LangDataKeys.PASTE_TARGET_PSI_ELEMENT.is(dataId)) {
|
||||
if (LangDataKeys.PASTE_TARGET_PSI_ELEMENT.is(dataId)) {
|
||||
final AbstractTreeNode parentNode = myBuilder.getParentNode();
|
||||
final Object element = parentNode != null ? parentNode.getValue() : null;
|
||||
return element instanceof PsiElement && ((PsiElement)element).isValid() ? element : null;
|
||||
}
|
||||
else if (PlatformDataKeys.NAVIGATABLE_ARRAY.is(dataId)) {
|
||||
if (PlatformDataKeys.NAVIGATABLE_ARRAY.is(dataId)) {
|
||||
return getNavigatables();
|
||||
}
|
||||
else if (PlatformDataKeys.COPY_PROVIDER.is(dataId)) {
|
||||
if (PlatformDataKeys.COPY_PROVIDER.is(dataId)) {
|
||||
return myCopyPasteDelegator != null ? myCopyPasteDelegator.getCopyProvider() : null;
|
||||
}
|
||||
else if (PlatformDataKeys.CUT_PROVIDER.is(dataId)) {
|
||||
if (PlatformDataKeys.CUT_PROVIDER.is(dataId)) {
|
||||
return myCopyPasteDelegator != null ? myCopyPasteDelegator.getCutProvider() : null;
|
||||
}
|
||||
else if (PlatformDataKeys.PASTE_PROVIDER.is(dataId)) {
|
||||
if (PlatformDataKeys.PASTE_PROVIDER.is(dataId)) {
|
||||
return myCopyPasteDelegator != null ? myCopyPasteDelegator.getPasteProvider() : null;
|
||||
}
|
||||
else if (LangDataKeys.IDE_VIEW.is(dataId)) {
|
||||
if (LangDataKeys.IDE_VIEW.is(dataId)) {
|
||||
return myIdeView;
|
||||
}
|
||||
else if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) {
|
||||
if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId)) {
|
||||
return myDeleteElementProvider;
|
||||
}
|
||||
else if (LangDataKeys.MODULE.is(dataId)) {
|
||||
if (LangDataKeys.MODULE.is(dataId)) {
|
||||
return selectedValue instanceof Module ? selectedValue : null;
|
||||
}
|
||||
else if (ModuleGroup.ARRAY_DATA_KEY.is(dataId)) {
|
||||
if (ModuleGroup.ARRAY_DATA_KEY.is(dataId)) {
|
||||
return selectedValue instanceof ModuleGroup ? new ModuleGroup[]{(ModuleGroup)selectedValue} : null;
|
||||
}
|
||||
else if (LibraryGroupElement.ARRAY_DATA_KEY.is(dataId)) {
|
||||
if (LibraryGroupElement.ARRAY_DATA_KEY.is(dataId)) {
|
||||
return selectedValue instanceof LibraryGroupElement ? new LibraryGroupElement[]{(LibraryGroupElement)selectedValue} : null;
|
||||
}
|
||||
else if (NamedLibraryElement.ARRAY_DATA_KEY.is(dataId)) {
|
||||
if (NamedLibraryElement.ARRAY_DATA_KEY.is(dataId)) {
|
||||
return selectedValue instanceof NamedLibraryElement ? new NamedLibraryElement[]{(NamedLibraryElement)selectedValue} : null;
|
||||
}
|
||||
|
||||
@@ -511,7 +519,7 @@ public class CommanderPanel extends JPanel {
|
||||
validElements.add(element);
|
||||
}
|
||||
}
|
||||
return validElements.size() == elements.length ? elements : PsiUtilBase.toPsiElementArray(validElements);
|
||||
return validElements.size() == elements.length ? elements : PsiUtilCore.toPsiElementArray(validElements);
|
||||
}
|
||||
|
||||
protected final Navigatable createEditSourceDescriptor() {
|
||||
@@ -529,18 +537,20 @@ public class CommanderPanel extends JPanel {
|
||||
myPanel = panel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setText(String text) {
|
||||
if (text == null || text.length() == 0) {
|
||||
if (text == null || text.isEmpty()) {
|
||||
text = " ";
|
||||
}
|
||||
super.setText(text);
|
||||
if (myPanel != null) {
|
||||
myPanel.setToolTipText(text.trim().length() == 0 ? null : text);
|
||||
myPanel.setToolTipText(text.trim().isEmpty() ? null : text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final class MyDeleteElementProvider implements DeleteProvider {
|
||||
@Override
|
||||
public void deleteElement(@NotNull final DataContext dataContext) {
|
||||
LocalHistoryAction a = LocalHistory.getInstance().startAction(IdeBundle.message("progress.deleting"));
|
||||
try {
|
||||
@@ -552,6 +562,7 @@ public class CommanderPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDeleteElement(@NotNull final DataContext dataContext) {
|
||||
final PsiElement[] elements = getSelectedElements();
|
||||
return DeleteHandler.shouldEnableDeleteAction(elements);
|
||||
@@ -559,16 +570,19 @@ public class CommanderPanel extends JPanel {
|
||||
}
|
||||
|
||||
private final class MyIdeView implements IdeView {
|
||||
@Override
|
||||
public void selectElement(final PsiElement element) {
|
||||
final boolean isDirectory = element instanceof PsiDirectory;
|
||||
if (!isDirectory) {
|
||||
EditorHelper.openInEditor(element);
|
||||
}
|
||||
ApplicationManager.getApplication().invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
myBuilder.selectElement(element, PsiUtilBase.getVirtualFile(element));
|
||||
myBuilder.selectElement(element, PsiUtilCore.getVirtualFile(element));
|
||||
if (!isDirectory) {
|
||||
ApplicationManager.getApplication().invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (myMoveFocus) {
|
||||
ToolWindowManager.getInstance(myProject).activateEditorComponent();
|
||||
@@ -593,11 +607,13 @@ public class CommanderPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiDirectory[] getDirectories() {
|
||||
PsiDirectory directory = getDirectory();
|
||||
return directory == null ? PsiDirectory.EMPTY_ARRAY : new PsiDirectory[]{directory};
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiDirectory getOrChooseDirectory() {
|
||||
return DirectoryChooserUtil.getOrChooseDirectory(this);
|
||||
}
|
||||
@@ -605,6 +621,7 @@ public class CommanderPanel extends JPanel {
|
||||
|
||||
public static final class MyModel extends AbstractListModel implements AbstractListBuilder.Model{
|
||||
final List myElements = new ArrayList();
|
||||
@Override
|
||||
public void removeAllElements() {
|
||||
int index1 = myElements.size()-1;
|
||||
myElements.clear();
|
||||
@@ -613,30 +630,36 @@ public class CommanderPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addElement(final Object obj) {
|
||||
int index = myElements.size();
|
||||
myElements.add(obj);
|
||||
fireIntervalAdded(this, index, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replaceElements(final List newElements) {
|
||||
removeAllElements();
|
||||
myElements.addAll(newElements);
|
||||
fireIntervalAdded(this, 0, newElements.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] toArray() {
|
||||
return ArrayUtil.toObjectArray(myElements);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int indexOf(final Object o) {
|
||||
return myElements.indexOf(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return myElements.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int index) {
|
||||
return myElements.get(index);
|
||||
}
|
||||
|
||||
@@ -81,14 +81,17 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
final VirtualFile finalVFile = vFile;
|
||||
final FocusRequestor focusRequestor = IdeFocusManager.getInstance(myProject).getFurtherRequestor();
|
||||
batch(new Progressive() {
|
||||
@Override
|
||||
public void run(@NotNull ProgressIndicator indicator) {
|
||||
final Ref<Object> target = new Ref<Object>();
|
||||
_select(value, finalVFile, false, Conditions.<AbstractTreeNode>alwaysTrue(), cb, indicator, target, focusRequestor, false);
|
||||
cb.doWhenDone(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
result.setDone(target.get());
|
||||
}
|
||||
}).doWhenRejected(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
result.setRejected();
|
||||
}
|
||||
@@ -102,14 +105,17 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected boolean isAlwaysShowPlus(NodeDescriptor nodeDescriptor) {
|
||||
return ((AbstractTreeNode)nodeDescriptor).isAlwaysShowPlus();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isAutoExpandNode(NodeDescriptor nodeDescriptor) {
|
||||
return nodeDescriptor.getParentDescriptor() == null || ((AbstractTreeNode)nodeDescriptor).isAlwaysExpand();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final void expandNodeChildren(final DefaultMutableTreeNode node) {
|
||||
final NodeDescriptor userObject = (NodeDescriptor)node.getUserObject();
|
||||
if (userObject == null) return;
|
||||
@@ -185,8 +191,10 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
|
||||
UiActivityMonitor.getInstance().addActivity(myProject, new UiActivity.AsyncBgOperation("projectViewSelect"), getUpdater().getModalityState());
|
||||
cancelUpdate().doWhenDone(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
batch(new Progressive() {
|
||||
@Override
|
||||
public void run(@NotNull ProgressIndicator indicator) {
|
||||
_select(element, file, requestFocus, nonStopCondition, result, indicator, null, requestor, false);
|
||||
UiActivityMonitor.getInstance().removeActivity(myProject, new UiActivity.AsyncBgOperation("projectViewSelect"));
|
||||
@@ -212,6 +220,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
final AbstractTreeNode alreadySelected = alreadySelectedNode(element);
|
||||
|
||||
final Runnable onDone = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (requestFocus && virtualSelectTarget == null && getUi().isReady()) {
|
||||
focusRequestor.requestFocus(getTree(), true);
|
||||
@@ -222,6 +231,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
};
|
||||
|
||||
final Condition<AbstractTreeNode> condition = new Condition<AbstractTreeNode>() {
|
||||
@Override
|
||||
public boolean value(AbstractTreeNode abstractTreeNode) {
|
||||
if (result.isProcessed()) return false;
|
||||
return nonStopCondition.value(abstractTreeNode);
|
||||
@@ -231,6 +241,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
if (alreadySelected == null) {
|
||||
expandPathTo(file, (AbstractTreeNode)getTreeStructure().getRootElement(), element, condition, indicator, virtualSelectTarget)
|
||||
.doWhenDone(new AsyncResult.Handler<AbstractTreeNode>() {
|
||||
@Override
|
||||
public void run(AbstractTreeNode node) {
|
||||
if (virtualSelectTarget == null) {
|
||||
select(node, onDone);
|
||||
@@ -294,6 +305,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
if (root.canRepresent(element)) {
|
||||
if (target == null) {
|
||||
expand(root, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
async.setDone(root);
|
||||
}
|
||||
@@ -313,6 +325,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
|
||||
if (target == null) {
|
||||
expand(root, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
indicator.checkCanceled();
|
||||
|
||||
@@ -342,6 +355,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
|
||||
yield(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (isDisposed()) return;
|
||||
expandChild(kids, 0, nonStopCondition, file, element, async, indicator, target);
|
||||
@@ -371,12 +385,14 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
|
||||
if (nonStopCondition.value(eachKid)) {
|
||||
expandPathTo(file, eachKid, element, nonStopCondition, indicator, virtualSelectTarget).doWhenDone(new AsyncResult.Handler<AbstractTreeNode>() {
|
||||
@Override
|
||||
public void run(AbstractTreeNode abstractTreeNode) {
|
||||
indicator.checkCanceled();
|
||||
|
||||
async.setDone(abstractTreeNode);
|
||||
}
|
||||
}).doWhenRejected(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
indicator.checkCanceled();
|
||||
|
||||
@@ -391,6 +407,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean validateNode(final Object child) {
|
||||
if (child == null) {
|
||||
return false;
|
||||
@@ -402,6 +419,7 @@ public abstract class BaseProjectTreeBuilder extends AbstractTreeBuilder {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
protected ProgressIndicator createProgressIndicator() {
|
||||
return new StatusBarProgress();
|
||||
|
||||
+6
@@ -44,18 +44,21 @@ public abstract class ProjectViewPsiTreeChangeListener extends PsiTreeChangeAdap
|
||||
|
||||
protected abstract DefaultMutableTreeNode getRootNode();
|
||||
|
||||
@Override
|
||||
public final void childRemoved(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement child = event.getOldChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void childAdded(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement child = event.getNewChild();
|
||||
if (child instanceof PsiWhiteSpace) return; //optimization
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void childReplaced(@NotNull PsiTreeChangeEvent event) {
|
||||
PsiElement oldChild = event.getOldChild();
|
||||
PsiElement newChild = event.getNewChild();
|
||||
@@ -63,11 +66,13 @@ public abstract class ProjectViewPsiTreeChangeListener extends PsiTreeChangeAdap
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void childMoved(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event.getOldParent(), false);
|
||||
childrenChanged(event.getNewParent(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void childrenChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
childrenChanged(event.getParent(), true);
|
||||
}
|
||||
@@ -105,6 +110,7 @@ public abstract class ProjectViewPsiTreeChangeListener extends PsiTreeChangeAdap
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
String propertyName = event.getPropertyName();
|
||||
PsiElement element = event.getElement();
|
||||
|
||||
+2
@@ -26,6 +26,7 @@ import com.intellij.openapi.wm.ToolWindowId;
|
||||
import com.intellij.openapi.wm.ToolWindowManager;
|
||||
|
||||
public final class ChangeProjectViewAction extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
|
||||
if (project == null) {
|
||||
@@ -35,6 +36,7 @@ public final class ChangeProjectViewAction extends AnAction {
|
||||
projectView.changeView();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent event){
|
||||
Presentation presentation = event.getPresentation();
|
||||
Project project = PlatformDataKeys.PROJECT.getData(event.getDataContext());
|
||||
|
||||
+1
@@ -32,6 +32,7 @@ public class MoveModulesOutsideGroupAction extends AnAction {
|
||||
super(IdeBundle.message("action.move.module.outside.any.group"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
final Module[] modules = LangDataKeys.MODULE_CONTEXT_ARRAY.getData(dataContext);
|
||||
|
||||
+2
@@ -39,6 +39,7 @@ public class MoveModulesToGroupAction extends AnAction {
|
||||
myModuleGroup = moduleGroup;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
Presentation presentation = getTemplatePresentation();
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
@@ -52,6 +53,7 @@ public class MoveModulesToGroupAction extends AnAction {
|
||||
return modules.length == 1 ? IdeBundle.message("message.module", modules[0].getName()) : IdeBundle.message("message.modules");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
final Module[] modules = LangDataKeys.MODULE_CONTEXT_ARRAY.getData(dataContext);
|
||||
|
||||
+2
@@ -34,12 +34,14 @@ public class MoveModulesToSubGroupAction extends MoveModulesToGroupAction {
|
||||
super(moduleGroup, moduleGroup == null ? IdeBundle.message("action.move.module.new.top.level.group") : IdeBundle.message("action.move.module.to.new.sub.group"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
Presentation presentation = e.getPresentation();
|
||||
String description = IdeBundle.message("action.description.create.new.module.group");
|
||||
presentation.setDescription(description);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
final Module[] modules = LangDataKeys.MODULE_CONTEXT_ARRAY.getData(dataContext);
|
||||
|
||||
+9
-5
@@ -35,31 +35,35 @@ public abstract class AbstractProjectTreeStructure extends ProjectAbstractTreeSt
|
||||
return new ProjectViewProjectNode(myProject, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract boolean isShowMembers();
|
||||
|
||||
@Override
|
||||
public final Object getRootElement() {
|
||||
return myRoot;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void commit() {
|
||||
PsiDocumentManager.getInstance(myProject).commitAllDocuments();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean hasSomethingToCommit() {
|
||||
if (myProject.isDisposed()) return false;
|
||||
return PsiDocumentManager.getInstance(myProject).hasUncommitedDocuments();
|
||||
return !myProject.isDisposed()
|
||||
&& PsiDocumentManager.getInstance(myProject).hasUncommitedDocuments();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStructureView() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAlwaysLeaf(Object element) {
|
||||
if (element instanceof ProjectViewNode) {
|
||||
return ((ProjectViewNode)element).isAlwaysLeaf();
|
||||
}
|
||||
else {
|
||||
return super.isAlwaysLeaf(element);
|
||||
}
|
||||
return super.isAlwaysLeaf(element);
|
||||
}
|
||||
}
|
||||
+14
@@ -62,6 +62,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
super(project);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JComponent createComponent() {
|
||||
if (myComponent != null) return myComponent;
|
||||
|
||||
@@ -78,6 +79,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
return myComponent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void dispose() {
|
||||
myComponent = null;
|
||||
super.dispose();
|
||||
@@ -97,23 +99,28 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
TreeUtil.installActions(myTree);
|
||||
|
||||
myTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(TreeSelectionEvent e) {
|
||||
fireTreeChangeListener();
|
||||
}
|
||||
});
|
||||
myTree.getModel().addTreeModelListener(new TreeModelListener() {
|
||||
@Override
|
||||
public void treeNodesChanged(TreeModelEvent e) {
|
||||
fireTreeChangeListener();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void treeNodesInserted(TreeModelEvent e) {
|
||||
fireTreeChangeListener();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void treeNodesRemoved(TreeModelEvent e) {
|
||||
fireTreeChangeListener();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void treeStructureChanged(TreeModelEvent e) {
|
||||
fireTreeChangeListener();
|
||||
}
|
||||
@@ -122,6 +129,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
new MySpeedSearch(myTree);
|
||||
|
||||
myTree.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
if (KeyEvent.VK_ENTER == e.getKeyCode()) {
|
||||
|
||||
@@ -147,6 +155,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
CustomizationUtil.installPopupHandler(myTree, IdeActions.GROUP_PROJECT_VIEW_POPUP, ActionPlaces.PROJECT_VIEW_POPUP);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final ActionCallback updateFromRoot(boolean restoreExpandedPaths) {
|
||||
final ArrayList<Object> pathsToExpand = new ArrayList<Object>();
|
||||
final ArrayList<Object> selectionPaths = new ArrayList<Object>();
|
||||
@@ -155,6 +164,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
if (restoreExpandedPaths) {
|
||||
TreeBuilderUtil.storePaths(getTreeBuilder(), (DefaultMutableTreeNode)myTree.getModel().getRoot(), pathsToExpand, selectionPaths, true);
|
||||
afterUpdate = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (myTree != null && getTreeBuilder() != null && !getTreeBuilder().isDisposed()) {
|
||||
myTree.setSelectionPaths(new TreePath[0]);
|
||||
@@ -166,6 +176,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
}
|
||||
else {
|
||||
afterUpdate = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
cb.setDone();
|
||||
}
|
||||
@@ -178,6 +189,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
return cb;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void select(Object element, VirtualFile file, boolean requestFocus) {
|
||||
selectCB(element, file, requestFocus);
|
||||
}
|
||||
@@ -192,6 +204,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
@NotNull
|
||||
protected BaseProjectTreeBuilder createBuilder(DefaultTreeModel treeModel) {
|
||||
return new ProjectTreeBuilder(myProject, myTree, treeModel, null, (ProjectAbstractTreeStructureBase)myTreeStructure) {
|
||||
@Override
|
||||
protected AbstractTreeUpdater createUpdater() {
|
||||
return createTreeUpdater(this);
|
||||
}
|
||||
@@ -210,6 +223,7 @@ public abstract class AbstractProjectViewPSIPane extends AbstractProjectViewPane
|
||||
super(tree);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isMatchingElement(Object element, String pattern) {
|
||||
Object userObject = ((DefaultMutableTreeNode)((TreePath)element).getLastPathComponent()).getUserObject();
|
||||
if (userObject instanceof PsiDirectoryNode) {
|
||||
|
||||
@@ -184,6 +184,7 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
|
||||
TreeUtil.selectPath(myTree, treePath);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
if (myDndManager != null) {
|
||||
if (myDropTarget != null) {
|
||||
@@ -211,12 +212,14 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
|
||||
private void doSelectModuleOrGroup(final Object toSelect, final boolean requestFocus) {
|
||||
ToolWindowManager windowManager=ToolWindowManager.getInstance(myProject);
|
||||
final Runnable runnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ProjectView projectView = ProjectView.getInstance(myProject);
|
||||
if (requestFocus) {
|
||||
projectView.changeView(getId(), getSubId());
|
||||
}
|
||||
((BaseProjectTreeBuilder)getTreeBuilder()).selectInWidth(toSelect, requestFocus, new Condition<AbstractTreeNode>(){
|
||||
@Override
|
||||
public boolean value(final AbstractTreeNode node) {
|
||||
return node instanceof AbstractModuleNode || node instanceof ModuleGroupNode || node instanceof AbstractProjectNode;
|
||||
}
|
||||
@@ -260,6 +263,7 @@ public abstract class AbstractProjectViewPane implements DataProvider, Disposabl
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getData(String dataId) {
|
||||
if (PlatformDataKeys.NAVIGATABLE_ARRAY.is(dataId)) {
|
||||
TreePath[] paths = getSelectionPaths();
|
||||
|
||||
@@ -45,6 +45,7 @@ public class DirectoryUrl extends AbstractUrl {
|
||||
return new DirectoryUrl(virtualFile.getUrl(), module != null ? module.getName() : null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] createPath(final Project project) {
|
||||
if (moduleName != null) {
|
||||
final Module module = ApplicationManager.getApplication().runReadAction(new Computable<Module>() {
|
||||
@@ -70,10 +71,12 @@ public class DirectoryUrl extends AbstractUrl {
|
||||
return new Object[]{directory};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractUrl createUrl(String moduleName, String url) {
|
||||
return new DirectoryUrl(url, moduleName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractUrl createUrlByElement(Object element) {
|
||||
if (element instanceof PsiDirectory) {
|
||||
return create((PsiDirectory)element);
|
||||
|
||||
+1
@@ -29,6 +29,7 @@ import com.intellij.ui.content.ContentManager;
|
||||
* @author Konstantin Bulenkov
|
||||
*/
|
||||
public class FavoritesViewToolWindowFactory implements ToolWindowFactory, DumbAware {
|
||||
@Override
|
||||
public void createToolWindowContent(Project project, ToolWindow toolWindow) {
|
||||
if (toolWindow != null) {
|
||||
final ContentManager contentManager = toolWindow.getContentManager();
|
||||
|
||||
@@ -42,6 +42,7 @@ public class GroupByTypeComparator implements Comparator<NodeDescriptor> {
|
||||
myForceSortByType = forceSortByType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(NodeDescriptor descriptor1, NodeDescriptor descriptor2) {
|
||||
if (!isSortByType() && descriptor1 instanceof ProjectViewNode && ((ProjectViewNode) descriptor1).isSortByFirstChild()) {
|
||||
final Collection<AbstractTreeNode> children = ((ProjectViewNode)descriptor1).getChildren();
|
||||
|
||||
@@ -31,16 +31,19 @@ public class LibraryModuleGroupUrl extends AbstractUrl {
|
||||
super(null, moduleName, ELEMENT_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] createPath(Project project) {
|
||||
final Module module = moduleName != null ? ModuleManager.getInstance(project).findModuleByName(moduleName) : null;
|
||||
if (module == null) return null;
|
||||
return new Object[]{new LibraryGroupElement(module)};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractUrl createUrl(String moduleName, String url) {
|
||||
return new LibraryModuleGroupUrl(moduleName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractUrl createUrlByElement(Object element) {
|
||||
if (element instanceof LibraryGroupElement) {
|
||||
LibraryGroupElement libraryGroupElement = (LibraryGroupElement)element;
|
||||
|
||||
@@ -27,15 +27,18 @@ public class ModuleGroupUrl extends AbstractUrl {
|
||||
super(url, null, ELEMENT_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] createPath(Project project) {
|
||||
final String[] groupPath = url.split(";");
|
||||
return new Object[]{new ModuleGroup(groupPath)};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractUrl createUrl(String moduleName, String url) {
|
||||
return new ModuleGroupUrl(url);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractUrl createUrlByElement(Object element) {
|
||||
if (element instanceof ModuleGroup) {
|
||||
ModuleGroup group = (ModuleGroup)element;
|
||||
|
||||
@@ -31,16 +31,19 @@ public class ModuleUrl extends AbstractUrl {
|
||||
super(url, moduleName,ELEMENT_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] createPath(Project project) {
|
||||
final Module module = moduleName != null ? ModuleManager.getInstance(project).findModuleByName(moduleName) : null;
|
||||
if (module == null) return null;
|
||||
return new Object[]{module};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractUrl createUrl(String moduleName, String url) {
|
||||
return new ModuleUrl(url, moduleName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractUrl createUrlByElement(Object element) {
|
||||
if (element instanceof Module) {
|
||||
Module module = (Module)element;
|
||||
|
||||
@@ -41,6 +41,7 @@ public class MoveModuleToGroup extends ActionGroup {
|
||||
setPopup(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e){
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
|
||||
@@ -51,12 +52,14 @@ public class MoveModuleToGroup extends ActionGroup {
|
||||
presentation.setText(myModuleGroup.presentableText());
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public AnAction[] getChildren(@Nullable AnActionEvent e) {
|
||||
if (e == null) return EMPTY_ARRAY;
|
||||
|
||||
List<ModuleGroup> children = new ArrayList<ModuleGroup>(myModuleGroup.childGroups(e.getDataContext()));
|
||||
Collections.sort ( children, new Comparator<ModuleGroup>() {
|
||||
@Override
|
||||
public int compare(final ModuleGroup moduleGroup1, final ModuleGroup moduleGroup2) {
|
||||
assert moduleGroup1.getGroupPath().length == moduleGroup2.getGroupPath().length;
|
||||
return moduleGroup1.toString().compareToIgnoreCase(moduleGroup2.toString());
|
||||
|
||||
+2
@@ -32,6 +32,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.util.*;
|
||||
|
||||
public class MoveModuleToGroupTopLevel extends ActionGroup {
|
||||
@Override
|
||||
public void update(AnActionEvent e){
|
||||
final DataContext dataContext = e.getDataContext();
|
||||
final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
|
||||
@@ -40,6 +41,7 @@ public class MoveModuleToGroupTopLevel extends ActionGroup {
|
||||
e.getPresentation().setVisible(active);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public AnAction[] getChildren(@Nullable AnActionEvent e) {
|
||||
if (e == null) {
|
||||
|
||||
@@ -34,6 +34,7 @@ public class NamedLibraryUrl extends AbstractUrl {
|
||||
super(url, moduleName, ELEMENT_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] createPath(Project project) {
|
||||
final Module module = moduleName != null ? ModuleManager.getInstance(project).findModuleByName(moduleName) : null;
|
||||
if (module == null) return null;
|
||||
@@ -45,10 +46,12 @@ public class NamedLibraryUrl extends AbstractUrl {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractUrl createUrl(String moduleName, String url) {
|
||||
return new NamedLibraryUrl(url, moduleName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractUrl createUrlByElement(Object element) {
|
||||
if (element instanceof NamedLibraryElement) {
|
||||
NamedLibraryElement libraryElement = (NamedLibraryElement)element;
|
||||
|
||||
+1
@@ -31,6 +31,7 @@ public abstract class ProjectAbstractTreeStructureBase extends AbstractTreeStruc
|
||||
super(project);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TreeStructureProvider> getProviders() {
|
||||
if (myProviders == null) {
|
||||
final TreeStructureProvider[] providers = Extensions.getExtensions(TreeStructureProvider.EP_NAME, myProject);
|
||||
|
||||
@@ -31,26 +31,32 @@ public abstract class ProjectTreeStructure extends AbstractProjectTreeStructure
|
||||
myId = ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlattenPackages() {
|
||||
return ProjectView.getInstance(myProject).isFlattenPackages(myId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowMembers() {
|
||||
return ProjectView.getInstance(myProject).isShowMembers(myId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHideEmptyMiddlePackages() {
|
||||
return ProjectView.getInstance(myProject).isHideEmptyMiddlePackages(myId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAbbreviatePackageNames() {
|
||||
return ProjectView.getInstance(myProject).isAbbreviatePackageNames(myId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowLibraryContents() {
|
||||
return ProjectView.getInstance(myProject).isShowLibraryContents(myId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowModules() {
|
||||
return ProjectView.getInstance(myProject).isShowModules(myId);
|
||||
}
|
||||
|
||||
@@ -232,10 +232,12 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
}
|
||||
|
||||
public abstract class MoveCopyDropHandler implements DropHandler {
|
||||
@Override
|
||||
public boolean isValidSource(@NotNull final TreeNode[] sourceNodes, TreeNode targetNode) {
|
||||
return canDrop(sourceNodes, targetNode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidTarget(@NotNull final TreeNode[] sourceNodes, final @NotNull TreeNode targetNode) {
|
||||
return canDrop(sourceNodes, targetNode);
|
||||
}
|
||||
@@ -279,6 +281,7 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
}
|
||||
|
||||
private class MoveDropHandler extends MoveCopyDropHandler {
|
||||
@Override
|
||||
protected boolean canDrop(@NotNull final TreeNode[] sourceNodes, @Nullable final TreeNode targetNode) {
|
||||
if (targetNode instanceof DefaultMutableTreeNode) {
|
||||
final Object userObject = ((DefaultMutableTreeNode)targetNode).getUserObject();
|
||||
@@ -293,6 +296,7 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
MoveHandler.canMove(sourceElements, targetElement));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doDrop(@NotNull final TreeNode[] sourceNodes, @NotNull final TreeNode targetNode) {
|
||||
if (targetNode instanceof DefaultMutableTreeNode) {
|
||||
final Object userObject = ((DefaultMutableTreeNode)targetNode).getUserObject();
|
||||
@@ -311,6 +315,7 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
final Module module = getModule(targetNode);
|
||||
final DataContext dataContext = DataManager.getInstance().getDataContext(myTree);
|
||||
getActionHandler().invoke(myProject, sourceElements, new DataContext() {
|
||||
@Override
|
||||
@Nullable
|
||||
public Object getData(@NonNls String dataId) {
|
||||
if (LangDataKeys.TARGET_MODULE.is(dataId)) {
|
||||
@@ -330,15 +335,18 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
return RefactoringActionHandlerFactory.getInstance().createMoveHandler();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDropRedundant(@NotNull TreeNode sourceNode, @NotNull TreeNode targetNode) {
|
||||
return sourceNode.getParent() == targetNode || MoveHandler.isMoveRedundant(getPsiElement(sourceNode), getPsiElement(targetNode));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldDelegateToParent(TreeNode[] sourceNodes, @NotNull final TreeNode targetNode) {
|
||||
final PsiElement psiElement = getPsiElement(targetNode);
|
||||
return !MoveHandler.isValidTarget(psiElement, getPsiElements(sourceNodes));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doDropFiles(List<File> fileList, TreeNode targetNode) {
|
||||
final PsiFileSystemItem[] sourceFileArray = getPsiFiles(fileList);
|
||||
|
||||
@@ -355,6 +363,7 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
}
|
||||
|
||||
private class CopyDropHandler extends MoveCopyDropHandler {
|
||||
@Override
|
||||
protected boolean canDrop(@NotNull final TreeNode[] sourceNodes, @Nullable final TreeNode targetNode) {
|
||||
final PsiElement[] sourceElements = getPsiElements(sourceNodes);
|
||||
final PsiElement targetElement = getPsiElement(targetNode);
|
||||
@@ -365,6 +374,7 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
return isTargetAcceptable && CopyHandler.canCopy(sourceElements);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doDrop(@NotNull final TreeNode[] sourceNodes, @NotNull final TreeNode targetNode) {
|
||||
final PsiElement[] sourceElements = getPsiElements(sourceNodes);
|
||||
doDrop(targetNode, sourceElements);
|
||||
@@ -389,15 +399,18 @@ class ProjectViewDropTarget implements DnDNativeTarget {
|
||||
CopyHandler.doCopy(sourceElements, psiDirectory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDropRedundant(@NotNull TreeNode sourceNode, @NotNull TreeNode targetNode) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldDelegateToParent(TreeNode[] sourceNodes, @NotNull final TreeNode targetNode) {
|
||||
final PsiElement psiElement = getPsiElement(targetNode);
|
||||
return psiElement == null || (!(psiElement instanceof PsiDirectoryContainer) && !(psiElement instanceof PsiDirectory));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doDropFiles(List<File> fileList, TreeNode targetNode) {
|
||||
final PsiFileSystemItem[] sourceFileArray = getPsiFiles(fileList);
|
||||
doDrop(targetNode, sourceFileArray);
|
||||
|
||||
@@ -178,6 +178,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
private static final String ATTRIBUTE_ID = "id";
|
||||
private JPanel myViewContentPanel;
|
||||
private static final Comparator<AbstractProjectViewPane> PANE_WEIGHT_COMPARATOR = new Comparator<AbstractProjectViewPane>() {
|
||||
@Override
|
||||
public int compare(final AbstractProjectViewPane o1, final AbstractProjectViewPane o2) {
|
||||
return o1.getWeight() - o2.getWeight();
|
||||
}
|
||||
@@ -201,6 +202,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
|
||||
myConnection = project.getMessageBus().connect();
|
||||
myConnection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootAdapter() {
|
||||
@Override
|
||||
public void rootsChanged(ModuleRootEvent event) {
|
||||
refresh();
|
||||
}
|
||||
@@ -211,6 +213,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
myDataProvider = new MyPanel();
|
||||
myDataProvider.add(myPanel, BorderLayout.CENTER);
|
||||
myCopyPasteDelegator = new CopyPasteDelegator(myProject, myPanel) {
|
||||
@Override
|
||||
@NotNull
|
||||
protected PsiElement[] getSelectedElements() {
|
||||
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
|
||||
@@ -218,10 +221,12 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
};
|
||||
myAutoScrollToSourceHandler = new AutoScrollToSourceHandler() {
|
||||
@Override
|
||||
protected boolean isAutoScrollMode() {
|
||||
return isAutoscrollToSource(myCurrentViewId);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setAutoScrollMode(boolean state) {
|
||||
setAutoscrollToSource(state, myCurrentViewId);
|
||||
}
|
||||
@@ -229,6 +234,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
toolWindowManager.addToolWindowManagerListener(new ToolWindowManagerAdapter(){
|
||||
private boolean toolWindowVisible;
|
||||
|
||||
@Override
|
||||
public void stateChanged() {
|
||||
ToolWindow window = toolWindowManager.getToolWindow(ToolWindowId.PROJECT_VIEW);
|
||||
if (window == null) return;
|
||||
@@ -252,10 +258,12 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
myPanel.setContent(myViewContentPanel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Project";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AnAction> getActions(boolean originalProvider) {
|
||||
ArrayList<AnAction> result = new ArrayList<AnAction>();
|
||||
|
||||
@@ -330,10 +338,12 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCycleRoot() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void addProjectPane(final AbstractProjectViewPane pane) {
|
||||
myUninitializedPanes.add(pane);
|
||||
SelectInTarget selectInTarget = pane.createSelectInTarget();
|
||||
@@ -345,6 +355,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void removeProjectPane(AbstractProjectViewPane pane) {
|
||||
myUninitializedPanes.remove(pane);
|
||||
//assume we are completely initialized here
|
||||
@@ -423,6 +434,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
content.setIcon(newPane.getIcon());
|
||||
content.setPopupIcon(subId != null ? AllIcons.General.Bullet : newPane.getIcon());
|
||||
content.setPreferredFocusedComponent(new Computable<JComponent>() {
|
||||
@Override
|
||||
public JComponent compute() {
|
||||
final AbstractProjectViewPane current = getCurrentProjectViewPane();
|
||||
return current != null ? current.getComponentToFocus() : null;
|
||||
@@ -470,20 +482,24 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
if (selectedPsiElement != null) {
|
||||
final VirtualFile virtualFile = PsiUtilCore.getVirtualFile(selectedPsiElement);
|
||||
if (virtualFile != null && ((ProjectViewSelectInTarget)newPane.createSelectInTarget()).isSubIdSelectable(newSubId, new SelectInContext() {
|
||||
@Override
|
||||
@NotNull
|
||||
public Project getProject() {
|
||||
return myProject;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public VirtualFile getVirtualFile() {
|
||||
return virtualFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getSelectorInFile() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileEditorProvider getFileEditorProvider() {
|
||||
return null;
|
||||
}
|
||||
@@ -539,6 +555,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
|
||||
GuiUtils.replaceJSplitPaneWithIDEASplitter(myPanel);
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
splitterProportions.restoreSplitterProportions(myPanel);
|
||||
}
|
||||
@@ -602,6 +619,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
myActionGroup.addAction(new PaneOptionAction(myFlattenPackages, IdeBundle.message("action.flatten.packages"),
|
||||
IdeBundle.message("action.flatten.packages"), PlatformIcons.FLATTEN_PACKAGES_ICON,
|
||||
ourFlattenPackagesDefaults) {
|
||||
@Override
|
||||
public void setSelected(AnActionEvent event, boolean flag) {
|
||||
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
|
||||
final SelectionInfo selectionInfo = SelectionInfo.create(viewPane);
|
||||
@@ -622,6 +640,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
super(optionsMap, text, description, icon, optionDefaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
super.update(e);
|
||||
final Presentation presentation = e.getPresentation();
|
||||
@@ -637,11 +656,13 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
IdeBundle.message("action.abbreviate.qualified.package.names"),
|
||||
AllIcons.ObjectBrowser.AbbreviatePackageNames,
|
||||
ourAbbreviatePackagesDefaults) {
|
||||
@Override
|
||||
public boolean isSelected(AnActionEvent event) {
|
||||
return super.isSelected(event) && isAbbreviatePackageNames(myCurrentViewId);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
super.update(e);
|
||||
if (ScopeViewPane.ID.equals(myCurrentViewId)) {
|
||||
@@ -665,14 +686,17 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
myActionGroup.addAction(new ScrollFromSourceAction());
|
||||
}
|
||||
AnAction collapseAllAction = CommonActionsManager.getInstance().createCollapseAllAction(new TreeExpander() {
|
||||
@Override
|
||||
public void expandAll() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canExpand() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void collapseAll() {
|
||||
AbstractProjectViewPane pane = getCurrentProjectViewPane();
|
||||
JTree tree = pane.myTree;
|
||||
@@ -681,6 +705,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canCollapse() {
|
||||
return true;
|
||||
}
|
||||
@@ -689,6 +714,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
getCurrentProjectViewPane().addToolbarActions(myActionGroup);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractProjectViewPane getProjectViewPaneById(String id) {
|
||||
if (!ApplicationManager.getApplication().isUnitTestMode()) { // most tests don't need all panes to be loaded
|
||||
ensurePanesLoaded();
|
||||
@@ -706,10 +732,12 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractProjectViewPane getCurrentProjectViewPane() {
|
||||
return getProjectViewPaneById(myCurrentViewId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refresh() {
|
||||
AbstractProjectViewPane currentProjectViewPane = getCurrentProjectViewPane();
|
||||
if (currentProjectViewPane != null) {
|
||||
@@ -718,6 +746,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void select(final Object element, VirtualFile file, boolean requestFocus) {
|
||||
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
|
||||
if (viewPane != null) {
|
||||
@@ -725,6 +754,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionCallback selectCB(Object element, VirtualFile file, boolean requestFocus) {
|
||||
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
|
||||
if (viewPane != null && viewPane instanceof AbstractProjectViewPSIPane) {
|
||||
@@ -735,18 +765,22 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
myConnection.disconnect();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JComponent getComponent() {
|
||||
return myDataProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCurrentViewId() {
|
||||
return myCurrentViewId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiElement getParentOfCurrentSelection() {
|
||||
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
|
||||
if (viewPane == null) {
|
||||
@@ -792,15 +826,18 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
myOptionDefaultValue = optionDefaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelected(AnActionEvent event) {
|
||||
return getPaneOptionValue(myOptionsMap, myCurrentViewId, myOptionDefaultValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelected(AnActionEvent event, boolean flag) {
|
||||
setPaneOption(myOptionsMap, flag, myCurrentViewId, true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changeView() {
|
||||
final List<AbstractProjectViewPane> views = new ArrayList<AbstractProjectViewPane>(myId2Pane.values());
|
||||
views.remove(getCurrentProjectViewPane());
|
||||
@@ -808,6 +845,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
|
||||
final JList list = new JBList(ArrayUtil.toObjectArray(views));
|
||||
list.setCellRenderer(new DefaultListCellRenderer() {
|
||||
@Override
|
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
||||
AbstractProjectViewPane pane = (AbstractProjectViewPane)value;
|
||||
@@ -820,6 +858,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
list.setSelectedValue(views.get(0), true);
|
||||
}
|
||||
Runnable runnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (list.getSelectedIndex() < 0) return;
|
||||
AbstractProjectViewPane pane = (AbstractProjectViewPane)list.getSelectedValue();
|
||||
@@ -833,10 +872,12 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
createPopup().showInCenterOf(getComponent());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changeView(@NotNull String viewId) {
|
||||
changeView(viewId, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changeView(@NotNull String viewId, @Nullable String subId) {
|
||||
AbstractProjectViewPane pane = getProjectViewPaneById(viewId);
|
||||
LOG.assertTrue(pane != null, "Project view pane not found: " + viewId + "; subId:" + subId);
|
||||
@@ -853,11 +894,13 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
|
||||
private final class MyDeletePSIElementProvider implements DeleteProvider {
|
||||
@Override
|
||||
public boolean canDeleteElement(@NotNull DataContext dataContext) {
|
||||
final PsiElement[] elements = getElementsToDelete();
|
||||
return DeleteHandler.shouldEnableDeleteAction(elements);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteElement(@NotNull DataContext dataContext) {
|
||||
List<PsiElement> allElements = Arrays.asList(getElementsToDelete());
|
||||
List<PsiElement> validElements = new ArrayList<PsiElement>();
|
||||
@@ -942,6 +985,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
return ((NodeDescriptor)userObject).getElement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getData(String dataId) {
|
||||
final AbstractProjectViewPane currentProjectViewPane = getCurrentProjectViewPane();
|
||||
if (currentProjectViewPane != null) {
|
||||
@@ -1005,10 +1049,12 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
final LibraryOrderEntry orderEntry = getSelectedLibrary();
|
||||
if (orderEntry != null) {
|
||||
return new DeleteProvider() {
|
||||
@Override
|
||||
public void deleteElement(@NotNull DataContext dataContext) {
|
||||
detachLibrary(orderEntry, myProject);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDeleteElement(@NotNull DataContext dataContext) {
|
||||
return true;
|
||||
}
|
||||
@@ -1102,8 +1148,10 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
int ret = Messages.showOkCancelDialog(project, message, title, Messages.getQuestionIcon());
|
||||
if (ret != 0) return;
|
||||
CommandProcessor.getInstance().executeCommand(module.getProject(), new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final Runnable action = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
|
||||
OrderEntry[] orderEntries = rootManager.getOrderEntries();
|
||||
@@ -1186,6 +1234,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
|
||||
private final class MyIdeView implements IdeView {
|
||||
@Override
|
||||
public void selectElement(PsiElement element) {
|
||||
selectPsiElement(element, false);
|
||||
boolean requestFocus = true;
|
||||
@@ -1205,6 +1254,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiDirectory[] getDirectories() {
|
||||
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
|
||||
if (viewPane != null) {
|
||||
@@ -1214,11 +1264,13 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
return PsiDirectory.EMPTY_ARRAY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PsiDirectory getOrChooseDirectory() {
|
||||
return DirectoryChooserUtil.getOrChooseDirectory(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void selectPsiElement(PsiElement element, boolean requestFocus) {
|
||||
if (element == null) return;
|
||||
VirtualFile virtualFile = PsiUtilBase.getVirtualFile(element);
|
||||
@@ -1247,6 +1299,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
parentNode.addContent(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadState(Element parentNode) {
|
||||
Element navigatorElement = parentNode.getChild(ELEMENT_NAVIGATOR);
|
||||
if (navigatorElement != null) {
|
||||
@@ -1300,6 +1353,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Element getState() {
|
||||
Element parentNode = new Element("projectView");
|
||||
Element navigatorElement = new Element(ELEMENT_NAVIGATOR);
|
||||
@@ -1357,6 +1411,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoscrollToSource(String paneId) {
|
||||
return getPaneOptionValue(myAutoscrollToSource, paneId, ourAutoscrollToSourceDefaults);
|
||||
}
|
||||
@@ -1365,6 +1420,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
myAutoscrollToSource.put(paneId, autoscrollMode ? Boolean.TRUE : Boolean.FALSE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAutoscrollFromSource(String paneId) {
|
||||
return getPaneOptionValue(myAutoscrollFromSource, paneId, ourAutoscrollFromSourceDefaults);
|
||||
}
|
||||
@@ -1373,6 +1429,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
setPaneOption(myAutoscrollFromSource, autoscrollMode, paneId, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlattenPackages(String paneId) {
|
||||
return getPaneOptionValue(myFlattenPackages, paneId, ourFlattenPackagesDefaults);
|
||||
}
|
||||
@@ -1381,6 +1438,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
setPaneOption(myFlattenPackages, flattenPackages, paneId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowMembers(String paneId) {
|
||||
return getPaneOptionValue(myShowMembers, paneId, ourShowMembersDefaults);
|
||||
}
|
||||
@@ -1389,18 +1447,22 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
setPaneOption(myShowMembers, showMembers, paneId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHideEmptyMiddlePackages(String paneId) {
|
||||
return getPaneOptionValue(myHideEmptyPackages, paneId, ourHideEmptyPackagesDefaults);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAbbreviatePackageNames(String paneId) {
|
||||
return getPaneOptionValue(myAbbreviatePackageNames, paneId, ourAbbreviatePackagesDefaults);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowLibraryContents(String paneId) {
|
||||
return getPaneOptionValue(myShowLibraryContents, paneId, ourShowLibraryContentsDefaults);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowLibraryContents(boolean showLibraryContents, String paneId) {
|
||||
setPaneOption(myShowLibraryContents, showLibraryContents, paneId, true);
|
||||
}
|
||||
@@ -1409,18 +1471,22 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
return setPaneOption(myShowLibraryContents, showLibraryContents, paneId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowModules(String paneId) {
|
||||
return getPaneOptionValue(myShowModules, paneId, ourShowModulesDefaults);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowModules(boolean showModules, String paneId) {
|
||||
setPaneOption(myShowModules, showModules, paneId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHideEmptyPackages(boolean hideEmptyPackages, String paneId) {
|
||||
setPaneOption(myHideEmptyPackages, hideEmptyPackages, paneId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAbbreviatePackageNames(boolean abbreviatePackageNames, String paneId) {
|
||||
setPaneOption(myAbbreviatePackageNames, abbreviatePackageNames, paneId, true);
|
||||
}
|
||||
@@ -1446,6 +1512,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
super(myHideEmptyPackages, "", "", null, ourHideEmptyPackagesDefaults);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelected(AnActionEvent event, boolean flag) {
|
||||
final AbstractProjectViewPane viewPane = getCurrentProjectViewPane();
|
||||
final SelectionInfo selectionInfo = SelectionInfo.create(viewPane);
|
||||
@@ -1455,6 +1522,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
selectionInfo.apply(viewPane);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
super.update(e);
|
||||
final Presentation presentation = e.getPresentation();
|
||||
@@ -1599,10 +1667,12 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isAutoScrollEnabled() {
|
||||
return isAutoscrollFromSource(myCurrentViewId);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setAutoScrollEnabled(boolean state) {
|
||||
setAutoscrollFromSource(state, myCurrentViewId);
|
||||
if (state) {
|
||||
@@ -1624,6 +1694,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
myEditor = editor;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Project getProject() {
|
||||
return myProject;
|
||||
@@ -1633,9 +1704,11 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
return myPsiFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileEditorProvider getFileEditorProvider() {
|
||||
if (myPsiFile == null) return null;
|
||||
return new FileEditorProvider() {
|
||||
@Override
|
||||
public FileEditor openFileEditor() {
|
||||
return myFileEditorManager.openFile(myPsiFile.getContainingFile().getVirtualFile(), false)[0];
|
||||
}
|
||||
@@ -1655,21 +1728,25 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
return e;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public VirtualFile getVirtualFile() {
|
||||
return getPsiFile().getVirtualFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getSelectorInFile() {
|
||||
return getPsiElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSortByType(String paneId) {
|
||||
return getPaneOptionValue(mySortByType, paneId, ourSortByTypeDefaults);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSortByType(String paneId, final boolean sortByType) {
|
||||
setPaneOption(mySortByType, sortByType, paneId, false);
|
||||
final AbstractProjectViewPane pane = getProjectViewPaneById(paneId);
|
||||
@@ -1682,14 +1759,17 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
AllIcons.ObjectBrowser.SortByType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelected(AnActionEvent event) {
|
||||
return isSortByType(getCurrentViewId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelected(AnActionEvent event, boolean flag) {
|
||||
setSortByType(getCurrentViewId(), flag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(final AnActionEvent e) {
|
||||
super.update(e);
|
||||
final Presentation presentation = e.getPresentation();
|
||||
@@ -1709,6 +1789,7 @@ public class ProjectViewImpl extends ProjectView implements PersistentStateCompo
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> getPaneIds() {
|
||||
return myId2Pane.keySet();
|
||||
}
|
||||
|
||||
@@ -45,42 +45,51 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
|
||||
super(project);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTitle() {
|
||||
return IdeBundle.message("title.project");
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getId() {
|
||||
return ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon getIcon() {
|
||||
return AllIcons.General.ProjectTab;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SelectInTarget createSelectInTarget() {
|
||||
return new ProjectPaneSelectInTarget(myProject);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractTreeUpdater createTreeUpdater(AbstractTreeBuilder treeBuilder) {
|
||||
return new ProjectViewTreeUpdater(treeBuilder);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ProjectAbstractTreeStructureBase createStructure() {
|
||||
return new ProjectTreeStructure(myProject, ID){
|
||||
@Override
|
||||
protected AbstractTreeNode createRoot(final Project project, ViewSettings settings) {
|
||||
return new ProjectViewProjectNode(project, settings);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ProjectViewTree createTree(DefaultTreeModel treeModel) {
|
||||
return new ProjectViewTree(myProject, treeModel) {
|
||||
public String toString() {
|
||||
return getTitle() + " " + super.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DefaultMutableTreeNode getSelectedNode() {
|
||||
return ProjectViewPane.this.getSelectedNode();
|
||||
}
|
||||
@@ -94,6 +103,7 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
|
||||
|
||||
|
||||
// should be first
|
||||
@Override
|
||||
public int getWeight() {
|
||||
return 0;
|
||||
}
|
||||
@@ -103,6 +113,7 @@ public class ProjectViewPane extends AbstractProjectViewPSIPane {
|
||||
super(treeBuilder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addSubtreeToUpdateByElement(Object element) {
|
||||
if (element instanceof PsiDirectory) {
|
||||
final PsiDirectory dir = (PsiDirectory)element;
|
||||
|
||||
+1
@@ -28,6 +28,7 @@ import com.intellij.openapi.wm.ToolWindowFactoryEx;
|
||||
* @author yole
|
||||
*/
|
||||
public class ProjectViewToolWindowFactory implements ToolWindowFactoryEx, DumbAware {
|
||||
@Override
|
||||
public void createToolWindowContent(Project project, ToolWindow toolWindow) {
|
||||
((ProjectViewImpl) ProjectView.getInstance(project)).setupImpl(toolWindow);
|
||||
}
|
||||
|
||||
@@ -67,6 +67,7 @@ public abstract class ProjectViewTree extends JBTreeWithHintProvider {
|
||||
return myProject;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int getToggleClickCount() {
|
||||
final DefaultMutableTreeNode selectedNode = getSelectedNode();
|
||||
if (selectedNode != null) {
|
||||
|
||||
@@ -36,6 +36,7 @@ public class PsiFileUrl extends AbstractUrl {
|
||||
super(url, null, ELEMENT_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] createPath(final Project project) {
|
||||
final VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(url);
|
||||
if (file == null || !file.isValid()){
|
||||
@@ -44,10 +45,12 @@ public class PsiFileUrl extends AbstractUrl {
|
||||
return new Object[]{PsiManager.getInstance(project).findFile(file)};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractUrl createUrl(String moduleName, String url) {
|
||||
return new PsiFileUrl(url);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractUrl createUrlByElement(Object element) {
|
||||
if (element instanceof PsiFile) {
|
||||
VirtualFile file = ((PsiFile)element).getVirtualFile();
|
||||
|
||||
@@ -50,19 +50,23 @@ import org.jetbrains.annotations.Nullable;
|
||||
public class RenameModuleHandler implements RenameHandler, TitledHandler {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.ide.projectView.actions.RenameModuleHandler");
|
||||
|
||||
@Override
|
||||
public boolean isAvailableOnDataContext(DataContext dataContext) {
|
||||
Module module = LangDataKeys.MODULE_CONTEXT.getData(dataContext);
|
||||
return module != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRenaming(DataContext dataContext) {
|
||||
return isAvailableOnDataContext(dataContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) {
|
||||
LOG.assertTrue(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(@NotNull final Project project, @NotNull PsiElement[] elements, @NotNull DataContext dataContext) {
|
||||
final Module module = LangDataKeys.MODULE_CONTEXT.getData(dataContext);
|
||||
LOG.assertTrue(module != null);
|
||||
@@ -74,6 +78,7 @@ public class RenameModuleHandler implements RenameHandler, TitledHandler {
|
||||
new MyInputValidator(project, module));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getActionTitle() {
|
||||
return RefactoringBundle.message("rename.module.title");
|
||||
}
|
||||
@@ -86,18 +91,22 @@ public class RenameModuleHandler implements RenameHandler, TitledHandler {
|
||||
myModule = module;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkInput(String inputString) {
|
||||
return inputString != null && inputString.length() > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canClose(final String inputString) {
|
||||
final String oldName = myModule.getName();
|
||||
final ModifiableModuleModel modifiableModel = renameModule(inputString);
|
||||
if (modifiableModel == null) return false;
|
||||
final Ref<Boolean> success = Ref.create(Boolean.TRUE);
|
||||
CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
UndoableAction action = new BasicUndoableAction() {
|
||||
@Override
|
||||
public void undo() throws UnexpectedUndoException {
|
||||
final ModifiableModuleModel modifiableModel = renameModule(oldName);
|
||||
if (modifiableModel != null) {
|
||||
@@ -115,6 +124,7 @@ public class RenameModuleHandler implements RenameHandler, TitledHandler {
|
||||
};
|
||||
UndoManager.getInstance(myProject).undoableActionPerformed(action);
|
||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
modifiableModel.commit();
|
||||
}
|
||||
|
||||
@@ -26,17 +26,20 @@ public abstract class ShowModulesAction extends ToggleAction {
|
||||
myProject = project;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelected(AnActionEvent event) {
|
||||
return ProjectView.getInstance(myProject).isShowModules(getId());
|
||||
}
|
||||
|
||||
protected abstract String getId();
|
||||
|
||||
@Override
|
||||
public void setSelected(AnActionEvent event, boolean flag) {
|
||||
final ProjectViewImpl projectView = (ProjectViewImpl)ProjectView.getInstance(myProject);
|
||||
projectView.setShowModules(flag, getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
super.update(e);
|
||||
final Presentation presentation = e.getPresentation();
|
||||
|
||||
@@ -38,6 +38,7 @@ public abstract class AbstractModuleNode extends ProjectViewNode<Module> impleme
|
||||
super(project, module, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
if (getValue().isDisposed()) {
|
||||
setValue(null);
|
||||
@@ -56,6 +57,7 @@ public abstract class AbstractModuleNode extends ProjectViewNode<Module> impleme
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getTestPresentation() {
|
||||
return "Module";
|
||||
}
|
||||
@@ -84,11 +86,13 @@ public abstract class AbstractModuleNode extends ProjectViewNode<Module> impleme
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getToolTip() {
|
||||
final Module module = getValue();
|
||||
return ModuleType.get(module).getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigate(final boolean requestFocus) {
|
||||
ProjectSettingsService.getInstance(myProject).openModuleSettings(getValue());
|
||||
}
|
||||
@@ -98,6 +102,7 @@ public abstract class AbstractModuleNode extends ProjectViewNode<Module> impleme
|
||||
return "Open Module Settings";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigate() {
|
||||
return ProjectSettingsService.getInstance(myProject).canOpenModuleSettings();
|
||||
}
|
||||
|
||||
+3
@@ -77,15 +77,18 @@ public abstract class AbstractProjectNode extends ProjectViewNode<Project> {
|
||||
protected abstract AbstractTreeNode createModuleGroupNode(final ModuleGroup moduleGroup)
|
||||
throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException;
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
presentation.setIcon(PlatformIcons.PROJECT_ICON);
|
||||
presentation.setPresentableText(getProject().getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTestPresentation() {
|
||||
return "Project";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(@NotNull VirtualFile file) {
|
||||
ProjectFileIndex index = ProjectRootManager.getInstance(getProject()).getFileIndex();
|
||||
final VirtualFile baseDir = getProject().getBaseDir();
|
||||
|
||||
+8
@@ -68,6 +68,7 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
|
||||
protected abstract Collection<AbstractTreeNode> getChildrenImpl();
|
||||
protected abstract void updateImpl(final PresentationData data);
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public final Collection<AbstractTreeNode> getChildren() {
|
||||
final PsiElement psiElement = extractPsiFromValue();
|
||||
@@ -83,6 +84,7 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
|
||||
return children != null ? children : Collections.<AbstractTreeNode>emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid() {
|
||||
final PsiElement psiElement = extractPsiFromValue();
|
||||
return psiElement != null && psiElement.isValid();
|
||||
@@ -103,6 +105,7 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public FileStatus getFileStatus() {
|
||||
VirtualFile file = getVirtualFileForValue();
|
||||
if (file == null) {
|
||||
@@ -124,6 +127,7 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
|
||||
|
||||
// Should be called in atomic action
|
||||
|
||||
@Override
|
||||
public void update(final PresentationData data) {
|
||||
AccessToken token = ReadAction.start();
|
||||
try {
|
||||
@@ -176,6 +180,7 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(@NotNull final VirtualFile file) {
|
||||
final PsiElement psiElement = extractPsiFromValue();
|
||||
if (psiElement == null || !psiElement.isValid()) {
|
||||
@@ -196,6 +201,7 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
|
||||
return (psiElement instanceof NavigationItem) ? (NavigationItem) psiElement : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigate(boolean requestFocus) {
|
||||
if (canNavigate()) {
|
||||
if (requestFocus) {
|
||||
@@ -207,11 +213,13 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigate() {
|
||||
final NavigationItem item = getNavigationItem();
|
||||
return item != null && item.canNavigate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigateToSource() {
|
||||
final NavigationItem item = getNavigationItem();
|
||||
return item != null && item.canNavigateToSource();
|
||||
|
||||
@@ -27,6 +27,7 @@ public abstract class BasePsiNode <T extends PsiElement> extends AbstractPsiBase
|
||||
super(project, value, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
protected PsiElement extractPsiFromValue() {
|
||||
return getValue();
|
||||
|
||||
@@ -53,6 +53,7 @@ public class LibraryGroupNode extends ProjectViewNode<LibraryGroupElement> {
|
||||
this(project, (LibraryGroupElement)value, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
Module module = getValue().getModule();
|
||||
@@ -107,10 +108,12 @@ public class LibraryGroupNode extends ProjectViewNode<LibraryGroupElement> {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getTestPresentation() {
|
||||
return "Libraries";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(@NotNull VirtualFile file) {
|
||||
final ProjectFileIndex index = ProjectRootManager.getInstance(getProject()).getFileIndex();
|
||||
if (!index.isInLibrarySource(file) && !index.isInLibraryClasses(file)) {
|
||||
@@ -120,15 +123,18 @@ public class LibraryGroupNode extends ProjectViewNode<LibraryGroupElement> {
|
||||
return someChildContainsFile(file, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
presentation.setPresentableText(IdeBundle.message("node.projectview.libraries"));
|
||||
presentation.setIcon(PlatformIcons.LIBRARY_ICON);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigate() {
|
||||
return ProjectSettingsService.getInstance(myProject).canOpenModuleLibrarySettings();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigate(final boolean requestFocus) {
|
||||
Module module = getValue().getModule();
|
||||
ProjectSettingsService.getInstance(myProject).openModuleLibrarySettings(module);
|
||||
|
||||
@@ -49,6 +49,7 @@ public abstract class ModuleGroupNode extends ProjectViewNode<ModuleGroup> imple
|
||||
InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException;
|
||||
protected abstract ModuleGroupNode createModuleGroupNode(ModuleGroup moduleGroup);
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
final Collection<ModuleGroup> childGroups = getValue().childGroups(getProject());
|
||||
@@ -82,37 +83,45 @@ public abstract class ModuleGroupNode extends ProjectViewNode<ModuleGroup> imple
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(@NotNull VirtualFile file) {
|
||||
return someChildContainsFile(file, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
final String[] groupPath = getValue().getGroupPath();
|
||||
presentation.setPresentableText(groupPath[groupPath.length-1]);
|
||||
presentation.setIcon(PlatformIcons.CLOSED_MODULE_GROUP_ICON);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTestPresentation() {
|
||||
return "Group: " + getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getToolTip() {
|
||||
return IdeBundle.message("tooltip.module.group");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeight() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTypeSortWeight(final boolean sortByType) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrop(TreeNode[] sourceNodes) {
|
||||
final List<Module> modules = extractModules(sourceNodes);
|
||||
return !modules.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drop(TreeNode[] sourceNodes, DataContext dataContext) {
|
||||
final List<Module> modules = extractModules(sourceNodes);
|
||||
MoveModulesToGroupAction.doMove(modules.toArray(new Module[modules.size()]), getValue(), null);
|
||||
|
||||
@@ -41,6 +41,7 @@ public class ModuleListNode extends ProjectViewNode<Module> {
|
||||
this(project, (Module)value, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
Module module = getValue();
|
||||
@@ -60,14 +61,17 @@ public class ModuleListNode extends ProjectViewNode<Module> {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getTestPresentation() {
|
||||
return "Modules";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(@NotNull VirtualFile file) {
|
||||
return someChildContainsFile(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
presentation.setPresentableText("Module Dependencies");
|
||||
presentation.setIcon(PlatformIcons.CLOSED_MODULE_GROUP_ICON);
|
||||
|
||||
+7
@@ -44,6 +44,7 @@ public class NamedLibraryElementNode extends ProjectViewNode<NamedLibraryElement
|
||||
super(project, value, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
final List<AbstractTreeNode> children = new ArrayList<AbstractTreeNode>();
|
||||
@@ -51,6 +52,7 @@ public class NamedLibraryElementNode extends ProjectViewNode<NamedLibraryElement
|
||||
return children;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTestPresentation() {
|
||||
return "Library: " + getValue().getName();
|
||||
}
|
||||
@@ -64,10 +66,12 @@ public class NamedLibraryElementNode extends ProjectViewNode<NamedLibraryElement
|
||||
return sdkType.getIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return getValue().getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(@NotNull VirtualFile file) {
|
||||
return orderEntryContainsFile(getValue().getOrderEntry(), file);
|
||||
}
|
||||
@@ -89,6 +93,7 @@ public class NamedLibraryElementNode extends ProjectViewNode<NamedLibraryElement
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
presentation.setPresentableText(getValue().getName());
|
||||
final OrderEntry orderEntry = getValue().getOrderEntry();
|
||||
@@ -110,10 +115,12 @@ public class NamedLibraryElementNode extends ProjectViewNode<NamedLibraryElement
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigate(final boolean requestFocus) {
|
||||
ProjectSettingsService.getInstance(myProject).openLibraryOrSdkSettings(getValue().getOrderEntry());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigate() {
|
||||
return ProjectSettingsService.getInstance(myProject).canOpenLibraryOrSdkSettings(getValue().getOrderEntry());
|
||||
}
|
||||
|
||||
+1
@@ -55,6 +55,7 @@ public class ProjectViewModuleGroupNode extends ModuleGroupNode {
|
||||
return createTreeNode(ProjectViewModuleNode.class, getProject(), module, getSettings());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ModuleGroupNode createModuleGroupNode(ModuleGroup moduleGroup) {
|
||||
return new ProjectViewModuleGroupNode(getProject(), moduleGroup, getSettings());
|
||||
}
|
||||
|
||||
+3
@@ -44,6 +44,7 @@ public class ProjectViewModuleNode extends AbstractModuleNode {
|
||||
this(project, (Module)value, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
Module module = getValue();
|
||||
@@ -76,10 +77,12 @@ public class ProjectViewModuleNode extends AbstractModuleNode {
|
||||
return children;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeight() {
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTypeSortWeight(final boolean sortByType) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
+4
@@ -43,6 +43,7 @@ public class ProjectViewProjectNode extends AbstractProjectNode {
|
||||
super(project, project, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
List<VirtualFile> topLevelContentRoots = ProjectViewDirectoryHelper.getInstance(myProject).getTopLevelRoots();
|
||||
@@ -98,6 +99,7 @@ public class ProjectViewProjectNode extends AbstractProjectNode {
|
||||
}
|
||||
|
||||
Collections.sort(roots, new java.util.Comparator<VirtualFile>() {
|
||||
@Override
|
||||
public int compare(VirtualFile o1, VirtualFile o2) {
|
||||
return o1.getPath().compareTo(o2.getPath());
|
||||
}
|
||||
@@ -124,6 +126,7 @@ public class ProjectViewProjectNode extends AbstractProjectNode {
|
||||
return reducedRoots;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractTreeNode createModuleGroup(final Module module)
|
||||
throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
|
||||
final VirtualFile[] roots = ModuleRootManager.getInstance(module).getContentRoots();
|
||||
@@ -137,6 +140,7 @@ public class ProjectViewProjectNode extends AbstractProjectNode {
|
||||
return createTreeNode(ProjectViewModuleNode.class, getProject(), module, getSettings());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbstractTreeNode createModuleGroupNode(final ModuleGroup moduleGroup)
|
||||
throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
|
||||
return createTreeNode(ProjectViewModuleGroupNode.class, getProject(), moduleGroup, getSettings());
|
||||
|
||||
@@ -62,6 +62,7 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
return !PlatformUtils.isCidr();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateImpl(PresentationData data) {
|
||||
final Project project = getProject();
|
||||
final PsiDirectory psiDirectory = getValue();
|
||||
@@ -151,10 +152,12 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<AbstractTreeNode> getChildrenImpl() {
|
||||
return ProjectViewDirectoryHelper.getInstance(myProject).getDirectoryChildren(getValue(), getSettings(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public String getTestPresentation() {
|
||||
return "PsiDirectory: " + getValue().getName();
|
||||
@@ -164,6 +167,7 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
return ProjectViewDirectoryHelper.getInstance(getProject()).isShowFQName(getSettings(), getParentValue(), getValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(@NotNull VirtualFile file) {
|
||||
final PsiDirectory value = getValue();
|
||||
if (value == null) {
|
||||
@@ -184,12 +188,14 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
return !fileIndex.isIgnored(file);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VirtualFile getVirtualFile() {
|
||||
PsiDirectory directory = getValue();
|
||||
if (directory == null) return null;
|
||||
return directory.getVirtualFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canRepresent(final Object element) {
|
||||
if (super.canRepresent(element)) return true;
|
||||
PsiDirectory directory = getValue();
|
||||
@@ -197,6 +203,7 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
return ProjectViewDirectoryHelper.getInstance(getProject()).canRepresent(element, directory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigate() {
|
||||
VirtualFile file = getVirtualFile();
|
||||
Project project = getProject();
|
||||
@@ -207,10 +214,12 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
(ProjectRootsUtil.isLibraryRoot(file, project) && service.canOpenModuleLibrarySettings()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigateToSource() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigate(final boolean requestFocus) {
|
||||
Module module = ModuleUtil.findModuleForPsiElement(getValue());
|
||||
if (module != null) {
|
||||
@@ -250,10 +259,12 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeight() {
|
||||
return isFQNameShown() ? 70 : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTitle() {
|
||||
final PsiDirectory directory = getValue();
|
||||
if (directory != null) {
|
||||
@@ -297,11 +308,13 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getQualifiedNameSortKey() {
|
||||
final PsiDirectoryFactory factory = PsiDirectoryFactory.getInstance(getProject());
|
||||
return factory.getQualifiedName(getValue(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTypeSortWeight(final boolean sortByType) {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ public class PsiFileNode extends BasePsiNode<PsiFile> implements NavigatableWith
|
||||
super(project, value, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<AbstractTreeNode> getChildrenImpl() {
|
||||
VirtualFile jarRoot = getJarRoot();
|
||||
if (jarRoot != null) {
|
||||
@@ -65,12 +66,14 @@ public class PsiFileNode extends BasePsiNode<PsiFile> implements NavigatableWith
|
||||
return file != null && file.isValid() && file.getFileType() instanceof ArchiveFileType;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateImpl(PresentationData data) {
|
||||
final PsiFile value = getValue();
|
||||
data.setPresentableText(value.getName());
|
||||
data.setIcon(value.getIcon(Iconable.ICON_FLAG_READ_STATUS));
|
||||
}
|
||||
|
||||
@Override
|
||||
public VirtualFile getVirtualFile() {
|
||||
PsiFile value = getValue();
|
||||
return value != null ? value.getVirtualFile() : null;
|
||||
@@ -122,6 +125,7 @@ public class PsiFileNode extends BasePsiNode<PsiFile> implements NavigatableWith
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeight() {
|
||||
return 20;
|
||||
}
|
||||
@@ -140,6 +144,7 @@ public class PsiFileNode extends BasePsiNode<PsiFile> implements NavigatableWith
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Comparable getTypeSortKey() {
|
||||
String extension = extension(getValue());
|
||||
return extension == null ? null : new ExtensionSortKey(extension);
|
||||
@@ -157,6 +162,7 @@ public class PsiFileNode extends BasePsiNode<PsiFile> implements NavigatableWith
|
||||
myExtension = extension;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(final Object o) {
|
||||
if (!(o instanceof ExtensionSortKey)) return 0;
|
||||
ExtensionSortKey rhs = (ExtensionSortKey) o;
|
||||
@@ -170,6 +176,7 @@ public class PsiFileNode extends BasePsiNode<PsiFile> implements NavigatableWith
|
||||
return file != null && file.getFileType() == StdFileTypes.JAVA;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canRepresent(final Object element) {
|
||||
return super.canRepresent(element) || getValue() != null && getValue().getVirtualFile() == element;
|
||||
}
|
||||
|
||||
+3
@@ -33,6 +33,7 @@ public class StructureViewModuleNode extends AbstractModuleNode {
|
||||
super(project, value, viewSettings);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
final Module module = getValue();
|
||||
@@ -52,10 +53,12 @@ public class StructureViewModuleNode extends AbstractModuleNode {
|
||||
return children;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWeight() {
|
||||
return 10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTypeSortWeight(final boolean sortByType) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
+5
-2
@@ -189,8 +189,11 @@ public class StructureTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
|
||||
final void addRootToUpdate() {
|
||||
getTreeStructure().commit();
|
||||
((SmartTreeStructure)getTreeStructure()).rebuildTree();
|
||||
AbstractTreeStructure structure = getTreeStructure();
|
||||
if (structure.hasSomethingToCommit()) {
|
||||
structure.commit();
|
||||
}
|
||||
((SmartTreeStructure)structure).rebuildTree();
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
|
||||
|
||||
+5
-1
@@ -41,6 +41,7 @@ public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
|
||||
myProject = project;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getChildElements(Object element) {
|
||||
LOG.assertTrue(element instanceof AbstractTreeNode, element != null ? element.getClass().getName() : null);
|
||||
AbstractTreeNode<?> treeNode = (AbstractTreeNode)element;
|
||||
@@ -69,6 +70,7 @@ public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
|
||||
return element instanceof AbstractTreeNode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getParentElement(Object element) {
|
||||
if (element instanceof AbstractTreeNode){
|
||||
return ((AbstractTreeNode)element).getParent();
|
||||
@@ -76,6 +78,7 @@ public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public NodeDescriptor createDescriptor(final Object element, final NodeDescriptor parentDescriptor) {
|
||||
return (NodeDescriptor)element;
|
||||
@@ -89,7 +92,8 @@ public abstract class AbstractTreeStructureBase extends AbstractTreeStructure {
|
||||
@Nullable
|
||||
public abstract List<TreeStructureProvider> getProviders();
|
||||
|
||||
public Object getDataFromProviders(final List<AbstractTreeNode> selectedNodes, final String dataId) {
|
||||
@Nullable
|
||||
public Object getDataFromProviders(@NotNull List<AbstractTreeNode> selectedNodes, final String dataId) {
|
||||
final List<TreeStructureProvider> providers = getProvidersDumbAware();
|
||||
if (providers != null) {
|
||||
for (TreeStructureProvider treeStructureProvider : providers) {
|
||||
|
||||
@@ -42,6 +42,7 @@ public class SmartElementDescriptor extends NodeDescriptor{
|
||||
mySmartPointer = SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElement() {
|
||||
return myElement;
|
||||
}
|
||||
@@ -55,6 +56,7 @@ public class SmartElementDescriptor extends NodeDescriptor{
|
||||
}
|
||||
|
||||
// Should be called in atomic action
|
||||
@Override
|
||||
public boolean update() {
|
||||
myElement = mySmartPointer.getElement();
|
||||
if (myElement == null) return true;
|
||||
|
||||
+5
@@ -36,6 +36,7 @@ public abstract class CachingChildrenTreeNode <Value> extends AbstractTreeNode<V
|
||||
myTreeModel = treeModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
ensureChildrenAreInitialized();
|
||||
@@ -70,6 +71,7 @@ public abstract class CachingChildrenTreeNode <Value> extends AbstractTreeNode<V
|
||||
mySorters = sorters;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(final CachingChildrenTreeNode o1, final CachingChildrenTreeNode o2) {
|
||||
final Object value1 = o1.getValue();
|
||||
final Object value2 = o2.getValue();
|
||||
@@ -229,14 +231,17 @@ public abstract class CachingChildrenTreeNode <Value> extends AbstractTreeNode<V
|
||||
|
||||
protected abstract void initChildren();
|
||||
|
||||
@Override
|
||||
public void navigate(final boolean requestFocus) {
|
||||
((Navigatable)getValue()).navigate(requestFocus);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigate() {
|
||||
return getValue() instanceof Navigatable && ((Navigatable)getValue()).canNavigate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigateToSource() {
|
||||
return getValue() instanceof Navigatable && ((Navigatable)getValue()).canNavigateToSource();
|
||||
}
|
||||
|
||||
@@ -27,16 +27,19 @@ public class GroupWrapper extends CachingChildrenTreeNode<Group> {
|
||||
clearChildren();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copyFromNewInstance(final CachingChildrenTreeNode newInstance) {
|
||||
clearChildren();
|
||||
setChildren(newInstance.getChildren());
|
||||
synchronizeChildren();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
presentation.updateFrom(getValue().getPresentation());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initChildren() {
|
||||
clearChildren();
|
||||
Collection<TreeElement> children = getValue().getChildren();
|
||||
@@ -46,6 +49,7 @@ public class GroupWrapper extends CachingChildrenTreeNode<Group> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void performTreeActions() {
|
||||
filterChildren(myTreeModel.getFilters());
|
||||
groupChildren(myTreeModel.getGroupers());
|
||||
|
||||
+6
@@ -34,22 +34,27 @@ public class SmartTreeStructure extends AbstractTreeStructure {
|
||||
myProject = project;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commit() {
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public NodeDescriptor createDescriptor(Object element, NodeDescriptor parentDescriptor) {
|
||||
return (AbstractTreeNode)element;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getChildElements(Object element) {
|
||||
return ((AbstractTreeNode)element).getChildren().toArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getParentElement(Object element) {
|
||||
return ((AbstractTreeNode)element).getParent();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getRootElement() {
|
||||
if (myRootElementWrapper == null){
|
||||
myRootElementWrapper = createTree();
|
||||
@@ -66,6 +71,7 @@ public class SmartTreeStructure extends AbstractTreeStructure {
|
||||
return ((AbstractTreeNode)element).isAlwaysLeaf();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSomethingToCommit() {
|
||||
return PsiDocumentManager.getInstance(myProject).hasUncommitedDocuments();
|
||||
}
|
||||
|
||||
+4
@@ -27,15 +27,18 @@ public class TreeElementWrapper extends CachingChildrenTreeNode<TreeElement> {
|
||||
super(project, value, treeModel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copyFromNewInstance(final CachingChildrenTreeNode oldInstance) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
if (((StructureViewTreeElement)getValue()).getValue() != null) {
|
||||
presentation.updateFrom(getValue().getPresentation());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initChildren() {
|
||||
clearChildren();
|
||||
TreeElement[] children = getValue().getChildren();
|
||||
@@ -55,6 +58,7 @@ public class TreeElementWrapper extends CachingChildrenTreeNode<TreeElement> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void performTreeActions() {
|
||||
filterChildren(myTreeModel.getFilters());
|
||||
groupChildren(myTreeModel.getGroupers());
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.intellij.openapi.util.AsyncResult;
|
||||
import com.intellij.util.containers.HashSet;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import com.intellij.util.ui.update.MergingUpdateQueue;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -40,7 +41,7 @@ import java.util.*;
|
||||
|
||||
public class AbstractTreeBuilder implements Disposable {
|
||||
private AbstractTreeUi myUi;
|
||||
private static final String TREE_BUILDER = "TreeBuilder";
|
||||
@NonNls private static final String TREE_BUILDER = "TreeBuilder";
|
||||
public static final boolean DEFAULT_UPDATE_INACTIVE = true;
|
||||
|
||||
public AbstractTreeBuilder(JTree tree,
|
||||
@@ -66,10 +67,10 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
protected void init(final JTree tree,
|
||||
final DefaultTreeModel treeModel,
|
||||
final AbstractTreeStructure treeStructure,
|
||||
final @Nullable Comparator<NodeDescriptor> comparator,
|
||||
@Nullable final Comparator<NodeDescriptor> comparator,
|
||||
final boolean updateIfInactive) {
|
||||
|
||||
tree.putClientProperty(TREE_BUILDER, new WeakReference(this));
|
||||
tree.putClientProperty(TREE_BUILDER, new WeakReference<AbstractTreeBuilder>(this));
|
||||
|
||||
myUi = createUi();
|
||||
getUi().init(this, tree, treeModel, treeStructure, comparator, updateIfInactive);
|
||||
@@ -208,9 +209,7 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
}
|
||||
|
||||
protected boolean validateNode(final Object child) {
|
||||
if (isDisposed()) return false;
|
||||
|
||||
return getUi().getTreeStructure().isValid(child);
|
||||
return !isDisposed() && getUi().getTreeStructure().isValid(child);
|
||||
}
|
||||
|
||||
protected boolean isDisposeOnCollapsing(NodeDescriptor nodeDescriptor) {
|
||||
@@ -347,9 +346,7 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
}
|
||||
|
||||
protected boolean isAutoExpandNode(final NodeDescriptor nodeDescriptor) {
|
||||
if (isDisposed()) return false;
|
||||
|
||||
return getRootElement() == getTreeStructureElement(nodeDescriptor);
|
||||
return !isDisposed() && getRootElement() == getTreeStructureElement(nodeDescriptor);
|
||||
}
|
||||
|
||||
protected boolean isAlwaysShowPlus(final NodeDescriptor descriptor) {
|
||||
@@ -376,15 +373,11 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
}
|
||||
|
||||
public final boolean wasRootNodeInitialized() {
|
||||
if (isDisposed()) return false;
|
||||
|
||||
return getUi().wasRootNodeInitialized();
|
||||
return !isDisposed() && getUi().wasRootNodeInitialized();
|
||||
}
|
||||
|
||||
public final boolean isNodeBeingBuilt(final TreePath path) {
|
||||
if (isDisposed()) return false;
|
||||
|
||||
return getUi().isNodeBeingBuilt(path);
|
||||
return !isDisposed() && getUi().isNodeBeingBuilt(path);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -458,6 +451,7 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
final Application app = ApplicationManager.getApplication();
|
||||
if (app != null) {
|
||||
app.runReadAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
runnable.run();
|
||||
}
|
||||
@@ -533,11 +527,13 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
super(null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public Collection<AbstractTreeNode> getChildren() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PresentationData presentation) {
|
||||
}
|
||||
}
|
||||
@@ -546,6 +542,7 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
return myUi;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
if (isDisposed()) return;
|
||||
|
||||
@@ -560,7 +557,7 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
if (isDisposed()) return false;
|
||||
|
||||
AbstractTreeUi ui = getUi();
|
||||
return ui != null && ui.doUpdateNodeDescriptor(descriptor);
|
||||
return ui != null && descriptor.update();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -645,14 +642,14 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
myUi.scrollSelectionToVisible(onDone, shouldBeCentered);
|
||||
}
|
||||
|
||||
protected boolean isUnitTestingMode() {
|
||||
private static boolean isUnitTestingMode() {
|
||||
Application app = ApplicationManager.getApplication();
|
||||
return app != null && app.isUnitTestMode();
|
||||
}
|
||||
|
||||
public static boolean isToPaintSelection(JTree tree) {
|
||||
AbstractTreeBuilder builder = getBuilderFor(tree);
|
||||
return builder != null && builder.getUi() != null ? builder.getUi().isToPaintSelection() : true;
|
||||
return builder == null || builder.getUi() == null || builder.getUi().isToPaintSelection();
|
||||
}
|
||||
|
||||
class UserRunnable implements Runnable {
|
||||
@@ -681,8 +678,4 @@ public class AbstractTreeBuilder implements Disposable {
|
||||
AbstractTreeUi ui = getUi();
|
||||
return ui != null && ui.isSelectionBeingAdjusted();
|
||||
}
|
||||
|
||||
private void assertDisposed() {
|
||||
assert !isDisposed();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ public abstract class AbstractTreeNode<T> extends PresentableNodeDescriptor impl
|
||||
return CopyPasteManager.getInstance().isCutElement(getValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
public PresentableNodeDescriptor getChildToHighlightAt(int index) {
|
||||
final Collection<? extends AbstractTreeNode> kids = getChildren();
|
||||
int i = 0;
|
||||
@@ -86,6 +87,7 @@ public abstract class AbstractTreeNode<T> extends PresentableNodeDescriptor impl
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldUpdateData() {
|
||||
return !myProject.isDisposed() && getValue() != null;
|
||||
}
|
||||
@@ -103,6 +105,7 @@ public abstract class AbstractTreeNode<T> extends PresentableNodeDescriptor impl
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public final Object getElement() {
|
||||
return getValue() != null ? this : null;
|
||||
@@ -131,6 +134,7 @@ public abstract class AbstractTreeNode<T> extends PresentableNodeDescriptor impl
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final NodeDescriptor getParentDescriptor() {
|
||||
return myParentDescriptor;
|
||||
}
|
||||
@@ -153,6 +157,7 @@ public abstract class AbstractTreeNode<T> extends PresentableNodeDescriptor impl
|
||||
return getTestPresentation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(@NotNull Map<String, String> info) {
|
||||
}
|
||||
|
||||
@@ -164,11 +169,11 @@ public abstract class AbstractTreeNode<T> extends PresentableNodeDescriptor impl
|
||||
@NonNls public String getTestPresentation() {
|
||||
if (myName != null) {
|
||||
return myName;
|
||||
} else if (getValue() != null){
|
||||
return getValue().toString();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
if (getValue() != null){
|
||||
return getValue().toString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -176,17 +181,21 @@ public abstract class AbstractTreeNode<T> extends PresentableNodeDescriptor impl
|
||||
return FileStatus.NOT_CHANGED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return myName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void navigate(boolean requestFocus) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigate() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canNavigateToSource() {
|
||||
return false;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -50,13 +50,13 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
|
||||
private long myUpdateCount;
|
||||
private boolean myReleaseRequested;
|
||||
|
||||
public AbstractTreeUpdater(AbstractTreeBuilder treeBuilder) {
|
||||
public AbstractTreeUpdater(@NotNull AbstractTreeBuilder treeBuilder) {
|
||||
myTreeBuilder = treeBuilder;
|
||||
final JTree tree = myTreeBuilder.getTree();
|
||||
final JComponent component = tree instanceof TreeTableTree ? ((TreeTableTree)tree).getTreeTable() : tree;
|
||||
myUpdateQueue = new MergingUpdateQueue("UpdateQueue", 300, component.isShowing(), component) {
|
||||
@Override
|
||||
protected Alarm createAlarm(Alarm.ThreadToUse thread, Disposable parent) {
|
||||
protected Alarm createAlarm(@NotNull Alarm.ThreadToUse thread, Disposable parent) {
|
||||
return new Alarm(thread, parent) {
|
||||
@Override
|
||||
protected boolean isEdt() {
|
||||
@@ -175,7 +175,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
|
||||
|
||||
|
||||
if (toAdd.isExpired()) {
|
||||
requeueViewUpdateIfNeeded();
|
||||
reQueueViewUpdateIfNeeded();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -186,18 +186,16 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
|
||||
myUpdateCount = newUpdateCount;
|
||||
toAdd.setUpdateStamp(myUpdateCount);
|
||||
|
||||
requeueViewUpdate();
|
||||
reQueueViewUpdate();
|
||||
}
|
||||
|
||||
private void requeueViewUpdateIfNeeded() {
|
||||
//if (myTreeBuilder.getUi().isPassthroughMode()) return;
|
||||
|
||||
private void reQueueViewUpdateIfNeeded() {
|
||||
if (myUpdateQueue.isEmpty() && !myNodeQueue.isEmpty()) {
|
||||
requeueViewUpdate();
|
||||
reQueueViewUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
private void requeueViewUpdate() {
|
||||
private void reQueueViewUpdate() {
|
||||
queue(new Update("ViewUpdate") {
|
||||
@Override
|
||||
public boolean isExpired() {
|
||||
@@ -208,7 +206,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
|
||||
public void run() {
|
||||
if (myTreeBuilder.getTreeStructure().hasSomethingToCommit()) {
|
||||
myTreeBuilder.getTreeStructure().commit();
|
||||
requeueViewUpdateIfNeeded();
|
||||
reQueueViewUpdateIfNeeded();
|
||||
return;
|
||||
}
|
||||
try {
|
||||
@@ -354,7 +352,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
|
||||
myRunBeforeUpdate = runnable;
|
||||
}
|
||||
|
||||
public long getUpdateCount() {
|
||||
public synchronized long getUpdateCount() {
|
||||
return myUpdateCount;
|
||||
}
|
||||
|
||||
@@ -382,7 +380,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
|
||||
|
||||
@NonNls
|
||||
@Override
|
||||
public String toString() {
|
||||
public synchronized String toString() {
|
||||
return "AbstractTreeUpdater updateCount=" + myUpdateCount + " queue=[" + myUpdateQueue.toString() + "] " + " nodeQueue=" + myNodeQueue;
|
||||
}
|
||||
|
||||
@@ -416,7 +414,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
|
||||
});
|
||||
}
|
||||
|
||||
public void requestRelease() {
|
||||
public synchronized void requestRelease() {
|
||||
myReleaseRequested = true;
|
||||
|
||||
reset();
|
||||
|
||||
@@ -25,6 +25,7 @@ public class AlphaComparator implements Comparator<NodeDescriptor>{
|
||||
protected AlphaComparator() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(NodeDescriptor nodeDescriptor1, NodeDescriptor nodeDescriptor2) {
|
||||
int weight1 = nodeDescriptor1.getWeight();
|
||||
int weight2 = nodeDescriptor2.getWeight();
|
||||
|
||||
@@ -28,6 +28,7 @@ public class IndexComparator implements Comparator<NodeDescriptor> {
|
||||
|
||||
private IndexComparator() {}
|
||||
|
||||
@Override
|
||||
public int compare(NodeDescriptor nodeDescriptor1, NodeDescriptor nodeDescriptor2) {
|
||||
return nodeDescriptor1.getIndex() - nodeDescriptor2.getIndex();
|
||||
}
|
||||
|
||||
@@ -173,9 +173,10 @@ public abstract class NodeDescriptor<E> {
|
||||
myDelegate.incStamp();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compare(T o1, T o2) {
|
||||
return myDelegate.compare(o1, o2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -54,18 +54,22 @@ public interface NodeOptions {
|
||||
* The default tree view settings.
|
||||
*/
|
||||
NodeOptions DEFAULT_OPTIONS = new NodeOptions() {
|
||||
@Override
|
||||
public boolean isFlattenPackages() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAbbreviatePackageNames() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHideEmptyMiddlePackages() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowLibraryContents() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ import java.awt.*;
|
||||
import java.util.List;
|
||||
|
||||
public class NodeRenderer extends ColoredTreeCellRenderer {
|
||||
|
||||
@Override
|
||||
public void customizeCellRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
|
||||
Color color = null;
|
||||
NodeDescriptor descriptor = null;
|
||||
@@ -54,7 +54,7 @@ public class NodeRenderer extends ColoredTreeCellRenderer {
|
||||
final PresentationData presentation = node.getPresentation();
|
||||
|
||||
final List<PresentableNodeDescriptor.ColoredFragment> coloredText = presentation.getColoredText();
|
||||
if (coloredText.size() == 0) {
|
||||
if (coloredText.isEmpty()) {
|
||||
String text = tree.convertValueToText(value.toString(), selected, expanded, leaf, row, hasFocus);
|
||||
SimpleTextAttributes simpleTextAttributes = getSimpleTextAttributes(node, presentation.getForcedTextForeground() != null ? presentation.getForcedTextForeground() : color);
|
||||
doAppend(text, simpleTextAttributes, selected);
|
||||
@@ -66,7 +66,7 @@ public class NodeRenderer extends ColoredTreeCellRenderer {
|
||||
}
|
||||
|
||||
final String location = presentation.getLocationString();
|
||||
if (location != null && location.length() > 0) {
|
||||
if (location != null && !location.isEmpty()) {
|
||||
doAppend(" (" + location + ")", SimpleTextAttributes.GRAY_ATTRIBUTES, selected);
|
||||
}
|
||||
|
||||
@@ -130,4 +130,4 @@ public class NodeRenderer extends ColoredTreeCellRenderer {
|
||||
return SimpleTextAttributes.REGULAR_ATTRIBUTES;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+11
-10
@@ -33,14 +33,14 @@ public abstract class PresentableNodeDescriptor<E> extends NodeDescriptor<E> {
|
||||
super(project, parentDescriptor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean update() {
|
||||
if (shouldUpdateData()) {
|
||||
PresentationData before = getPresentation().clone();
|
||||
PresentationData updated = getUpdatedPresentation();
|
||||
return shouldApply() ? apply(updated, before) : false;
|
||||
} else {
|
||||
return false;
|
||||
return shouldApply() && apply(updated, before);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected final boolean apply(PresentationData presentation) {
|
||||
@@ -52,7 +52,8 @@ public abstract class PresentableNodeDescriptor<E> extends NodeDescriptor<E> {
|
||||
if (desc instanceof PresentableNodeDescriptor) {
|
||||
PresentableNodeDescriptor pnd = (PresentableNodeDescriptor)desc;
|
||||
apply(pnd.getPresentation());
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
super.applyFrom(desc);
|
||||
}
|
||||
}
|
||||
@@ -61,7 +62,7 @@ public abstract class PresentableNodeDescriptor<E> extends NodeDescriptor<E> {
|
||||
myIcon = presentation.getIcon(false);
|
||||
myName = presentation.getPresentableText();
|
||||
myColor = presentation.getForcedTextForeground();
|
||||
boolean updated = before != null ? !presentation.equals(before) : true;
|
||||
boolean updated = before == null || !presentation.equals(before);
|
||||
|
||||
if (myUpdatedPresentation == null) {
|
||||
myUpdatedPresentation = createPresentation();
|
||||
@@ -120,7 +121,8 @@ public abstract class PresentableNodeDescriptor<E> extends NodeDescriptor<E> {
|
||||
PresentationData result;
|
||||
if (myUpdatedPresentation == null) {
|
||||
result = getTemplatePresentation();
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
result = myUpdatedPresentation;
|
||||
}
|
||||
return result;
|
||||
@@ -219,15 +221,14 @@ public abstract class PresentableNodeDescriptor<E> extends NodeDescriptor<E> {
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
if (getPresentation().getColoredText().size() > 0) {
|
||||
if (!getPresentation().getColoredText().isEmpty()) {
|
||||
StringBuilder result = new StringBuilder("");
|
||||
for (ColoredFragment each : getPresentation().getColoredText()) {
|
||||
result.append(each.getText());
|
||||
}
|
||||
return result.toString();
|
||||
} else {
|
||||
return myName;
|
||||
}
|
||||
return myName;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ public class TreeState implements JDOMExternalizable {
|
||||
@NonNls private static final String PATH = "PATH";
|
||||
@NonNls private static final String PATH_ELEMENT = "PATH_ELEMENT";
|
||||
@NonNls private static final String USER_OBJECT = "USER_OBJECT";
|
||||
public static final String CALLBACK = "Callback";
|
||||
@NonNls public static final String CALLBACK = "Callback";
|
||||
|
||||
static class PathElement implements JDOMExternalizable {
|
||||
public String myItemId;
|
||||
@@ -73,11 +73,13 @@ public class TreeState implements JDOMExternalizable {
|
||||
return myUserObject != null && myUserObject.equals(object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
DefaultJDOMExternalizer.readExternal(this, element);
|
||||
myUserObject = element.getAttributeValue(USER_OBJECT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
DefaultJDOMExternalizer.writeExternal(this, element);
|
||||
if (myUserObject instanceof String){
|
||||
@@ -100,6 +102,7 @@ public class TreeState implements JDOMExternalizable {
|
||||
this(new ArrayList<List<PathElement>>(), new ArrayList<List<PathElement>>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readExternal(Element element) throws InvalidDataException {
|
||||
myExpandedPaths.clear();
|
||||
final List paths = element.getChildren(PATH);
|
||||
@@ -125,6 +128,7 @@ public class TreeState implements JDOMExternalizable {
|
||||
return new TreeState(createExpandedPaths(tree, treeNode), createSelectedPaths(tree, treeNode));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeExternal(Element element) throws WriteExternalException {
|
||||
for (List<PathElement> path : myExpandedPaths) {
|
||||
final Element pathElement = new Element(PATH);
|
||||
@@ -242,8 +246,10 @@ public class TreeState implements JDOMExternalizable {
|
||||
|
||||
private void applyExpanded(final TreeFacade tree, final Object root) {
|
||||
tree.getIntialized().doWhenDone(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
tree.batch(new Progressive() {
|
||||
@Override
|
||||
public void run(@NotNull ProgressIndicator indicator) {
|
||||
_applyExpanded(tree, root, indicator);
|
||||
}
|
||||
@@ -325,9 +331,11 @@ public class TreeState implements JDOMExternalizable {
|
||||
|
||||
}
|
||||
|
||||
private TreeNode requestedExpand;
|
||||
|
||||
private boolean applyTo(final int positionInPath, final List<PathElement> path, final Object root, final TreeFacade tree, final ProgressIndicator indicator) {
|
||||
private static boolean applyTo(final int positionInPath,
|
||||
final List<PathElement> path,
|
||||
final Object root,
|
||||
final TreeFacade tree,
|
||||
final ProgressIndicator indicator) {
|
||||
if (!(root instanceof DefaultMutableTreeNode)) return false;
|
||||
|
||||
final DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)root;
|
||||
@@ -343,6 +351,7 @@ public class TreeState implements JDOMExternalizable {
|
||||
}
|
||||
|
||||
tree.expand(treeNode).doWhenDone(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
indicator.checkCanceled();
|
||||
|
||||
@@ -406,11 +415,13 @@ public class TreeState implements JDOMExternalizable {
|
||||
myTree = tree;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionCallback expand(DefaultMutableTreeNode node) {
|
||||
myTree.expandPath(new TreePath(node.getPath()));
|
||||
return new ActionCallback.Done();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionCallback getIntialized() {
|
||||
final WeakReference<ActionCallback> ref = (WeakReference<ActionCallback>)myTree.getClientProperty(CALLBACK);
|
||||
if (ref != null) {
|
||||
@@ -420,6 +431,7 @@ public class TreeState implements JDOMExternalizable {
|
||||
return new ActionCallback.Done();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batch(Progressive progressive) {
|
||||
progressive.run(new EmptyProgressIndicator());
|
||||
}
|
||||
@@ -433,14 +445,17 @@ public class TreeState implements JDOMExternalizable {
|
||||
myBuilder = builder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionCallback getIntialized() {
|
||||
return myBuilder.getReady(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batch(Progressive progressive) {
|
||||
myBuilder.batch(progressive);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionCallback expand(DefaultMutableTreeNode node) {
|
||||
final Object userObject = node.getUserObject();
|
||||
if (!(userObject instanceof NodeDescriptor)) return new ActionCallback.Rejected();
|
||||
@@ -452,6 +467,7 @@ public class TreeState implements JDOMExternalizable {
|
||||
final ActionCallback result = new ActionCallback();
|
||||
|
||||
myBuilder.expand(element, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
result.setDone();
|
||||
}
|
||||
|
||||
@@ -15,41 +15,30 @@
|
||||
*/
|
||||
package com.intellij.ide.util.treeView;
|
||||
|
||||
import com.intellij.openapi.util.ActiveRunnable;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.tree.DefaultMutableTreeNode;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class TreeUpdatePass {
|
||||
|
||||
private DefaultMutableTreeNode myNode;
|
||||
|
||||
private ActiveRunnable myBefore;
|
||||
private ActiveRunnable myAfter;
|
||||
private final DefaultMutableTreeNode myNode;
|
||||
|
||||
private long myUpdateStamp;
|
||||
private boolean myExpired;
|
||||
|
||||
private DefaultMutableTreeNode myCurrentNode;
|
||||
|
||||
private long myAllocation;
|
||||
private final long myAllocation;
|
||||
|
||||
private boolean myUpdateChildren = true;
|
||||
private boolean myUpdateStructure = true;
|
||||
private Set<NodeDescriptor> myUpdatedDescriptors = new HashSet<NodeDescriptor>();
|
||||
|
||||
public TreeUpdatePass(@NotNull final DefaultMutableTreeNode node, @Nullable final ActiveRunnable before, @Nullable final ActiveRunnable after) {
|
||||
myNode = node;
|
||||
myBefore = before;
|
||||
myAfter = after;
|
||||
myAllocation = System.currentTimeMillis();
|
||||
}
|
||||
private final Set<NodeDescriptor> myUpdatedDescriptors = new HashSet<NodeDescriptor>();
|
||||
|
||||
public TreeUpdatePass(@NotNull final DefaultMutableTreeNode node) {
|
||||
this(node, null, null);
|
||||
myNode = node;
|
||||
myAllocation = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public TreeUpdatePass setUpdateChildren(boolean updateChildren) {
|
||||
@@ -90,6 +79,7 @@ public class TreeUpdatePass {
|
||||
myCurrentNode = currentNode;
|
||||
}
|
||||
|
||||
@NonNls
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TreUpdatePass node=" + myNode + " structure=" + myUpdateStructure + " stamp=" + myUpdateStamp + " expired=" + myExpired + " currentNode=" + myCurrentNode + " allocation=" + myAllocation;
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
*/
|
||||
package com.intellij.ide.util.treeView;
|
||||
|
||||
public interface TreeVisitor<T> {
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
boolean visit(T node);
|
||||
|
||||
public interface TreeVisitor<T> {
|
||||
boolean visit(@NotNull T node);
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
@@ -32,7 +33,6 @@ public class UpdaterTreeState {
|
||||
private final AbstractTreeUi myUi;
|
||||
protected WeakHashMap<Object, Object> myToSelect = new WeakHashMap<Object, Object>();
|
||||
protected WeakHashMap<Object, Condition> myAdjustedSelection = new WeakHashMap<Object, Condition>();
|
||||
protected WeakHashMap<Object, Object> myDisposedElements = new WeakHashMap<Object, Object>();
|
||||
protected WeakHashMap<Object, Object> myToExpand = new WeakHashMap<Object, Object>();
|
||||
private int myProcessingCount;
|
||||
|
||||
@@ -169,8 +169,10 @@ public class UpdaterTreeState {
|
||||
final Set<Object> originallySelected = myUi.getSelectedElements();
|
||||
|
||||
myUi._select(toSelect, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
processUnsuccessfulSelections(toSelect, new Function<Object, Object>() {
|
||||
@Override
|
||||
public Object fun(final Object o) {
|
||||
if (myUi.getTree().isRootVisible() || !myUi.getTreeStructure().getRootElement().equals(o)) {
|
||||
addSelection(o);
|
||||
@@ -180,8 +182,10 @@ public class UpdaterTreeState {
|
||||
}, originallySelected);
|
||||
|
||||
processAjusted(adjusted, originallySelected).doWhenDone(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
myUi.expand(toExpand, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
myUi.clearUpdaterState();
|
||||
setProcessingNow(false);
|
||||
@@ -224,17 +228,17 @@ public class UpdaterTreeState {
|
||||
final Set<Object> selected = myUi.getSelectedElements();
|
||||
|
||||
boolean wasFullyRejected = false;
|
||||
if (toSelect.length > 0 && selected.size() > 0 && !originallySelected.containsAll(selected)) {
|
||||
if (toSelect.length > 0 && !selected.isEmpty() && !originallySelected.containsAll(selected)) {
|
||||
final Set<Object> successfulSelections = new HashSet<Object>();
|
||||
ContainerUtil.addAll(successfulSelections, toSelect);
|
||||
|
||||
successfulSelections.retainAll(selected);
|
||||
wasFullyRejected = successfulSelections.size() == 0;
|
||||
} else if (selected.size() == 0 && originallySelected.size() == 0) {
|
||||
wasFullyRejected = successfulSelections.isEmpty();
|
||||
} else if (selected.isEmpty() && originallySelected.isEmpty()) {
|
||||
wasFullyRejected = true;
|
||||
}
|
||||
|
||||
if (wasFullyRejected && selected.size() > 0) return;
|
||||
if (wasFullyRejected && !selected.isEmpty()) return;
|
||||
|
||||
for (Object eachToSelect : toSelect) {
|
||||
if (!selected.contains(eachToSelect)) {
|
||||
@@ -249,15 +253,15 @@ public class UpdaterTreeState {
|
||||
final Set<Object> allSelected = myUi.getSelectedElements();
|
||||
|
||||
Set<Object> toSelect = new HashSet<Object>();
|
||||
for (Object each : adjusted.keySet()) {
|
||||
if (adjusted.get(each).value(each)) continue;
|
||||
for (Map.Entry<Object, Condition> entry : adjusted.entrySet()) {
|
||||
if (entry.getValue().value(entry.getKey())) continue;
|
||||
|
||||
for (final Object eachSelected : allSelected) {
|
||||
if (isParentOrSame(each, eachSelected)) continue;
|
||||
toSelect.add(each);
|
||||
if (isParentOrSame(entry.getKey(), eachSelected)) continue;
|
||||
toSelect.add(entry.getKey());
|
||||
}
|
||||
if (allSelected.size() == 0) {
|
||||
toSelect.add(each);
|
||||
if (allSelected.isEmpty()) {
|
||||
toSelect.add(entry.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,9 +269,11 @@ public class UpdaterTreeState {
|
||||
|
||||
if (newSelection.length > 0) {
|
||||
myUi._select(newSelection, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final Set<Object> hangByParent = new HashSet<Object> ();
|
||||
processUnsuccessfulSelections(newSelection, new Function<Object, Object>() {
|
||||
@Override
|
||||
public Object fun(final Object o) {
|
||||
if (myUi.isInStructure(o) && !adjusted.get(o).value(o)) {
|
||||
hangByParent.add(o);
|
||||
@@ -289,14 +295,14 @@ public class UpdaterTreeState {
|
||||
}
|
||||
|
||||
private ActionCallback processHangByParent(Set<Object> elements) {
|
||||
if (elements.size() == 0) return new ActionCallback.Done();
|
||||
if (elements.isEmpty()) return new ActionCallback.Done();
|
||||
|
||||
ActionCallback result = new ActionCallback(elements.size());
|
||||
for (Iterator<Object> iterator = elements.iterator(); iterator.hasNext();) {
|
||||
Object hangElement = iterator.next();
|
||||
for (Object hangElement : elements) {
|
||||
if (!myAdjustmentCause2Adjustment.containsKey(hangElement)) {
|
||||
processHangByParent(hangElement).notify(result);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
result.setDone();
|
||||
}
|
||||
}
|
||||
@@ -318,6 +324,7 @@ public class UpdaterTreeState {
|
||||
callback.setDone();
|
||||
} else {
|
||||
myUi.select(nextElement, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
processNextHang(nextElement, callback);
|
||||
}
|
||||
@@ -356,9 +363,12 @@ public class UpdaterTreeState {
|
||||
}
|
||||
}
|
||||
|
||||
@NonNls
|
||||
@Override
|
||||
public String toString() {
|
||||
return "UpdaterState toSelect" + Arrays.asList(myToSelect) + " toExpand=" + Arrays.asList(myToExpand) + " processingNow=" + isProcessingNow() + " canRun=" + myCanRunRestore;
|
||||
return "UpdaterState toSelect" +
|
||||
myToSelect + " toExpand=" +
|
||||
myToExpand + " processingNow=" + isProcessingNow() + " canRun=" + myCanRunRestore;
|
||||
}
|
||||
|
||||
public void setProcessingNow(boolean processingNow) {
|
||||
|
||||
+3
@@ -41,14 +41,17 @@ public class ActionPresentationData implements ActionPresentation {
|
||||
myIcon = icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText() {
|
||||
return myText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return myDescription;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon getIcon() {
|
||||
return myIcon;
|
||||
}
|
||||
|
||||
@@ -45,8 +45,10 @@ public interface Sorter extends TreeAction {
|
||||
* The default sorter which sorts the tree nodes alphabetically.
|
||||
*/
|
||||
Sorter ALPHA_SORTER = new Sorter() {
|
||||
@Override
|
||||
public Comparator getComparator() {
|
||||
return new Comparator() {
|
||||
@Override
|
||||
public int compare(Object o1, Object o2) {
|
||||
String s1 = SorterUtil.getStringPresentation(o1);
|
||||
String s2 = SorterUtil.getStringPresentation(o2);
|
||||
@@ -55,6 +57,7 @@ public interface Sorter extends TreeAction {
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible() {
|
||||
return true;
|
||||
}
|
||||
@@ -63,6 +66,7 @@ public interface Sorter extends TreeAction {
|
||||
return getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public ActionPresentation getPresentation() {
|
||||
return new ActionPresentationData(IdeBundle.message("action.sort.alphabetically"),
|
||||
@@ -70,6 +74,7 @@ public interface Sorter extends TreeAction {
|
||||
AllIcons.ObjectBrowser.Sorted);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return ALPHA_SORTER_ID;
|
||||
|
||||
@@ -60,6 +60,8 @@ public interface BusyObject {
|
||||
protected void onReadyWasSent() {
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public final ActionCallback getReady(@NotNull Object requestor) {
|
||||
if (isReady()) {
|
||||
return new ActionCallback.Done();
|
||||
@@ -69,6 +71,7 @@ public interface BusyObject {
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private ActionCallback addReadyCallback(Object requestor) {
|
||||
synchronized (myReadyCallbacks) {
|
||||
ActionCallback cb = myReadyCallbacks.get(requestor);
|
||||
@@ -117,6 +120,7 @@ public interface BusyObject {
|
||||
myBusyCount.addAndGet(1);
|
||||
ActionCallback cb = runnable.run();
|
||||
cb.doWhenProcessed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
myBusyCount.addAndGet(-1);
|
||||
if (isReady()) {
|
||||
|
||||
@@ -28,6 +28,7 @@ import com.intellij.ui.TreeUIHelper;
|
||||
import com.intellij.util.ui.EmptyIcon;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import com.intellij.util.ui.tree.TreeUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
@@ -118,7 +119,7 @@ public class SimpleTree extends Tree implements CellEditorListener {
|
||||
|
||||
public boolean accept(AbstractTreeBuilder builder, final SimpleNodeVisitor visitor) {
|
||||
return builder.accept(SimpleNode.class, new TreeVisitor<SimpleNode>() {
|
||||
public boolean visit(SimpleNode node) {
|
||||
public boolean visit(@NotNull SimpleNode node) {
|
||||
return visitor.accept(node);
|
||||
}
|
||||
}) != null;
|
||||
@@ -479,7 +480,7 @@ public class SimpleTree extends Tree implements CellEditorListener {
|
||||
|
||||
public boolean select(AbstractTreeBuilder aBuilder, final SimpleNodeVisitor aVisitor, boolean shouldExpand) {
|
||||
return aBuilder.select(SimpleNode.class, new TreeVisitor<SimpleNode>() {
|
||||
public boolean visit(SimpleNode node) {
|
||||
public boolean visit(@NotNull SimpleNode node) {
|
||||
return aVisitor.accept(node);
|
||||
}
|
||||
}, null, false);
|
||||
|
||||
@@ -111,7 +111,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
|
||||
}
|
||||
|
||||
|
||||
protected Alarm createAlarm(Alarm.ThreadToUse thread, Disposable parent) {
|
||||
protected Alarm createAlarm(@NotNull Alarm.ThreadToUse thread, Disposable parent) {
|
||||
return new Alarm(thread, parent);
|
||||
}
|
||||
|
||||
|
||||
-2
@@ -21,7 +21,6 @@ import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.testFramework.PlatformTestUtil;
|
||||
import com.intellij.ui.SimpleTextAttributes;
|
||||
import com.intellij.ui.treeStructure.Tree;
|
||||
import com.intellij.util.Time;
|
||||
import com.intellij.util.WaitFor;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
import junit.framework.Assert;
|
||||
@@ -542,7 +541,6 @@ abstract class AbstractTreeBuilderTest extends BaseTreeTestCase<BaseTreeTestCase
|
||||
|
||||
initRootNode();
|
||||
|
||||
getUi().setJantorPollPeriod(Time.SECOND * 2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+7
-13
@@ -45,8 +45,8 @@ abstract class BaseTreeTestCase<StructureElement> extends FlyIdeaTestCase {
|
||||
Throwable myCancelRequest;
|
||||
boolean myReadyRequest;
|
||||
|
||||
private boolean myYieldingUiBuild;
|
||||
private boolean myBgStructureBuilding;
|
||||
private final boolean myYieldingUiBuild;
|
||||
private final boolean myBgStructureBuilding;
|
||||
protected Set<Object> myForegroundLoadingNodes = new HashSet<Object>();
|
||||
|
||||
private boolean myPassThroughMode;
|
||||
@@ -97,7 +97,7 @@ abstract class BaseTreeTestCase<StructureElement> extends FlyIdeaTestCase {
|
||||
boolean success = new WaitFor(60000) {
|
||||
@Override
|
||||
protected boolean condition() {
|
||||
final boolean[] ready = new boolean[]{false};
|
||||
final boolean[] ready = {false};
|
||||
invokeAndWaitIfNeeded(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -107,7 +107,7 @@ abstract class BaseTreeTestCase<StructureElement> extends FlyIdeaTestCase {
|
||||
return;
|
||||
}
|
||||
|
||||
ready[0] = (myCancelRequest != null || myReadyRequest) || (condition.value(null) && (ui.isReady()));
|
||||
ready[0] = myCancelRequest != null || myReadyRequest || condition.value(null) && ui.isReady();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -177,10 +177,6 @@ abstract class BaseTreeTestCase<StructureElement> extends FlyIdeaTestCase {
|
||||
super(tree, treeModel, treeStructure, comparator, updateIfInactive);
|
||||
}
|
||||
|
||||
public BaseTreeBuilder() {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected final boolean updateNodeDescriptor(NodeDescriptor descriptor) {
|
||||
checkThread(descriptor.getElement());
|
||||
@@ -188,16 +184,14 @@ abstract class BaseTreeTestCase<StructureElement> extends FlyIdeaTestCase {
|
||||
int delay = getNodeDescriptorUpdateDelay();
|
||||
if (delay > 0) {
|
||||
try {
|
||||
Thread.currentThread().sleep(delay);
|
||||
Thread.sleep(delay);
|
||||
}
|
||||
catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (getUi() == null) return false;
|
||||
|
||||
return super.updateNodeDescriptor(descriptor);
|
||||
return getUi() != null && super.updateNodeDescriptor(descriptor);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -446,7 +440,7 @@ abstract class BaseTreeTestCase<StructureElement> extends FlyIdeaTestCase {
|
||||
}, new Condition() {
|
||||
@Override
|
||||
public boolean value(Object o) {
|
||||
return done.get() || (canBeInterrupted && getBuilder().getUi().isCancelledReady());
|
||||
return done.get() || canBeInterrupted && getBuilder().getUi().isCancelledReady();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtilBase;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.ui.AutoScrollToSourceHandler;
|
||||
import org.jdom.Element;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
@@ -108,11 +108,13 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
myToolWindowManager = toolWindowManager;
|
||||
|
||||
final AbstractAction backAction = new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
myHistory.back();
|
||||
}
|
||||
};
|
||||
final AbstractAction fwdAction = new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent e) {
|
||||
myHistory.forward();
|
||||
}
|
||||
@@ -152,13 +154,11 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
private void processConfigurationElement() {
|
||||
if (myElement == null) return;
|
||||
|
||||
Element element;
|
||||
|
||||
element = myElement.getChild(ELEMENT_LEFTPANEL);
|
||||
Element element = myElement.getChild(ELEMENT_LEFTPANEL);
|
||||
if (element != null) {
|
||||
final PsiElement parentElement = readParentElement(element);
|
||||
if (parentElement != null) {
|
||||
myLeftPanel.getBuilder().enterElement(parentElement, PsiUtilBase.getVirtualFile(parentElement));
|
||||
myLeftPanel.getBuilder().enterElement(parentElement, PsiUtilCore.getVirtualFile(parentElement));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
if (element != null) {
|
||||
final PsiElement parentElement = readParentElement(element);
|
||||
if (parentElement != null) {
|
||||
myRightPanel.getBuilder().enterElement(parentElement, PsiUtilBase.getVirtualFile(parentElement));
|
||||
myRightPanel.getBuilder().enterElement(parentElement, PsiUtilCore.getVirtualFile(parentElement));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,7 +179,8 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
if (proportion >= 0 && proportion <= 1) {
|
||||
mySplitter.setProportion(proportion);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
}
|
||||
catch (NumberFormatException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -211,19 +212,23 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
|
||||
public void setupImpl() {
|
||||
mySelectionListener = new ListSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(final ListSelectionEvent e) {
|
||||
updateToolWindowTitle();
|
||||
}
|
||||
};
|
||||
myListDataListener = new ListDataListener() {
|
||||
@Override
|
||||
public void intervalAdded(final ListDataEvent e) {
|
||||
updateToolWindowTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void intervalRemoved(final ListDataEvent e) {
|
||||
updateToolWindowTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void contentsChanged(final ListDataEvent e) {
|
||||
updateToolWindowTitle();
|
||||
}
|
||||
@@ -232,12 +237,14 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
|
||||
myLeftPanel = createPanel();
|
||||
myLeftPanel.addHistoryListener(new CommanderHistoryListener() {
|
||||
@Override
|
||||
public void historyChanged(final PsiElement selectedElement, final boolean elementExpanded) {
|
||||
getCommandHistory().saveState(selectedElement, elementExpanded, true);
|
||||
}
|
||||
});
|
||||
myRightPanel = createPanel();
|
||||
myRightPanel.addHistoryListener(new CommanderHistoryListener() {
|
||||
@Override
|
||||
public void historyChanged(final PsiElement selectedElement, final boolean elementExpanded) {
|
||||
getCommandHistory().saveState(selectedElement, elementExpanded, false);
|
||||
}
|
||||
@@ -250,10 +257,12 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
add(mySplitter, BorderLayout.CENTER);
|
||||
|
||||
final AutoScrollToSourceHandler handler = new AutoScrollToSourceHandler() {
|
||||
@Override
|
||||
protected boolean isAutoScrollMode() {
|
||||
return myAutoScrollMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setAutoScrollMode(boolean state) {
|
||||
myAutoScrollMode = state;
|
||||
}
|
||||
@@ -277,10 +286,12 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
final DefaultActionGroup group = new DefaultActionGroup();
|
||||
|
||||
final AnAction backAction = new AnAction() {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
myHistory.back();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
super.update(e);
|
||||
e.getPresentation().setEnabled(myHistory.canGoBack());
|
||||
@@ -290,10 +301,12 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
group.add(backAction);
|
||||
|
||||
final AnAction forwardAction = new AnAction() {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
myHistory.forward();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
super.update(e);
|
||||
e.getPresentation().setEnabled(myHistory.canGoForward());
|
||||
@@ -312,6 +325,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
final CommanderPanel panel = new CommanderPanel(myProject, true, false);
|
||||
|
||||
panel.getList().addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(final KeyEvent e) {
|
||||
if (KeyEvent.VK_ESCAPE == e.getKeyCode()) {
|
||||
if (e.isConsumed()) return;
|
||||
@@ -331,6 +345,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
panel.setProjectTreeStructure(treeStructure);
|
||||
|
||||
final FocusAdapter focusListener = new FocusAdapter() {
|
||||
@Override
|
||||
public void focusGained(final FocusEvent e) {
|
||||
updateToolWindowTitle(panel);
|
||||
}
|
||||
@@ -341,6 +356,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
list.getModel().addListDataListener(myListDataListener);
|
||||
|
||||
Disposer.register(this, new Disposable() {
|
||||
@Override
|
||||
public void dispose() {
|
||||
list.removeFocusListener(focusListener);
|
||||
list.getSelectionModel().removeListSelectionListener(mySelectionListener);
|
||||
@@ -352,26 +368,32 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
|
||||
protected AbstractProjectTreeStructure createProjectTreeStructure() {
|
||||
return new AbstractProjectTreeStructure(myProject) {
|
||||
@Override
|
||||
public boolean isShowMembers() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHideEmptyMiddlePackages() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFlattenPackages() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAbbreviatePackageNames() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowLibraryContents() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowModules() {
|
||||
return false;
|
||||
}
|
||||
@@ -427,13 +449,8 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
}
|
||||
|
||||
public void enterElementInActivePanel(final PsiElement element) {
|
||||
final CommanderPanel activePanel;
|
||||
if (isLeftPanelActive()) {
|
||||
activePanel = myLeftPanel;
|
||||
} else {
|
||||
activePanel = myRightPanel;
|
||||
}
|
||||
activePanel.getBuilder().enterElement(element, PsiUtilBase.getVirtualFile(element));
|
||||
final CommanderPanel activePanel = isLeftPanelActive() ? myLeftPanel : myRightPanel;
|
||||
activePanel.getBuilder().enterElement(element, PsiUtilCore.getVirtualFile(element));
|
||||
}
|
||||
|
||||
public void swapPanels() {
|
||||
@@ -466,6 +483,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
return !isLeftPanelActive() ? myLeftPanel : myRightPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getData(final String dataId) {
|
||||
if (PlatformDataKeys.HELP_ID.is(dataId)) {
|
||||
return HelpID.COMMANDER;
|
||||
@@ -477,7 +495,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
final AbstractTreeNode parentElement = getInactivePanel().getBuilder().getParentNode();
|
||||
if (parentElement == null) return null;
|
||||
final Object element = parentElement.getValue();
|
||||
return (element instanceof PsiElement) && ((PsiElement)element).isValid()? element : null;
|
||||
return element instanceof PsiElement && ((PsiElement)element).isValid()? element : null;
|
||||
}
|
||||
else if (CompareFiles.DIFF_REQUEST.is(dataId)) {
|
||||
PsiElement primary = getActivePanel().getSelectedElement();
|
||||
@@ -495,6 +513,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Element getState() {
|
||||
Element element = new Element("commander");
|
||||
if (myLeftPanel == null || myRightPanel == null) {
|
||||
@@ -543,6 +562,7 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadState(Element state) {
|
||||
myElement = state;
|
||||
processConfigurationElement();
|
||||
@@ -554,13 +574,15 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
final String url = element.getAttributeValue(ATTRIBUTE_URL);
|
||||
final VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(url);
|
||||
return file != null ? PsiManager.getInstance(myProject).findDirectory(file) : null;
|
||||
} else if (element.getAttributeValue(ATTRIBUTE_CLASS) != null) {
|
||||
}
|
||||
if (element.getAttributeValue(ATTRIBUTE_CLASS) != null) {
|
||||
final String className = element.getAttributeValue(ATTRIBUTE_CLASS);
|
||||
return className != null ? JavaPsiFacade.getInstance(myProject).findClass(className, GlobalSearchScope.allScope(myProject)) : null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
if (myLeftPanel == null) {
|
||||
// not opened project (default?)
|
||||
@@ -580,9 +602,10 @@ public class Commander extends JPanel implements PersistentStateComponent<Elemen
|
||||
return myLeftPanel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void selectElement(PsiElement element, boolean selectInActivePanel) {
|
||||
CommanderPanel panel = selectInActivePanel ? getActivePanel() : getInactivePanel();
|
||||
panel.getBuilder().selectElement(element, PsiUtilBase.getVirtualFile(element));
|
||||
panel.getBuilder().selectElement(element, PsiUtilCore.getVirtualFile(element));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user