Skip to content

Commit

Permalink
2 files diff editor
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Apr 18, 2024
1 parent a7ad1e9 commit 28abb6f
Show file tree
Hide file tree
Showing 9 changed files with 200 additions and 106 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,7 @@
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.ui.EditorTextField;
import com.intellij.ui.EditorTextFieldProvider;
import com.intellij.ui.MonospaceEditorCustomization;
import com.intellij.ui.OnePixelSplitter;
import com.intellij.ui.*;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.tree.TreeUtil;
Expand Down Expand Up @@ -147,8 +144,7 @@ private JComponent initQueryPanel() {
root.add(toolbar.getComponent(), BorderLayout.NORTH);

query = createQueryTextField(ComboQueryType.Type.NAME_OR_OID);
JBScrollPane pane = new JBScrollPane(query);
root.add(pane, BorderLayout.CENTER);
root.add(ScrollPaneFactory.createScrollPane(query, true), BorderLayout.CENTER);

return root;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.evolveum.midpoint.studio.ui;

import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
Expand All @@ -21,6 +22,15 @@ public CustomComboBoxAction() {
selected = getDefaultItem();
}

public CustomComboBoxAction(T selected) {
this.selected = selected;
}

@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}

@Override
protected @NotNull DefaultActionGroup createPopupActionGroup(JComponent button) {
DefaultActionGroup group = new DefaultActionGroup();
Expand Down Expand Up @@ -93,6 +103,11 @@ public ComboItemAction(CustomComboBoxAction combo, T item) {
this.item = item;
}

@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}

@Override
public void update(@NotNull AnActionEvent e) {
super.update(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import com.evolveum.midpoint.studio.impl.xml.DiffType;
import com.evolveum.midpoint.studio.impl.xml.ObjectsDiffFactory;
import com.evolveum.midpoint.studio.ui.CustomComboBoxAction;
import com.evolveum.midpoint.studio.ui.diff.DiffStrategy;
import com.evolveum.midpoint.studio.ui.diff.DiffStrategyComboAction;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.evolveum.midpoint.studio.util.RunnableUtils;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand All @@ -35,7 +37,6 @@
import java.awt.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
Expand All @@ -45,36 +46,6 @@ public class ObjectDeltaPanel extends BorderLayoutPanel implements Disposable {

private static final Logger LOG = Logger.getInstance(ObjectDeltaPanel.class);

public enum DiffStrategy {

LITERAL("Literal", ParameterizedEquivalenceStrategy.LITERAL),

DATA("Data", ParameterizedEquivalenceStrategy.DATA),

IGNORE_METADATA("Ignore Metadata", ParameterizedEquivalenceStrategy.IGNORE_METADATA),

DEFAULT("Default Compare", ParameterizedEquivalenceStrategy.FOR_DELTA_ADD_APPLICATION),

REAL_VALUE("Real Value", ParameterizedEquivalenceStrategy.REAL_VALUE);

private final String label;

private final ParameterizedEquivalenceStrategy strategy;

DiffStrategy(String label, ParameterizedEquivalenceStrategy strategy) {
this.label = label;
this.strategy = strategy;
}

public String getLabel() {
return label;
}

public ParameterizedEquivalenceStrategy getStrategy() {
return strategy;
}
}

private Project project;

private VirtualFile file;
Expand All @@ -95,22 +66,7 @@ public ObjectDeltaPanel(@NotNull Project project, @NotNull VirtualFile file) {
}

private void initLayout() {
strategyCombo = new CustomComboBoxAction<>() {

@Override
public DiffStrategy getDefaultItem() {
return DiffStrategy.DEFAULT;
}

@Override
public List<DiffStrategy> getItems() {
return Arrays.asList(DiffStrategy.values());
}

@Override
protected String createItemLabel(DiffStrategy item) {
return item != null ? item.getLabel() : "";
}
strategyCombo = new DiffStrategyComboAction(DiffStrategy.DEFAULT) {

@Override
public void setSelected(DiffStrategy selected) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.prism.ModificationType;
import com.evolveum.midpoint.prism.PrismValue;

public record DeltaItem(ModificationType modificationType, PrismValue value) {

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.studio.ui.CustomComboBoxAction;
import com.evolveum.midpoint.studio.ui.UiAction;
import com.evolveum.midpoint.studio.ui.delta.ObjectDeltaPanel;
import com.intellij.diff.DiffRequestFactory;
import com.intellij.diff.chains.DiffRequestChain;
import com.intellij.diff.chains.SimpleDiffRequestChain;
import com.intellij.diff.impl.CacheDiffRequestChainProcessor;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.Project;
import com.intellij.testFramework.LightVirtualFile;
Expand All @@ -20,7 +19,6 @@
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DiffPanel extends JBPanel {
Expand Down Expand Up @@ -59,8 +57,8 @@ private ObjectDeltaTree createDeltaTable() {
}

private JComponent createTextDiff() {
LightVirtualFile left = new LightVirtualFile("left.xml", "left\ncontent");
LightVirtualFile right = new LightVirtualFile("right.xml", "right\ncontent");
LightVirtualFile left = new LightVirtualFile("(RESULT) system-configuration.xml", "left\ncontent");
LightVirtualFile right = new LightVirtualFile("(REMOTE) system-configuration.xml", "right\ncontent");

DiffRequest request = DiffRequestFactory.getInstance().createFromFiles(project, left, right);

Expand All @@ -87,49 +85,65 @@ private JComponent createTextDiff() {
private JComponent initMainToolbar(JComponent parent) {
DefaultActionGroup group = new DefaultActionGroup();

CustomComboBoxAction<ObjectDeltaPanel.DiffStrategy> strategyCombo = new CustomComboBoxAction<>() {
group.add(new DiffStrategyComboAction(DiffStrategy.NATURAL_KEYS) {

@Override
public ObjectDeltaPanel.DiffStrategy getDefaultItem() {
return ObjectDeltaPanel.DiffStrategy.DEFAULT;
public DiffStrategy getDefaultItem() {
return super.getDefaultItem();
}

@Override
public List<ObjectDeltaPanel.DiffStrategy> getItems() {
return Arrays.asList(ObjectDeltaPanel.DiffStrategy.values());
}

@Override
protected String createItemLabel(ObjectDeltaPanel.DiffStrategy item) {
return item != null ? item.getLabel() : "";
}

@Override
public void setSelected(ObjectDeltaPanel.DiffStrategy selected) {
public void setSelected(DiffStrategy selected) {
super.setSelected(selected);

// todo change was done
diffStrategyChanged(selected);
}
};
group.add(strategyCombo);
});

group.add(new Separator());

group.add(new UiAction("Apply to left", e -> {
}));
group.add(new UiAction("Apply to right", e -> {
}));
group.add(new UiAction("Accept", AllIcons.Diff.ApplyNotConflictsLeft, e -> acceptPerformed()));
group.add(new UiAction("Ignore", AllIcons.Diff.ApplyNotConflictsRight, e -> ignorePerformed()));

group.add(new Separator());

group.add(new UiAction("Cleanup left", e -> {
}));
group.add(new UiAction("Cleanup right", e -> {
}));
group.add(new UiAction("Cleanup right", AllIcons.General.InspectionsEye, e -> cleanupRightPerformed()));

group.add(new UiAction("Save", AllIcons.General.GreenCheckmark, e -> savePerformed()));
group.add(new UiAction("Roll back", AllIcons.Actions.Rollback, e -> rollbackPerformed()));


ActionToolbar toolbar = ActionManager.getInstance().createActionToolbar("toolbar", group, true);
toolbar.setTargetComponent(parent);

return toolbar.getComponent();
}

private void rollbackPerformed() {
// todo implement
}

private void savePerformed() {
// todo implement
}

private void diffStrategyChanged(DiffStrategy strategy) {
// todo implement
}

private void acceptPerformed() {
// todo implement
}

private void ignorePerformed() {
// todo implement
}

private void cleanupLeft() {
// todo implement
}

private void cleanupRightPerformed() {
// todo implement
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy;
import com.evolveum.midpoint.prism.equivalence.ParameterizedEquivalenceStrategy;

public enum DiffStrategy {

LITERAL("Literal", ParameterizedEquivalenceStrategy.LITERAL),

DATA("Data", ParameterizedEquivalenceStrategy.DATA),

IGNORE_METADATA("Ignore Metadata", ParameterizedEquivalenceStrategy.IGNORE_METADATA),

DEFAULT("Default Compare", ParameterizedEquivalenceStrategy.FOR_DELTA_ADD_APPLICATION),

REAL_VALUE("Real Value", ParameterizedEquivalenceStrategy.REAL_VALUE),

NATURAL_KEYS("Natural Keys", EquivalenceStrategy.REAL_VALUE_CONSIDER_DIFFERENT_IDS_NATURAL_KEYS);

private final String label;

private final ParameterizedEquivalenceStrategy strategy;

DiffStrategy(String label, ParameterizedEquivalenceStrategy strategy) {
this.label = label;
this.strategy = strategy;
}

public String getLabel() {
return label;
}

public ParameterizedEquivalenceStrategy getStrategy() {
return strategy;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.studio.ui.CustomComboBoxAction;

import java.util.Arrays;
import java.util.List;

public class DiffStrategyComboAction extends CustomComboBoxAction<DiffStrategy> {

public DiffStrategyComboAction(DiffStrategy defaultStrategy) {
super(defaultStrategy);
}

@Override
public List<DiffStrategy> getItems() {
return Arrays.asList(DiffStrategy.values());
}

@Override
protected String createItemLabel(DiffStrategy item) {
return item != null ? item.getLabel() : "";
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,63 @@
package com.evolveum.midpoint.studio.ui.diff;

import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.intellij.ui.JBColor;
import com.intellij.ui.render.LabelBasedRenderer;
import com.intellij.ui.treeStructure.Tree;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;

public class ObjectDeltaTree<O extends ObjectType> extends Tree {

public ObjectDeltaTree(@NotNull ObjectDeltaTreeModel<O> model) {
super(model); // todo implement

setup();
}

private void setup() {
setCellRenderer(new LabelBasedRenderer.Tree() {

@Override
public @NotNull Component getTreeCellRendererComponent(@NotNull JTree tree, @Nullable Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean focused) {
Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, focused);

DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
if (!(node.getUserObject() instanceof DeltaItem di)) {
return c;
}

switch (di.modificationType()) {
case ADD:
c.setForeground(JBColor.GREEN);
break;
case DELETE:
c.setForeground(JBColor.RED);
break;
case REPLACE:
c.setForeground(JBColor.BLUE);
break;
}

return c;
}
});
}

@Override
public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
if (node.getUserObject() instanceof DeltaItem di) {
value = di.value();
} else if (node.getUserObject() instanceof ItemDelta<?,?> id) {
value = id.getPath().toString();
}

return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus);
}
}

0 comments on commit 28abb6f

Please sign in to comment.