Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

UserLibrary: feature for adding folders to library #228

Merged
merged 7 commits into from
May 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,9 @@
import com.oracle.javafx.scenebuilder.app.preferences.PreferencesController;
import com.oracle.javafx.scenebuilder.app.preferences.PreferencesRecordDocument;
import com.oracle.javafx.scenebuilder.app.preferences.PreferencesRecordGlobal;
import com.oracle.javafx.scenebuilder.app.report.JarAnalysisReportController;
import com.oracle.javafx.scenebuilder.app.util.AppSettings;
import com.oracle.javafx.scenebuilder.kit.ResourceUtils;
import com.oracle.javafx.scenebuilder.kit.preview.PreviewWindowController;
import com.oracle.javafx.scenebuilder.app.report.JarAnalysisReportController;
import com.oracle.javafx.scenebuilder.kit.selectionbar.SelectionBarController;
import com.oracle.javafx.scenebuilder.kit.skeleton.SkeletonWindowController;
import com.oracle.javafx.scenebuilder.kit.alert.WarnThemeAlert;
import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
import com.oracle.javafx.scenebuilder.kit.editor.EditorController.ControlAction;
Expand All @@ -58,8 +55,8 @@
import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.HierarchyPanelController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.InspectorPanelController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.InspectorPanelController.SectionId;
import com.oracle.javafx.scenebuilder.kit.editor.panel.library.manager.LibraryDialogController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.library.LibraryPanelController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.library.manager.LibraryDialogController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractFxmlWindowController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog.ButtonID;
Expand All @@ -73,6 +70,9 @@
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
import com.oracle.javafx.scenebuilder.kit.library.Library;
import com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary;
import com.oracle.javafx.scenebuilder.kit.preview.PreviewWindowController;
import com.oracle.javafx.scenebuilder.kit.selectionbar.SelectionBarController;
import com.oracle.javafx.scenebuilder.kit.skeleton.SkeletonWindowController;
import com.oracle.javafx.scenebuilder.kit.util.Utils;

import java.io.File;
Expand All @@ -93,6 +93,7 @@
import java.util.Map;

import javafx.beans.InvalidationListener;
import javafx.beans.binding.Bindings;
import javafx.beans.value.ChangeListener;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
Expand All @@ -102,6 +103,7 @@
import javafx.scene.control.Accordion;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DialogPane;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
Expand Down Expand Up @@ -214,6 +216,7 @@ public enum ActionStatus {
@FXML private SplitPane mainSplitPane;
@FXML private SplitPane leftRightSplitPane;
@FXML private SplitPane libraryDocumentSplitPane;
@FXML private Label libraryLabel;

@FXML private MenuButton libraryMenuButton;
@FXML private MenuItem libraryImportSelection;
Expand Down Expand Up @@ -1142,6 +1145,12 @@ protected void controllerDidLoadFxml() {
}
}
});

libraryLabel.textProperty().bind(Bindings.createStringBinding(() -> {

return SceneBuilderApp.getSingleton().getUserLibrary().isExploring() ? I18N.getString("library.exploring") : I18N.getString("library");

}, SceneBuilderApp.getSingleton().getUserLibrary().exploringProperty()));
}

@Override
Expand Down Expand Up @@ -1344,6 +1353,7 @@ public void onManageJarFxml(ActionEvent event) {
SceneBuilderApp.getSingleton().performOpenRecent(this,
fxmlPath.toFile());
});
libraryDialogController.setOnAddFolder(() -> onImportFromFolder(libraryDialogController.getStage()));
}

libraryDialogController.openWindow();
Expand All @@ -1353,6 +1363,10 @@ public void onImportJarFxml(Window owner) {
libraryPanelController.performImportJarFxml(owner);
}

public void onImportFromFolder(Window owner) {
libraryPanelController.performImportFromFolder(owner);
}

@FXML
void onLibraryViewAsList(ActionEvent event) {
if (libraryPanelController.getDisplayMode() != LibraryPanelController.DISPLAY_MODE.SEARCH) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
<children>
<HBox id="HBox" alignment="CENTER" spacing="0.0" styleClass="panel-header">
<children>
<Label maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" text="%library" HBox.hgrow="NEVER" />
<Label fx:id="libraryLabel" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" text="%library" HBox.hgrow="NEVER" />
<StackPane fx:id="librarySearchPanelHost" maxHeight="-1.0" maxWidth="-1.0" minHeight="-1.0" minWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" style="" HBox.hgrow="ALWAYS" />
<MenuButton fx:id="libraryMenuButton" mnemonicParsing="false" text="" HBox.hgrow="NEVER">
<items>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ template.cannot.save.file = Can''t save file: {0}
# Library Menu within Library panel
# -----------------------------------------------------------------------------
library = Library
library.exploring = Exploring Library..
library.panel.menu.manage.jar.fxml = JAR/FXML Manager
library.panel.menu.import.selection = Import Selection
# Messages below are temporarily unused
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,6 @@
*/
package com.oracle.javafx.scenebuilder.kit.editor.panel.library;

import com.oracle.javafx.scenebuilder.kit.alert.ImportingGluonControlsAlert;
import com.oracle.javafx.scenebuilder.kit.i18n.I18N;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.ErrorDialog;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
import com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary;
import com.oracle.javafx.scenebuilder.kit.library.util.JarExplorer;
import com.oracle.javafx.scenebuilder.kit.library.util.JarReport;
import com.oracle.javafx.scenebuilder.kit.library.util.JarReportEntry;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
Expand All @@ -54,10 +44,23 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ExecutionException;
import java.util.stream.Collectors;

import com.oracle.javafx.scenebuilder.kit.alert.ImportingGluonControlsAlert;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.ErrorDialog;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
import com.oracle.javafx.scenebuilder.kit.i18n.I18N;
import com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary;
import com.oracle.javafx.scenebuilder.kit.library.util.FolderExplorer;
import com.oracle.javafx.scenebuilder.kit.library.util.JarExplorer;
import com.oracle.javafx.scenebuilder.kit.library.util.JarReport;
import com.oracle.javafx.scenebuilder.kit.library.util.JarReportEntry;
import com.oracle.javafx.scenebuilder.kit.preferences.MavenPreferences;

import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
Expand Down Expand Up @@ -228,10 +231,36 @@ protected void okButtonPressed(ActionEvent e) {

try {
closeClassLoader();

UserLibrary userLib = ((UserLibrary) libPanelController.getEditorController().getLibrary());

if (copyFilesToUserLibraryDir) {
libPanelController.copyFilesToUserLibraryDir(importFiles);
// collect directories from importFiles and add to library.folders file
// for other filex (jar, fxml) copy them directly
List<File> folders = new ArrayList<>(importFiles.size());
List<File> files = new ArrayList<>(importFiles.size());

for (File file : importFiles) {
if (file.isDirectory())
folders.add(file);
else
files.add(file);
}

if (!files.isEmpty())
libPanelController.copyFilesToUserLibraryDir(files);

Path foldersMarkerPath = Paths.get(userLib.getPath().toString(), LibraryUtil.FOLDERS_LIBRARY_FILENAME);

if (!Files.exists(foldersMarkerPath))
Files.createFile(foldersMarkerPath);

Set<String> lines = new TreeSet<>(Files.readAllLines(foldersMarkerPath));
lines.addAll(folders.stream().map(f -> f.getAbsolutePath()).collect(Collectors.toList()));

Files.write(foldersMarkerPath, lines);
}
UserLibrary userLib = ((UserLibrary) libPanelController.getEditorController().getLibrary());

if (copyFilesToUserLibraryDir) {
userLib.setFilter(getExcludedItems());
}
Expand Down Expand Up @@ -373,9 +402,16 @@ protected List<JarReport> call() throws Exception {
}
updateMessage(I18N.getString("import.work.exploring", file.getName()));
// System.out.println("[" + index + "/" + max + "] Exploring file " + file.getName()); //NOI18N
final JarExplorer explorer = new JarExplorer(Paths.get(file.getAbsolutePath()));
final JarReport jarReport = explorer.explore(classLoader);
res.add(jarReport);
if (file.isDirectory()) {
final FolderExplorer explorer = new FolderExplorer(file.toPath());
final JarReport jarReport = explorer.explore(classLoader);
res.add(jarReport);
}
else {
final JarExplorer explorer = new JarExplorer(Paths.get(file.getAbsolutePath()));
final JarReport jarReport = explorer.explore(classLoader);
res.add(jarReport);
}
updateProgress(index, numOfImportedJar);
index++;
}
Expand Down Expand Up @@ -530,9 +566,11 @@ void unsetProcessing() {
}

if (builtinPrefWidth == 0 || builtinPrefHeight == 0) {
((Region) zeNode).setPrefSize(200, 200);
setSizeLabel(PrefSize.TWO_HUNDRED_BY_TWO_HUNDRED);
defSizeChoice.getSelectionModel().select(2);
if (zeNode instanceof Region) { // must check instanceof: custom components are not necessarily regions..
((Region) zeNode).setPrefSize(200, 200);
setSizeLabel(PrefSize.TWO_HUNDRED_BY_TWO_HUNDRED);
defSizeChoice.getSelectionModel().select(2);
}
} else {
setSizeLabel(PrefSize.DEFAULT);
defSizeChoice.getSelectionModel().selectFirst();
Expand All @@ -557,7 +595,13 @@ private URL[] makeURLArrayFromFiles(List<File> files) {
try {
int index = 0;
for (File file : files) {
result[index] = new URL("jar","",file.toURI().toURL()+"!/");
URL url = file.toURI().toURL();
if (url.toString().endsWith(".jar")) {
result[index] = new URL("jar", "", url + "!/"); // <-- jar:file/path/to/jar!/
} else {
result[index] = url; // <-- file:/path/to/folder/
}

index++;
}
} catch (MalformedURLException x) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,28 +32,6 @@
*/
package com.oracle.javafx.scenebuilder.kit.editor.panel.library;

import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
import com.oracle.javafx.scenebuilder.kit.editor.drag.source.AbstractDragSource;
import com.oracle.javafx.scenebuilder.kit.editor.drag.source.DocumentDragSource;
import com.oracle.javafx.scenebuilder.kit.i18n.I18N;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractFxmlPanelController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog.ButtonID;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AlertDialog;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.ErrorDialog;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMArchive;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyT;
import com.oracle.javafx.scenebuilder.kit.library.BuiltinLibrary;
import com.oracle.javafx.scenebuilder.kit.library.Library;
import com.oracle.javafx.scenebuilder.kit.library.LibraryItem;
import com.oracle.javafx.scenebuilder.kit.library.LibraryItemNameComparator;
import com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary;
import com.oracle.javafx.scenebuilder.kit.metadata.util.PrefixedValue;
import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
Expand All @@ -67,6 +45,7 @@
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.FileAttribute;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
Expand All @@ -75,7 +54,29 @@
import java.util.TimerTask;
import java.util.TreeSet;

import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
import com.oracle.javafx.scenebuilder.kit.editor.drag.source.AbstractDragSource;
import com.oracle.javafx.scenebuilder.kit.editor.drag.source.DocumentDragSource;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractFxmlPanelController;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog.ButtonID;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AlertDialog;
import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.ErrorDialog;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMArchive;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyT;
import com.oracle.javafx.scenebuilder.kit.i18n.I18N;
import com.oracle.javafx.scenebuilder.kit.library.BuiltinLibrary;
import com.oracle.javafx.scenebuilder.kit.library.Library;
import com.oracle.javafx.scenebuilder.kit.library.LibraryItem;
import com.oracle.javafx.scenebuilder.kit.library.LibraryItemNameComparator;
import com.oracle.javafx.scenebuilder.kit.library.user.UserLibrary;
import com.oracle.javafx.scenebuilder.kit.metadata.util.PrefixedValue;
import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
import com.oracle.javafx.scenebuilder.kit.preferences.MavenPreferences;

import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.collections.ListChangeListener;
Expand All @@ -91,6 +92,7 @@
import javafx.scene.input.KeyEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.StackPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.stage.Window;
Expand Down Expand Up @@ -175,6 +177,15 @@ public void performImportJarFxml(Window owner) {
}

/**
* @param owner
* @treatAsPrivate Perform the import jar action.
*/
public void performImportFromFolder(Window owner) {
File folder = performSelectFolder(owner);
processImportFolder(folder);
}

/**
* @treatAsPrivate Perform the import of the selection
* @param objects the FXOM objects to import to customize the Library content.
*/
Expand Down Expand Up @@ -776,6 +787,32 @@ private void processImportJarFxml(List<File> importedFiles) {
}
}

private void processImportFolder(File folder) {
if (folder != null && folder.exists() && folder.isDirectory()) {
Path libPath = Paths.get(((UserLibrary)getEditorController().getLibrary()).getPath());
if (createUserLibraryDir(libPath)) {
// From here we know we will initiate the import dialog.
// This is why we put application window on the front.
// From there the import dialog window, which is application modal,
// should come on top of it.
final Window window = getPanelRoot().getScene().getWindow();
if (window instanceof Stage) {
final Stage stage = (Stage) window;
stage.toFront();
}

final ImportWindowController iwc = new ImportWindowController(this, Arrays.asList(folder), mavenPreferences, (Stage) window);
iwc.setToolStylesheet(getEditorController().getToolStylesheet());
// See comment in OnDragDropped handle set in method startListeningToDrop.
ButtonID userChoice = iwc.showAndWait();

if (userChoice.equals(ButtonID.OK) && currentDisplayMode.equals(DISPLAY_MODE.SECTIONS)) {
sectionNameToKeepOpened = UserLibrary.TAG_USER_DEFINED;
}
}
}
}

private List<File> getSubsetOfFiles(String pattern, List<File> files) {
final List<File> res = new ArrayList<>();

Expand Down Expand Up @@ -897,6 +934,23 @@ private List<File> performSelectJarOrFxmlFile(Window owner) {
return selectedFiles;
}

/**
* Open a file chooser that allows to select one folder
* @return the selected folder or null
*/
private File performSelectFolder(Window owner) {
DirectoryChooser dirChooser = new DirectoryChooser();
dirChooser.setInitialDirectory(EditorController.getNextInitialDirectory());

File folder = dirChooser.showDialog(owner);
if (folder != null) {
// Keep track of the user choice for next time
EditorController.updateNextInitialDirectory(folder);
}

return folder;
}

private void userLibraryUpdateRejected() {
final AlertDialog dialog = new AlertDialog(null);
dialog.setTitle(I18N.getString("alert.import.reject.dependencies.title"));
Expand Down
Loading