This commit is contained in:
Alexey Kudravtsev
2012-08-28 12:55:26 +04:00
parent 952768ce2e
commit e0469f86aa
72 changed files with 862 additions and 417 deletions
@@ -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();
@@ -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();
@@ -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());
@@ -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);
@@ -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);
@@ -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);
@@ -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);
}
}
@@ -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);
@@ -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());
@@ -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;
@@ -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;
@@ -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();
}
@@ -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();
@@ -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);
@@ -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());
}
@@ -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());
}
@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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());
}
@@ -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;
@@ -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());
@@ -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();
}
@@ -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;
}
}
}
@@ -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) {
@@ -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);
}
@@ -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);
}
@@ -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));
}
}