diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeExtendsToImplementsFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeExtendsToImplementsFix.java index 7edfb619e311..5c1e4117baa4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeExtendsToImplementsFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeExtendsToImplementsFix.java @@ -36,7 +36,7 @@ public class ChangeExtendsToImplementsFix extends ExtendsListFix { myName = QuickFixBundle.message("exchange.extends.implements.keyword", aClass.isInterface() == myClassToExtendFrom.isInterface() ? PsiKeyword.IMPLEMENTS : PsiKeyword.EXTENDS, aClass.isInterface() == myClassToExtendFrom.isInterface() ? PsiKeyword.EXTENDS : PsiKeyword.IMPLEMENTS, - myClassToExtendFrom.getQualifiedName()); + myClassToExtendFrom.getName()); } @Override diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java index c0c8328a9820..b566999c2877 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java @@ -312,12 +312,13 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { } } final List createdFiles = new ArrayList(fileToClasses.size()); - int foIdx = 0; + int[] choice = fileToClasses.size() > 1 ? new int[]{-1} : null; List files = new ArrayList(); for (final Map.Entry entry : fileToClasses.entrySet()) { final PsiFile psiFile = entry.getKey(); if (psiFile instanceof PsiClassOwner) { - final PsiFile createdFile = copy(psiFile, targetDirectory, copyClassName, map == null ? null : map.get(psiFile)); + final PsiFile createdFile = copy(psiFile, targetDirectory, copyClassName, map == null ? null : map.get(psiFile), choice); + if (createdFile == null) return null; final PsiClass[] sources = entry.getValue(); for (final PsiClass destination : ((PsiClassOwner)createdFile).getClasses()) { if (destination instanceof SyntheticElement) { @@ -339,7 +340,7 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { } } - int[] choice = files.size() > 1 ? new int[]{-1} : null; + for (PsiFile file : files) { try { final PsiFile fileCopy = @@ -375,11 +376,12 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { return newElement != null ? newElement : createdFiles.size() > 0 ? createdFiles.get(0) : null; } - private static PsiFile copy(@NotNull PsiFile file, PsiDirectory directory, String name, String relativePath) { + private static PsiFile copy(@NotNull PsiFile file, PsiDirectory directory, String name, String relativePath, int[] choice) { final String fileName = getNewFileName(file, name); if (relativePath != null && !relativePath.isEmpty()) { return buildRelativeDir(directory, relativePath).findOrCreateTargetDirectory().copyFileFrom(fileName, file); } + if (CopyFilesOrDirectoriesHandler.checkFileExist(directory, choice, file, fileName, "Copy")) return null; return directory.copyFileFrom(fileName, file); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after1.java index 05a5f6ea50ad..a42be12d1546 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after1.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after1.java @@ -1,4 +1,4 @@ -// "Change 'extends java.lang.Runnable' to 'implements java.lang.Runnable'" "true" +// "Change 'extends Runnable' to 'implements Runnable'" "true" import java.io.*; class a implements Runnable { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after2.java index 4c42079a514e..983afe99b398 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after2.java @@ -1,4 +1,4 @@ -// "Change 'implements java.lang.Object' to 'extends java.lang.Object'" "true" +// "Change 'implements Object' to 'extends Object'" "true" import java.io.*; class a extends Object { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after3.java index a65332bbeca9..23610fd075ec 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after3.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after3.java @@ -1,4 +1,4 @@ -// "Change 'implements java.lang.Object' to 'extends java.lang.Object'" "true" +// "Change 'implements Object' to 'extends Object'" "true" import java.io.*; class a extends Object implements Runnable, Serializable { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after4.java index ad0ad096a63f..5071affa52b1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after4.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/after4.java @@ -1,4 +1,4 @@ -// "Change 'extends java.lang.Runnable' to 'implements java.lang.Runnable'" "true" +// "Change 'extends Runnable' to 'implements Runnable'" "true" import java.io.*; class a extends Object implements Serializable, Runnable { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before1.java index 4e685fa29351..cf8f2fb687a1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before1.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before1.java @@ -1,4 +1,4 @@ -// "Change 'extends java.lang.Runnable' to 'implements java.lang.Runnable'" "true" +// "Change 'extends Runnable' to 'implements Runnable'" "true" import java.io.*; class a extends Runnable { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before2.java index a5abad4a8282..efaac225efdc 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before2.java @@ -1,4 +1,4 @@ -// "Change 'implements java.lang.Object' to 'extends java.lang.Object'" "true" +// "Change 'implements Object' to 'extends Object'" "true" import java.io.*; class a implements Object { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before3.java index abaab1bc8672..1090e28dca95 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before3.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before3.java @@ -1,4 +1,4 @@ -// "Change 'implements java.lang.Object' to 'extends java.lang.Object'" "true" +// "Change 'implements Object' to 'extends Object'" "true" import java.io.*; class a implements Runnable,Object,Serializable { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before4.java index e35098aeb5a9..e986ea2245c5 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before4.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before4.java @@ -1,4 +1,4 @@ -// "Change 'extends java.lang.Runnable' to 'implements java.lang.Runnable'" "true" +// "Change 'extends Runnable' to 'implements Runnable'" "true" import java.io.*; class a extends Object,Runnable implements Serializable { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before5.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before5.java index e3b2e78a8f93..0fd4057007b8 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before5.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/changeExtendsToImplements/before5.java @@ -1,4 +1,4 @@ -// "Change 'implements java.lang.Object' to 'extends java.lang.Object'" "false" +// "Change 'implements Object' to 'extends Object'" "false" import java.io.*; class a extends b implements Runnable,Object,Serializable { diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 8fd4a694af7e..998b3fc8719c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -56,7 +56,7 @@ public class JavaBuilder extends ModuleLevelBuilder { private static final String FORM_EXTENSION = ".form"; public static final boolean USE_EMBEDDED_JAVAC = System.getProperty(GlobalOptions.USE_EXTERNAL_JAVAC_OPTION) == null; - private static final FileFilter JAVA_SOURCES_FILTER = new FileFilter() { + public static final FileFilter JAVA_SOURCES_FILTER = new FileFilter() { public boolean accept(File file) { return file.getPath().endsWith(JAVA_EXTENSION); } diff --git a/platform/lang-api/src/com/intellij/lang/LanguageImportStatements.java b/platform/lang-api/src/com/intellij/lang/LanguageImportStatements.java index cf7ae42ea17a..7154680a46ab 100644 --- a/platform/lang-api/src/com/intellij/lang/LanguageImportStatements.java +++ b/platform/lang-api/src/com/intellij/lang/LanguageImportStatements.java @@ -21,9 +21,7 @@ package com.intellij.lang; import com.intellij.psi.PsiFile; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; public class LanguageImportStatements extends LanguageExtension { @@ -33,15 +31,14 @@ public class LanguageImportStatements extends LanguageExtension super("com.intellij.lang.importOptimizer"); } - public List forFile(PsiFile file) { - List runnables = new ArrayList(); + public Set forFile(PsiFile file) { Set optimizers = new HashSet(); for (PsiFile psiFile : file.getViewProvider().getAllFiles()) { ImportOptimizer optimizer = forLanguage(psiFile.getLanguage()); - if (optimizer != null && optimizer.supports(psiFile) && optimizers.add(optimizer)) { - runnables.add(optimizer.processFile(psiFile)); + if (optimizer != null && optimizer.supports(psiFile)) { + optimizers.add(optimizer); } } - return runnables; + return optimizers; } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/actions/OptimizeImportsProcessor.java b/platform/lang-impl/src/com/intellij/codeInsight/actions/OptimizeImportsProcessor.java index f6ce2f44134e..becb732f4e39 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/actions/OptimizeImportsProcessor.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/actions/OptimizeImportsProcessor.java @@ -17,16 +17,20 @@ package com.intellij.codeInsight.actions; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.lang.ImportOptimizer; import com.intellij.lang.LanguageImportStatements; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.EmptyRunnable; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; +import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Set; import java.util.concurrent.FutureTask; public class OptimizeImportsProcessor extends AbstractLayoutCodeProcessor { @@ -59,12 +63,18 @@ public class OptimizeImportsProcessor extends AbstractLayoutCodeProcessor { @NotNull protected FutureTask preprocessFile(@NotNull final PsiFile file, boolean processChangedTextOnly) throws IncorrectOperationException { - final List optimizers = LanguageImportStatements.INSTANCE.forFile(file); - Runnable runnable = optimizers.isEmpty() ? EmptyRunnable.getInstance() : new Runnable() { + final Set optimizers = LanguageImportStatements.INSTANCE.forFile(file); + final List runnables = ContainerUtil.map(optimizers, new Function() { + @Override + public Runnable fun(ImportOptimizer optimizer) { + return optimizer.processFile(file); + } + }); + Runnable runnable = runnables.isEmpty() ? EmptyRunnable.getInstance() : new Runnable() { @Override public void run() { - for (Runnable optimizer : optimizers) { - optimizer.run(); + for (Runnable runnable : runnables) { + runnable.run(); } } }; diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/MnemonicChooser.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/MnemonicChooser.java index a8b78eeb7d20..6897fb9780e1 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/MnemonicChooser.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/MnemonicChooser.java @@ -33,6 +33,9 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class MnemonicChooser extends JPanel { + private static final Color OCCUPIED_CELL_COLOR = new Color(250, 250, 139); + private static final Color FREE_CELL_COLOR = LightColors.SLIGHTLY_GRAY; + public MnemonicChooser() { super(new VerticalFlowLayout()); JPanel numbers = new NonOpaquePanel(new GridLayout(2, 5, 2, 2)); @@ -83,7 +86,7 @@ public class MnemonicChooser extends JPanel { } private Color backgroundForMnemonic(char c) { - return isOccupied(c) ? LightColors.YELLOW : LightColors.SLIGHTLY_GRAY; + return isOccupied(c) ? OCCUPIED_CELL_COLOR : FREE_CELL_COLOR; } private class MnemonicLabel extends JLabel { diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionGroup.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionGroup.java index 76042442732f..bfc4375287c2 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionGroup.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/ActionGroup.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -184,4 +184,8 @@ public abstract class ActionGroup extends AnAction { return myDumbAware; } + + public boolean hideIfNoVisibleChildren() { + return false; + } } diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java index 979f08e2fc22..0875bffe57e5 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -20,6 +20,7 @@ import com.intellij.ui.MouseDragHelper; import com.intellij.ui.ScreenUtil; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.tabs.TabInfo; +import com.intellij.ui.util.Axis; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -35,9 +36,6 @@ class DragHelper extends MouseDragHelper { Rectangle myDragRec; Dimension myHoldDelta; - Measurer myHorizontal = new Measurer.Width(); - Measurer myVertical = new Measurer.Height(); - private TabInfo myDragOutSource; private TabLabel myPressedTabLabel; @@ -134,14 +132,14 @@ class DragHelper extends MouseDragHelper { TabLabel targetLabel; if (myTabs.isHorizontalTabs()) { - targetLabel = findMostOverlapping(myHorizontal, left, right); + targetLabel = findMostOverlapping(Axis.X, left, right); if (targetLabel == null) { - targetLabel = findMostOverlapping(myVertical, top, bottom); + targetLabel = findMostOverlapping(Axis.Y, top, bottom); } } else { - targetLabel = findMostOverlapping(myVertical, top, bottom); + targetLabel = findMostOverlapping(Axis.Y, top, bottom); if (targetLabel == null) { - targetLabel = findMostOverlapping(myHorizontal, left, right); + targetLabel = findMostOverlapping(Axis.X, left, right); } } @@ -163,7 +161,7 @@ class DragHelper extends MouseDragHelper { } } - private TabLabel findMostOverlapping(Measurer measurer, TabLabel... labels) { + private TabLabel findMostOverlapping(Axis measurer, TabLabel... labels) { double freeSpace; if (measurer.getMinValue(myDragRec) < measurer.getMinValue(myDragOriginalRec)) { @@ -179,7 +177,7 @@ class DragHelper extends MouseDragHelper { if (each == null) continue; final Rectangle eachBounds = each.getBounds(); - if (measurer.getMeasuredValue(eachBounds) > freeSpace + freeSpace *0.3) continue; + if (measurer.getSize(eachBounds) > freeSpace + freeSpace *0.3) continue; Rectangle intersection = myDragRec.intersection(eachBounds); int size = intersection.width * intersection.height; @@ -192,40 +190,6 @@ class DragHelper extends MouseDragHelper { return maxLabel; } - interface Measurer { - int getMinValue(Rectangle r); - int getMaxValue(Rectangle r); - int getMeasuredValue(Rectangle r); - - class Width implements Measurer{ - public int getMinValue(Rectangle r) { - return r.x; - } - - public int getMaxValue(Rectangle r) { - return (int)r.getMaxX(); - } - - public int getMeasuredValue(Rectangle r) { - return r.width; - } - } - - class Height implements Measurer{ - public int getMinValue(Rectangle r) { - return r.y; - } - - public int getMaxValue(Rectangle r) { - return (int)r.getMaxY(); - } - - public int getMeasuredValue(Rectangle r) { - return r.height; - } - } - } - @Nullable private TabLabel findLabel(Point dragPoint) { diff --git a/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java b/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java index 57871d556d71..fff18a346054 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/NonEmptyActionGroup.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -29,4 +29,8 @@ public class NonEmptyActionGroup extends DefaultActionGroup implements DumbAware Presentation presentation = event.getPresentation(); presentation.setVisible(getChildrenCount() > 0); } + + public boolean hideIfNoVisibleChildren() { + return true; + } } diff --git a/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java index c9cdcc013bf8..7e76682b4746 100644 --- a/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/dnd/DnDManagerImpl.java @@ -68,7 +68,7 @@ public class DnDManagerImpl extends DnDManager implements Disposable { onTimer(); } }); - private Runnable myHightlighterShowRequest; + private Runnable myHighlighterShowRequest; private Rectangle myLastHighlightedRec; private int myLastProcessedAction; @@ -431,7 +431,7 @@ public class DnDManagerImpl extends DnDManager implements Disposable { } private void queueTooltip(final DnDEvent aEvent, final JLayeredPane aLayeredPane, final Rectangle aRectangle) { - myHightlighterShowRequest = new Runnable() { + myHighlighterShowRequest = new Runnable() { public void run() { if (myCurrentEvent != aEvent) return; Highlighters.hide(DnDEvent.DropTargetHighlightingType.TEXT | DnDEvent.DropTargetHighlightingType.ERROR_TEXT); @@ -451,14 +451,14 @@ public class DnDManagerImpl extends DnDManager implements Disposable { void hideCurrentHighlighter() { Highlighters.hide(); - myHightlighterShowRequest = null; + myHighlighterShowRequest = null; setLastHighlightedEvent(null, null); } private void onTimer() { - if (myHightlighterShowRequest != null) { - myHightlighterShowRequest.run(); - myHightlighterShowRequest = null; + if (myHighlighterShowRequest != null) { + myHighlighterShowRequest.run(); + myHighlighterShowRequest = null; } } @@ -729,7 +729,7 @@ public class DnDManagerImpl extends DnDManager implements Disposable { target.cleanUpOnLeave(); } hideCurrentHighlighter(); - myHightlighterShowRequest = null; + myHighlighterShowRequest = null; } private Application getApplication() { diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java index 33319507d861..484efbe9da42 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/Utils.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * 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. @@ -131,8 +131,11 @@ public class Utils{ ActionGroup actionGroup = (ActionGroup)child; if (actionGroup.isPopup()) { // popup menu has its own presentation // disable group if it contains no visible actions - final boolean enabled = actionGroup.canBePerformed(context) || hasVisibleChildren(actionGroup, presentationFactory, context, place); - presentation.setEnabled(enabled); + final boolean visibleChildren = hasVisibleChildren(actionGroup, presentationFactory, context, place); + if (actionGroup.hideIfNoVisibleChildren() && !visibleChildren) { + continue; + } + presentation.setEnabled(actionGroup.canBePerformed(context) || visibleChildren); list.add(child); } else { diff --git a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java index 6b5792b4c262..99aaaf31b0eb 100644 --- a/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java +++ b/platform/platform-impl/src/com/intellij/ui/popup/AbstractPopup.java @@ -40,6 +40,7 @@ import com.intellij.ui.*; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.components.JBLabel; import com.intellij.ui.speedSearch.SpeedSearch; +import com.intellij.util.Alarm; import com.intellij.util.ImageLoader; import com.intellij.util.Processor; import com.intellij.util.ui.ChildFocusWatcher; @@ -612,6 +613,7 @@ public class AbstractPopup implements JBPopup { assert ApplicationManager.getApplication().isDispatchThread(); + installWindowHook(this); addActivity(); final boolean shouldShow = beforeShow(); @@ -865,6 +867,19 @@ public class AbstractPopup implements JBPopup { } } + //Sometimes just after popup was shown the WINDOW_ACTIVATED cancels it + private static void installWindowHook(final AbstractPopup popup) { + if (popup.myCancelOnWindow) { + popup.myCancelOnWindow = false; + new Alarm(popup).addRequest(new Runnable() { + @Override + public void run() { + popup.myCancelOnWindow = true; + } + }, 100); + } + } + private void addActivity() { UiActivityMonitor.getInstance().addActivity(myActivityKey); } diff --git a/platform/platform-impl/src/com/intellij/ide/dnd/DnDDemo.java b/platform/platform-tests/testSrc/com/intellij/ide/dnd/DnDDemo.java similarity index 99% rename from platform/platform-impl/src/com/intellij/ide/dnd/DnDDemo.java rename to platform/platform-tests/testSrc/com/intellij/ide/dnd/DnDDemo.java index d9035d8242e0..0d3d95675443 100644 --- a/platform/platform-impl/src/com/intellij/ide/dnd/DnDDemo.java +++ b/platform/platform-tests/testSrc/com/intellij/ide/dnd/DnDDemo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. diff --git a/platform/util/src/com/intellij/ui/util/Axis.java b/platform/util/src/com/intellij/ui/util/Axis.java new file mode 100644 index 000000000000..5add0cdc4a3c --- /dev/null +++ b/platform/util/src/com/intellij/ui/util/Axis.java @@ -0,0 +1,58 @@ +/* + * 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.ui.util; + +import java.awt.*; + +/** +* @author yole +*/ +public abstract class Axis { + public abstract int getMinValue(Rectangle r); + public abstract int getMaxValue(Rectangle r); + public abstract int getSize(Rectangle r); + + public static Axis X = new Axis() { + @Override + public int getMinValue(Rectangle r) { + return r.x; + } + + @Override + public int getMaxValue(Rectangle r) { + return (int) r.getMaxX(); + } + + @Override + public int getSize(Rectangle r) { + return r.width; + } + }; + + public static Axis Y = new Axis() { + public int getMinValue(Rectangle r) { + return r.y; + } + + public int getMaxValue(Rectangle r) { + return (int)r.getMaxY(); + } + + public int getSize(Rectangle r) { + return r.height; + } + }; +} diff --git a/platform/util/src/com/intellij/util/containers/LinkedMultiMap.java b/platform/util/src/com/intellij/util/containers/LinkedMultiMap.java new file mode 100644 index 000000000000..3128f507a2bc --- /dev/null +++ b/platform/util/src/com/intellij/util/containers/LinkedMultiMap.java @@ -0,0 +1,36 @@ +/* + * 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.util.containers; + +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author Evgeny Gerashchenko + */ +public class LinkedMultiMap extends MultiMap { + @Override + protected Map> createMap() { + return new LinkedHashMap>(); + } + + @Override + protected Map> createMap(int i, float v) { + return new LinkedHashMap>(i, v); + } +} diff --git a/platform/util/src/com/intellij/util/ui/IdeaUIManager.java b/platform/util/src/com/intellij/util/ui/IdeaUIManager.java deleted file mode 100644 index 44cf107679c7..000000000000 --- a/platform/util/src/com/intellij/util/ui/IdeaUIManager.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2009 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.util.ui; - -import javax.swing.*; -import java.awt.*; - - -/** - * @deprecated Use UIUtil instead - */ - - -public class IdeaUIManager { - - public static Color getTableSelectionBackgroung(){ - return UIUtil.getTableSelectionBackground(); - } - - public static Color getTableBackgroung(){ - return UIUtil.getTableBackground(); - } - - public static Color getTableSelectionForegroung(){ - return UIUtil.getTableSelectionForeground(); - } - - public static Color getTableForegroung(){ - return UIUtil.getTableForeground(); - } - - public static Color getTreeForegroung() { - return UIUtil.getTreeForeground(); - } - -} diff --git a/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java b/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java index 90ad838fb665..a7dbd36119d4 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java +++ b/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java @@ -60,6 +60,7 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.util.List; +import java.util.concurrent.Callable; /** * @author Alexander Lobas @@ -150,12 +151,7 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel { }); // TODO: run in background - try { - createRenderer(layoutXmlText); - } - catch (IndexNotReadyException e) { - createRenderer(layoutXmlText); - } + createRenderer(layoutXmlText); Result result = mySession.getResult(); if (!result.isSuccess()) { @@ -228,32 +224,37 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel { } - private void createRenderer(String layoutXmlText) throws Exception { + private void createRenderer(final String layoutXmlText) throws Exception { // TODO: (profile|device|target|...|theme) panel - AndroidPlatform platform = AndroidPlatform.getInstance(myModule); - IAndroidTarget target = platform.getTarget(); - AndroidFacet facet = AndroidFacet.getInstance(myModule); + mySession = ApplicationManager.getApplication().executeOnPooledThread(new Callable() { + @Override + public RenderSession call() throws Exception { + AndroidPlatform platform = AndroidPlatform.getInstance(myModule); + IAndroidTarget target = platform.getTarget(); + AndroidFacet facet = AndroidFacet.getInstance(myModule); - LayoutDeviceManager layoutDeviceManager = new LayoutDeviceManager(); - layoutDeviceManager.loadDevices(platform.getSdkData()); - LayoutDevice layoutDevice = layoutDeviceManager.getCombinedList().get(0); + LayoutDeviceManager layoutDeviceManager = new LayoutDeviceManager(); + layoutDeviceManager.loadDevices(platform.getSdkData()); + LayoutDevice layoutDevice = layoutDeviceManager.getCombinedList().get(0); - LayoutDeviceConfiguration deviceConfiguration = layoutDevice.getConfigurations().get(0); + LayoutDeviceConfiguration deviceConfiguration = layoutDevice.getConfigurations().get(0); - FolderConfiguration config = new FolderConfiguration(); - config.set(deviceConfiguration.getConfiguration()); - config.setUiModeQualifier(new UiModeQualifier(UiMode.NORMAL)); - config.setNightModeQualifier(new NightModeQualifier(NightMode.NIGHT)); - config.setLanguageQualifier(new LanguageQualifier()); - config.setRegionQualifier(new RegionQualifier()); + FolderConfiguration config = new FolderConfiguration(); + config.set(deviceConfiguration.getConfiguration()); + config.setUiModeQualifier(new UiModeQualifier(UiMode.NORMAL)); + config.setNightModeQualifier(new NightModeQualifier(NightMode.NIGHT)); + config.setLanguageQualifier(new LanguageQualifier()); + config.setRegionQualifier(new RegionQualifier()); - float xdpi = deviceConfiguration.getDevice().getXDpi(); - float ydpi = deviceConfiguration.getDevice().getYDpi(); + float xdpi = deviceConfiguration.getDevice().getXDpi(); + float ydpi = deviceConfiguration.getDevice().getYDpi(); - ThemeData theme = new ThemeData("Theme", false); + ThemeData theme = new ThemeData("Theme", false); - mySession = RenderUtil.createRenderSession(myModule.getProject(), layoutXmlText, myFile, target, facet, config, xdpi, ydpi, theme); + return RenderUtil.createRenderSession(myModule.getProject(), layoutXmlText, myFile, target, facet, config, xdpi, ydpi, theme); + } + }).get(); } @Override diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptStateStorage.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptStateStorage.java index 46e0cc249536..9ea0c4339a42 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptStateStorage.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidAptStateStorage.java @@ -16,7 +16,7 @@ import java.io.IOException; */ public class AndroidAptStateStorage extends AbstractStateStorage { - @NonNls private static final String ANDROID_STORAGE_DIR = "android_resource_names"; + @NonNls private static final String ANDROID_RESOURCE_NAMES_STORAGE_DIR = "android_resource_names"; @NonNls private static final String RESOURCE_NAMES_STORAGE = "resource_names"; public AndroidAptStateStorage(@NotNull File dataStorageRoot) throws IOException { @@ -25,7 +25,7 @@ public class AndroidAptStateStorage extends AbstractStateStorage { diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java index 01e265d283c1..6299193b3e26 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidBuilderService.java @@ -3,6 +3,7 @@ package org.jetbrains.jps.android; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.incremental.BuilderService; import org.jetbrains.jps.incremental.ModuleLevelBuilder; +import org.jetbrains.jps.incremental.ProjectLevelBuilder; import java.util.Arrays; import java.util.List; @@ -17,7 +18,12 @@ public class AndroidBuilderService extends BuilderService { public List createModuleLevelBuilders(ExecutorService executorService) { return Arrays.asList(new AndroidSourceGeneratingBuilder(), new AndroidLibraryPackagingBuilder(), - new AndroidDexBuilder(), - new AndroidPackagingBuilder()); + new AndroidResourcePackagingBuilder()); + } + + @NotNull + @Override + public List createProjectLevelBuilders() { + return Arrays.asList(new AndroidDexBuilder()); } } diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidClassesAndJarsState.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidClassesAndJarsState.java new file mode 100644 index 000000000000..3a6c4bbeccd1 --- /dev/null +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidClassesAndJarsState.java @@ -0,0 +1,60 @@ +package org.jetbrains.jps.android; + +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.Processor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.incremental.storage.ValidityState; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Eugene.Kudelevsky + */ +class AndroidClassesAndJarsState implements ValidityState { + private Map myFiles; + + public AndroidClassesAndJarsState(@NotNull Collection roots) { + myFiles = new HashMap(); + + for (String rootPath : roots) { + AndroidJpsUtil.processClassFilesAndJarsRecursively(rootPath, new Processor() { + @Override + public boolean process(File file) { + myFiles.put(FileUtil.toSystemIndependentName(file.getPath()), file.lastModified()); + return true; + } + }); + } + } + + public AndroidClassesAndJarsState(@NotNull DataInput in) throws IOException { + myFiles = new HashMap(); + int size = in.readInt(); + + while (size-- > 0) { + final String path = in.readUTF(); + final long timestamp = in.readLong(); + myFiles.put(path, timestamp); + } + } + + public boolean equalsTo(ValidityState otherState) { + return otherState instanceof AndroidClassesAndJarsState + && myFiles.equals(((AndroidClassesAndJarsState)otherState).myFiles); + } + + public void save(DataOutput out) throws IOException { + out.writeInt(myFiles.size()); + + for (String path : myFiles.keySet()) { + out.writeUTF(path); + out.writeLong(myFiles.get(path)); + } + } +} diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidClassesAndJarsStateStorage.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidClassesAndJarsStateStorage.java new file mode 100644 index 000000000000..31d7c3dc9f0e --- /dev/null +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidClassesAndJarsStateStorage.java @@ -0,0 +1,43 @@ +package org.jetbrains.jps.android; + +import com.intellij.util.io.DataExternalizer; +import com.intellij.util.io.EnumeratorStringDescriptor; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.incremental.storage.AbstractStateStorage; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.File; +import java.io.IOException; + +/** + * @author Eugene.Kudelevsky + */ +public class AndroidClassesAndJarsStateStorage extends AbstractStateStorage { + + @NonNls private static final String ANDROID_CLASSES_AND_JARS_STORAGE_DIR = "android_classes_and_jars"; + @NonNls private static final String CLASSES_AND_JARS_STORAGE = "classes_and_jars"; + + public AndroidClassesAndJarsStateStorage(@NotNull File dataStorageRoot) throws IOException { + super(getStorageFile(dataStorageRoot), new EnumeratorStringDescriptor(), new MyDataExternalizer()); + } + + @NotNull + private static File getStorageFile(@NotNull File dataStorageRoot) { + return new File(new File(dataStorageRoot, ANDROID_CLASSES_AND_JARS_STORAGE_DIR), CLASSES_AND_JARS_STORAGE); + } + + private static class MyDataExternalizer implements DataExternalizer { + + @Override + public void save(DataOutput out, AndroidClassesAndJarsState value) throws IOException { + value.save(out); + } + + @Override + public AndroidClassesAndJarsState read(DataInput in) throws IOException { + return new AndroidClassesAndJarsState(in); + } + } +} diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java index 75249485d0c9..82cacc2ae2c0 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java @@ -13,9 +13,11 @@ import org.jetbrains.android.util.AndroidCompilerMessageKind; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.Module; -import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.ProjectPaths; -import org.jetbrains.jps.incremental.*; +import org.jetbrains.jps.incremental.CompileContext; +import org.jetbrains.jps.incremental.ExternalProcessUtil; +import org.jetbrains.jps.incremental.ProjectBuildException; +import org.jetbrains.jps.incremental.ProjectLevelBuilder; import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.incremental.messages.ProgressMessage; @@ -28,37 +30,48 @@ import java.util.*; /** * @author Eugene.Kudelevsky */ -// todo: save validity state + // todo: support light builds (for tests) -public class AndroidDexBuilder extends ModuleLevelBuilder { +public class AndroidDexBuilder extends ProjectLevelBuilder { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.android.AndroidDexBuilder"); @NonNls private static final String BUILDER_NAME = "android-dex"; - protected AndroidDexBuilder() { - super(BuilderCategory.CLASS_POST_PROCESSOR); - } - @Override - public ExitCode build(CompileContext context, ModuleChunk chunk) throws ProjectBuildException { - if (context.isCompilingTests() || !AndroidJpsUtil.containsAndroidFacet(chunk)) { - return ModuleLevelBuilder.ExitCode.OK; + public void build(CompileContext context) throws ProjectBuildException { + if (!AndroidJpsUtil.containsAndroidFacet(context.getProject())) { + return; } context.processMessage(new ProgressMessage(AndroidJpsBundle.message("android.jps.progress.dex"))); try { - return doBuild(context, chunk); + doBuild(context); + } + catch (ProjectBuildException e) { + throw e; } catch (Exception e) { - return AndroidJpsUtil.handleException(context, e, BUILDER_NAME); + AndroidJpsUtil.handleException(context, e, BUILDER_NAME); } } - private static ExitCode doBuild(CompileContext context, ModuleChunk chunk) { + private static void doBuild(CompileContext context) throws IOException, ProjectBuildException { + final AndroidClassesAndJarsStateStorage storage = new AndroidClassesAndJarsStateStorage(context.getDataManager().getDataStorageRoot()); + try { + if (!doDexBuild(context, storage)) { + throw new ProjectBuildException(); + } + } + finally { + storage.close(); + } + } + + private static boolean doDexBuild(CompileContext context, AndroidClassesAndJarsStateStorage storage) { boolean success = true; - for (Module module : chunk.getModules()) { + for (Module module : context.getProject().getModules().values()) { final AndroidFacet facet = AndroidJpsUtil.getFacet(module); if (facet == null || facet.getLibrary()) { continue; @@ -92,35 +105,51 @@ public class AndroidDexBuilder extends ModuleLevelBuilder { continue; } - final Set fileSet = new HashSet(); - AndroidJpsUtil.addSubdirectories(classesDir, fileSet); - fileSet.addAll(AndroidJpsUtil.getExternalLibraries(projectPaths, module)); - for (String filePath : AndroidJpsUtil.getClassdirsOfDependentModules(projectPaths, module)) { - if (!classesDir.getPath().equals(filePath)) { - fileSet.add(filePath); + try { + final Set fileSet = new HashSet(); + AndroidJpsUtil.addSubdirectories(classesDir, fileSet); + fileSet.addAll(AndroidJpsUtil.getExternalLibraries(projectPaths, module)); + + for (String filePath : AndroidJpsUtil.getClassdirsOfDependentModules(projectPaths, module)) { + if (!classesDir.getPath().equals(filePath)) { + fileSet.add(filePath); + } + } + + if (facet.isLibrary()) { + final File testsClassDir = projectPaths.getModuleOutputDir(module, true); + + if (testsClassDir != null && testsClassDir.isDirectory()) { + AndroidJpsUtil.addSubdirectories(testsClassDir, fileSet); + } + } + + final AndroidClassesAndJarsState newState = new AndroidClassesAndJarsState(fileSet); + final AndroidClassesAndJarsState oldState = storage.getState(module.getName()); + if (oldState != null && oldState.equalsTo(newState)) { + continue; + } + + final String[] files = new String[fileSet.size()]; + int i = 0; + for (String filePath : fileSet) { + files[i++] = FileUtil.toSystemDependentName(filePath); + } + + if (!runDex(androidSdk, target, dexOutputDir.getPath(), files, context)) { + success = false; + } + else { + storage.update(module.getName(), newState); } } - - if (facet.isLibrary()) { - final File testsClassDir = projectPaths.getModuleOutputDir(module, true); - - if (testsClassDir != null && testsClassDir.isDirectory()) { - AndroidJpsUtil.addSubdirectories(testsClassDir, fileSet); - } - } - - final String[] files = new String[fileSet.size()]; - int i = 0; - for (String filePath : fileSet) { - files[i++] = FileUtil.toSystemDependentName(filePath); - } - - if (!runDex(androidSdk, target, dexOutputDir.getPath(), files, context)) { - success = false; + catch (IOException e) { + AndroidJpsUtil.reportExceptionError(context, null, e, BUILDER_NAME); + return false; } } - return success ? ExitCode.OK : ExitCode.ABORT; + return success; } @Override @@ -137,7 +166,7 @@ public class AndroidDexBuilder extends ModuleLevelBuilder { @NotNull IAndroidTarget target, @NotNull String outputDir, @NotNull String[] compileTargets, - @NotNull CompileContext context) { + @NotNull CompileContext context) throws IOException { @SuppressWarnings("deprecation") final String dxJarPath = FileUtil.toSystemDependentName(target.getPath(IAndroidTarget.DX_JAR)); @@ -173,23 +202,17 @@ public class AndroidDexBuilder extends ModuleLevelBuilder { LOG.info(AndroidCommonUtils.command2string(commandLine)); - try { - final Process process = Runtime.getRuntime().exec(ArrayUtil.toStringArray(commandLine)); + final Process process = Runtime.getRuntime().exec(ArrayUtil.toStringArray(commandLine)); - final HashMap> messages = new HashMap>(3); - messages.put(AndroidCompilerMessageKind.ERROR, new ArrayList()); - messages.put(AndroidCompilerMessageKind.WARNING, new ArrayList()); - messages.put(AndroidCompilerMessageKind.INFORMATION, new ArrayList()); + final HashMap> messages = new HashMap>(3); + messages.put(AndroidCompilerMessageKind.ERROR, new ArrayList()); + messages.put(AndroidCompilerMessageKind.WARNING, new ArrayList()); + messages.put(AndroidCompilerMessageKind.INFORMATION, new ArrayList()); - AndroidCommonUtils.handleDexCompilationResult(process, outFilePath, messages); + AndroidCommonUtils.handleDexCompilationResult(process, outFilePath, messages); - AndroidJpsUtil.addMessages(context, messages, BUILDER_NAME); + AndroidJpsUtil.addMessages(context, messages, BUILDER_NAME); - return messages.get(AndroidCompilerMessageKind.ERROR).size() == 0; - } - catch (IOException e) { - AndroidJpsUtil.reportExceptionError(context, null, e, BUILDER_NAME); - return false; - } + return messages.get(AndroidCompilerMessageKind.ERROR).size() == 0; } } diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java index dbde71f62cbd..522dae01d197 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidJpsUtil.java @@ -130,7 +130,13 @@ class AndroidJpsUtil { final File file = new File(filePath); if (file.exists()) { - collectClassFilesAndJars(filePath, libraries); + processClassFilesAndJarsRecursively(filePath, new Processor() { + @Override + public boolean process(File file) { + libraries.add(file.getPath()); + return true; + } + }); } } } @@ -162,8 +168,7 @@ class AndroidJpsUtil { } } - private static void collectClassFilesAndJars(@NotNull String root, - @NotNull final Set result) { + public static void processClassFilesAndJarsRecursively(@NotNull String root, @NotNull final Processor processor) { FileUtil.processFilesRecursively(new File(root), new Processor() { @Override public boolean process(File file) { @@ -171,7 +176,9 @@ class AndroidJpsUtil { final String ext = FileUtil.getExtension(file.getName()); if ("jar".equals(ext) || "class".equals(ext)) { - result.add(file.getPath()); + if (!processor.process(file)) { + return false; + } } } return true; @@ -247,6 +254,15 @@ class AndroidJpsUtil { return false; } + public static boolean containsAndroidFacet(@NotNull Project project) { + for (Module module : project.getModules().values()) { + if (getFacet(module) != null) { + return true; + } + } + return false; + } + public static ModuleLevelBuilder.ExitCode handleException(@NotNull CompileContext context, @NotNull Exception e, @NotNull String builderName) diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidLibraryPackagingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidLibraryPackagingBuilder.java index f2e042cee5a8..b6ae9e908c6e 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidLibraryPackagingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidLibraryPackagingBuilder.java @@ -23,7 +23,6 @@ import java.util.Set; * @author Eugene.Kudelevsky */ -// todo: save validity states // todo: support light builds public class AndroidLibraryPackagingBuilder extends ModuleLevelBuilder { @@ -48,46 +47,60 @@ public class AndroidLibraryPackagingBuilder extends ModuleLevelBuilder { } } - private static ModuleLevelBuilder.ExitCode doBuild(CompileContext context, ModuleChunk chunk) { + private static ModuleLevelBuilder.ExitCode doBuild(CompileContext context, ModuleChunk chunk) throws IOException { boolean success = true; + final AndroidClassesAndJarsStateStorage storage = new AndroidClassesAndJarsStateStorage(context.getDataManager().getDataStorageRoot()); - for (Module module : chunk.getModules()) { - final AndroidFacet facet = AndroidJpsUtil.getFacet(module); - if (facet == null || !facet.isLibrary()) { - continue; - } - - final ProjectPaths projectPaths = context.getProjectPaths(); - final File outputDirectoryForPackagedFiles = AndroidJpsUtil.getOutputDirectoryForPackagedFiles(projectPaths, module); - - if (outputDirectoryForPackagedFiles == null) { - context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, AndroidJpsBundle - .message("android.jps.errors.output.dir.not.specified", module.getName()))); - success = false; - continue; - } - - final File classesDir = projectPaths.getModuleOutputDir(module, false); - if (classesDir == null || !classesDir.isDirectory()) { - continue; - } - - final Set subdirs = new HashSet(); - AndroidJpsUtil.addSubdirectories(classesDir, subdirs); - - if (subdirs.size() > 0) { - final File outputJarFile = new File(outputDirectoryForPackagedFiles, AndroidCommonUtils.CLASSES_JAR_FILE_NAME); - - try { - AndroidCommonUtils.packClassFilesIntoJar(ArrayUtil.EMPTY_STRING_ARRAY, ArrayUtil.toStringArray(subdirs), outputJarFile); + try { + for (Module module : chunk.getModules()) { + final AndroidFacet facet = AndroidJpsUtil.getFacet(module); + if (facet == null || !facet.isLibrary()) { + continue; } - catch (IOException e) { - AndroidJpsUtil.reportExceptionError(context, null, e, BUILDER_NAME); + + final ProjectPaths projectPaths = context.getProjectPaths(); + final File outputDirectoryForPackagedFiles = AndroidJpsUtil.getOutputDirectoryForPackagedFiles(projectPaths, module); + + if (outputDirectoryForPackagedFiles == null) { + context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, AndroidJpsBundle + .message("android.jps.errors.output.dir.not.specified", module.getName()))); success = false; + continue; + } + + final File classesDir = projectPaths.getModuleOutputDir(module, false); + if (classesDir == null || !classesDir.isDirectory()) { + continue; + } + + final Set subdirs = new HashSet(); + AndroidJpsUtil.addSubdirectories(classesDir, subdirs); + + final AndroidClassesAndJarsState newState = new AndroidClassesAndJarsState(subdirs); + final AndroidClassesAndJarsState oldState = storage.getState(module.getName()); + + if (oldState != null && oldState.equals(newState)) { + continue; + } + + if (subdirs.size() > 0) { + final File outputJarFile = new File(outputDirectoryForPackagedFiles, AndroidCommonUtils.CLASSES_JAR_FILE_NAME); + + try { + AndroidCommonUtils.packClassFilesIntoJar(ArrayUtil.EMPTY_STRING_ARRAY, ArrayUtil.toStringArray(subdirs), outputJarFile); + storage.update(module.getName(), newState); + } + catch (IOException e) { + AndroidJpsUtil.reportExceptionError(context, null, e, BUILDER_NAME); + success = false; + } } } + return success ? ModuleLevelBuilder.ExitCode.OK : ModuleLevelBuilder.ExitCode.ABORT; + } + finally { + storage.close(); } - return success ? ModuleLevelBuilder.ExitCode.OK : ModuleLevelBuilder.ExitCode.ABORT; } @Override diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidResourcePackagingBuilder.java similarity index 97% rename from plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java rename to plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidResourcePackagingBuilder.java index 56404aa1965b..78366869bad9 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidPackagingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidResourcePackagingBuilder.java @@ -29,10 +29,10 @@ import java.util.Map; // todo: save validity states // todo: support light builds (for tests) -public class AndroidPackagingBuilder extends ModuleLevelBuilder { +public class AndroidResourcePackagingBuilder extends ModuleLevelBuilder { @NonNls private static final String BUILDER_NAME = "android-packager"; - protected AndroidPackagingBuilder() { + protected AndroidResourcePackagingBuilder() { super(BuilderCategory.PACKAGER); } diff --git a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java index 8e96574851ff..4723a54625d1 100644 --- a/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java +++ b/plugins/android/jps-plugin/src/org/jetbrains/jps/android/AndroidSourceGeneratingBuilder.java @@ -301,10 +301,14 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { final Set depLibPackagesSet = getDepLibPackages(module); depLibPackagesSet.remove(packageName); - if (!updateState(module, resPaths, manifestFile, packageName, depLibPackagesSet, storage)) { + final Set resources = collectResources(resPaths); + final Set manifestElements = collectManifestElements(manifestFile); + final AndroidAptValidityState newState = new AndroidAptValidityState(resources, manifestElements, depLibPackagesSet, packageName); + + final AndroidAptValidityState oldState = storage.getState(module.getName()); + if (newState.equalsTo(oldState)) { continue; } - final File outputDirectory = moduleData.getOutputDirectory(); final File aptOutputDirectory = new File(outputDirectory, "generated-aapt"); @@ -323,6 +327,7 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { success = false; } else { + storage.update(module.getName(), newState); JavaBuilder.addTempSourcePathRoot(context, aptOutputDirectory); } } @@ -334,25 +339,6 @@ public class AndroidSourceGeneratingBuilder extends ModuleLevelBuilder { return success; } - private static boolean updateState(@NotNull Module module, - @NotNull String[] resPaths, - @NotNull File manifestFile, - @NotNull String packageName, - @NotNull Set depLibPackagesSet, - @NotNull AndroidAptStateStorage storage) throws IOException { - - final Set resources = collectResources(resPaths); - final Set manifestElements = collectManifestElements(manifestFile); - final AndroidAptValidityState newState = new AndroidAptValidityState(resources, manifestElements, depLibPackagesSet, packageName); - - final AndroidAptValidityState oldState = storage.getState(module.getName()); - if (newState.equalsTo(oldState)) { - return false; - } - storage.update(module.getName(), newState); - return true; - } - @NotNull private static Set getDepLibPackages(@NotNull Module module) throws IOException { final Set result = new HashSet(); diff --git a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/changeBrowser/CvsCommittedChangesProvider.java b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/changeBrowser/CvsCommittedChangesProvider.java index 4857a6408dc7..99ad4dd3cff5 100644 --- a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/changeBrowser/CvsCommittedChangesProvider.java +++ b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/changeBrowser/CvsCommittedChangesProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * 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. @@ -25,10 +25,7 @@ import com.intellij.openapi.cvsIntegration.CvsResult; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; +import com.intellij.openapi.util.*; import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.actions.VcsContextFactory; import com.intellij.openapi.vcs.changes.ChangesUtil; @@ -58,11 +55,9 @@ public class CvsCommittedChangesProvider implements CachingCommittedChangesProvi private static final Logger LOG = Logger.getInstance("#com.intellij.cvsSupport2.changeBrowser.CvsCommittedChangesProvider"); private final Project myProject; - private final MyZipper myZipper; public CvsCommittedChangesProvider(Project project) { myProject = project; - myZipper = new MyZipper(); } public ChangeBrowserSettings createDefaultSettings() { @@ -74,10 +69,13 @@ public class CvsCommittedChangesProvider implements CachingCommittedChangesProvi } public VcsCommittedListsZipper getZipper() { - return myZipper; + return new MyZipper(); } private static class MyZipper extends VcsCommittedListsZipperAdapter { + private long lastNumber = 0; + private final Map numberCache = new HashMap(); + private MyZipper() { super(new GroupCreator() { public Object createKey(final RepositoryLocation location) { @@ -97,7 +95,22 @@ public class CvsCommittedChangesProvider implements CachingCommittedChangesProvi @Override public long getNumber(final CommittedChangeList list) { - return list.getCommitDate().getTime(); + final long time = list.getCommitDate().getTime(); + final Long roundedTime = Long.valueOf(time - (time % CvsChangeList.SUITABLE_DIFF)); + final CommittedChangeListKey key = new CommittedChangeListKey(list.getCommitterName(), roundedTime, list.getComment()); + final Long number = numberCache.get(key); + if (number == null) { + numberCache.put(key, Long.valueOf(lastNumber)); + return lastNumber++; + } + return number.longValue(); + } + } + + private static class CommittedChangeListKey extends Trinity { + + CommittedChangeListKey(String name, Long commitDate, String comment) { + super(name, commitDate, comment); } } diff --git a/plugins/xpath/xpath-view/src/org/intellij/plugins/xpathView/XPathAction.java b/plugins/xpath/xpath-view/src/org/intellij/plugins/xpathView/XPathAction.java index 1e87351867d8..df5cfa4b178a 100644 --- a/plugins/xpath/xpath-view/src/org/intellij/plugins/xpathView/XPathAction.java +++ b/plugins/xpath/xpath-view/src/org/intellij/plugins/xpathView/XPathAction.java @@ -44,7 +44,7 @@ public abstract class XPathAction extends AnAction { } else if (ActionPlaces.MAIN_MENU.equals(event.getPlace())) { updateMainMenu(event); } else if (ActionPlaces.EDITOR_POPUP.equals(event.getPlace())) { - updatePopupMenu(event); + presentation.setVisible(presentation.isEnabled()); } } @@ -53,22 +53,18 @@ public abstract class XPathAction extends AnAction { event.getPresentation().setVisible(b && isEnabled(event, false)); } - protected void updatePopupMenu(AnActionEvent event) { - event.getPresentation().setVisible(isEnabled(event, false)); - } - protected void updateToolbar(AnActionEvent event) { event.getPresentation().setVisible(myComponent.getConfig().SHOW_IN_TOOLBAR); } protected boolean isEnabled(AnActionEvent event, boolean checkAvailable) { - final Project project = LangDataKeys.PROJECT.getData(event.getDataContext()); + final Project project = PlatformDataKeys.PROJECT.getData(event.getDataContext()); if (project == null) { // no active project return false; } - Editor editor = LangDataKeys.EDITOR.getData(event.getDataContext()); + Editor editor = PlatformDataKeys.EDITOR.getData(event.getDataContext()); if (editor == null) { FileEditorManager fem = FileEditorManager.getInstance(project); editor = fem.getSelectedTextEditor();