Skip to content

Commit f50e3e3

Browse files
subhramitkoppor
andauthored
CSL4LibreOffice - G [Custom CSL Styles, build-time loading] (#12951)
* Initial implementation - custom CSL Signed-off-by: subhramit <[email protected]> * Fix illegal character in external path Signed-off-by: subhramit <[email protected]> * Refine javadoc Signed-off-by: subhramit <[email protected]> * Add localization keys, rename StyleLoader->JStyleLoader Signed-off-by: subhramit <[email protected]> * Convert discovery to build-time process Signed-off-by: subhramit <[email protected]> * Refine build task dependencies Signed-off-by: subhramit <[email protected]> * Use `List.of()` Signed-off-by: subhramit <[email protected]> * Add more javadoc Signed-off-by: subhramit <[email protected]> * Use metadata from json Signed-off-by: subhramit <[email protected]> * Extract magic path, remove unused method Signed-off-by: subhramit <[email protected]> * Separate logic and model Signed-off-by: subhramit <[email protected]> * Make JStyleLoader pure Signed-off-by: subhramit <[email protected]> * Fix import order Signed-off-by: subhramit <[email protected]> * Fix import orders Signed-off-by: subhramit <[email protected]> * Remove clash check Signed-off-by: subhramit <[email protected]> * Rename jstyle methods, use modern java syntax Signed-off-by: subhramit <[email protected]> * Implement deletion Signed-off-by: subhramit <[email protected]> * Don't show paths for internal styles Signed-off-by: subhramit <[email protected]> * Convert to local Signed-off-by: subhramit <[email protected]> * Add check for empty catalog Signed-off-by: subhramit <[email protected]> * Update FAQ Signed-off-by: subhramit <[email protected]> * Concise javadoc Signed-off-by: subhramit <[email protected]> * Format faq Signed-off-by: subhramit <[email protected]> * Rename method Signed-off-by: subhramit <[email protected]> * Use modern java, refine javadoc Signed-off-by: subhramit <[email protected]> * Rename variable Signed-off-by: subhramit <[email protected]> * Separate logger declaration Signed-off-by: subhramit <[email protected]> * Add changelog entries Signed-off-by: subhramit <[email protected]> * Add PR number to changelog Signed-off-by: subhramit <[email protected]> * OpenRewrite Signed-off-by: subhramit <[email protected]> * Use `@AllowedToUseClassGetResource` for catalog generator Signed-off-by: subhramit <[email protected]> * Try to fix nulls in tests Signed-off-by: subhramit <[email protected]> * Try again to fix nulls in tests Signed-off-by: subhramit <[email protected]> * Experiment with mock preferences Signed-off-by: subhramit <[email protected]> * Revert Signed-off-by: subhramit <[email protected]> * Partial fix - snapshot Signed-off-by: subhramit <[email protected]> * Partial fix - snapshot Signed-off-by: subhramit <[email protected]> * Partial fix - snapshot Signed-off-by: subhramit <[email protected]> * Partial fix - snapshot Signed-off-by: subhramit <[email protected]> * Partial fix - snapshot Signed-off-by: subhramit <[email protected]> * Bridging commit Signed-off-by: subhramit <[email protected]> * Bridging commit - address review comments, fix tests. Signed-off-by: subhramit <[email protected]> * Clean build file Signed-off-by: subhramit <[email protected]> * Remove redundant comments Signed-off-by: subhramit <[email protected]> * Constructor injection: loader Signed-off-by: subhramit <[email protected]> * Remove dead method Signed-off-by: subhramit <[email protected]> * Add tests Signed-off-by: subhramit <[email protected]> * Parameterize tests Signed-off-by: subhramit <[email protected]> * Enhance javadoc Signed-off-by: subhramit <[email protected]> * Add another custom style test Signed-off-by: subhramit <[email protected]> * Refine comment Signed-off-by: subhramit <[email protected]> * Use external styles in preview Signed-off-by: subhramit <[email protected]> * Rename `fromOOBibStyle` to `fromJStyle` Signed-off-by: subhramit <[email protected]> * Use `_` for unused observable variables Signed-off-by: subhramit <[email protected]> * Use enumeration for tabs Signed-off-by: subhramit <[email protected]> * Remove unnecessary semicolon Signed-off-by: subhramit <[email protected]> * Rename enum Signed-off-by: subhramit <[email protected]> * Rename tabType Signed-off-by: subhramit <[email protected]> * Refactor viewmodel, add uniform double click action Signed-off-by: subhramit <[email protected]> * Refine comment Signed-off-by: subhramit <[email protected]> * Use class-qualified call Signed-off-by: subhramit <[email protected]> * Use fx id to identify tabs Signed-off-by: subhramit <[email protected]> * Trigger workflows * Trigger workflows * Trigger workflows * Fix variable name * Re-write fxml properties, re-order items in view file Signed-off-by: subhramit <[email protected]> * Reorder viewmodel Signed-off-by: subhramit <[email protected]> * Make UI uniform Signed-off-by: subhramit <[email protected]> * Ordering of properties Signed-off-by: subhramit <[email protected]> * Looker style type description Signed-off-by: subhramit <[email protected]> * Update l10n Signed-off-by: subhramit <[email protected]> * Use `StandardFileType.getName()` Signed-off-by: subhramit <[email protected]> --------- Signed-off-by: subhramit <[email protected]> Co-authored-by: Oliver Kopp <[email protected]>
1 parent 9ab6c71 commit f50e3e3

30 files changed

+3938
-612
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
3535
- We added automatic PubMed URL insertion when importing from PubMed if no URL is present. [#12832](https://github.com/JabRef/jabref/issues/12832/)
3636
- We added a "LTWA" abbreviation feature in the "Quality > Abbreviate journal names > LTWA" menu [#12273](https://github.com/JabRef/jabref/issues/12273/)
3737
- We added path validation to file directories in library properties dialog. [#11840](https://github.com/JabRef/jabref/issues/11840)
38+
- We now support usage of custom CSL styles in the Open/LibreOffice integration. [#12337](https://github.com/JabRef/jabref/issues/12337)
3839

3940
### Changed
4041

@@ -70,6 +71,8 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
7071
- We improved search in preferences and keybindings. [#12647](https://github.com/JabRef/jabref/issues/12647)
7172
- We improved the performance of the LibreOffice integration when inserting CSL citations/bibliography. [#12851](https://github.com/JabRef/jabref/pull/12851)
7273
- 'Affected fields' and 'Do not wrap when saving' are now displayed as tags. [#12550](https://github.com/JabRef/jabref/issues/12550)
74+
- We revamped the UI of the Select Style dialog (in the LibreOffice panel) for CSL styles. [#12951](https://github.com/JabRef/jabref/pull/12951)
75+
- We reduced the delay in populating the list of CSL styles in the Select Style dialog of the LibreOffice panel. [#12951](https://github.com/JabRef/jabref/pull/12951)
7376

7477
### Fixed
7578

build.gradle

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,32 @@ tasks.register('generateLtwaListMV', JavaExec) {
552552
jar.dependsOn("generateLtwaListMV")
553553
compileTestJava.dependsOn("generateLtwaListMV")
554554

555+
tasks.register('generateCitationStyleCatalog', JavaExec) {
556+
group = "JabRef"
557+
description = "Generates a catalog of all available citation styles"
558+
559+
dependsOn 'processResources'
560+
561+
classpath = sourceSets.main.runtimeClasspath
562+
563+
mainClass = "org.jabref.logic.citationstyle.CitationStyleCatalogGenerator"
564+
javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
565+
}
566+
567+
jar.dependsOn('generateCitationStyleCatalog')
568+
569+
// catalog from above task needs to be copied to build output for tests
570+
tasks.register('copyCitationStyleCatalog', Copy) {
571+
from 'src/main/resources/citation-style-catalog.json'
572+
into 'build/resources/main'
573+
mustRunAfter 'checkstyleMain'
574+
dependsOn 'generateCitationStyleCatalog'
575+
}
576+
577+
compileTestJava.dependsOn('copyCitationStyleCatalog')
578+
generateJournalListMV.dependsOn('copyCitationStyleCatalog')
579+
generateLtwaListMV.dependsOn('copyCitationStyleCatalog')
580+
555581
tasks.register('generateCitaviSource', XjcTask) {
556582
group = 'JabRef'
557583
description = "Generates java files for the citavi importer."

docs/code-howtos/faq.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ You can always click on the details of the failing test to pinpoint which keys a
3232
Background: There are localization keys in the [localization properties file](https://github.com/JabRef/jabref/blob/main/src/main/resources/l10n/JabRef_en.properties) that are not used in the code, probably due to the removal of existing code.
3333
Read more about the background and format of localization in JabRef [here](https://devdocs.jabref.org/code-howtos/localization.html).
3434

35-
### `org.jabref.logic.citationstyle.CitationStyle discoverCitationStyles` <span style="color:red">ERROR: Could not find any citation style. Tried with /ieee.csl.</span>
35+
### `org.jabref.logic.citationstyle.CitationStyleCatalogGenerator generateCitationStyleCatalog` <span style="color:red">ERROR: Could not find any citation style. Tried with /ieee.csl.</span>
3636

3737
Check the directory `src/main/resources/csl-styles`.
3838
If it is missing or empty, run `git submodule update`.

src/main/java/org/jabref/Launcher.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.jabref.gui.preferences.JabRefGuiPreferences;
99
import org.jabref.gui.util.DefaultFileUpdateMonitor;
1010
import org.jabref.logic.UiCommand;
11+
import org.jabref.logic.citationstyle.CSLStyleLoader;
1112
import org.jabref.logic.preferences.CliPreferences;
1213
import org.jabref.logic.search.PostgreServer;
1314
import org.jabref.logic.util.HeadlessExecutorService;
@@ -35,13 +36,15 @@ public static void main(String[] args) {
3536
HeadlessExecutorService.INSTANCE.executeInterruptableTask(fileUpdateMonitor, "FileUpdateMonitor");
3637

3738
List<UiCommand> uiCommands = JabKit.processArguments(args, preferences, fileUpdateMonitor);
38-
// The method `processArguments` quites the whole JVM if no GUI is needed.
39+
// The method `processArguments` quits the whole JVM if no GUI is needed.
3940

4041
PreferencesMigrations.runMigrations(preferences);
4142

4243
PostgreServer postgreServer = new PostgreServer();
4344
Injector.setModelOrService(PostgreServer.class, postgreServer);
4445

46+
CSLStyleLoader.loadInternalStyles();
47+
4548
JabRefGUI.setup(uiCommands, preferences, fileUpdateMonitor);
4649
JabRefGUI.launch(JabRefGUI.class, args);
4750
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.jabref.gui.openoffice;
2+
3+
import javafx.beans.property.BooleanProperty;
4+
import javafx.beans.property.SimpleBooleanProperty;
5+
import javafx.beans.property.SimpleStringProperty;
6+
import javafx.beans.property.StringProperty;
7+
8+
import org.jabref.logic.citationstyle.CitationStylePreviewLayout;
9+
import org.jabref.logic.l10n.Localization;
10+
11+
public class CSLStyleSelectViewModel {
12+
private final CitationStylePreviewLayout layout;
13+
private final StringProperty nameProperty = new SimpleStringProperty();
14+
private final StringProperty pathProperty = new SimpleStringProperty();
15+
private final BooleanProperty internalStyleProperty = new SimpleBooleanProperty();
16+
17+
public CSLStyleSelectViewModel(CitationStylePreviewLayout layout) {
18+
this.layout = layout;
19+
this.nameProperty.set(layout.getDisplayName());
20+
if (layout.getCitationStyle().isInternalStyle()) {
21+
this.pathProperty.set(Localization.lang("Internal style"));
22+
} else {
23+
this.pathProperty.set(layout.getFilePath());
24+
}
25+
this.internalStyleProperty.set(layout.getCitationStyle().isInternalStyle());
26+
}
27+
28+
public StringProperty nameProperty() {
29+
return nameProperty;
30+
}
31+
32+
public StringProperty pathProperty() {
33+
return pathProperty;
34+
}
35+
36+
public BooleanProperty internalStyleProperty() {
37+
return internalStyleProperty;
38+
}
39+
40+
public CitationStylePreviewLayout getLayout() {
41+
return layout;
42+
}
43+
}

src/main/java/org/jabref/gui/openoffice/StyleSelectItemViewModel.java renamed to src/main/java/org/jabref/gui/openoffice/JStyleSelectViewModel.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import org.jabref.gui.icon.IconTheme;
1212
import org.jabref.logic.openoffice.style.JStyle;
1313

14-
public class StyleSelectItemViewModel {
14+
public class JStyleSelectViewModel {
1515

1616
private final StringProperty name = new SimpleStringProperty("");
1717
private final StringProperty journals = new SimpleStringProperty("");
@@ -20,7 +20,7 @@ public class StyleSelectItemViewModel {
2020
private final JStyle jStyle;
2121
private final BooleanProperty internalStyle = new SimpleBooleanProperty();
2222

23-
public StyleSelectItemViewModel(String name, String journals, String file, JStyle jStyle) {
23+
public JStyleSelectViewModel(String name, String journals, String file, JStyle jStyle) {
2424
this.name.setValue(name);
2525
this.journals.setValue(journals);
2626
this.file.setValue(file);

src/main/java/org/jabref/gui/openoffice/OpenOfficePanel.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.jabref.logic.ai.AiService;
4646
import org.jabref.logic.citationkeypattern.CitationKeyGenerator;
4747
import org.jabref.logic.citationkeypattern.CitationKeyPatternPreferences;
48+
import org.jabref.logic.citationstyle.CSLStyleLoader;
4849
import org.jabref.logic.citationstyle.CitationStyle;
4950
import org.jabref.logic.help.HelpFile;
5051
import org.jabref.logic.journals.JournalAbbreviationRepository;
@@ -54,8 +55,8 @@
5455
import org.jabref.logic.openoffice.OpenOfficePreferences;
5556
import org.jabref.logic.openoffice.action.Update;
5657
import org.jabref.logic.openoffice.style.JStyle;
58+
import org.jabref.logic.openoffice.style.JStyleLoader;
5759
import org.jabref.logic.openoffice.style.OOStyle;
58-
import org.jabref.logic.openoffice.style.StyleLoader;
5960
import org.jabref.logic.util.BackgroundTask;
6061
import org.jabref.model.database.BibDatabase;
6162
import org.jabref.model.database.BibDatabaseContext;
@@ -105,7 +106,8 @@ public class OpenOfficePanel {
105106
private final UndoManager undoManager;
106107
private final UiTaskExecutor taskExecutor;
107108
private final AiService aiService;
108-
private final StyleLoader loader;
109+
private final JStyleLoader jStyleLoader;
110+
private final CSLStyleLoader cslStyleLoader;
109111
private final LibraryTabContainer tabContainer;
110112
private final FileUpdateMonitor fileUpdateMonitor;
111113
private final BibEntryTypesManager entryTypesManager;
@@ -143,6 +145,15 @@ public OpenOfficePanel(LibraryTabContainer tabContainer,
143145
this.undoManager = undoManager;
144146
this.currentStyle = openOfficePreferences.getCurrentStyle();
145147

148+
this.currentStyleProperty = new SimpleObjectProperty<>(currentStyle);
149+
150+
jStyleLoader = new JStyleLoader(
151+
openOfficePreferences,
152+
layoutFormatterPreferences,
153+
abbreviationRepository);
154+
155+
cslStyleLoader = new CSLStyleLoader(openOfficePreferences);
156+
146157
ActionFactory factory = new ActionFactory();
147158

148159
connect = new Button();
@@ -168,13 +179,6 @@ public OpenOfficePanel(LibraryTabContainer tabContainer,
168179
update.setTooltip(new Tooltip(Localization.lang("Sync OpenOffice/LibreOffice bibliography")));
169180
update.setMaxWidth(Double.MAX_VALUE);
170181

171-
loader = new StyleLoader(
172-
openOfficePreferences,
173-
layoutFormatterPreferences,
174-
abbreviationRepository);
175-
176-
currentStyleProperty = new SimpleObjectProperty<>(currentStyle);
177-
178182
initPanel();
179183
}
180184

@@ -187,16 +191,16 @@ public Node getContent() {
187191
* Return true if failed. In this case the dialog is already shown.
188192
*/
189193
private boolean getOrUpdateTheStyle(String title) {
190-
currentStyle = loader.getUsedStyleUnified();
191-
currentStyleProperty.set(currentStyle);
192194
final boolean FAIL = true;
193195
final boolean PASS = false;
194196

195197
if (currentStyle == null) {
196-
currentStyle = loader.getUsedStyleUnified();
198+
currentStyle = openOfficePreferences.getCurrentStyle();
199+
currentStyleProperty.set(currentStyle);
197200
} else {
198201
if (currentStyle instanceof JStyle jStyle) {
199202
try {
203+
jStyle = jStyleLoader.getUsedJstyle();
200204
jStyle.ensureUpToDate();
201205
} catch (IOException ex) {
202206
LOGGER.warn("Unable to reload style file '{}'", jStyle.getPath(), ex);
@@ -230,7 +234,7 @@ private void initPanel() {
230234

231235
setStyleFile.setMaxWidth(Double.MAX_VALUE);
232236
setStyleFile.setOnAction(event -> {
233-
StyleSelectDialogView styleDialog = new StyleSelectDialogView(loader);
237+
StyleSelectDialogView styleDialog = new StyleSelectDialogView(cslStyleLoader, jStyleLoader);
234238
dialogService.showCustomDialogAndWait(styleDialog)
235239
.ifPresent(selectedStyle -> {
236240
currentStyle = selectedStyle;

src/main/java/org/jabref/gui/openoffice/StyleSelectDialog.fxml

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<?import javafx.scene.control.ButtonType?>
66
<?import javafx.scene.control.DialogPane?>
77
<?import javafx.scene.control.Label?>
8-
<?import javafx.scene.control.ListView?>
98
<?import javafx.scene.control.Tab?>
109
<?import javafx.scene.control.TableColumn?>
1110
<?import javafx.scene.control.TableView?>
@@ -14,59 +13,67 @@
1413
<?import javafx.scene.layout.HBox?>
1514
<?import javafx.scene.layout.VBox?>
1615
<?import org.controlsfx.control.textfield.CustomTextField?>
17-
<DialogPane xmlns:fx="http://javafx.com/fxml/1" minHeight="-Infinity" minWidth="-Infinity" prefHeight="550.0"
16+
<DialogPane xmlns:fx="http://javafx.com/fxml/1" minHeight="-Infinity" minWidth="-Infinity" prefHeight="580.0"
1817
prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.171"
1918
fx:controller="org.jabref.gui.openoffice.StyleSelectDialogView"
2019
id="styleSelectDialog">
2120
<content>
2221
<VBox spacing="10.0">
2322
<TabPane fx:id="tabPane" tabClosingPolicy="UNAVAILABLE" VBox.vgrow="ALWAYS">
24-
<Tab text="CSL Styles">
23+
<Tab fx:id="cslStyleTab" text="CSL Styles">
2524
<VBox spacing="10.0" VBox.vgrow="ALWAYS">
2625
<padding>
2726
<Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
2827
</padding>
29-
<VBox spacing="4.0" VBox.vgrow="ALWAYS">
28+
<HBox alignment="CENTER_LEFT" spacing="10.0">
3029
<Label text="%Available" styleClass="sectionHeader"/>
31-
<CustomTextField fx:id="searchBox" promptText="%Filter" prefHeight="20.0"/>
32-
<ListView fx:id="availableListView" VBox.vgrow="ALWAYS"/>
33-
</VBox>
30+
<HBox HBox.hgrow="ALWAYS" />
31+
<Button fx:id="addCslButton" text="%Add .csl file" onAction="#addCslStyleFile"/>
32+
</HBox>
33+
<CustomTextField fx:id="searchBox" promptText="%Filter" prefHeight="20.0"/>
34+
<TableView fx:id="cslStylesTable" VBox.vgrow="ALWAYS" prefHeight="350.0">
35+
<columns>
36+
<TableColumn fx:id="cslNameColumn" text="%Name" minWidth="200.0" prefWidth="-1.0"/>
37+
<TableColumn fx:id="cslPathColumn" text="%File" minWidth="100.0" prefWidth="-1.0"/>
38+
<TableColumn fx:id="cslDeleteColumn" minWidth="30.0" maxWidth="30.0" resizable="false"/>
39+
</columns>
40+
<columnResizePolicy>
41+
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
42+
</columnResizePolicy>
43+
</TableView>
3444
<VBox spacing="4.0">
3545
<Label text="%Preview" styleClass="sectionHeader"/>
36-
<VBox fx:id="cslPreviewBox" prefHeight="300.0" spacing="4.0"/>
46+
<VBox fx:id="cslPreviewBox" prefHeight="200.0" spacing="4.0"/>
3747
</VBox>
3848
<Button text="%Modify bibliography title" alignment="CENTER_RIGHT" onAction="#modifyBibliographyTitle" />
3949
</VBox>
4050
</Tab>
41-
<Tab text="JStyles">
42-
<BorderPane>
43-
<top>
44-
<TableView fx:id="tvStyles" prefHeight="208.0" prefWidth="662.0" BorderPane.alignment="CENTER">
45-
<columns>
46-
<TableColumn fx:id="colName" minWidth="100.0" prefWidth="-1.0" text="%Name"/>
47-
<TableColumn fx:id="colJournals" minWidth="100.0" prefWidth="75.0" text="%Journals"/>
48-
<TableColumn fx:id="colFile" minWidth="100.0" prefWidth="-1.0" text="%File"/>
49-
<TableColumn fx:id="colDeleteIcon" minWidth="100.0" prefWidth="-1.0"/>
50-
</columns>
51-
<columnResizePolicy>
52-
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
53-
</columnResizePolicy>
54-
</TableView>
55-
</top>
56-
<right>
57-
<Button fx:id="add" alignment="TOP_RIGHT" mnemonicParsing="false" onAction="#addStyleFile"
58-
text="%Add style file" BorderPane.alignment="CENTER"/>
59-
</right>
60-
<bottom>
61-
<VBox spacing="4.0">
62-
<padding>
63-
<Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
64-
</padding>
65-
<Label text="%Preview" styleClass="sectionHeader"/>
66-
<VBox fx:id="jstylePreviewBox" prefHeight="84.0" prefWidth="665.0" BorderPane.alignment="CENTER"/>
67-
</VBox>
68-
</bottom>
69-
</BorderPane>
51+
<Tab fx:id="jStyleTab" text="JStyles">
52+
<VBox spacing="10.0" VBox.vgrow="ALWAYS">
53+
<padding>
54+
<Insets top="10.0" right="10.0" bottom="10.0" left="10.0"/>
55+
</padding>
56+
<HBox alignment="CENTER_LEFT" spacing="10.0">
57+
<Label text="%Available" styleClass="sectionHeader"/>
58+
<HBox HBox.hgrow="ALWAYS" />
59+
<Button fx:id="addJStyleButton" text="%Add .jstyle file" onAction="#addJStyleFile"/>
60+
</HBox>
61+
<TableView fx:id="jStylesTable" VBox.vgrow="ALWAYS" prefHeight="350.0">
62+
<columns>
63+
<TableColumn fx:id="jStyleNameColumn" minWidth="100.0" prefWidth="-1.0" text="%Name"/>
64+
<TableColumn fx:id="jStyleJournalColumn" minWidth="100.0" prefWidth="75.0" text="%Journals"/>
65+
<TableColumn fx:id="jStyleFileColumn" minWidth="100.0" prefWidth="-1.0" text="%File"/>
66+
<TableColumn fx:id="jStyleDeleteColumn" minWidth="30.0" maxWidth="30.0" resizable="false"/>
67+
</columns>
68+
<columnResizePolicy>
69+
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/>
70+
</columnResizePolicy>
71+
</TableView>
72+
<VBox spacing="4.0">
73+
<Label text="%Preview" styleClass="sectionHeader"/>
74+
<VBox fx:id="jStylePreviewBox" prefHeight="84.0" prefWidth="665.0"/>
75+
</VBox>
76+
</VBox>
7077
</Tab>
7178
</TabPane>
7279
<HBox alignment="CENTER_LEFT" spacing="10.0">

0 commit comments

Comments
 (0)