diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/openapi')
13 files changed, 228 insertions, 318 deletions
diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectAllOccurrencesAction.java b/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectAllOccurrencesAction.java index 3e284ff6b2cc..ae2a4dc0d53c 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectAllOccurrencesAction.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectAllOccurrencesAction.java @@ -42,8 +42,6 @@ public class SelectAllOccurrencesAction extends EditorAction { @Override public void doExecute(final Editor editor, @Nullable Caret c, DataContext dataContext) { - if (executeEquivalentFindPanelAction(editor, dataContext)) return; - Caret caret = c == null ? editor.getCaretModel().getPrimaryCaret() : c; boolean wholeWordsSearch = false; @@ -88,10 +86,5 @@ public class SelectAllOccurrencesAction extends EditorAction { }, caretShiftFromSelectionStart); editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); } - - @Override - protected EditorHeaderAction getEquivalentFindPanelAction(EditorSearchComponent searchComponent) { - return new SelectAllAction(searchComponent); - } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectNextOccurrenceAction.java b/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectNextOccurrenceAction.java index 7d3c408ee152..74390f15b149 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectNextOccurrenceAction.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectNextOccurrenceAction.java @@ -40,8 +40,6 @@ public class SelectNextOccurrenceAction extends EditorAction { @Override public void doExecute(Editor editor, @Nullable Caret c, DataContext dataContext) { - if (executeEquivalentFindPanelAction(editor, dataContext)) return; - Caret caret = c == null ? editor.getCaretModel().getPrimaryCaret() : c; TextRange wordSelectionRange = getSelectionRange(editor, caret); boolean notFoundPreviously = getAndResetNotFoundStatus(editor); @@ -56,7 +54,7 @@ public class SelectNextOccurrenceAction extends EditorAction { FindModel model = getFindModel(selectedText, wholeWordSearch); - findManager.setFindWasPerformed(); + findManager.setSelectNextOccurrenceWasPerformed(); findManager.setFindNextModel(model); int searchStartOffset = notFoundPreviously ? 0 : caret.getSelectionEnd(); @@ -84,10 +82,5 @@ public class SelectNextOccurrenceAction extends EditorAction { } editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); } - - @Override - protected EditorHeaderAction getEquivalentFindPanelAction(EditorSearchComponent searchComponent) { - return new AddOccurrenceAction(searchComponent); - } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectOccurrencesActionHandler.java b/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectOccurrencesActionHandler.java index 7b189281dfd0..1858ef53b3f5 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectOccurrencesActionHandler.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/actions/SelectOccurrencesActionHandler.java @@ -107,25 +107,4 @@ abstract public class SelectOccurrencesActionHandler extends EditorActionHandler model.setWholeWordsOnly(wholeWords); return model; } - - protected boolean executeEquivalentFindPanelAction(Editor editor, DataContext context) { - if (editor.getHeaderComponent() instanceof EditorSearchComponent) { - EditorSearchComponent searchComponent = (EditorSearchComponent)editor.getHeaderComponent(); - EditorHeaderAction action = getEquivalentFindPanelAction(searchComponent); - if (action != null) { - Presentation presentation = new Presentation(); - AnActionEvent event = new AnActionEvent(null, context, ActionPlaces.MAIN_MENU, presentation, ActionManager.getInstance(), 0); - action.update(event); - if (presentation.isEnabled()) { - action.actionPerformed(event); - return true; - } - } - } - return false; - } - - protected EditorHeaderAction getEquivalentFindPanelAction(EditorSearchComponent searchComponent) { - return null; - } } diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/actions/UnselectPreviousOccurrenceAction.java b/platform/lang-impl/src/com/intellij/openapi/editor/actions/UnselectPreviousOccurrenceAction.java index fffff56b12dc..a5657ff89b27 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/actions/UnselectPreviousOccurrenceAction.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/actions/UnselectPreviousOccurrenceAction.java @@ -15,9 +15,6 @@ */ package com.intellij.openapi.editor.actions; -import com.intellij.find.EditorSearchComponent; -import com.intellij.find.editorHeaderActions.EditorHeaderAction; -import com.intellij.find.editorHeaderActions.RemoveOccurrenceAction; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; @@ -38,8 +35,6 @@ public class UnselectPreviousOccurrenceAction extends EditorAction { @Override public void doExecute(Editor editor, @Nullable Caret caret, DataContext dataContext) { - if (executeEquivalentFindPanelAction(editor, dataContext)) return; - if (editor.getCaretModel().getCaretCount() > 1) { editor.getCaretModel().removeCaret(editor.getCaretModel().getPrimaryCaret()); } @@ -49,10 +44,5 @@ public class UnselectPreviousOccurrenceAction extends EditorAction { getAndResetNotFoundStatus(editor); editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); } - - @Override - protected EditorHeaderAction getEquivalentFindPanelAction(EditorSearchComponent searchComponent) { - return new RemoveOccurrenceAction(searchComponent); - } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/FontMapper.java b/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/FontMapper.java index 4fec39342090..c5fd5592b634 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/FontMapper.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/FontMapper.java @@ -16,10 +16,10 @@ package com.intellij.openapi.editor.richcopy; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.ReflectionUtil; import org.jetbrains.annotations.NotNull; import java.awt.*; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Locale; @@ -46,20 +46,18 @@ public class FontMapper { } Method findFontMethod = Class.forName("sun.font.FontManager").getMethod("findFont2D", String.class, int.class, int.class); for (String logicalFont : logicalFontsToMap) { - String physicalFont = null; Object font2D = findFontMethod.invoke(fontManager, logicalFont, Font.PLAIN, 0); if (font2D == null) { continue; } String fontClassName = font2D.getClass().getName(); + String physicalFont = null; if ("sun.font.CompositeFont".equals(fontClassName)) { // Windows and Linux case Object physicalFontObject = Class.forName("sun.font.CompositeFont").getMethod("getSlotFont", int.class).invoke(font2D, 0); physicalFont = (String)Class.forName("sun.font.Font2D").getMethod("getFamilyName", Locale.class).invoke(physicalFontObject, Locale.getDefault()); } else if ("sun.font.CFont".equals(fontClassName)) { // MacOS case - Field field = Class.forName("sun.font.CFont").getDeclaredField("nativeFontName"); - field.setAccessible(true); - physicalFont = (String)field.get(font2D); + physicalFont = ReflectionUtil.getField(Class.forName("sun.font.CFont"), font2D, String.class, "nativeFontName"); } if (physicalFont != null) { logicalToPhysicalMapping.put(logicalFont, physicalFont); diff --git a/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/TextWithMarkupProcessor.java b/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/TextWithMarkupProcessor.java index 54406106b976..504496a27716 100644 --- a/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/TextWithMarkupProcessor.java +++ b/platform/lang-impl/src/com/intellij/openapi/editor/richcopy/TextWithMarkupProcessor.java @@ -23,6 +23,7 @@ import com.intellij.ide.highlighter.HighlighterFactory; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.FontPreferences; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.ex.DisposableIterator; import com.intellij.openapi.editor.ex.MarkupModelEx; @@ -418,7 +419,7 @@ public class TextWithMarkupProcessor extends CopyPastePostProcessor<RawTextWithM private MarkupIterator(@NotNull CharSequence charSequence, @NotNull RangeIterator rangeIterator, @NotNull EditorColorsScheme colorsScheme) { myRangeIterator = rangeIterator; - mySegmentIterator = new SegmentIterator(charSequence, colorsScheme.getEditorFontName(), colorsScheme.getEditorFontSize()); + mySegmentIterator = new SegmentIterator(charSequence, colorsScheme.getFontPreferences()); } public boolean atEnd() { @@ -812,8 +813,7 @@ public class TextWithMarkupProcessor extends CopyPastePostProcessor<RawTextWithM private static class SegmentIterator { private final CharSequence myCharSequence; - private final String myDefaultFontFamilyName; - private final int myFontSize; + private final FontPreferences myFontPreferences; private int myCurrentStartOffset; private int myCurrentOffset; @@ -822,10 +822,9 @@ public class TextWithMarkupProcessor extends CopyPastePostProcessor<RawTextWithM private String myCurrentFontFamilyName; private String myNextFontFamilyName; - private SegmentIterator(CharSequence charSequence, String defaultFontFamilyName, int fontSize) { + private SegmentIterator(CharSequence charSequence, FontPreferences fontPreferences) { myCharSequence = charSequence; - myDefaultFontFamilyName = defaultFontFamilyName; - myFontSize = fontSize; + myFontPreferences = fontPreferences; } public void reset(int startOffset, int endOffset, int fontStyle) { @@ -843,9 +842,8 @@ public class TextWithMarkupProcessor extends CopyPastePostProcessor<RawTextWithM myCurrentStartOffset = myCurrentOffset; for (; myCurrentOffset < myEndOffset; myCurrentOffset++) { FontInfo fontInfo = ComplementaryFontsRegistry.getFontAbleToDisplay(myCharSequence.charAt(myCurrentOffset), - myFontSize, myFontStyle, - myDefaultFontFamilyName); + myFontPreferences); String fontFamilyName = fontInfo.getFont().getFamily(); if (myCurrentFontFamilyName == null) { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java index b1385686bc3a..09e489b3d1df 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java @@ -25,15 +25,14 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModuleRootAdapter; -import com.intellij.openapi.roots.ModuleRootEvent; -import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.*; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.newvfs.BulkFileListener; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.events.VFileEvent; +import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; import com.intellij.util.containers.ConcurrentIntObjectMap; import com.intellij.util.containers.StripedLockIntObjectConcurrentHashMap; @@ -43,6 +42,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import org.jetbrains.jps.model.module.JpsModuleSourceRootType; +import java.util.Arrays; +import java.util.Collections; import java.util.List; public class DirectoryIndexImpl extends DirectoryIndex { @@ -68,7 +69,7 @@ public class DirectoryIndexImpl extends DirectoryIndex { }); } - private void subscribeToFileChanges() { + protected void subscribeToFileChanges() { myConnection.subscribe(FileTypeManager.TOPIC, new FileTypeListener.Adapter() { @Override public void fileTypesChanged(@NotNull FileTypeEvent event) { @@ -98,7 +99,7 @@ public class DirectoryIndexImpl extends DirectoryIndex { }); } - private void markContentRootsForRefresh() { + protected void markContentRootsForRefresh() { Module[] modules = ModuleManager.getInstance(myProject).getModules(); for (Module module : modules) { VirtualFile[] contentRoots = ModuleRootManager.getInstance(module).getContentRoots(); @@ -110,7 +111,7 @@ public class DirectoryIndexImpl extends DirectoryIndex { } } - private void dispatchPendingEvents() { + protected void dispatchPendingEvents() { myConnection.deliverImmediately(); } @@ -124,24 +125,27 @@ public class DirectoryIndexImpl extends DirectoryIndex { private RootIndex getRootIndex() { RootIndex rootIndex = myRootIndex; if (rootIndex == null) { - myRootIndex = rootIndex = new RootIndex(myProject, new RootIndex.InfoCache() { - // Upsource can't use int-mapping because different files may have the same id there - private final ConcurrentIntObjectMap<DirectoryInfo> myInfoCache = new StripedLockIntObjectConcurrentHashMap<DirectoryInfo>(); - @Override - public void cacheInfo(@NotNull VirtualFile dir, @NotNull DirectoryInfo info) { - myInfoCache.put(((NewVirtualFile)dir).getId(), info); - } - - @Override - public DirectoryInfo getCachedInfo(@NotNull VirtualFile dir) { - return myInfoCache.get(((NewVirtualFile)dir).getId()); - } - }); + myRootIndex = rootIndex = new RootIndex(myProject, createRootInfoCache()); } return rootIndex; } - @Override + protected RootIndex.InfoCache createRootInfoCache() { + return new RootIndex.InfoCache() { + // Upsource can't use int-mapping because different files may have the same id there + private final ConcurrentIntObjectMap<DirectoryInfo> myInfoCache = new StripedLockIntObjectConcurrentHashMap<DirectoryInfo>(); + @Override + public void cacheInfo(@NotNull VirtualFile dir, @NotNull DirectoryInfo info) { + myInfoCache.put(((NewVirtualFile)dir).getId(), info); + } + + @Override + public DirectoryInfo getCachedInfo(@NotNull VirtualFile dir) { + return myInfoCache.get(((NewVirtualFile)dir).getId()); + } + }; + } + @TestOnly public void checkConsistency() { getRootIndex().checkConsistency(); @@ -181,6 +185,21 @@ public class DirectoryIndexImpl extends DirectoryIndex { return getRootIndex().getPackageName(dir); } + @NotNull + @Override + public OrderEntry[] getOrderEntries(@NotNull DirectoryInfo info) { + checkAvailability(); + return getRootIndex().getOrderEntries(info); + } + + @TestOnly + void assertConsistency(DirectoryInfo info) { + OrderEntry[] entries = getOrderEntries(info); + for (int i = 1; i < entries.length; i++) { + assert RootIndex.BY_OWNER_MODULE.compare(entries[i - 1], entries[i]) <= 0; + } + } + private void checkAvailability() { if (myDisposed) { ProgressManager.checkCanceled(); @@ -188,4 +207,95 @@ public class DirectoryIndexImpl extends DirectoryIndex { } } + @NotNull + private static OrderEntry createFakeOrderEntry(@NotNull final Module ownerModule) { + return new OrderEntry() { + @NotNull + @Override + public VirtualFile[] getFiles(OrderRootType type) { + throw new IncorrectOperationException(); + } + + @NotNull + @Override + public String[] getUrls(OrderRootType rootType) { + throw new IncorrectOperationException(); + } + + @NotNull + @Override + public String getPresentableName() { + throw new IncorrectOperationException(); + } + + @Override + public boolean isValid() { + throw new IncorrectOperationException(); + } + + @NotNull + @Override + public Module getOwnerModule() { + return ownerModule; + } + + @Override + public <R> R accept(RootPolicy<R> policy, @Nullable R initialValue) { + throw new IncorrectOperationException(); + } + + @Override + public int compareTo(@NotNull OrderEntry o) { + throw new IncorrectOperationException(); + } + + @Override + public boolean isSynthetic() { + throw new IncorrectOperationException(); + } + }; + } + + @Override + @Nullable + OrderEntry findOrderEntryWithOwnerModule(@NotNull DirectoryInfo info, @NotNull Module ownerModule) { + OrderEntry[] entries = getOrderEntries(info); + if (entries.length < 10) { + for (OrderEntry entry : entries) { + if (entry.getOwnerModule() == ownerModule) return entry; + } + return null; + } + int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), RootIndex.BY_OWNER_MODULE); + return index < 0 ? null : entries[index]; + } + + @Override + @NotNull + List<OrderEntry> findAllOrderEntriesWithOwnerModule(@NotNull DirectoryInfo info, @NotNull Module ownerModule) { + OrderEntry[] entries = getOrderEntries(info); + if (entries.length == 0) return Collections.emptyList(); + + if (entries.length == 1) { + OrderEntry entry = entries[0]; + return entry.getOwnerModule() == ownerModule ? Arrays.asList(entries) : Collections.<OrderEntry>emptyList(); + } + int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), RootIndex.BY_OWNER_MODULE); + if (index < 0) { + return Collections.emptyList(); + } + int firstIndex = index; + while (firstIndex - 1 >= 0 && entries[firstIndex - 1].getOwnerModule() == ownerModule) { + firstIndex--; + } + int lastIndex = index + 1; + while (lastIndex < entries.length && entries[lastIndex].getOwnerModule() == ownerModule) { + lastIndex++; + } + + OrderEntry[] subArray = new OrderEntry[lastIndex - firstIndex]; + System.arraycopy(entries, firstIndex, subArray, 0, lastIndex - firstIndex); + + return Arrays.asList(subArray); + } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java index 932204c6dbd3..4ba8b7b03a8d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java @@ -72,10 +72,8 @@ public class ProjectRootManagerComponent extends ProjectRootManagerImpl { private Set<LocalFileSystem.WatchRequest> myRootsToWatch = new THashSet<LocalFileSystem.WatchRequest>(); private final boolean myDoLogCachesUpdate; - public ProjectRootManagerComponent(Project project, - DirectoryIndex directoryIndex, - StartupManager startupManager) { - super(project, directoryIndex); + public ProjectRootManagerComponent(Project project, StartupManager startupManager) { + super(project); myConnection = project.getMessageBus().connect(project); myConnection.subscribe(FileTypeManager.TOPIC, new FileTypeListener() { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/CheckboxTreeTable.java b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/CheckboxTreeTable.java deleted file mode 100644 index dd72da957fa2..000000000000 --- a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/CheckboxTreeTable.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.openapi.roots.libraries.ui.impl; - -import com.intellij.ui.CheckboxTree; -import com.intellij.ui.CheckedTreeNode; -import com.intellij.ui.ClickListener; -import com.intellij.ui.dualView.TreeTableView; -import com.intellij.ui.treeStructure.treetable.ListTreeTableModelOnColumns; -import com.intellij.ui.treeStructure.treetable.TreeTableTree; -import com.intellij.util.ui.ColumnInfo; -import com.intellij.util.ui.tree.TreeUtil; -import org.jetbrains.annotations.NotNull; - -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeModel; -import javax.swing.tree.TreeNode; -import javax.swing.tree.TreePath; -import java.awt.*; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Enumeration; - -/** - * @author nik - */ -public class CheckboxTreeTable extends TreeTableView { - public CheckboxTreeTable(CheckedTreeNode root, CheckboxTree.CheckboxTreeCellRenderer renderer, final ColumnInfo[] columns) { - super(new ListTreeTableModelOnColumns(root, columns)); - initTree(getTree(), renderer); - } - - //todo[nik] I hate to copy-paste but have to copy the code below from CheckboxTreeBase to support CheckboxTree inside TreeTable in IDEA 11.1.x branch - //todo[nik] I solemnly swear to get rid of this code in IDEA 12 branch - private void initTree(final TreeTableTree tree, final CheckboxTree.CheckboxTreeCellRenderer cellRenderer) { - tree.setCellRenderer(cellRenderer); - tree.setRootVisible(false); - tree.setShowsRootHandles(true); - tree.setLineStyleAngled(); - TreeUtil.installActions(tree); - - new ClickListener() { - @Override - public boolean onClick(@NotNull MouseEvent e, int clickCount) { - int row = tree.getRowForLocation(e.getX(), e.getY()); - if (row < 0) return false; - final Object o = tree.getPathForRow(row).getLastPathComponent(); - if (!(o instanceof CheckedTreeNode)) return false; - Rectangle rowBounds = tree.getRowBounds(row); - cellRenderer.setBounds(rowBounds); - Rectangle checkBounds = cellRenderer.myCheckbox.getBounds(); - checkBounds.setLocation(rowBounds.getLocation()); - - if (checkBounds.height == 0) checkBounds.height = rowBounds.height; - - final CheckedTreeNode node = (CheckedTreeNode)o; - if (checkBounds.contains(e.getPoint())) { - if (node.isEnabled()) { - toggleNode(node); - tree.setSelectionRow(row); - return true; - } - } - - return false; - } - }.installOn(this); - - addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - if (isToggleEvent(e)) { - TreePath treePath = tree.getLeadSelectionPath(); - if (treePath == null) return; - final Object o = treePath.getLastPathComponent(); - if (!(o instanceof CheckedTreeNode)) return; - CheckedTreeNode firstNode = (CheckedTreeNode)o; - boolean checked = toggleNode(firstNode); - - TreePath[] selectionPaths = tree.getSelectionPaths(); - for (int i = 0; selectionPaths != null && i < selectionPaths.length; i++) { - final TreePath selectionPath = selectionPaths[i]; - final Object o1 = selectionPath.getLastPathComponent(); - if (!(o1 instanceof CheckedTreeNode)) continue; - CheckedTreeNode node = (CheckedTreeNode)o1; - checkNode(node, checked); - ((DefaultTreeModel)tree.getModel()).nodeChanged(node); - } - - e.consume(); - } - } - }); - - tree.setSelectionRow(0); - } - - private static boolean isToggleEvent(KeyEvent e) { - return e.getKeyCode() == KeyEvent.VK_SPACE; - } - - protected boolean toggleNode(CheckedTreeNode node) { - boolean checked = !node.isChecked(); - checkNode(node, checked); - - // notify model listeners about model change - final TreeModel model = getTree().getModel(); - model.valueForPathChanged(new TreePath(node.getPath()), node.getUserObject()); - - return checked; - } - - private void checkNode(CheckedTreeNode node, boolean checked) { - adjustParentsAndChildren(node, checked); - repaint(); - } - - private void adjustParentsAndChildren(final CheckedTreeNode node, final boolean checked) { - changeNodeState(node, checked); - if (!checked) { - TreeNode parent = node.getParent(); - while (parent != null) { - if (parent instanceof CheckedTreeNode) { - changeNodeState((CheckedTreeNode)parent, false); - } - parent = parent.getParent(); - } - uncheckChildren(node); - } - else { - checkChildren(node); - } - repaint(); - } - - private static void changeNodeState(final CheckedTreeNode node, final boolean checked) { - if (node.isChecked() != checked) { - node.setChecked(checked); - } - } - - private static void uncheckChildren(final CheckedTreeNode node) { - final Enumeration children = node.children(); - while (children.hasMoreElements()) { - final Object o = children.nextElement(); - if (!(o instanceof CheckedTreeNode)) continue; - CheckedTreeNode child = (CheckedTreeNode)o; - changeNodeState(child, false); - uncheckChildren(child); - } - } - - private static void checkChildren(final CheckedTreeNode node) { - final Enumeration children = node.children(); - while (children.hasMoreElements()) { - final Object o = children.nextElement(); - if (!(o instanceof CheckedTreeNode)) continue; - CheckedTreeNode child = (CheckedTreeNode)o; - changeNodeState(child, true); - checkChildren(child); - } - } - - @SuppressWarnings("unchecked") - public <T> T[] getCheckedNodes(final Class<T> nodeType) { - final ArrayList<T> nodes = new ArrayList<T>(); - final Object root = getTree().getModel().getRoot(); - if (!(root instanceof CheckedTreeNode)) { - throw new IllegalStateException("The root must be instance of the " + CheckedTreeNode.class.getName() + ": " + root.getClass().getName()); - } - new Object() { - @SuppressWarnings("unchecked") - public void collect(CheckedTreeNode node) { - if (node.isLeaf()) { - Object userObject = node.getUserObject(); - if (node.isChecked() && userObject != null && nodeType.isAssignableFrom(userObject.getClass())) { - final T value = (T)userObject; - nodes.add(value); - } - } - else { - for (int i = 0; i < node.getChildCount(); i++) { - final TreeNode child = node.getChildAt(i); - if (child instanceof CheckedTreeNode) { - collect((CheckedTreeNode)child); - } - } - } - } - }.collect((CheckedTreeNode)root); - T[] result = (T[])Array.newInstance(nodeType, nodes.size()); - nodes.toArray(result); - return result; - } -} diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/DetectedRootsChooserDialog.java b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/DetectedRootsChooserDialog.java index ee44bdf2f08b..bf3d383aeebb 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/DetectedRootsChooserDialog.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/DetectedRootsChooserDialog.java @@ -26,11 +26,13 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.*; import com.intellij.ui.treeStructure.treetable.TreeColumnInfo; import com.intellij.util.PlatformIcons; +import com.intellij.util.containers.Convertor; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ComboBoxCellEditor; import com.intellij.util.ui.tree.TreeUtil; import com.intellij.xml.util.XmlStringUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -38,12 +40,11 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; +import javax.swing.tree.TreePath; import java.awt.*; import java.io.File; -import java.util.Arrays; -import java.util.HashMap; +import java.util.*; import java.util.List; -import java.util.Map; /** * This dialog allows selecting paths inside selected archives or directories. @@ -108,17 +109,17 @@ public class DetectedRootsChooserDialog extends DialogWrapper { private JScrollPane myPane; private String myDescription; - public DetectedRootsChooserDialog(Component component, List<SuggestedChildRootInfo> suggestedRoots) { + public DetectedRootsChooserDialog(Component component, Collection<SuggestedChildRootInfo> suggestedRoots) { super(component, true); init(suggestedRoots); } - public DetectedRootsChooserDialog(Project project, List<SuggestedChildRootInfo> suggestedRoots) { + public DetectedRootsChooserDialog(Project project, Collection<SuggestedChildRootInfo> suggestedRoots) { super(project, true); init(suggestedRoots); } - private void init(List<SuggestedChildRootInfo> suggestedRoots) { + private void init(Collection<SuggestedChildRootInfo> suggestedRoots) { myDescription = XmlStringUtil.wrapInHtml(ApplicationNamesInfo.getInstance().getFullProductName() + " just scanned files and detected the following " + StringUtil.pluralize("root", suggestedRoots.size()) + ".<br>" + "Select items in the tree below or press Cancel to cancel operation."); @@ -128,7 +129,7 @@ public class DetectedRootsChooserDialog extends DialogWrapper { init(); } - private static CheckboxTreeTable createTreeTable(List<SuggestedChildRootInfo> suggestedRoots) { + private static CheckboxTreeTable createTreeTable(Collection<SuggestedChildRootInfo> suggestedRoots) { final CheckedTreeNode root = createRoot(suggestedRoots); CheckboxTreeTable treeTable = new CheckboxTreeTable(root, new CheckboxTree.CheckboxTreeCellRenderer(true) { @Override @@ -189,14 +190,30 @@ public class DetectedRootsChooserDialog extends DialogWrapper { column.setPreferredWidth(width); column.setMaxWidth(width); treeTable.setRootVisible(false); + new TreeTableSpeedSearch(treeTable, new Convertor<TreePath, String>() { + @Override + public String convert(TreePath o) { + Object node = o.getLastPathComponent(); + if (!(node instanceof VirtualFileCheckedTreeNode)) return ""; + return ((VirtualFileCheckedTreeNode)node).getFile().getPresentableUrl(); + } + }); TreeUtil.expandAll(treeTable.getTree()); return treeTable; } - private static CheckedTreeNode createRoot(List<SuggestedChildRootInfo> suggestedRoots) { + private static CheckedTreeNode createRoot(Collection<SuggestedChildRootInfo> suggestedRoots) { + SuggestedChildRootInfo[] sortedRoots = suggestedRoots.toArray(new SuggestedChildRootInfo[suggestedRoots.size()]); + Arrays.sort(sortedRoots, new Comparator<SuggestedChildRootInfo>() { + @Override + public int compare(@NotNull SuggestedChildRootInfo o1, @NotNull SuggestedChildRootInfo o2) { + return o1.getDetectedRoot().getFile().getPresentableUrl().compareTo(o2.getDetectedRoot().getFile().getPresentableUrl()); + } + }); + CheckedTreeNode root = new CheckedTreeNode(null); Map<VirtualFile, CheckedTreeNode> rootCandidateNodes = new HashMap<VirtualFile, CheckedTreeNode>(); - for (SuggestedChildRootInfo rootInfo : suggestedRoots) { + for (SuggestedChildRootInfo rootInfo : sortedRoots) { final VirtualFile rootCandidate = rootInfo.getRootCandidate(); CheckedTreeNode parent = rootCandidateNodes.get(rootCandidate); if (parent == null) { @@ -230,6 +247,12 @@ public class DetectedRootsChooserDialog extends DialogWrapper { return "DetectedRootsChooserDialog"; } + @Nullable + @Override + public JComponent getPreferredFocusedComponent() { + return myTreeTable; + } + private static class VirtualFileCheckedTreeNode extends CheckedTreeNode { private final VirtualFile myFile; diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/SuggestedChildRootInfo.java b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/SuggestedChildRootInfo.java index 743e408b8c97..725216600ffa 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/SuggestedChildRootInfo.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/SuggestedChildRootInfo.java @@ -19,6 +19,7 @@ import com.intellij.openapi.roots.libraries.LibraryRootType; import com.intellij.openapi.roots.libraries.ui.DetectedLibraryRoot; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.Map; @@ -32,17 +33,19 @@ class SuggestedChildRootInfo { private final Map<LibraryRootType, String> myRootTypeNames; private LibraryRootType mySelectedRootType; - SuggestedChildRootInfo(VirtualFile rootCandidate, DetectedLibraryRoot detectedRoot, Map<LibraryRootType, String> rootTypeNames) { + SuggestedChildRootInfo(@NotNull VirtualFile rootCandidate, @NotNull DetectedLibraryRoot detectedRoot, @NotNull Map<LibraryRootType, String> rootTypeNames) { myRootCandidate = rootCandidate; myDetectedRoot = detectedRoot; myRootTypeNames = rootTypeNames; mySelectedRootType = detectedRoot.getTypes().get(0); } + @NotNull public VirtualFile getRootCandidate() { return myRootCandidate; } + @NotNull public DetectedLibraryRoot getDetectedRoot() { return myDetectedRoot; } @@ -51,6 +54,7 @@ class SuggestedChildRootInfo { return myRootTypeNames.get(type); } + @NotNull public LibraryRootType getSelectedRootType() { return mySelectedRootType; } @@ -64,6 +68,7 @@ class SuggestedChildRootInfo { } } + @NotNull public String[] getRootTypeNames() { final String[] types = ArrayUtil.toStringArray(myRootTypeNames.values()); Arrays.sort(types, String.CASE_INSENSITIVE_ORDER); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java index 72f9c5a965c0..04f908a17c00 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,12 +33,15 @@ import com.intellij.openapi.roots.ModuleRootModel; import com.intellij.openapi.roots.ui.componentsList.components.ScrollablePanel; import com.intellij.openapi.roots.ui.componentsList.layout.VerticalStackLayout; import com.intellij.openapi.roots.ui.configuration.actions.IconWithTextAction; -import com.intellij.openapi.ui.Splitter; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.ex.VirtualFileManagerAdapter; +import com.intellij.ui.JBSplitter; +import com.intellij.ui.OnePixelSplitter; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.border.CustomLineBorder; import com.intellij.ui.roots.ToolbarPanel; import com.intellij.util.Consumer; import com.intellij.util.ui.UIUtil; @@ -48,6 +51,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType; import javax.swing.*; import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -146,7 +150,9 @@ public class CommonContentEntriesEditor extends ModuleElementsEditor { myContentEntryEditorListener = new MyContentEntryEditorListener(); final JPanel mainPanel = new JPanel(new BorderLayout()); - mainPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + if (!Registry.is("ide.new.project.settings")) { + mainPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + } addAdditionalSettingsToPanel(mainPanel); @@ -159,21 +165,32 @@ public class CommonContentEntriesEditor extends ModuleElementsEditor { myEditorsPanel = new ScrollablePanel(new VerticalStackLayout()); myEditorsPanel.setBackground(BACKGROUND_COLOR); - JScrollPane myScrollPane = ScrollPaneFactory.createScrollPane(myEditorsPanel); - entriesPanel.add(new ToolbarPanel(myScrollPane, group), BorderLayout.CENTER); + JScrollPane myScrollPane = ScrollPaneFactory.createScrollPane(myEditorsPanel, Registry.is("ide.new.project.settings")); + final ToolbarPanel toolbarPanel = new ToolbarPanel(myScrollPane, group); + if (Registry.is("ide.new.project.settings")) { + toolbarPanel.setBorder(new CustomLineBorder(1,0,0,0)); + } + entriesPanel.add(toolbarPanel, BorderLayout.CENTER); - final Splitter splitter = new Splitter(false); + final JBSplitter splitter = Registry.is("ide.new.project.settings") ? new OnePixelSplitter(false) : new JBSplitter(false); splitter.setProportion(0.6f); splitter.setHonorComponentsMinimumSize(true); myRootTreeEditor = createContentEntryTreeEditor(project); - splitter.setFirstComponent(myRootTreeEditor.createComponent()); + final JComponent component = myRootTreeEditor.createComponent(); + if (Registry.is("ide.new.project.settings")) { + component.setBorder(new CustomLineBorder(1,0,0,0)); + } + + splitter.setFirstComponent(component); splitter.setSecondComponent(entriesPanel); JPanel contentPanel = new JPanel(new GridBagLayout()); - contentPanel.setBorder(BorderFactory.createEtchedBorder()); + if (!Registry.is("ide.new.project.settings")) { + contentPanel.setBorder(BorderFactory.createEtchedBorder()); + } final ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, myRootTreeEditor.getEditingActionsGroup(), true); contentPanel.add(new JLabel("Mark as:"), - new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST, 0, new Insets(0, 5, 0, 5), 0, 0)); + new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST, 0, new Insets(0, 10, 0, 10), 0, 0)); contentPanel.add(actionToolbar.getComponent(), new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); @@ -236,7 +253,11 @@ public class CommonContentEntriesEditor extends ModuleElementsEditor { if (componentBorder != null) { border = BorderFactory.createCompoundBorder(border, componentBorder); } - component.setBorder(border); + if (Registry.is("ide.new.project.settings")) { + component.setBorder(new EmptyBorder(0,0,0,0)); + } else { + component.setBorder(border); + } myEditorsPanel.add(component); } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java index 469d966a29d8..bc10302c9c43 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import com.intellij.ui.roots.IconActionComponent; import com.intellij.ui.roots.ResizingWrapper; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; +import com.intellij.util.NotNullProducer; import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -59,10 +60,22 @@ import java.util.Map; */ public abstract class ContentRootPanel extends JPanel { private static final Color EXCLUDED_COLOR = new JBColor(new Color(0x992E00), DarculaColors.RED); - private static final Color SELECTED_HEADER_COLOR = new JBColor(new Color(0xDEF2FF), UIUtil.getPanelBackground().darker()); + private static final Color SELECTED_HEADER_COLOR = new JBColor(new NotNullProducer<Color>() { + @NotNull + @Override + public Color produce() { + return UIUtil.isUnderDarcula() ? UIUtil.getPanelBackground().darker() : new Color(0xDEF2FF); + } + }); private static final Color HEADER_COLOR = new JBColor(new Color(0xF5F5F5), Gray._82); private static final Color SELECTED_CONTENT_COLOR = new Color(0xF0F9FF); - private static final Color CONTENT_COLOR = new JBColor(Color.WHITE, UIUtil.getPanelBackground()); + private static final Color CONTENT_COLOR = new JBColor(new NotNullProducer<Color>() { + @NotNull + @Override + public Color produce() { + return UIUtil.isUnderDarcula() ? UIUtil.getPanelBackground() : Gray._255; + } + }); private static final Color UNSELECTED_TEXT_COLOR = Gray._51; protected final ActionCallback myCallback; @@ -140,7 +153,7 @@ public abstract class ContentRootPanel extends JPanel { headerLabel.setFont(headerLabel.getFont().deriveFont(Font.BOLD)); headerLabel.setOpaque(false); if (getContentEntry().getFile() == null) { - headerLabel.setForeground(Color.RED); + headerLabel.setForeground(JBColor.RED); } final IconActionComponent deleteIconComponent = new IconActionComponent(AllIcons.Modules.DeleteContentRoot, AllIcons.Modules.DeleteContentRootRollover, |