package office;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Set;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
import org.xml.sax.InputSource;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.Background;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
import java.util.Collection;
import java.util.Collections;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.fxmisc.flowless.VirtualizedScrollPane;
import org.fxmisc.richtext.CodeArea;
import org.fxmisc.richtext.LineNumberFactory;
import org.fxmisc.richtext.model.StyleSpans;
import org.fxmisc.richtext.model.StyleSpansBuilder;
public class TreeViewExample extends Application {
Stage primaryStage;
BorderPane root;
Map<String, TreeItem> map;
Map<String, String> inmemory;
CodeArea textArea = new CodeArea();
private static final Pattern XML_TAG = Pattern.compile("(?<ELEMENT>(</?\\h*)(\\w+)([^<>]*)(\\h*/?>))"
+"|(?<COMMENT><!--[^<>]+-->)");
private static final Pattern ATTRIBUTES = Pattern.compile("(\\w+\\h*)(=)(\\h*\"[^\"]+\")");
private static final int GROUP_OPEN_BRACKET = 2;
private static final int GROUP_ELEMENT_NAME = 3;
private static final int GROUP_ATTRIBUTES_SECTION = 4;
private static final int GROUP_CLOSE_BRACKET = 5;
private static final int GROUP_ATTRIBUTE_NAME = 1;
private static final int GROUP_EQUAL_SYMBOL = 2;
private static final int GROUP_ATTRIBUTE_VALUE = 3;
public static void main
(String[] args
) { Application.launch(args);
}
textArea.clear();
inmemory=new HashMap<String, String>();
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("selecione el excel");
fileChooser.getExtensionFilters().addAll(new ExtensionFilter("Excel", "*.xlsx"),
new ExtensionFilter("Doc", "*.docx"), new ExtensionFilter("Ppt", "*..pptx"));
File file
= fileChooser.
showOpenDialog(primaryStage
);
if (file != null) {
label.setText(file.getAbsolutePath());
Enumeration<?> enu = zipFile.entries();
Set<String> nodes = new HashSet<>();
while (enu.hasMoreElements()) {
InputStream inputStream
= zipFile.
getInputStream(zipEntry
);
String name
= zipEntry.
getName();
inmemory.put(name+"/", convertToString(inputStream));
inputStream.close();
String[] split
= name.
split("/");
for (String current
: split
) { node += current + "/";
nodes.add(node);
}
}
List<String> listnodes = new ArrayList<String>(nodes);
TreeItem rootItem = root(listnodes, file.getName());
TreeView treeView = new TreeView();
treeView.getSelectionModel().selectedItemProperty().addListener(this::selectedFile);
treeView.setRoot(rootItem);
treeView.setShowRoot(true);
root.setLeft(treeView);
Alert alert = new Alert(AlertType.ERROR);
alert.setContentText(e.getMessage());
e.printStackTrace();
alert.showAndWait();
}
}
}
Scanner scanner = new Scanner(in);
scanner.useDelimiter("\\A");
boolean hasInput = scanner.hasNext();
if (hasInput) {
return scanner.next();
} else {
return null;
}
}
void selectedFile
(ObservableValue observable,
Object oldValue,
TreeItem<String> selectedItem = (TreeItem<String>) newValue;
for(String current
: map.
keySet()) { if(map.get(current)==selectedItem) {
String text
=inmemory.
get(current
); if(text!=null) {
textArea.replaceText(prettyFormat(text));
}
}
}
}
int result
= (Integer.
valueOf(o1.
split("/").
length)).
compareTo(o2.
split("/").
length); if (result == 0)
result = o1.compareTo(o2);
return result;
}
private TreeItem root
(List
<String
> listnodes,
String name
) {
TreeItem rootItem = new TreeItem(name);
rootItem.setExpanded(true);
map = new LinkedHashMap<String, TreeItem>();
for (String current
: listnodes
) { String[] split
= current.
substring(0, current.
length() - 1).
split("/");
map.put(current, new TreeItem(split[split.length - 1]));
}
for (String key
: map.
keySet()) {
if (key.split("/", -1).length == 2) {
rootItem.getChildren().add(map.get(key));
} else {
String currentName
= map.
get(key
).
getValue() + ""; String result
= key.
substring(0, key.
lastIndexOf(currentName
+ "/"));
TreeItem parent = map.get(result);
parent.setExpanded(true);
parent.getChildren().add(map.get(key));
}
}
return rootItem;
}
try {
final InputSource src
= new InputSource
(new StringReader(xml
)); final Node document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement();
final Boolean keepDeclaration
= Boolean.
valueOf(xml.
startsWith("<?xml"));
//May need this: System.setProperty(DOMImplementationRegistry.PROPERTY,"com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl");
final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
final DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
final LSSerializer writer = impl.createLSSerializer();
writer.
getDomConfig().
setParameter("format-pretty-print",
Boolean.
TRUE); // Set this to true if the output needs to be beautified. writer.getDomConfig().setParameter("xml-declaration", keepDeclaration); // Set this to true if the declaration is needed to be outputted.
return writer.writeToString(document);
}
}
@Override
public void start(Stage primaryStage) {
label.setEditable(false);
label.setStyle("-fx-background-color:#ced1d6;");
textArea.setParagraphGraphicFactory(LineNumberFactory.get(textArea));
this.primaryStage = primaryStage;
open.setOnAction(this::open);
m.getItems().add(open);
mb.getMenus().add(m);
root = new BorderPane();
VBox head = new VBox();
head.getChildren().add(mb);
head.getChildren().add(label);
root.setTop(head);
textArea.setEditable(false);
textArea.textProperty().addListener((obs, oldText, newText) -> {
textArea.setStyleSpans(0, computeHighlighting(newText));
});
root.setCenter(new VirtualizedScrollPane<>(textArea));
Scene scene = new Scene(root, 550, 250);
scene.getStylesheets().add(TreeViewExample.class.getResource("xml-highlighting.css").toExternalForm());
primaryStage.setTitle("OpenXml Comparator");
primaryStage.setScene(scene);
// primaryStage.setMaximized(true);
primaryStage.show();
}
private static StyleSpans
<Collection
<String
>> computeHighlighting
(String text
) {
Matcher matcher = XML_TAG.matcher(text);
int lastKwEnd = 0;
StyleSpansBuilder<Collection<String>> spansBuilder = new StyleSpansBuilder<>();
while(matcher.find()) {
spansBuilder.
add(Collections.
emptyList(), matcher.
start() - lastKwEnd
); if(matcher.group("COMMENT") != null) {
spansBuilder.
add(Collections.
singleton("comment"), matcher.
end() - matcher.
start()); }
else {
if(matcher.group("ELEMENT") != null) {
String attributesText
= matcher.
group(GROUP_ATTRIBUTES_SECTION
);
spansBuilder.
add(Collections.
singleton("tagmark"), matcher.
end(GROUP_OPEN_BRACKET
) - matcher.
start(GROUP_OPEN_BRACKET
)); spansBuilder.
add(Collections.
singleton("anytag"), matcher.
end(GROUP_ELEMENT_NAME
) - matcher.
end(GROUP_OPEN_BRACKET
));
if(!attributesText.isEmpty()) {
lastKwEnd = 0;
Matcher amatcher = ATTRIBUTES.matcher(attributesText);
while(amatcher.find()) {
spansBuilder.
add(Collections.
emptyList(), amatcher.
start() - lastKwEnd
); spansBuilder.
add(Collections.
singleton("attribute"), amatcher.
end(GROUP_ATTRIBUTE_NAME
) - amatcher.
start(GROUP_ATTRIBUTE_NAME
)); spansBuilder.
add(Collections.
singleton("tagmark"), amatcher.
end(GROUP_EQUAL_SYMBOL
) - amatcher.
end(GROUP_ATTRIBUTE_NAME
)); spansBuilder.
add(Collections.
singleton("avalue"), amatcher.
end(GROUP_ATTRIBUTE_VALUE
) - amatcher.
end(GROUP_EQUAL_SYMBOL
)); lastKwEnd = amatcher.end();
}
if(attributesText.length() > lastKwEnd)
spansBuilder.
add(Collections.
emptyList(), attributesText.
length() - lastKwEnd
); }
lastKwEnd = matcher.end(GROUP_ATTRIBUTES_SECTION);
spansBuilder.
add(Collections.
singleton("tagmark"), matcher.
end(GROUP_CLOSE_BRACKET
) - lastKwEnd
); }
}
lastKwEnd = matcher.end();
}
spansBuilder.
add(Collections.
emptyList(), text.
length() - lastKwEnd
); return spansBuilder.create();
}
}