diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.form b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.form index c290232b4338..f10e0c16cc56 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.form +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.form @@ -1,6 +1,6 @@
diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java index dd46393ea572..51d2bd2addf9 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java @@ -254,8 +254,9 @@ public class SelectTemplateStep extends ModuleWizardStep implements SettingsStep addField("Project \u001bformat:", myFormatPanel.getStorageFormatComboBox(), myModulePanel); } - mySplitter = new JBSplitter(false, 0.3f); + mySplitter = new JBSplitter(false, 0.3f, 0.3f, 0.6f); mySplitter.setSplitterProportionKey("select.template.proportion"); + myLeftPanel.setMinimumSize(new Dimension(200, 200)); mySplitter.setFirstComponent(myLeftPanel); mySplitter.setSecondComponent(myRightPanel); // mySettingsPanel.setVisible(false); diff --git a/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java b/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java index d0435900326f..3e925e4bd07f 100644 --- a/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java +++ b/java/idea-ui/src/com/intellij/platform/templates/RemoteTemplatesFactory.java @@ -36,6 +36,7 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.io.InputStream; +import java.io.InterruptedIOException; import java.net.HttpURLConnection; import java.util.List; import java.util.zip.ZipInputStream; @@ -66,6 +67,9 @@ public class RemoteTemplatesFactory implements ProjectTemplatesFactory { String text = StreamUtil.readText(stream); return createFromText(text); } + catch (InterruptedIOException ex) { // timeouts etc + return ProjectTemplate.EMPTY_ARRAY; + } catch (Exception e) { LOG.error(e); return ProjectTemplate.EMPTY_ARRAY; diff --git a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java index f6fe8a74680a..be62ee4d9310 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/util/duplicates/DuplicatesImpl.java @@ -112,7 +112,7 @@ public class DuplicatesImpl { if (!ApplicationManager.getApplication().isUnitTestMode()) { if ((!skipPromptWhenOne || size > 1) && (showAll.get() == null || !showAll.get())) { final String prompt = provider.getConfirmDuplicatePrompt(match); - final ReplacePromptDialog promptDialog = new ReplacePromptDialog(false, provider.getReplaceDuplicatesTitle(idx, size), project){ + final ReplacePromptDialog promptDialog = new ReplacePromptDialog(false, provider.getReplaceDuplicatesTitle(idx, size), project) { @Override protected String getMessage() { final String message = super.getMessage(); diff --git a/java/java-impl/src/resources/projectTemplates/Java/Java_Command_Line_Application.zip b/java/java-impl/src/resources/projectTemplates/Java/Command_Line_Application.zip similarity index 100% rename from java/java-impl/src/resources/projectTemplates/Java/Java_Command_Line_Application.zip rename to java/java-impl/src/resources/projectTemplates/Java/Command_Line_Application.zip diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java index ae003acaf9d9..0fbce3182562 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java @@ -355,7 +355,7 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { List extends JpsNamedCompositeEleme
return urls;
}
+ private static final Set extends JpsNamedCompositeEleme
}
}
// todo [nik] get list of extensions mapped to Archive file type from IDE settings
- else if (extension.equals("jar") || extension.equals("zip") || extension.equals("swc") || extension.equals("ane")) {
+ else if (AR_EXTENSIONS.contains(extension)) {
result.add(JpsPathUtil.getLibraryRootUrl(child));
}
}
diff --git a/platform/lang-api/src/com/intellij/find/FindManager.java b/platform/lang-api/src/com/intellij/find/FindManager.java
index 48c04f692a5c..5b05a5bf6a5e 100644
--- a/platform/lang-api/src/com/intellij/find/FindManager.java
+++ b/platform/lang-api/src/com/intellij/find/FindManager.java
@@ -66,7 +66,7 @@ public abstract class FindManager {
*
* @param model the model containing the settings of the replace operation.
* @param title the title of the dialog to show.
- * @return the exit code of the dialog, as defined by the {@link PromptResult}
+ * @return the exit code of the dialog, as defined by the {@link com.intellij.find.FindManager.PromptResult}
* interface.
*/
public abstract int showPromptDialog(FindModel model, String title);
@@ -118,6 +118,18 @@ public abstract class FindManager {
public abstract FindResult findString(@NotNull CharSequence text, int offset, @NotNull FindModel model,
@Nullable VirtualFile findContextFile);
+ /**
+ * Shows a replace prompt dialog for the bad replace operation.
+ *
+ * @param model the model containing the settings of the replace operation.
+ * @param title the title of the dialog to show.
+ * @param exception exception from {@link FindManager#getStringToReplace}
+ * @return the exit code of the dialog, as defined by the {@link PromptResult}
+ * interface. May be only {@link PromptResult.CANCEL} or {@link PromptResult.SKIP} for bad replace operation
+ */
+
+ public abstract int showMalformedReplacementPrompt(FindModel model, String title, MalformedReplacementStringException exception);
+
public static class MalformedReplacementStringException extends Exception {
public MalformedReplacementStringException(String s) {
super(s); //To change body of overridden methods use File | Settings | File Templates.
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RearrangeCodeAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RearrangeCodeAction.java
index e9e8d5b867df..e0085ba12e77 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RearrangeCodeAction.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/RearrangeCodeAction.java
@@ -15,8 +15,10 @@
*/
package com.intellij.application.options.codeStyle.arrangement.action;
+import com.intellij.lang.Language;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.components.ServiceManager;
@@ -27,6 +29,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
+import com.intellij.psi.codeStyle.arrangement.Rearranger;
import com.intellij.psi.codeStyle.arrangement.engine.ArrangementEngine;
import java.util.ArrayList;
@@ -40,6 +43,16 @@ import java.util.List;
*/
public class RearrangeCodeAction extends AnAction {
+ @Override
+ public void update(AnActionEvent e) {
+ Language language = LangDataKeys.LANGUAGE.getData(e.getDataContext());
+ boolean enabled = false;
+ if (language != null) {
+ enabled = Rearranger.EXTENSION.forLanguage(language) != null;
+ }
+ e.getPresentation().setEnabled(enabled);
+ }
+
@Override
public void actionPerformed(AnActionEvent e) {
final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java
index 5f7e8d962050..5fa073fbbb21 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchNodeComponentFactory.java
@@ -88,18 +88,21 @@ public class ArrangementMatchNodeComponentFactory {
ArrangementAnimationManager.Callback
{
- @NotNull private final StdArrangementMatchRule myRule;
+ @NotNull private final StdArrangementMatchRule myRule;
+
+ @NotNull private Object myModelValue;
private int myRow;
RemoveAtomConditionCallback(@NotNull StdArrangementMatchRule rule) {
myRule = rule;
+ myModelValue = myRule;
}
@Override
public void consume(@NotNull ArrangementAtomMatchConditionComponent component) {
ArrangementAtomMatchCondition condition = component.getMatchCondition();
ArrangementMatchingRulesModel model = myList.getModel();
- int i = getRuleIndex();
+ int i = getModelIndex();
if (i < 0) {
return;
}
@@ -108,7 +111,7 @@ public class ArrangementMatchNodeComponentFactory {
ArrangementMatchCondition existingCondition = myRule.getMatcher().getCondition();
if (existingCondition.equals(condition)) {
// We can't just remove an element at this time because that breaks last row rendering.
- model.set(i, new DummyElement());
+ model.set(i, myModelValue = new DummyElement());
}
else {
assert existingCondition instanceof ArrangementCompositeMatchCondition;
@@ -116,13 +119,15 @@ public class ArrangementMatchNodeComponentFactory {
operands.remove(condition);
if (operands.isEmpty()) {
// We can't just remove an element at this time because that breaks last row rendering.
- model.set(i, new DummyElement());
+ model.set(i, myModelValue = new DummyElement());
}
else if (operands.size() == 1) {
- model.set(i, new StdArrangementMatchRule(new StdArrangementEntryMatcher(operands.iterator().next()), myRule.getOrderType()));
+ myModelValue = new StdArrangementMatchRule(new StdArrangementEntryMatcher(operands.iterator().next()), myRule.getOrderType());
+ model.set(i, myModelValue);
}
else if (ArrangementConstants.LOG_RULE_MODIFICATION) {
LOG.info(String.format("Removed '%s' condition. Current rule state: %s", condition, myRule));
+ myModelValue = myRule;
}
}
@@ -132,37 +137,46 @@ public class ArrangementMatchNodeComponentFactory {
@Override
public void onAnimationIteration(boolean finished) {
+ refreshRow();
+ if (myRow < 0) {
+ return;
+ }
myList.repaintRows(myRow, myRow, finished);
if (!finished) {
return;
}
ArrangementMatchingRulesModel model = myList.getModel();
- boolean repaintToBottom = getRuleIndex() < 0;
- if (repaintToBottom) {
- Object removeCandidate = model.getElementAt(myRow);
- if (removeCandidate instanceof DummyElement) {
- model.removeRow(myRow);
- }
- }
-
- if (repaintToBottom && myRow < model.getSize()) {
- myList.repaintRows(myRow, model.getSize() - 1, true);
+ if (myModelValue instanceof DummyElement) {
+ model.removeRow(myRow);
}
}
- private int getRuleIndex() {
+ private void refreshRow() {
+ ArrangementMatchingRulesModel model = myList.getModel();
+ if (myRow < 0 || myRow >= model.getSize()) {
+ myRow = getModelIndex();
+ }
+ else {
+ Object o = model.getElementAt(myRow);
+ if (o != myModelValue) {
+ myRow = getModelIndex();
+ }
+ }
+ }
+
+ private int getModelIndex() {
// We can't just use model.indexOf(myRule) because there is a possible case that the model contain equal
// rules (rule1.equals(rule2) == true). That's why we have a helper method for search by reference identity.
ArrangementMatchingRulesModel model = myList.getModel();
for (int i = 0, max = model.getSize(); i < max; i++) {
- if (model.getElementAt(i) == myRule) {
+ if (model.getElementAt(i) == myModelValue) {
return i;
}
}
return -1;
}
}
-
+
private static class DummyElement {
@Override
public String toString() {
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java
index 166d67d9ab2d..8e93abd2c212 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java
@@ -421,17 +421,19 @@ public class ArrangementMatchingRulesControl extends JBTable {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+ if (isEditing() && getEditingRow() == row) {
+ return EMPTY_RENDERER;
+ }
if (value instanceof ArrangementRepresentationAware) {
return ((ArrangementRepresentationAware)value).getComponent();
}
- if (!(value instanceof StdArrangementMatchRule)) {
- return EMPTY_RENDERER;
- }
-
- StdArrangementMatchRule rule = (StdArrangementMatchRule)value;
ArrangementListRowDecorator component = myComponents.get(row);
if (component == null) {
+ if (!(value instanceof StdArrangementMatchRule)) {
+ return EMPTY_RENDERER;
+ }
+ StdArrangementMatchRule rule = (StdArrangementMatchRule)value;
ArrangementMatchConditionComponent ruleComponent = myFactory.getComponent(rule.getMatcher().getCondition(), rule, true);
component = new ArrangementListRowDecorator(ruleComponent, ArrangementMatchingRulesControl.this);
myComponents.set(row, component);
@@ -441,7 +443,9 @@ public class ArrangementMatchingRulesControl extends JBTable {
component.setRowIndex((myEditorRow >= 0 && row > myEditorRow) ? row : row + 1);
component.setSelected(getSelectionModel().isSelectedIndex(row) || (myEditorRow >= 0 && row == myEditorRow - 1));
component.setBeingEdited(myEditorRow >= 0 && myEditorRow == row + 1);
- component.setShowSortIcon(rule.getOrderType() == ArrangementEntryOrderType.BY_NAME);
+ boolean showSortIcon = value instanceof StdArrangementMatchRule
+ && ((StdArrangementMatchRule)value).getOrderType() == ArrangementEntryOrderType.BY_NAME;
+ component.setShowSortIcon(showSortIcon);
return component.getUiComponent();
}
}
diff --git a/platform/lang-impl/src/com/intellij/find/FindUtil.java b/platform/lang-impl/src/com/intellij/find/FindUtil.java
index 97aea5aa553b..9c4655703812 100644
--- a/platform/lang-impl/src/com/intellij/find/FindUtil.java
+++ b/platform/lang-impl/src/com/intellij/find/FindUtil.java
@@ -638,7 +638,7 @@ public class FindUtil {
}
}
- ReplaceInProjectManager.reportNumberReplacedOccurences(project, occurrences);
+ ReplaceInProjectManager.reportNumberReplacedOccurrences(project, occurrences);
return replaced;
}
diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java
index 88865cb426a8..ce99e3143b23 100644
--- a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java
+++ b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java
@@ -155,7 +155,11 @@ public class FindManagerImpl extends FindManager implements PersistentStateCompo
@Override
public int showPromptDialog(final FindModel model, String title) {
- ReplacePromptDialog replacePromptDialog = new ReplacePromptDialog(model.isMultipleFiles(), title, myProject) {
+ return showPromptDialogImpl(model, title, null);
+ }
+
+ public int showPromptDialogImpl(final FindModel model, String title, @Nullable final MalformedReplacementStringException exception) {
+ ReplacePromptDialog replacePromptDialog = new ReplacePromptDialog(model.isMultipleFiles(), title, myProject, exception) {
@Override
@Nullable
public Point getInitialLocation() {
@@ -313,6 +317,11 @@ public class FindManagerImpl extends FindManager implements PersistentStateCompo
}
}
+ @Override
+ public int showMalformedReplacementPrompt(FindModel model, String title, MalformedReplacementStringException exception) {
+ return showPromptDialogImpl(model, title, exception);
+ }
+
@Override
public FindModel getPreviousFindModel() {
return myPreviousFindModel;
@@ -626,10 +635,14 @@ public class FindManagerImpl extends FindManager implements PersistentStateCompo
return replaced.substring(matcher.start());
}
catch (Exception e) {
- throw new MalformedReplacementStringException(FindBundle.message("find.replace.invalid.replacement.string", model.getStringToReplace()), e);
+ throw createMalformedReplacementException(model, e);
}
}
+ private static MalformedReplacementStringException createMalformedReplacementException(FindModel model, Exception e) {
+ return new MalformedReplacementStringException(FindBundle.message("find.replace.invalid.replacement.string", model.getStringToReplace()), e);
+ }
+
private static String getStringToReplaceByRegexp0(String foundString, final FindModel model) throws MalformedReplacementStringException{
String toFind = model.getStringToFind();
String toReplace = model.getStringToReplace();
@@ -651,7 +664,7 @@ public class FindManagerImpl extends FindManager implements PersistentStateCompo
return matcher.replaceAll(StringUtil.unescapeStringCharacters(toReplace));
}
catch (Exception e) {
- throw new MalformedReplacementStringException(FindBundle.message("find.replace.invalid.replacement.string", model.getStringToReplace()), e);
+ throw createMalformedReplacementException(model, e);
}
}
else {
diff --git a/platform/lang-impl/src/com/intellij/find/replaceInProject/ReplaceInProjectManager.java b/platform/lang-impl/src/com/intellij/find/replaceInProject/ReplaceInProjectManager.java
index ab0e59bf4b6c..c5976f3e73bd 100644
--- a/platform/lang-impl/src/com/intellij/find/replaceInProject/ReplaceInProjectManager.java
+++ b/platform/lang-impl/src/com/intellij/find/replaceInProject/ReplaceInProjectManager.java
@@ -19,6 +19,7 @@ package com.intellij.find.replaceInProject;
import com.intellij.find.*;
import com.intellij.find.findInProject.FindInProjectManager;
import com.intellij.find.impl.FindInProjectUtil;
+import com.intellij.notification.NotificationGroup;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationManager;
@@ -27,14 +28,17 @@ import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Factory;
+import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.Segment;
import com.intellij.openapi.vfs.ReadonlyStatusHandler;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.StatusBar;
+import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
@@ -47,12 +51,11 @@ import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
public class ReplaceInProjectManager {
+ static final NotificationGroup NOTIFICATION_GROUP = NotificationGroup.toolWindowGroup("FindInPath", ToolWindowId.FIND, false);
+
private final Project myProject;
private boolean myIsFindInProgress = false;
@@ -214,7 +217,16 @@ public class ReplaceInProjectManager {
CommandProcessor.getInstance()
.executeCommand(myProject, selectOnEditorRunnable, FindBundle.message("find.replace.select.on.editor.command"), null);
String title = FindBundle.message("find.replace.found.usage.title", i + 1, usages.length);
- int result = FindManager.getInstance(myProject).showPromptDialog(replaceContext.getFindModel(), title);
+
+ int result;
+ try {
+ doReplace(usage, replaceContext.getFindModel(), replaceContext.getExcludedSet(), true);
+ result = FindManager.getInstance(myProject).showPromptDialog(replaceContext.getFindModel(), title);
+ }
+ catch (FindManager.MalformedReplacementStringException e) {
+ markAsMalformedReplacement(replaceContext, usage);
+ result = FindManager.getInstance(myProject).showMalformedReplacementPrompt(replaceContext.getFindModel(), title, e);
+ }
if (result == FindManager.PromptResult.CANCEL) {
return;
@@ -225,16 +237,15 @@ public class ReplaceInProjectManager {
final int currentNumber = i;
if (result == FindManager.PromptResult.OK) {
+ final Ref