Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Add source to changes dialog #9533

Merged
merged 37 commits into from
Feb 7, 2023
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
633ac6e
Show source and preview for entry changes/deleted/added
Siedlerchr Jan 5, 2023
8b3d26d
remove preview from EntryChanged, better to use the diff dialog
Siedlerchr Jan 5, 2023
f00bbe1
add changelog entry and make readonly
Siedlerchr Jan 5, 2023
6d04e51
add padding, show previe and source also for entry change
Siedlerchr Jan 5, 2023
a194e2b
spaces...
Siedlerchr Jan 5, 2023
a4abb6d
remove from permit
Siedlerchr Jan 5, 2023
3168b78
Hide and show rows
Siedlerchr Jan 6, 2023
3511420
fix checkstlye
Siedlerchr Jan 6, 2023
a2649c8
Show/hide indifferent field rows
HoussemNasri Jan 7, 2023
15b1eff
Merge branch 'main' into addSourceToChangesDialog
calixtus Jan 9, 2023
c4de530
Update FieldRowView.java
HoussemNasri Jan 16, 2023
d49b3ae
Merge remote-tracking branch 'upstream/main' into addSourceToChangesD…
Siedlerchr Jan 16, 2023
fe2385e
checkstyle
Siedlerchr Jan 16, 2023
d2b1f63
Add SplitPane to show both entries with preview together
Siedlerchr Jan 17, 2023
1312241
Merge remote-tracking branch 'upstream/main' into addSourceToChangesD…
Siedlerchr Jan 17, 2023
fab0023
checkstyle
Siedlerchr Jan 17, 2023
f9400a3
Merge remote-tracking branch 'upstream/main' into addSourceToChangesD…
Siedlerchr Jan 21, 2023
c35de7b
Change boolean logic, default show all fields
Siedlerchr Jan 21, 2023
ce792af
remove virtualized scrollpane breaks mouse scrolling
Siedlerchr Jan 21, 2023
ae715ed
checkstyle
Siedlerchr Jan 21, 2023
1d899b6
Add TODO for optimization
HoussemNasri Jan 21, 2023
175e2ff
Fix typo
HoussemNasri Jan 21, 2023
cfa9e40
row.show() reads better than row.showRow()
HoussemNasri Jan 21, 2023
4dd0b0b
Refactor code
HoussemNasri Jan 21, 2023
ef10a66
Merge remote-tracking branch 'upstream/main' into addSourceToChangesD…
Siedlerchr Jan 28, 2023
e970e88
Create PreviewView in advance at least for added and removed
Siedlerchr Jan 28, 2023
cc418bf
checkstyle
Siedlerchr Jan 28, 2023
49f8b38
Merge remote-tracking branch 'upstream/main' into addSourceToChangesD…
Siedlerchr Feb 2, 2023
4e2336a
Add label header for tab pane
Siedlerchr Feb 3, 2023
2efa489
add css class
Siedlerchr Feb 4, 2023
2a3a341
Store value of chekcbox in prefs
Siedlerchr Feb 4, 2023
22899e7
remove tab chars
Siedlerchr Feb 4, 2023
ef6cfc3
make prefs inject private
Siedlerchr Feb 4, 2023
74a653c
Update src/main/java/org/jabref/gui/collab/entrychange/PreviewWithSou…
Siedlerchr Feb 5, 2023
771b032
remove empty line
Siedlerchr Feb 7, 2023
0291ed3
Merge remote-tracking branch 'upstream/addSourceToChangesDialog' into…
Siedlerchr Feb 7, 2023
93dd7cf
empty line
Siedlerchr Feb 7, 2023
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
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve

### Added


- We added a field showing the BibTeX/biblatex source for added and deleted entries in the "External Changes Resolver" dialog. [#9509](https://github.com/JabRef/jabref/issues/9509)



Expand Down
6 changes: 6 additions & 0 deletions src/main/java/org/jabref/gui/Base.css
Original file line number Diff line number Diff line change
Expand Up @@ -1310,6 +1310,12 @@ We want to have a look that matches our icons in the tool-bar */
-fx-fill: -fx-text-background-color;
}


koppor marked this conversation as resolved.
Show resolved Hide resolved
#bibtexcodearea {
-fx-padding: 4 4 4 4;
-fx-background-color: -fx-control-inner-background;
}

.code-area .selection {
-fx-fill: -jr-accent;
}
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/org/jabref/gui/LibraryTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -770,8 +770,6 @@ public void resetChangeMonitor() {
Globals.TASK_EXECUTOR,
dialogService,
preferencesService,
stateManager,
themeManager,
databaseNotificationPane));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

import javafx.scene.layout.AnchorPane;

import org.jabref.gui.collab.entryadd.EntryAddDetailsView;
import org.jabref.gui.collab.entrychange.EntryChangeDetailsView;
import org.jabref.gui.collab.entrydelete.EntryDeleteDetailsView;
import org.jabref.gui.collab.entrychange.EntryWithPreviewAndSourceDetailsView;
import org.jabref.gui.collab.groupchange.GroupChangeDetailsView;
import org.jabref.gui.collab.metedatachange.MetadataChangeDetailsView;
import org.jabref.gui.collab.preamblechange.PreambleChangeDetailsView;
Expand All @@ -13,5 +12,5 @@
import org.jabref.gui.collab.stringdelete.BibTexStringDeleteDetailsView;
import org.jabref.gui.collab.stringrename.BibTexStringRenameDetailsView;

public sealed abstract class DatabaseChangeDetailsView extends AnchorPane permits EntryAddDetailsView, EntryChangeDetailsView, EntryDeleteDetailsView, GroupChangeDetailsView, MetadataChangeDetailsView, PreambleChangeDetailsView, BibTexStringAddDetailsView, BibTexStringChangeDetailsView, BibTexStringDeleteDetailsView, BibTexStringRenameDetailsView {
public sealed abstract class DatabaseChangeDetailsView extends AnchorPane permits EntryWithPreviewAndSourceDetailsView, GroupChangeDetailsView, MetadataChangeDetailsView, PreambleChangeDetailsView, BibTexStringAddDetailsView, BibTexStringChangeDetailsView, BibTexStringDeleteDetailsView, BibTexStringRenameDetailsView, EntryChangeDetailsView {
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
import org.jabref.gui.DialogService;
import org.jabref.gui.StateManager;
import org.jabref.gui.collab.entryadd.EntryAdd;
import org.jabref.gui.collab.entryadd.EntryAddDetailsView;
import org.jabref.gui.collab.entrychange.EntryChange;
import org.jabref.gui.collab.entrychange.EntryChangeDetailsView;
import org.jabref.gui.collab.entrychange.EntryWithPreviewAndSourceDetailsView;
import org.jabref.gui.collab.entrydelete.EntryDelete;
import org.jabref.gui.collab.entrydelete.EntryDeleteDetailsView;
import org.jabref.gui.collab.groupchange.GroupChange;
import org.jabref.gui.collab.groupchange.GroupChangeDetailsView;
import org.jabref.gui.collab.metedatachange.MetadataChange;
Expand All @@ -24,6 +23,7 @@
import org.jabref.gui.collab.stringrename.BibTexStringRenameDetailsView;
import org.jabref.gui.theme.ThemeManager;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntryTypesManager;
import org.jabref.preferences.PreferencesService;

public class DatabaseChangeDetailsViewFactory {
Expand All @@ -32,23 +32,25 @@ public class DatabaseChangeDetailsViewFactory {
private final StateManager stateManager;
private final ThemeManager themeManager;
private final PreferencesService preferencesService;
private final BibEntryTypesManager entryTypesManager;

public DatabaseChangeDetailsViewFactory(BibDatabaseContext databaseContext, DialogService dialogService, StateManager stateManager, ThemeManager themeManager, PreferencesService preferencesService) {
public DatabaseChangeDetailsViewFactory(BibDatabaseContext databaseContext, DialogService dialogService, StateManager stateManager, ThemeManager themeManager, PreferencesService preferencesService, BibEntryTypesManager entryTypesManager) {
this.databaseContext = databaseContext;
this.dialogService = dialogService;
this.stateManager = stateManager;
this.themeManager = themeManager;
this.preferencesService = preferencesService;
this.entryTypesManager = entryTypesManager;
}

public DatabaseChangeDetailsView create(DatabaseChange databaseChange) {
// TODO: Use Pattern Matching for switch once it's out of preview
if (databaseChange instanceof EntryChange entryChange) {
return new EntryChangeDetailsView(entryChange, databaseContext, dialogService, stateManager, themeManager, preferencesService);
return new EntryChangeDetailsView(entryChange.getOldEntry(), entryChange.getNewEntry(), databaseContext, dialogService, stateManager, themeManager, preferencesService, entryTypesManager);
} else if (databaseChange instanceof EntryAdd entryAdd) {
return new EntryAddDetailsView(entryAdd, databaseContext, dialogService, stateManager, themeManager, preferencesService);
return new EntryWithPreviewAndSourceDetailsView(entryAdd.getAddedEntry(), databaseContext, dialogService, stateManager, themeManager, preferencesService, entryTypesManager);
} else if (databaseChange instanceof EntryDelete entryDelete) {
return new EntryDeleteDetailsView(entryDelete, databaseContext, dialogService, stateManager, themeManager, preferencesService);
return new EntryWithPreviewAndSourceDetailsView(entryDelete.getDeletedEntry(), databaseContext, dialogService, stateManager, themeManager, preferencesService, entryTypesManager);
} else if (databaseChange instanceof BibTexStringAdd stringAdd) {
return new BibTexStringAddDetailsView(stringAdd);
} else if (databaseChange instanceof BibTexStringDelete stringDelete) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@

import org.jabref.gui.DialogService;
import org.jabref.gui.LibraryTab;
import org.jabref.gui.StateManager;
import org.jabref.gui.icon.IconTheme;
import org.jabref.gui.theme.ThemeManager;
import org.jabref.gui.util.BackgroundTask;
import org.jabref.gui.util.TaskExecutor;
import org.jabref.logic.l10n.Localization;
Expand Down Expand Up @@ -39,8 +37,6 @@ public DatabaseChangeMonitor(BibDatabaseContext database,
TaskExecutor taskExecutor,
DialogService dialogService,
PreferencesService preferencesService,
StateManager stateManager,
ThemeManager themeManager,
LibraryTab.DatabaseNotification notificationPane) {
this.database = database;
this.fileMonitor = fileMonitor;
Expand All @@ -63,7 +59,7 @@ public DatabaseChangeMonitor(BibDatabaseContext database,
Localization.lang("The library has been modified by another program."),
List.of(new Action(Localization.lang("Dismiss changes"), event -> notificationPane.hide()),
new Action(Localization.lang("Review changes"), event -> {
dialogService.showCustomDialogAndWait(new DatabaseChangesResolverDialog(changes, database, dialogService, stateManager, themeManager, preferencesService, Localization.lang("External Changes Resolver")));
dialogService.showCustomDialogAndWait(new DatabaseChangesResolverDialog(changes, database, Localization.lang("External Changes Resolver")));
notificationPane.hide();
})),
Duration.ZERO));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.jabref.gui.theme.ThemeManager;
import org.jabref.gui.util.BaseDialog;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntryTypesManager;
import org.jabref.preferences.PreferencesService;

import com.airhacks.afterburner.views.ViewLoader;
Expand Down Expand Up @@ -46,12 +47,16 @@ public class DatabaseChangesResolverDialog extends BaseDialog<Boolean> {
private BorderPane changeInfoPane;

private final List<DatabaseChange> changes;
private final BibDatabaseContext database;

private ExternalChangesResolverViewModel viewModel;

private final DatabaseChangeDetailsViewFactory databaseChangeDetailsViewFactory;

@Inject private UndoManager undoManager;
@Inject private StateManager stateManager;
@Inject private DialogService dialogService;
@Inject private PreferencesService preferencesService;
@Inject private ThemeManager themeManager;
@Inject private BibEntryTypesManager entryTypesManager;

/**
* A dialog going through given <code>changes</code>, which are diffs to the provided <code>database</code>.
Expand All @@ -60,9 +65,9 @@ public class DatabaseChangesResolverDialog extends BaseDialog<Boolean> {
* @param changes The list of changes
* @param database The database to apply the changes to
*/
public DatabaseChangesResolverDialog(List<DatabaseChange> changes, BibDatabaseContext database, DialogService dialogService, StateManager stateManager, ThemeManager themeManager, PreferencesService preferencesService, String dialogTitle) {
public DatabaseChangesResolverDialog(List<DatabaseChange> changes, BibDatabaseContext database, String dialogTitle) {
this.changes = changes;
this.databaseChangeDetailsViewFactory = new DatabaseChangeDetailsViewFactory(database, dialogService, stateManager, themeManager, preferencesService);
this.database = database;

this.setTitle(dialogTitle);
ViewLoader.view(this)
Expand All @@ -82,6 +87,8 @@ public DatabaseChangesResolverDialog(List<DatabaseChange> changes, BibDatabaseCo

@FXML
private void initialize() {
DatabaseChangeDetailsViewFactory databaseChangeDetailsViewFactory = new DatabaseChangeDetailsViewFactory(database, dialogService, stateManager, themeManager, preferencesService, entryTypesManager);

viewModel = new ExternalChangesResolverViewModel(changes, undoManager);

changeName.setCellValueFactory(data -> new SimpleStringProperty(data.getValue().getName()));
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,24 +1,45 @@
package org.jabref.gui.collab.entrychange;

import javafx.geometry.Orientation;
import javafx.scene.control.SplitPane;
import javafx.scene.control.TabPane;

import org.jabref.gui.DialogService;
import org.jabref.gui.StateManager;
import org.jabref.gui.collab.DatabaseChangeDetailsView;
import org.jabref.gui.preview.PreviewViewer;
import org.jabref.gui.theme.ThemeManager;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.BibEntryTypesManager;
import org.jabref.preferences.PreferencesService;

import com.tobiasdiez.easybind.EasyBind;

public final class EntryChangeDetailsView extends DatabaseChangeDetailsView {
public EntryChangeDetailsView(EntryChange entryChange, BibDatabaseContext bibDatabaseContext, DialogService dialogService, StateManager stateManager, ThemeManager themeManager, PreferencesService preferencesService) {
PreviewViewer previewViewer = new PreviewViewer(bibDatabaseContext, dialogService, stateManager, themeManager);
previewViewer.setLayout(preferencesService.getPreviewPreferences().getSelectedPreviewLayout());
previewViewer.setEntry(entryChange.getNewEntry());
private final PreviewWithSourceTab oldPreviewWithSourcesTab = new PreviewWithSourceTab();
private final PreviewWithSourceTab newPreviewWithSourcesTab = new PreviewWithSourceTab();

public EntryChangeDetailsView(BibEntry oldEntry, BibEntry newEntry, BibDatabaseContext databaseContext, DialogService dialogService, StateManager stateManager, ThemeManager themeManager, PreferencesService preferencesService, BibEntryTypesManager entryTypesManager) {
Siedlerchr marked this conversation as resolved.
Show resolved Hide resolved
TabPane oldEntryTabPane = oldPreviewWithSourcesTab.getPreviewWithSourceTab(oldEntry, databaseContext, dialogService, stateManager, themeManager, preferencesService, entryTypesManager);
TabPane newEntryTabPane = newPreviewWithSourcesTab.getPreviewWithSourceTab(newEntry, databaseContext, dialogService, stateManager, themeManager, preferencesService, entryTypesManager);

EasyBind.subscribe(oldEntryTabPane.getSelectionModel().selectedIndexProperty(), selectedIndex -> {
newEntryTabPane.getSelectionModel().select(selectedIndex.intValue());
});

EasyBind.subscribe(newEntryTabPane.getSelectionModel().selectedIndexProperty(), selectedIndex -> {
if (oldEntryTabPane.getSelectionModel().getSelectedIndex() != selectedIndex.intValue()) {
oldEntryTabPane.getSelectionModel().select(selectedIndex.intValue());
}
});

setLeftAnchor(previewViewer, 8d);
setTopAnchor(previewViewer, 8d);
setRightAnchor(previewViewer, 8d);
setBottomAnchor(previewViewer, 8d);
SplitPane split = new SplitPane(oldEntryTabPane, newEntryTabPane);
split.setOrientation(Orientation.HORIZONTAL);

getChildren().setAll(previewViewer);
setLeftAnchor(split, 8d);
setTopAnchor(split, 8d);
setRightAnchor(split, 8d);
setBottomAnchor(split, 8d);
this.getChildren().add(split);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.jabref.gui.collab.entrychange;

import javafx.scene.control.TabPane;

import org.jabref.gui.DialogService;
import org.jabref.gui.StateManager;
import org.jabref.gui.collab.DatabaseChangeDetailsView;
import org.jabref.gui.theme.ThemeManager;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.BibEntryTypesManager;
import org.jabref.preferences.PreferencesService;

public final class EntryWithPreviewAndSourceDetailsView extends DatabaseChangeDetailsView {

private final PreviewWithSourceTab previewWithSourceTab = new PreviewWithSourceTab();

public EntryWithPreviewAndSourceDetailsView(BibEntry entry, BibDatabaseContext bibDatabaseContext, DialogService dialogService, StateManager stateManager, ThemeManager themeManager, PreferencesService preferencesService, BibEntryTypesManager entryTypesManager) {
Siedlerchr marked this conversation as resolved.
Show resolved Hide resolved
TabPane tabPanePreviewCode = previewWithSourceTab.getPreviewWithSourceTab(entry, bibDatabaseContext, dialogService, stateManager, themeManager, preferencesService, entryTypesManager);
setLeftAnchor(tabPanePreviewCode, 8d);
setTopAnchor(tabPanePreviewCode, 8d);
setRightAnchor(tabPanePreviewCode, 8d);
setBottomAnchor(tabPanePreviewCode, 8d);

getChildren().setAll(tabPanePreviewCode);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package org.jabref.gui.collab.entrychange;

import java.io.IOException;
import java.io.StringWriter;

import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;

import org.jabref.gui.DialogService;
import org.jabref.gui.StateManager;
import org.jabref.gui.preview.PreviewViewer;
import org.jabref.gui.theme.ThemeManager;
import org.jabref.logic.bibtex.BibEntryWriter;
import org.jabref.logic.bibtex.FieldWriter;
import org.jabref.logic.bibtex.FieldWriterPreferences;
import org.jabref.logic.exporter.BibWriter;
import org.jabref.logic.l10n.Localization;
import org.jabref.logic.util.OS;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.database.BibDatabaseMode;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.BibEntryTypesManager;
import org.jabref.preferences.PreferencesService;

import org.fxmisc.richtext.CodeArea;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PreviewWithSourceTab {

private static final Logger LOGGER = LoggerFactory.getLogger(PreviewWithSourceTab.class);

public TabPane getPreviewWithSourceTab(BibEntry entry, BibDatabaseContext bibDatabaseContext, DialogService dialogService, StateManager stateManager, ThemeManager themeManager, PreferencesService preferencesService, BibEntryTypesManager entryTypesManager) {
// TODO: Optimization: Each PreviewViewer instance creates a WebView on initialization. WebView instances are
// very heavy on CPU and memory. Thus, we should consider sharing PreviewViewer between entry changes.
PreviewViewer previewViewer = new PreviewViewer(bibDatabaseContext, dialogService, stateManager, themeManager);
previewViewer.setLayout(preferencesService.getPreviewPreferences().getSelectedPreviewLayout());
previewViewer.setEntry(entry);

CodeArea codeArea = new CodeArea();
codeArea.setId("bibtexcodearea");
codeArea.setWrapText(true);
codeArea.setDisable(true);

TabPane tabPanePreviewCode = new TabPane();
Tab previewTab = new Tab(Localization.lang("Entry preview"), previewViewer);

try {
codeArea.appendText(getSourceString(entry, bibDatabaseContext.getMode(), preferencesService.getFieldWriterPreferences(), entryTypesManager));
} catch (IOException e) {
LOGGER.error("Error getting Bibtex: {}", entry);
}
codeArea.setEditable(true);
Siedlerchr marked this conversation as resolved.
Show resolved Hide resolved
Tab codeTab = new Tab(Localization.lang("%0 source", bibDatabaseContext.getMode().getFormattedName()), codeArea);

tabPanePreviewCode.getTabs().addAll(previewTab, codeTab);
return tabPanePreviewCode;
}

private String getSourceString(BibEntry entry, BibDatabaseMode type, FieldWriterPreferences fieldWriterPreferences, BibEntryTypesManager entryTypesManager) throws IOException {
StringWriter writer = new StringWriter();
BibWriter bibWriter = new BibWriter(writer, OS.NEWLINE);
FieldWriter fieldWriter = FieldWriter.buildIgnoreHashes(fieldWriterPreferences);
new BibEntryWriter(fieldWriter, entryTypesManager).write(entry, bibWriter, type);
return writer.toString();
}
}
Loading