Skip to content

Commit

Permalink
3-way merge for initial objects ui prototype
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Mar 19, 2024
1 parent 0f0ebdd commit 8bf4f21
Show file tree
Hide file tree
Showing 6 changed files with 400 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
package com.evolveum.midpoint.studio.action;

import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.studio.client.ClientUtils;
import com.evolveum.midpoint.studio.impl.diff.InitialObjectDiffProcessor;
import com.evolveum.midpoint.studio.util.MidPointUtils;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.io.ByteArrayInputStream;

/**
* Created by Viliam Repan (lazyman).
Expand Down Expand Up @@ -36,34 +45,49 @@ public void actionPerformed(@NotNull AnActionEvent evt) {
return;
}

// DiffRequestFactory factory = DiffRequestFactory.getInstance();
// VirtualFile file = VfsUtil.;
// List<byte[]> contents = List.of(
// "first1".getBytes(),
// "".getBytes(),
// "third3".getBytes()
// );
//
// try {
// MergeRequest request = factory.createMergeRequest(project, file, contents, "my title", List.of("first", "second", "third"), c -> {
// System.out.println("merge request created");
// });
//
// MergeRequestProcessor processor = new MergeRequestProcessor(project) {
// @Override
// public void closeDialog() {
//
// }
//
// @Override
// protected @Nullable JRootPane getRootPane() {
// return new JRootPane();
// }
// };
// processor.init(request);
//
// } catch (Exception e) {
// e.printStackTrace();
// }
try {
VirtualFile parent = project.getBaseDir();
VirtualFile previousInitialFile = parent.findFileByRelativePath("./_3-merge/previous-initial-system.xml");
VirtualFile currentInitialFile = parent.findFileByRelativePath("./_3-merge/current-initial-system.xml");
VirtualFile currentObjectFile = parent.findFileByRelativePath("./_3-merge/current-system.xml");

PrismObject<?> previousInitial = parse(previousInitialFile);
PrismObject<?> currentInitial = parse(currentInitialFile);
PrismObject<?> currentObject = parse(currentObjectFile);

InitialObjectDiffProcessor processor = new InitialObjectDiffProcessor(
project, previousInitial, currentInitial, currentObject);

ApplicationManager.getApplication().invokeAndWait(() -> {
Dialog dialog = new Dialog(project) {

@Override
protected @Nullable JComponent createCenterPanel() {
return processor.getComponent();
}
};

dialog.showAndGet();
});
} catch (Exception ex) {
ex.printStackTrace();
}
}

private PrismObject<?> parse(VirtualFile file) throws Exception {
return ClientUtils.createParser(
MidPointUtils.DEFAULT_PRISM_CONTEXT,
new ByteArrayInputStream(file.contentsToByteArray()))
.parse();
}

private static abstract class Dialog extends DialogWrapper {

public Dialog(@Nullable Project project) {
super(project, false);

setSize(800, 600);
init();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.evolveum.midpoint.studio.impl.diff;

import com.intellij.openapi.util.NlsContexts;
import com.intellij.ui.treeStructure.treetable.TreeTableModel;
import com.intellij.ui.treeStructure.treetable.TreeTableTree;
import com.intellij.util.ui.ColumnInfo;
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import javax.swing.tree.DefaultTreeModel;
import java.util.List;

public class DefaultTreeTableModel<T> extends DefaultTreeModel implements TreeTableModel {

private TreeTableTree tree;

private List<ColumnInfo> columns;

private T data;

public DefaultTreeTableModel(@NotNull List<ColumnInfo> columns) {
this(columns, null);
}

public DefaultTreeTableModel(@NotNull List<ColumnInfo> columns, T data) {
super(new DefaultMutableTreeTableNode());

this.columns = columns;

setData(data);
}

public ColumnInfo getColumnInfo(int index) {
return columns.get(index);
}

@Override
public int getColumnCount() {
return columns.size();
}

@Override
public @NlsContexts.ColumnName String getColumnName(int column) {
return columns.get(column).getName();
}

@Override
public Class<?> getColumnClass(int column) {
return columns.get(column).getColumnClass();
}

@Override
public Object getValueAt(Object node, int column) {
return columns.get(column).valueOf(node);
}

@Override
public boolean isCellEditable(Object node, int column) {
return columns.get(column).isCellEditable(node);
}

@Override
public void setValueAt(Object aValue, Object node, int column) {
columns.get(column).setValue(node, aValue);
}

public TreeTableTree getTree() {
return tree;
}

@Override
public void setTree(JTree tree) {
if (!(tree instanceof TreeTableTree)) {
throw new IllegalArgumentException("Tree must be instance of TreeTableTree");
}
this.tree = (TreeTableTree) tree;
}

public T getData() {
return data;
}

public void setData(T data) {
this.data = data;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.evolveum.midpoint.studio.impl.diff;

import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.intellij.ui.treeStructure.treetable.TreeTable;

public class DeltaTreeTable extends TreeTable {

public DeltaTreeTable(ObjectDelta<?> delta) {
super(new DeltaTreeTableModel());

setupComponent();
}

private void setupComponent() {
setDragEnabled(false);

this.tableHeader.setReorderingAllowed(false);

this.columnModel.getColumn(0).setPreferredWidth(40);
this.columnModel.getColumn(0).setMinWidth(40);
this.columnModel.getColumn(0).setMaxWidth(40);

this.columnModel.getColumn(1).setPreferredWidth(200);
this.columnModel.getColumn(1).setMinWidth(50);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.evolveum.midpoint.studio.impl.diff;

import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.studio.ui.browse.ObjectColumnInfo;
import com.intellij.ui.treeStructure.treetable.TreeTableModel;
import com.intellij.util.ui.ColumnInfo;

import java.util.List;

public class DeltaTreeTableModel extends DefaultTreeTableModel<ObjectDelta<?>> {

private static final List<ColumnInfo> COLUMNS = List.of(
new ObjectColumnInfo("", o -> true) {

@Override
public Class<?> getColumnClass() {
return Boolean.class;
}
},
new ObjectColumnInfo("Path", o -> "asdf") {

@Override
public Class<?> getColumnClass() {
return TreeTableModel.class;
}
}
);

public DeltaTreeTableModel() {
super(COLUMNS);
}
}

0 comments on commit 8bf4f21

Please sign in to comment.