mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
+6
-2
@@ -126,8 +126,7 @@ public class StringLiteralCopyPasteProcessor implements CopyPastePreProcessor {
|
||||
if (rawText != null && rawText.rawText != null) return rawText.rawText; // Copied from the string literal. Copy as is.
|
||||
|
||||
StringBuilder buffer = new StringBuilder(text.length());
|
||||
CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(project);
|
||||
@NonNls String breaker = codeStyleSettings.BINARY_OPERATION_SIGN_ON_NEXT_LINE ? "\\n\"\n+ \"" : "\\n\" +\n\"";
|
||||
@NonNls String breaker = getLineBreaker(token);
|
||||
final String[] lines = LineTokenizer.tokenize(text.toCharArray(), false, true);
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
String line = lines[i];
|
||||
@@ -143,6 +142,11 @@ public class StringLiteralCopyPasteProcessor implements CopyPastePreProcessor {
|
||||
return text;
|
||||
}
|
||||
|
||||
protected String getLineBreaker(PsiElement token) {
|
||||
CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(token.getProject());
|
||||
return codeStyleSettings.BINARY_OPERATION_SIGN_ON_NEXT_LINE ? "\\n\"\n+ \"" : "\\n\" +\n\"";
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private PsiElement findLiteralTokenType(PsiFile file, int selectionStart, int selectionEnd) {
|
||||
final PsiElement elementAtSelectionStart = file.findElementAt(selectionStart);
|
||||
|
||||
@@ -109,7 +109,7 @@ public class DiffApplication implements ApplicationStarterEx {
|
||||
|
||||
final DirDiffSettings settings = new DirDiffSettings();
|
||||
settings.showInFrame = false;
|
||||
diffManager.showDiff(d1, d2, settings);
|
||||
diffManager.showDiff(d1, d2, settings, null);
|
||||
} else {
|
||||
SimpleDiffRequest request = SimpleDiffRequest.compareFiles(file1, file2, null);
|
||||
request.addHint(DiffTool.HINT_SHOW_MODAL_DIALOG);
|
||||
|
||||
@@ -22,6 +22,8 @@ import com.intellij.openapi.project.Project;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.awt.event.WindowListener;
|
||||
|
||||
/**
|
||||
* @author Konstantin Bulenkov
|
||||
*/
|
||||
@@ -30,7 +32,7 @@ public abstract class DirDiffManager {
|
||||
return ServiceManager.getService(project, DirDiffManager.class);
|
||||
}
|
||||
|
||||
public abstract void showDiff(@NotNull DiffElement dir1, @NotNull DiffElement dir2, DirDiffSettings settings);
|
||||
public abstract void showDiff(@NotNull DiffElement dir1, @NotNull DiffElement dir2, DirDiffSettings settings, WindowListener windowListener);
|
||||
|
||||
public abstract boolean canShow(@NotNull DiffElement dir1, @NotNull DiffElement dir2);
|
||||
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ public class CompareDirectoriesAction extends AnAction {
|
||||
}
|
||||
final DirDiffManager mgr = DirDiffManager.getInstance(project);
|
||||
if (src != null && trg != null && mgr.canShow(src, trg)) {
|
||||
mgr.showDiff(src, trg, new DirDiffSettings());
|
||||
mgr.showDiff(src, trg, new DirDiffSettings(), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ public class CompareJarsAction extends AnAction {
|
||||
}
|
||||
final DirDiffManager mgr = DirDiffManager.getInstance(project);
|
||||
if (src != null && trg != null && mgr.canShow(src, trg)) {
|
||||
mgr.showDiff(src, trg, new DirDiffSettings());
|
||||
mgr.showDiff(src, trg, new DirDiffSettings(), null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -282,7 +282,7 @@ public class MacMessagesImpl extends MacMessages {
|
||||
IdeFocusManager.getGlobalInstance().setTypeaheadEnabled(false);
|
||||
|
||||
invoke(delegate, "performSelectorOnMainThread:withObject:waitUntilDone:",
|
||||
Foundation.createSelector("showVariableButtonsSheet:"), paramsArray, true);
|
||||
Foundation.createSelector("showVariableButtonsSheet:"), paramsArray, false);
|
||||
}
|
||||
finally {
|
||||
invoke(pool, "release");
|
||||
@@ -443,7 +443,7 @@ public class MacMessagesImpl extends MacMessages {
|
||||
IdeFocusManager.getGlobalInstance().setTypeaheadEnabled(false);
|
||||
|
||||
invoke(delegate, "performSelectorOnMainThread:withObject:waitUntilDone:",
|
||||
Foundation.createSelector("showSheet:"), paramsArray, true);
|
||||
Foundation.createSelector("showSheet:"), paramsArray, false);
|
||||
}
|
||||
finally {
|
||||
invoke(pool, "release");
|
||||
|
||||
@@ -24,6 +24,9 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.JarFileSystem;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.awt.event.WindowListener;
|
||||
|
||||
/**
|
||||
* @author Konstantin Bulenkov
|
||||
@@ -36,15 +39,25 @@ public class DirDiffManagerImpl extends DirDiffManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showDiff(@NotNull final DiffElement dir1, @NotNull final DiffElement dir2, final DirDiffSettings settings) {
|
||||
public void showDiff(@NotNull final DiffElement dir1,
|
||||
@NotNull final DiffElement dir2,
|
||||
final DirDiffSettings settings,
|
||||
@Nullable WindowListener windowListener) {
|
||||
final DirDiffTableModel model = new DirDiffTableModel(myProject, dir1, dir2, settings);
|
||||
if (settings.showInFrame) {
|
||||
new DirDiffFrame(myProject, model).show();
|
||||
DirDiffFrame frame = new DirDiffFrame(myProject, model);
|
||||
if (windowListener != null) {
|
||||
frame.getFrame().addWindowListener(windowListener);
|
||||
}
|
||||
frame.show();
|
||||
} else {
|
||||
final DirDiffDialog dirDiffDialog = new DirDiffDialog(myProject, model);
|
||||
if (myProject == null || myProject.isDefault()) {
|
||||
dirDiffDialog.setModal(true);
|
||||
}
|
||||
if (windowListener != null) {
|
||||
dirDiffDialog.getOwner().addWindowListener(windowListener);
|
||||
}
|
||||
dirDiffDialog.show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,9 +182,9 @@ public class DirDiffPanel implements Disposable {
|
||||
column.setMinWidth(120);
|
||||
}
|
||||
}
|
||||
final DirDiffToolbarActions actions = new DirDiffToolbarActions(myModel, this.getPanel());
|
||||
final DirDiffToolbarActions actions = new DirDiffToolbarActions(myModel, myDiffPanel);
|
||||
final ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar("DirDiff", actions, true);
|
||||
registerCustomShortcuts(actions, myRootPanel);
|
||||
registerCustomShortcuts(actions, myTable);
|
||||
myToolBarPanel.add(toolbar.getComponent(), BorderLayout.CENTER);
|
||||
final JBLoadingPanel loadingPanel = new JBLoadingPanel(new BorderLayout(), wnd.getDisposable());
|
||||
loadingPanel.add(myComponent, BorderLayout.CENTER);
|
||||
@@ -350,10 +350,14 @@ public class DirDiffPanel implements Disposable {
|
||||
myDiffPanel.repaint();
|
||||
}
|
||||
|
||||
private void registerCustomShortcuts(DirDiffToolbarActions actions, JPanel rootPanel) {
|
||||
final ActionManager mgr = ActionManager.getInstance();
|
||||
private void registerCustomShortcuts(DirDiffToolbarActions actions, JComponent component) {
|
||||
for (AnAction action : actions.getChildren(null)) {
|
||||
|
||||
if (action instanceof ShortcutProvider) {
|
||||
final ShortcutSet shortcut = ((ShortcutProvider)action).getShortcut();
|
||||
if (shortcut != null) {
|
||||
action.registerCustomShortcutSet(shortcut, component);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ import javax.swing.table.AbstractTableModel;
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
@@ -62,7 +63,7 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
private DiffElement mySrc;
|
||||
private DiffElement myTrg;
|
||||
private DTree myTree;
|
||||
private final List<DirDiffElement> myElements = new ArrayList<DirDiffElement>();
|
||||
private final List<DirDiffElement> myElements = Collections.synchronizedList(new ArrayList<DirDiffElement>());
|
||||
private final AtomicBoolean myUpdating = new AtomicBoolean(false);
|
||||
private JBTable myTable;
|
||||
public String DECORATOR = "DIFF_TABLE_DECORATOR";
|
||||
@@ -90,58 +91,65 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
public void applyRemove() {
|
||||
final List<DirDiffElement> selectedElements = getSelectedElements();
|
||||
myUpdating.set(true);
|
||||
final Iterator<DirDiffElement> i = myElements.iterator();
|
||||
while(i.hasNext()) {
|
||||
final DType type = i.next().getType();
|
||||
switch (type) {
|
||||
case SOURCE:
|
||||
if (!mySettings.showNewOnSource) i.remove();
|
||||
break;
|
||||
case TARGET:
|
||||
if (!mySettings.showNewOnTarget) i.remove();
|
||||
break;
|
||||
case SEPARATOR:
|
||||
break;
|
||||
case CHANGED:
|
||||
if (!mySettings.showDifferent) i.remove();
|
||||
break;
|
||||
case EQUAL:
|
||||
if (!mySettings.showEqual) i.remove();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
boolean sep = true;
|
||||
for (int j = myElements.size() - 1; j >= 0; j--) {
|
||||
if (myElements.get(j).isSeparator()) {
|
||||
if (sep) {
|
||||
myElements.remove(j);
|
||||
} else {
|
||||
sep = true;
|
||||
synchronized (myElements) {
|
||||
final Iterator<DirDiffElement> i = myElements.iterator();
|
||||
while(i.hasNext()) {
|
||||
final DType type = i.next().getType();
|
||||
switch (type) {
|
||||
case SOURCE:
|
||||
if (!mySettings.showNewOnSource) i.remove();
|
||||
break;
|
||||
case TARGET:
|
||||
if (!mySettings.showNewOnTarget) i.remove();
|
||||
break;
|
||||
case SEPARATOR:
|
||||
break;
|
||||
case CHANGED:
|
||||
if (!mySettings.showDifferent) i.remove();
|
||||
break;
|
||||
case EQUAL:
|
||||
if (!mySettings.showEqual) i.remove();
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
sep = false;
|
||||
}
|
||||
|
||||
boolean sep = true;
|
||||
for (int j = myElements.size() - 1; j >= 0; j--) {
|
||||
if (myElements.get(j).isSeparator()) {
|
||||
if (sep) {
|
||||
myElements.remove(j);
|
||||
}
|
||||
else {
|
||||
sep = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
sep = false;
|
||||
}
|
||||
}
|
||||
fireTableDataChanged();
|
||||
myUpdating.set(false);
|
||||
int index;
|
||||
if (!selectedElements.isEmpty() && (index = myElements.indexOf(selectedElements.get(0))) != -1) {
|
||||
myTable.getSelectionModel().setSelectionInterval(index, index);
|
||||
TableUtil.scrollSelectionToVisible(myTable);
|
||||
}
|
||||
else {
|
||||
selectFirstRow();
|
||||
}
|
||||
myPanel.focusTable();
|
||||
myPanel.update(true);
|
||||
}
|
||||
fireTableDataChanged();
|
||||
myUpdating.set(false);
|
||||
int index;
|
||||
if (!selectedElements.isEmpty() && (index = myElements.indexOf(selectedElements.get(0))) != -1) {
|
||||
myTable.getSelectionModel().setSelectionInterval(index, index);
|
||||
TableUtil.scrollSelectionToVisible(myTable);
|
||||
} else {
|
||||
selectFirstRow();
|
||||
}
|
||||
myPanel.focusTable();
|
||||
myPanel.update(true);
|
||||
}
|
||||
|
||||
public void selectFirstRow() {
|
||||
if (myElements.size() > 0) {
|
||||
int row = myElements.get(0).isSeparator() ? 1 : 0;
|
||||
if (row < myTable.getRowCount()) {
|
||||
myTable.getSelectionModel().setSelectionInterval(row, row);
|
||||
TableUtil.scrollSelectionToVisible(myTable);
|
||||
synchronized (myElements) {
|
||||
if (myElements.size() > 0) {
|
||||
int row = myElements.get(0).isSeparator() ? 1 : 0;
|
||||
if (row < myTable.getRowCount()) {
|
||||
myTable.getSelectionModel().setSelectionInterval(row, row);
|
||||
TableUtil.scrollSelectionToVisible(myTable);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -167,11 +175,14 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
String right;
|
||||
if (text == null) {
|
||||
right = EMPTY_STRING;
|
||||
} else if (text.length() == LEN) {
|
||||
}
|
||||
else if (text.length() == LEN) {
|
||||
right = text;
|
||||
} else if (text.length() < LEN) {
|
||||
}
|
||||
else if (text.length() < LEN) {
|
||||
right = text + EMPTY_STRING.substring(0, LEN - text.length());
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
right = "..." + text.substring(text.length() - LEN + 2);
|
||||
}
|
||||
return "Loading... " + right;
|
||||
@@ -267,20 +278,22 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
fillElements(myTree, elements);
|
||||
final Runnable uiThread = new Runnable() {
|
||||
public void run() {
|
||||
clear();
|
||||
myElements.addAll(elements);
|
||||
myUpdating.set(false);
|
||||
fireTableDataChanged();
|
||||
DirDiffTableModel.this.text.set("");
|
||||
if (loadingPanel.isLoading()) {
|
||||
loadingPanel.stopLoading();
|
||||
synchronized (myElements) {
|
||||
clear();
|
||||
myElements.addAll(elements);
|
||||
myUpdating.set(false);
|
||||
fireTableDataChanged();
|
||||
DirDiffTableModel.this.text.set("");
|
||||
if (loadingPanel.isLoading()) {
|
||||
loadingPanel.stopLoading();
|
||||
}
|
||||
if (mySelectionConfig == null) {
|
||||
selectFirstRow();
|
||||
} else {
|
||||
mySelectionConfig.restore();
|
||||
}
|
||||
myPanel.update(true);
|
||||
}
|
||||
if (mySelectionConfig == null) {
|
||||
selectFirstRow();
|
||||
} else {
|
||||
mySelectionConfig.restore();
|
||||
}
|
||||
myPanel.update(true);
|
||||
}
|
||||
};
|
||||
if (myProject.isDefault()) {
|
||||
@@ -328,10 +341,12 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
if (!myElements.isEmpty()) {
|
||||
final int size = myElements.size();
|
||||
myElements.clear();
|
||||
fireTableRowsDeleted(0, size - 1);
|
||||
synchronized (myElements) {
|
||||
if (!myElements.isEmpty()) {
|
||||
final int size = myElements.size();
|
||||
myElements.clear();
|
||||
fireTableRowsDeleted(0, size - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -354,7 +369,9 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
|
||||
@Nullable
|
||||
public DirDiffElement getElementAt(int index) {
|
||||
return 0 <= index && index < myElements.size() ? myElements.get(index) : null;
|
||||
synchronized (myElements) {
|
||||
return 0 <= index && index < myElements.size() ? myElements.get(index) : null;
|
||||
}
|
||||
}
|
||||
|
||||
public DiffElement getSourceDir() {
|
||||
@@ -508,6 +525,7 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
Runnable onFinish = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
if (!Disposer.isDisposed(DirDiffTableModel.this)) {
|
||||
DiffElement newElement = diff.get();
|
||||
refreshElementAfterCopyTo(newElement, element);
|
||||
@@ -534,16 +552,18 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
|
||||
private void refreshElementAfterCopyTo(DiffElement newElement, DirDiffElement element) {
|
||||
if (newElement != null) {
|
||||
final DTree node = element.getNode();
|
||||
final int row = myElements.indexOf(element);
|
||||
if (getSettings().showEqual) {
|
||||
node.setType(DType.EQUAL);
|
||||
node.setTarget(newElement);
|
||||
element.updateSourceFromTarget(newElement);
|
||||
fireTableRowsUpdated(row, row);
|
||||
}
|
||||
else {
|
||||
removeElement(element);
|
||||
synchronized (myElements) {
|
||||
final DTree node = element.getNode();
|
||||
final int row = myElements.indexOf(element);
|
||||
if (getSettings().showEqual) {
|
||||
node.setType(DType.EQUAL);
|
||||
node.setTarget(newElement);
|
||||
element.updateSourceFromTarget(newElement);
|
||||
fireTableRowsUpdated(row, row);
|
||||
}
|
||||
else {
|
||||
removeElement(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -559,6 +579,7 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
Runnable onFinish = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
if (!Disposer.isDisposed(DirDiffTableModel.this)) {
|
||||
refreshElementAfterCopyFrom(element, diff.get());
|
||||
if (!errorMessage.isNull()) {
|
||||
@@ -585,40 +606,45 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
private void refreshElementAfterCopyFrom(DirDiffElement element, DiffElement newElement) {
|
||||
if (newElement != null) {
|
||||
final DTree node = element.getNode();
|
||||
final int row = myElements.indexOf(element);
|
||||
if (getSettings().showEqual) {
|
||||
node.setType(DType.EQUAL);
|
||||
node.setSource(newElement);
|
||||
element.updateTargetFromSource(newElement);
|
||||
fireTableRowsUpdated(row, row);
|
||||
}
|
||||
else {
|
||||
removeElement(element);
|
||||
synchronized (myElements) {
|
||||
final int row = myElements.indexOf(element);
|
||||
if (getSettings().showEqual) {
|
||||
node.setType(DType.EQUAL);
|
||||
node.setSource(newElement);
|
||||
element.updateTargetFromSource(newElement);
|
||||
fireTableRowsUpdated(row, row);
|
||||
}
|
||||
else {
|
||||
removeElement(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void removeElement(DirDiffElement element) {
|
||||
int row = myElements.indexOf(element);
|
||||
if (row != -1) {
|
||||
final DTree node = element.getNode();
|
||||
final DTree parentNode = element.getParentNode();
|
||||
parentNode.remove(node);
|
||||
myElements.remove(row);
|
||||
int start = row;
|
||||
synchronized (myElements) {
|
||||
int row = myElements.indexOf(element);
|
||||
if (row != -1) {
|
||||
final DTree node = element.getNode();
|
||||
final DTree parentNode = element.getParentNode();
|
||||
parentNode.remove(node);
|
||||
myElements.remove(row);
|
||||
int start = row;
|
||||
|
||||
if (row > 0 && row == myElements.size() && myElements.get(row - 1).isSeparator()) {
|
||||
final DirDiffElement el = myElements.get(row - 1);
|
||||
el.getParentNode().remove(el.getNode());
|
||||
myElements.remove(row - 1);
|
||||
start = row - 1;
|
||||
} else if (row != myElements.size() && myElements.get(row).isSeparator() && row > 0 && myElements.get(row - 1).isSeparator()) {
|
||||
final DirDiffElement el = myElements.get(row - 1);
|
||||
el.getParentNode().remove(el.getNode());
|
||||
myElements.remove(row - 1);
|
||||
start = row - 1;
|
||||
if (row > 0 && row == myElements.size() && myElements.get(row - 1).isSeparator()) {
|
||||
final DirDiffElement el = myElements.get(row - 1);
|
||||
el.getParentNode().remove(el.getNode());
|
||||
myElements.remove(row - 1);
|
||||
start = row - 1;
|
||||
}
|
||||
else if (row != myElements.size() && myElements.get(row).isSeparator() && row > 0 && myElements.get(row - 1).isSeparator()) {
|
||||
final DirDiffElement el = myElements.get(row - 1);
|
||||
el.getParentNode().remove(el.getNode());
|
||||
myElements.remove(row - 1);
|
||||
start = row - 1;
|
||||
}
|
||||
fireTableRowsDeleted(start, row);
|
||||
}
|
||||
fireTableRowsDeleted(start, row);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -636,8 +662,10 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
reportException(errorMessage.get());
|
||||
}
|
||||
else {
|
||||
if (myElements.indexOf(element) != -1) {
|
||||
removeElement(element);
|
||||
synchronized (myElements) {
|
||||
if (myElements.indexOf(element) != -1) {
|
||||
removeElement(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -651,8 +679,10 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (myElements.indexOf(element) != -1) {
|
||||
removeElement(element);
|
||||
synchronized (myElements) {
|
||||
if (myElements.indexOf(element) != -1) {
|
||||
removeElement(element);
|
||||
}
|
||||
}
|
||||
final AccessToken token = ApplicationManager.getApplication().acquireWriteActionLock(getClass());
|
||||
try {
|
||||
@@ -670,12 +700,14 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
}
|
||||
|
||||
public void synchronizeSelected() {
|
||||
rememberSelection();
|
||||
for (DirDiffElement element : getSelectedElements()) {
|
||||
syncElement(element);
|
||||
synchronized (myElements) {
|
||||
rememberSelection();
|
||||
for (DirDiffElement element : getSelectedElements()) {
|
||||
syncElement(element);
|
||||
}
|
||||
restoreSelection();
|
||||
}
|
||||
restoreSelection();
|
||||
}
|
||||
}
|
||||
|
||||
private void restoreSelection() {
|
||||
if (mySelectionConfig != null) {
|
||||
@@ -684,10 +716,12 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode
|
||||
}
|
||||
|
||||
public void synchronizeAll() {
|
||||
for (DirDiffElement element : getElements()) {
|
||||
syncElement(element);
|
||||
synchronized (myElements) {
|
||||
for (DirDiffElement element : myElements) {
|
||||
syncElement(element);
|
||||
}
|
||||
selectFirstRow();
|
||||
}
|
||||
selectFirstRow();
|
||||
}
|
||||
|
||||
private void syncElement(DirDiffElement element) {
|
||||
|
||||
+14
-2
@@ -327,8 +327,20 @@ public class ShelveChangesManager implements ProjectComponent, JDOMExternalizabl
|
||||
if (defaultPath.length() == 0) {
|
||||
defaultPath = "unnamed";
|
||||
}
|
||||
return FileUtil.findSequentNonexistentFile(file, defaultPath,
|
||||
extension == null ? VcsConfiguration.getInstance(project).getPatchFileExtension() : extension);
|
||||
if (defaultPath.length() > (PatchNameChecker.MAX - 10)) {
|
||||
defaultPath = defaultPath.substring(0, PatchNameChecker.MAX - 10);
|
||||
}
|
||||
while (true) {
|
||||
final File nonexistentFile = FileUtil.findSequentNonexistentFile(file, defaultPath,
|
||||
extension == null
|
||||
? VcsConfiguration.getInstance(project).getPatchFileExtension()
|
||||
: extension);
|
||||
if (nonexistentFile.getName().length() >= PatchNameChecker.MAX) {
|
||||
defaultPath = defaultPath.substring(0, defaultPath.length() - 1);
|
||||
continue;
|
||||
}
|
||||
return nonexistentFile;
|
||||
}
|
||||
}
|
||||
|
||||
public void unshelveChangeList(final ShelvedChangeList changeList, @Nullable final List<ShelvedChange> changes,
|
||||
|
||||
+1
-1
@@ -80,7 +80,7 @@ public class ChangesBrowserFilePathNode extends ChangesBrowserNode<FilePath> {
|
||||
}
|
||||
|
||||
public static String getRelativePath(FilePath parent, FilePath child) {
|
||||
if (parent == null) return child.getPath().replace('/', File.separatorChar);
|
||||
if (parent == null || ! child.getPath().startsWith(parent.getPath())) return child.getPath().replace('/', File.separatorChar);
|
||||
final String parentPath = parent.getPath();
|
||||
final int beginOffset = (parentPath.length() == 1 && '/' == parentPath.charAt(0)) ? 0 : 1; // IDEADEV-35767
|
||||
return child.getPath().substring(parent.getPath().length() + beginOffset).replace('/', File.separatorChar);
|
||||
|
||||
@@ -19,6 +19,7 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Computable;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.openapi.util.Trinity;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vcs.FilePath;
|
||||
import com.intellij.openapi.vcs.FilePathImpl;
|
||||
import com.intellij.openapi.vcs.FileStatus;
|
||||
@@ -283,7 +284,10 @@ public class TreeModelBuilder {
|
||||
for (FilePath file : filePaths) {
|
||||
assert file != null;
|
||||
// whether a folder does not matter
|
||||
final StaticFilePath pathKey = new StaticFilePath(false, new File(file.getIOFile().getPath().replace('\\', '/')).getAbsolutePath(), file.getVirtualFile());
|
||||
final String path = file.getPath();
|
||||
final StaticFilePath pathKey = (! FileUtil.isAbsolute(path) || VcsUtil.isPathRemote(path)) ?
|
||||
new StaticFilePath(false, path, null) :
|
||||
new StaticFilePath(false, new File(file.getIOFile().getPath().replace('\\', '/')).getAbsolutePath(), file.getVirtualFile());
|
||||
ChangesBrowserNode oldNode = myFoldersCache.get(pathKey.getKey());
|
||||
if (oldNode == null) {
|
||||
final ChangesBrowserNode node = ChangesBrowserNode.create(myProject, file);
|
||||
@@ -437,7 +441,8 @@ public class TreeModelBuilder {
|
||||
}
|
||||
|
||||
private static StaticFilePath staticFrom(final FilePath fp) {
|
||||
if (fp.isNonLocal() && VcsUtil.isPathRemote(fp.getPath())) {
|
||||
final String path = fp.getPath();
|
||||
if (fp.isNonLocal() && (! FileUtil.isAbsolute(path) || VcsUtil.isPathRemote(path))) {
|
||||
return new StaticFilePath(fp.isDirectory(), fp.getIOFile().getPath().replace('\\', '/'), fp.getVirtualFile());
|
||||
}
|
||||
return new StaticFilePath(fp.isDirectory(), new File(fp.getIOFile().getPath().replace('\\', '/')).getAbsolutePath(), fp.getVirtualFile());
|
||||
|
||||
+19
@@ -39,6 +39,25 @@ public class GroovyLiteralCopyPasteProcessor extends StringLiteralCopyPasteProce
|
||||
return TokenSets.STRING_LITERALS.contains(token.getNode().getElementType());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getLineBreaker(PsiElement token) {
|
||||
final String text = token.getText();
|
||||
if (text.contains("'''") || text.contains("\"\"\"")) {
|
||||
return "\n";
|
||||
}
|
||||
|
||||
final IElementType type = token.getNode().getElementType();
|
||||
if (type == mGSTRING_LITERAL || type == mGSTRING_CONTENT) {
|
||||
return super.getLineBreaker(token);
|
||||
}
|
||||
if (type == mSTRING_LITERAL) {
|
||||
return super.getLineBreaker(token).replace('"', '\'');
|
||||
}
|
||||
|
||||
return "\n";
|
||||
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected String escapeCharCharacters(@NotNull String s, @NotNull PsiElement token) {
|
||||
|
||||
@@ -78,4 +78,28 @@ class GroovyCopyPasteTest extends LightCodeInsightFixtureTestCase {
|
||||
Foo f'''
|
||||
}
|
||||
|
||||
public void testPasteMultilineIntoMultilineGString() throws Exception {
|
||||
myFixture.configureByText 'a.txt', '<selection>a/b\nc/d</selection>'
|
||||
myFixture.performEditorAction IdeActions.ACTION_COPY
|
||||
myFixture.configureByText 'b.groovy', 'def x = """smth<caret>"""'
|
||||
myFixture.performEditorAction IdeActions.ACTION_PASTE
|
||||
myFixture.checkResult 'def x = """smtha/b\nc/d<caret>"""'
|
||||
}
|
||||
|
||||
public void testPasteMultilineIntoString() throws Exception {
|
||||
myFixture.configureByText 'a.txt', '<selection>a\nd</selection>'
|
||||
myFixture.performEditorAction IdeActions.ACTION_COPY
|
||||
myFixture.configureByText 'b.groovy', "def x = 'smth<caret>'"
|
||||
myFixture.performEditorAction IdeActions.ACTION_PASTE
|
||||
myFixture.checkResult "def x = 'smtha\\n' +\n 'd<caret>'"
|
||||
}
|
||||
|
||||
public void testPasteMultilineIntoGString() throws Exception {
|
||||
myFixture.configureByText 'a.txt', '<selection>a\nd</selection>'
|
||||
myFixture.performEditorAction IdeActions.ACTION_COPY
|
||||
myFixture.configureByText 'b.groovy', 'def x = "smth<caret>"'
|
||||
myFixture.performEditorAction IdeActions.ACTION_PASTE
|
||||
myFixture.checkResult 'def x = "smtha\\n" +\n "d<caret>"'
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package org.jetbrains.idea.svn.history;
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.openapi.vcs.ConcurrentTasks;
|
||||
@@ -28,6 +29,7 @@ import org.tmatesoft.svn.core.wc.SVNRevision;
|
||||
import java.util.Map;
|
||||
|
||||
public class FirstInBranch implements Runnable {
|
||||
private final static Logger LOG = Logger.getInstance("#org.jetbrains.idea.svn.history.FirstInBranch");
|
||||
private final SvnVcs myVcs;
|
||||
private final String myFullBranchUrl;
|
||||
private final String myFullTrunkUrl;
|
||||
@@ -36,6 +38,10 @@ public class FirstInBranch implements Runnable {
|
||||
private final Consumer<CopyData> myConsumer;
|
||||
|
||||
public FirstInBranch(final SvnVcs vcs, final String repositoryRoot, final String branchUrl, final String trunkUrl, final Consumer<CopyData> consumer) {
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("FirstInBranch created with: repoRoot: " + repositoryRoot + " branchUrl: " + branchUrl +
|
||||
" trunkUrl: " + trunkUrl);
|
||||
}
|
||||
myVcs = vcs;
|
||||
myConsumer = consumer;
|
||||
|
||||
@@ -58,6 +64,7 @@ public class FirstInBranch implements Runnable {
|
||||
trunkURL = SVNURL.parseURIEncoded(myFullTrunkUrl);
|
||||
}
|
||||
catch (SVNException e) {
|
||||
LOG.info(e);
|
||||
myConsumer.consume(null);
|
||||
return;
|
||||
}
|
||||
@@ -86,7 +93,7 @@ public class FirstInBranch implements Runnable {
|
||||
}
|
||||
});
|
||||
} catch (SVNException e) {
|
||||
//
|
||||
LOG.info(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -106,7 +113,7 @@ public class FirstInBranch implements Runnable {
|
||||
});
|
||||
}
|
||||
catch (SVNException e) {
|
||||
//
|
||||
LOG.info(e);
|
||||
}
|
||||
return myRevisionCandidate.get();
|
||||
}
|
||||
@@ -117,7 +124,10 @@ public class FirstInBranch implements Runnable {
|
||||
final SVNLogEntryPath path = (SVNLogEntryPath) o;
|
||||
final String localPath = path.getPath();
|
||||
final String copyPath = path.getCopyPath();
|
||||
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("localPath: " + localPath + " copy path: " + copyPath);
|
||||
}
|
||||
|
||||
if ('A' == path.getType()) {
|
||||
if ((myBranchUrl.equals(localPath) || SVNPathUtil.isAncestor(localPath, myBranchUrl)) &&
|
||||
((myTrunkUrl.equals(copyPath)) || SVNPathUtil.isAncestor(copyPath, myTrunkUrl))) {
|
||||
|
||||
@@ -267,7 +267,11 @@ public class SvnChangeList implements CommittedChangeList {
|
||||
private FilePath getLocalPath(final String path, final NotNullFunction<File, Boolean> detector) {
|
||||
final String fullPath = myRepositoryRoot + path;
|
||||
if (myNonLocal) return VcsContextFactory.SERVICE.getInstance().createFilePathOnNonLocal(fullPath, detector.fun(new File(fullPath)));
|
||||
return myLocation.getLocalPath(fullPath, detector, myVcs);
|
||||
final FilePath localPath = myLocation.getLocalPath(fullPath, detector, myVcs);
|
||||
if (localPath == null) {
|
||||
return VcsContextFactory.SERVICE.getInstance().createFilePathOnNonLocal(fullPath, detector.fun(new File(fullPath)));
|
||||
}
|
||||
return localPath;
|
||||
}
|
||||
|
||||
private long getRevision(final boolean isBeforeRevision) {
|
||||
|
||||
+3
-1
@@ -182,6 +182,8 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi
|
||||
throws VcsException {
|
||||
try {
|
||||
final SvnRepositoryLocation svnLocation = (SvnRepositoryLocation) location;
|
||||
final String path = myVcs.getSvnFileUrlMapping().getLocalPath(((SvnRepositoryLocation)location).getURL());
|
||||
final boolean isRemote = path == null;
|
||||
final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator();
|
||||
if (progress != null) {
|
||||
progress.setText(SvnBundle.message("progress.text.changes.collecting.changes"));
|
||||
@@ -206,7 +208,7 @@ public class SvnCommittedChangesProvider implements CachingCommittedChangesProvi
|
||||
|
||||
getCommittedChangesImpl(settings, svnLocation.getURL(), new String[]{""}, maxCount, new Consumer<SVNLogEntry>() {
|
||||
public void consume(final SVNLogEntry svnLogEntry) {
|
||||
final SvnChangeList cl = new SvnChangeList(myVcs, svnLocation, svnLogEntry, repositoryRoot);
|
||||
final SvnChangeList cl = new SvnChangeList(myVcs, svnLocation, svnLogEntry, repositoryRoot, isRemote);
|
||||
if (filter.accepts(cl)) {
|
||||
consumer.consume(cl);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user