diff --git a/src/main/java/org/jabref/gui/JabRefMaterialDesignIcon.java b/src/main/java/org/jabref/gui/JabRefMaterialDesignIcon.java new file mode 100644 index 00000000000..c892f8f0bd1 --- /dev/null +++ b/src/main/java/org/jabref/gui/JabRefMaterialDesignIcon.java @@ -0,0 +1,44 @@ +package org.jabref.gui; + +import de.jensd.fx.glyphs.GlyphIcons; + +/** + * Provides the same true-type font interface as MaterialDesignIcon itself, but uses a font we created ourselves that + * contains icons that are not available in MaterialDesignIcons. + * + * @implNote The glyphs of the ttf (speak: the icons) were created with Illustrator and a template from the material design icons + * web-page. The art boards for each icon was exported as SVG and then converted with + * IcoMoon. The final TTF font is located in the resource folder. + * @see Tutorial on our Wiki + * @see Material Design Icon custom page + */ +public enum JabRefMaterialDesignIcon implements GlyphIcons { + + TEX_STUDIO("\ue900"), + TEX_MAKER("\ue901"), + EMACS("\ue902"), + OPEN_OFFICE("\ue903"), + VIM("\ue904"), + LYX("\ue905"), + WINEDT("\ue906"), + ARXIV("\ue907"), + COPY("\ue908"), + PASTE("\ue909"); + + + private final String unicode; + + JabRefMaterialDesignIcon(String unicode) { + this.unicode = unicode; + } + + @Override + public String unicode() { + return unicode; + } + + @Override + public String fontFamily() { + return "\'JabRefMaterialDesign\'"; + } +} diff --git a/src/main/java/org/jabref/gui/Main.css b/src/main/java/org/jabref/gui/Main.css index 8ec16e91e05..68ded58af53 100644 --- a/src/main/java/org/jabref/gui/Main.css +++ b/src/main/java/org/jabref/gui/Main.css @@ -1,69 +1,249 @@ -/* - * The base css file defining the style that is valid for every pane and dialog. - */ - .root { + /* - * A strong blue to indicate something neutral. - */ - -fx-neutral: #2980b9; + The theme color and some derived colors from it are used for icons, tab-headers, marking of selected inputs and + hover colors for the main menu. It generally defines the look of JabRef. The highlighting colors below should + work nicely with this base color + */ + + /*-jr-theme: #2467ab;*/ + + /* This theme is the original JabRef dark blue color */ + -jr-theme: #50618F; + /* The base gray. Most gray-tones in the application are derived from this color. */ + -jr-base: #f0f0f0; + -jr-accent: derive(-jr-theme, 50%); + + -jr-white: #ffffff; + -jr-gray-0: #f0f0f0; + -jr-gray-1: #e6e6e6; + -jr-gray-2: #808080; + -jr-gray-3: #404040; + -jr-black: #000; + + /* Highlights */ + -jr-blue: #0abde3; + -jr-light-blue: #48dbfb; + -jr-purple: #f368e0; + -jr-light-purple: #ff9ff3; + -jr-green: #10ac84; + -jr-light-green: #1dd1a1; + -jr-red: #ee5253; + -jr-light-red: #ff6b6b; + -jr-yellow: #feca57; + -jr-orange: #ff9f43; + + /* Some blueish greys */ + -jr-blue-gray-1: #c8d6e5; + -jr-blue-gray-2: #8395a7; + -jr-blue-gray-3: #576574; + -jr-blue-gray-4: #222f3e; + + + /* maintable and group view cells*/ + -jr-hover-cell: derive(-jr-yellow, 50%); + -jr-selected-cell: derive(-jr-yellow, 5%); + -jr-drag-target: -jr-orange; + + /* Background-color of the toolbar */ + -jr-toolbar: derive(-jr-base, 80%); + + /* All icons on toolbars or next to inputs */ + -jr-icon: -jr-theme; + + /* Colors for messages and errors */ + -jr-info: -jr-light-green; + -jr-warn: -jr-orange; + -jr-error: -jr-light-red; + + /* Background-color for the small group view indicator for the number of hits */ + -jr-group-hits-bg: -jr-gray-0; + + /* Specific color for general tooltips */ + -jr-tooltip-bg: -jr-info; + -jr-tooltip-fg: -jr-black; + + /* Finally, some specific jr styles that depend on -fx definitions in *this* style */ + -jr-sidepane-background: -fx-control-inner-background; + -jr-sidepane-header-background: -fx-background; + -jr-sidepane-header-color: -jr-icon; + + /* Specs for the scrollbars */ + -jr-scrollbar-thumb: -fx-outer-border; + -jr-scrollbar-track: -fx-control-inner-background; /* - * A strong green to indicate something positive. + Here are redefinitions of the default properties of modena. They should in principle all be derived from the + above colors. Goal should be to make as few as possible direct color-changes to elements and only do this for + very specific purposes. */ - -fx-positive: #27ae60; + -fx-base: -jr-base; - /* - * A strong red to indicate something negative. + /* A very light grey used for the background of windows. See also + * -fx-text-background-color, which should be used as the -fx-text-fill + * value for text painted on top of backgrounds colored with -fx-background. */ - -fx-negative: #c0392b; + -fx-background: derive(-fx-base, 26.4%); - /* - * A dark grayish blue to display information (but kind of highlighted). + /* Used for the inside of text boxes, password boxes, lists, trees, and + * tables. See also -fx-text-inner-color, which should be used as the + * -fx-text-fill value for text painted on top of backgrounds colored + * with -fx-control-inner-background. */ - -fx-info: #2c3e50; + -fx-control-inner-background: derive(-fx-base, 80%); + /* Version of -fx-control-inner-background for alternative rows */ + -fx-control-inner-background-alt: derive(-fx-control-inner-background, -2%); + + /* One of these colors will be chosen based upon a ladder calculation + * that uses the brightness of a background color. Instead of using these + * colors directly as -fx-text-fill values, the sections in this file should + * use a derived color to match the background in use. See also: + * + * -fx-text-base-color for text on top of -fx-base, -fx-color, and -fx-body-color + * -fx-text-background-color for text on top of -fx-background + * -fx-text-inner-color for text on top of -fx-control-inner-color + * -fx-selection-bar-text for text on top of -fx-selection-bar + */ + -fx-dark-text-color: -jr-black; + -fx-mid-text-color: derive(-jr-base, -60%); + -fx-light-text-color: -jr-white; - /* - * A dark gray to indicate something not so important + /* A bright blue for highlighting/accenting objects. For example: selected + * text; selected items in menus, lists, trees, and tables; progress bars */ + -fx-accent: -jr-accent; + + /* Default buttons color, this is similar to accent but more subtle */ + -fx-default-button: derive(-fx-accent, 50%); + + /* A bright blue for the focus indicator of objects. Typically used as the + * first color in -fx-background-color for the "focused" pseudo-class. Also + * typically used with insets of -1.4 to provide a glowing effect. + */ + -fx-focus-color: -fx-accent; + -fx-faint-focus-color: derive(-fx-accent, 50%); + + /* The color that is used in styling controls. The default value is based + * on -fx-base, but is changed by pseudoclasses to change the base color. + * For example, the "hover" pseudoclass will typically set -fx-color to + * -fx-hover-base (see below) and the "armed" pseudoclass will typically + * set -fx-color to -fx-pressed-base. */ - -fx-unimportant: #595959; + -fx-color: -fx-base; - /* - * A light gray for accented background + -fx-hover-base: derive(-fx-base,30%); + + /* A little darker than -fx-base and used as the -fx-color for the + * "armed" pseudoclass state. + * + * TODO: should this be renamed to -fx-armed-base? */ - -fx-accented-background: #dadad8; + -fx-pressed-base: derive(-fx-base,-6%); - /* - * A darker gray as background + /* The color to use for -fx-text-fill when text is to be painted on top of + * a background filled with the -fx-background color. */ - -fx-dark-background: #aaaaaa; + -fx-text-background-color: -fx-dark-text-color; - /* - * A strong white as background + /* A little darker than -fx-color and used to draw boxes around objects such + * as progress bars, scroll bars, scroll panes, trees, tables, and lists. */ - -fx-light-background: #ffffff; + -fx-box-border: derive(-fx-color,-5%); - /* - * A dark gray for borders + /* Darker than -fx-background and used to draw boxes around text boxes and + * password boxes. */ - -fx-border: #868786; + -fx-text-box-border: derive(-fx-background, -15%); - /* - * A light gray for background for active items in list like elements such as menus, lists, trees, and tables. + /* Lighter than -fx-background and used to provide a small highlight when + * needed on top of -fx-background. This is never a shadow in Modena but + * keep -fx-shadow-highlight-color name to be compatible with Caspian. */ - -fx-selection-bar: #e5e5e5; + -fx-shadow-highlight-color: rgba(255,255,255,0.07) 70%; - /* - * The base color for the theme + /* A gradient that goes from a little darker than -fx-color on the top to + * even more darker than -fx-color on the bottom. Typically is the second + * color in the -fx-background-color list as the small thin border around + * a control. It is typically the same size as the control (i.e., insets + * are 0). */ - -fx-theme-base: #4d4673; + -fx-outer-border: derive(-fx-color,-5%); - /* - * A slightly lighter theme-based color for backgrounds of active items (toggle button, selected list item) + /* A gradient that goes from a bit lighter than -fx-color on the top to + * a little darker at the bottom. Typically is the third color in the + * -fx-background-color list as a thin highlight inside the outer border. + * Insets are typically 1. + */ + -fx-inner-border: derive(-fx-color,65%); + -fx-inner-border-horizontal: derive(-fx-color,65%); + -fx-inner-border-bottomup: derive(-fx-color,65%); + + /*-fx-inner-border: red;*/ + /*-fx-inner-border-horizontal: green;*/ + /*-fx-inner-border-bottomup: blue;*/ + + /* A gradient that goes from a little lighter than -fx-color at the top to + * a little darker than -fx-color at the bottom and is used to fill the + * body of many controls such as buttons. */ - -fx-active-background: derive(-fx-theme-base, 20%); + -fx-body-color: derive(-fx-color,20%); + -fx-body-color-bottomup: derive(-fx-color,20%); + -fx-body-color-to-right: derive(-fx-color,20%); + + /* The color to use as -fx-text-fill when painting text on top of + * backgrounds filled with -fx-base, -fx-color, and -fx-body-color. + */ + -fx-text-base-color: -fx-dark-text-color 46%; + + /* The color to use as -fx-text-fill when painting text on top of + * backgrounds filled with -fx-control-inner-background. + */ + -fx-text-inner-color: -fx-dark-text-color; + + /* The color to use for small mark-like objects such as checks on check + * boxes, filled in circles in radio buttons, arrows on scroll bars, etc. + */ + -fx-mark-color: -jr-theme; + + /* The small thin light "shadow" for mark-like objects. Typically used in + * conjunction with -fx-mark-color with an insets of 1 0 -1 0. */ + -fx-mark-highlight-color: transparent; + /*-fx-mark-highlight-color: derive(-fx-color,80%);*/ + + /* Background for items in list like things such as menus, lists, trees, + * and tables. */ + -fx-selection-bar: -fx-accent; + + /* Background color to use for selection of list cells etc. This is when + * the control doesn't have focus or the row of a previously selected item. */ + -fx-selection-bar-non-focused: lightgrey; + + /* The color to use as -fx-text-fill when painting text on top of + * backgrounds filled with -fx-selection-bar. + * + * TODO: this can be removed + */ + -fx-selection-bar-text: -fx-text-background-color; + + /* These are needed for Popup */ + -fx-background-color: inherit; + -fx-background-radius: inherit; + -fx-background-insets: inherit; + -fx-padding: inherit; + + /** Focus line for keyboard focus traversal on cell based controls */ + -fx-cell-focus-inner-border: derive(-fx-selection-bar,30%); + + -fx-focused-text-base-color : -fx-dark-text-color; + -fx-focused-mark-color : -fx-focused-text-base-color; + + /* Consistent size for headers of tab-pane and side-panels*/ + -jr-header-height: 3em; } +/* + * The base css file defining the style that is valid for every pane and dialog. + */ + .hyperlink { -fx-padding: 0; -fx-underline: false; @@ -85,14 +265,13 @@ } .tooltip { - -fx-background-color: #616161; + -fx-background-color: -jr-tooltip-bg; -fx-opacity: 95%; - -fx-text-fill: rgba(255, 255, 255, 0.9); + -fx-text-fill: -jr-tooltip-fg; -fx-font-size: 1em; } .tooltip > TextFlow > Text { - -fx-fill: rgba(255, 255, 255, 0.9); -fx-font-size: 1em; } @@ -114,13 +293,27 @@ -fx-shadow-highlight-color: transparent; -fx-outer-border: transparent; -fx-inner-border: transparent; - -fx-focus-color: -fx-active-background; -fx-faint-focus-color: transparent; -fx-background-color: transparent; - -fx-text-background-color: dimgray; + -fx-text-background-color: transparent; -fx-padding: 0.5em; } +.flatButtonNoSpaceBottom .glyph-icon, +.flatButtonNoSpaceTop .glyph-icon, +.flatButton .glyph-icon { + -fx-fill: -jr-icon; + -fx-text-fill: -jr-icon; +} + +.flatButtonNoSpaceBottom:hover .glyph-icon, +.flatButtonNoSpaceTop:hover .glyph-icon, +.flatButton:hover .glyph-icon { + -fx-fill: derive(-jr-icon, -30%); + -fx-text-fill: derive(-jr-icon, -30%); + -fx-effect: dropshadow(one-pass-box, -jr-icon, 5, 0, 1, 1); +} + .flatButton:selected { -fx-background-color: -fx-active-background; -fx-text-fill: white; @@ -136,22 +329,22 @@ } .menu-bar { - -fx-background-color: white; + -fx-background-color: -fx-body-color; -fx-background-insets: 0; -fx-background-radius: 0; } -.menu-bar > .container > .menu-button > .label { - -fx-padding: 0.41777em 0.41777em 0.41777em 0.41777em; /* 5 5 5 5 */ -} +/*.menu-bar > .container > .menu-button > .label {*/ + /*-fx-padding: 0.41777em 0.41777em 0.41777em 0.41777em; !* 5 5 5 5 *!*/ +/*}*/ -.menu-bar > .menu { - -fx-padding: 0.0em 0.666667em 0.0em 0.666667em; /* 0 8 0 8 */ -} +/*.menu-bar > .menu {*/ + /*-fx-padding: 0.0em 0.666667em 0.0em 0.666667em; !* 0 8 0 8 *!*/ +/*}*/ -.menu-item { - -fx-padding: 0.5em 0.41777em 0.5em 0.41777em; /* 6 5 6 5 */ -} +/*.menu-item {*/ + /*-fx-padding: 0.5em 0.41777em 0.5em 0.41777em; !* 6 5 6 5 *!*/ +/*}*/ .tab-pane { -fx-open-tab-animation: NONE; @@ -161,24 +354,54 @@ .tab-pane > .tab-header-area > .headers-region > .tab { -fx-background-insets: 0; -fx-background-radius: 0; - -fx-background-color: -fx-accented-background; - -fx-border-color: -fx-border; + /*-fx-background-color: green;*/ + /*-fx-background-color: -fx-accented-background;*/ + -fx-border-color: -fx-outer-border; -fx-border-width: 0.5 0.5 0.5 0.5; - -fx-padding: 0.4em 0.9em 0.4em 0.9em; + -fx-padding: 0.3em 0.9em 0.3em 0.9em; + -fx-pref-height: -jr-header-height; + } .tab-pane > .tab-header-area > .headers-region > .tab .tab-label { - -fx-text-fill: -fx-unimportant; + -fx-text-fill: -fx-mid-text-color; +} + +.tab-pane > .tab-header-area > .headers-region > .control-buttons-tab { + -fx-border-color: -jr-theme; + -fx-fill: -jr-theme; + -fx-text-fill: -jr-theme; } .tab-pane > .tab-header-area > .headers-region > .tab:selected { - -fx-background-color: -fx-light-background; - -fx-border-color: -fx-active-background; + /*-fx-background-color: -fx-control-inner-background;*/ + -fx-border-color: -jr-theme; + -fx-fill: -jr-theme; + -fx-text-fill: -jr-theme; -fx-border-width: 3 0 0 0; } -.tab-pane > .tab-header-area > .headers-region > .tab:selected .tab-label { - -fx-text-fill: black; + +.tab-pane > .tab-header-area > .headers-region > .tab:selected .tab-label{ + -fx-text-fill: -jr-theme; + -fx-fill: -jr-theme; +} + +.tab-pane > .tab-header-area > .headers-region > .tab:selected .tab-close-button { + -fx-background-color: -jr-theme; +} + +.tab-pane > .tab-header-area > .headers-region > .tab:selected .tab-close-button:hover { + -fx-background-color: -jr-theme; + -fx-fill: derive(-jr-icon, -30%); + -fx-text-fill: derive(-jr-icon, -30%); + -fx-effect: dropshadow(one-pass-box, -jr-icon, 5, 0, 1, 1); +} + + +.tab-pane > .tab-header-area > .headers-region > .tab:selected .glyph-icon { + -fx-text-fill: -jr-theme; + -fx-fill: -jr-theme; } .tab-pane:focused > .tab-header-area > .headers-region > .tab:selected .focus-indicator { @@ -188,22 +411,23 @@ } .tab-pane > .tab-header-area > .tab-header-background { - -fx-background-color: -fx-accented-background; + -fx-background-color: -fx-outer-border; } .tab-pane > .tab-header-area > .headers-region > .tab .glyph-icon { -glyph-size: 13px; - -fx-text-fill: -fx-unimportant; - -fx-fill: -fx-unimportant; + -fx-text-fill: -fx-mid-text-color; + -fx-fill: -fx-mid-text-color; } .tab-pane > .tab-header-area > .headers-region > .tab:selected .glyph-icon { - -fx-text-fill: black; - -fx-fill: black; + -fx-text-fill: -jr-icon; + -fx-fill: -jr-icon; } .tab-pane > .tab-header-area { - -fx-padding: 0.416667em 5 0.0em 0em; + /*-fx-padding: 0.416667em 5 0.0em 0em;*/ + -fx-padding: 0 0 0 0; } .table-view { @@ -216,25 +440,25 @@ } .split-pane > .split-pane-divider { - -fx-background-color: -fx-accented-background; - -fx-padding: 0 0.15ex 0 0.15ex; + /*-fx-background-color: -jr-separator;*/ + -fx-padding: 0 .5 0 .5; } .table-row-cell:hover, .tree-table-row-cell:hover { - -fx-background-color: lightgrey; + -fx-background-color: -jr-hover-cell; } .table-row-cell:selected, .tree-table-row-cell:selected { - -fx-background-color: -fx-active-background; - -fx-text-fill: white; - -fx-fill: white; + -fx-background-color: -jr-selected-cell; + /*-fx-text-fill: white;*/ + /*-fx-fill: white;*/ } .tree-table-row-cell:selected > .tree-table-cell > .glyph-icon { - -fx-fill: white; - -fx-text-fill: white; + /*-fx-fill: white;*/ + /*-fx-text-fill: white;*/ } .table-view > .virtual-flow > .clipped-container > .sheet > .table-row-cell .table-cell:selected, @@ -272,32 +496,32 @@ } .text-input { - -fx-background-color: #cacbca, -fx-control-inner-background; + -fx-background-color: -fx-outer-border, -fx-control-inner-background; -fx-background-insets: 0, 1; } .text-input:focused { - -fx-background-color: -fx-active-background, -fx-control-inner-background; + -fx-background-color: -fx-accent, -fx-control-inner-background; -fx-background-insets: 0, 2; } .text-area { - -fx-background-color: white; + -fx-background-color: -fx-control-inner-background; } .text-area .content { - -fx-background-color: #cacbca, -fx-control-inner-background; + /*-fx-background-color: -jr-separator, -fx-control-inner-background;*/ -fx-background-insets: 0, 1; -fx-padding: 0.333333em 0.583em 0.333333em 0.583em; } .text-area:focused .content { - -fx-background-color: -fx-active-background, -fx-control-inner-background; + -fx-background-color: -fx-accent, -fx-control-inner-background; -fx-background-insets: 0, 2; } .date-picker > .text-field:focused { - -fx-background-color: -fx-active-background, -fx-control-inner-background; + -fx-background-color: -fx-accent, -fx-control-inner-background; -fx-background-insets: 0, 2; } @@ -308,21 +532,21 @@ .scroll-bar:horizontal .track, .scroll-bar:vertical .track { - -fx-background-color: derive(#868786, 20%); + -fx-background-color: -jr-scrollbar-track; -fx-opacity: 0.2; -fx-background-radius: 0em; } .scroll-bar:horizontal .thumb, .scroll-bar:vertical .thumb { - -fx-background-color: derive(#757575, 60%); + -fx-background-color: -jr-scrollbar-thumb; -fx-background-insets: 0, 0, 0; -fx-background-radius: 0em; } .scroll-bar .thumb:hover, .scroll-bar .thumb:pressed { - -fx-background-color: derive(black, 70%); + -fx-background-color: derive(-jr-scrollbar-thumb, -20%); } /* Hide increment and decrement buttons */ @@ -365,38 +589,65 @@ } .sidePaneComponentHeader { - -fx-background-color: -fx-dark-background; + -fx-background-color: -jr-sidepane-header-background; + -fx-padding: 0.3em 0.9em 0.3em 0.9em; + -fx-pref-height: -jr-header-height; } -.mainMenu { - -fx-background-color: derive(-fx-theme-base, -10%); +.sidePaneComponentHeader > .label { + -fx-text-fill: -jr-sidepane-header-color; + -fx-font-weight: bold; + -fx-padding: 0.3em 0.9em 0.3em 0.9em; } -.menu-bar > .container > .menu-button:hover, -.menu-bar > .container > .menu-button:focused, -.menu-bar > .container > .menu-button:showing { - -fx-background: derive(-fx-theme-base, 10%); +.sidePaneComponentHeader .glyph-icon{ + -fx-font-size: 16px; } +/*.mainMenu {*/ + /*-fx-background-color: -jr-background;*/ +/*}*/ -.mainMenu > .container > .menu-button > .label { - -fx-text-fill: white; - -fx-font-weight: bold; -} +/*.menu-bar > .container > .menu-button:hover,*/ +/*.menu-bar > .container > .menu-button:focused,*/ +/*.menu-bar > .container > .menu-button:showing {*/ + /*-fx-background: -jr-hover-cell;*/ +/*}*/ + +/*.mainMenu > .container > .menu-button > .label {*/ + /*-fx-text-fill: black;*/ + /*!*-fx-font-weight: bold;*!*/ +/*}*/ + +/*.menu-item:focused {*/ + /*-fx-background: -jr-hover-cell;*/ + /*-fx-background-color: -fx-background;*/ + /*-fx-text-fill: black;*/ +/*}*/ +/*.menu-item:focused > .label {*/ + /*-fx-text-fill: black;*/ +/*}*/ .mainToolbar { - -fx-background-color: derive(-fx-theme-base, -10%); + -fx-background-color: -jr-toolbar; + -fx-border-color: derive(-jr-toolbar, 50%); + -fx-border-width: 1 1 1 1; + -fx-border-radius: 2 2 2 2; + -fx-background-radius: 2 2 2 2; } .mainToolbar .glyph-icon { -fx-font-size: 1.7em; - -fx-text-fill: white; - -fx-fill: white; } -.mainToolbar .search-field { - -fx-background-color: derive(-fx-theme-base, -15%); +.mainToolbar .search-field .glyph-icon { + -fx-fill: -jr-icon; + -fx-text-fill: -jr-icon; } -.mainToolbar .search-field:focused { - -fx-background-color: derive(-fx-theme-base, 15%); +/* The little arrow that shows up when not all tool-bar icons fit into the tool-bar. +We want to have a look that matches our icons in the tool-bar */ +.mainToolbar .tool-bar-overflow-button:hover > .arrow { + -fx-background-color: -fx-mark-highlight-color, derive(-jr-icon, -30%); + -fx-effect: dropshadow(one-pass-box, -jr-icon, 5, 0, 1, 1); } + diff --git a/src/main/java/org/jabref/gui/SidePaneComponent.java b/src/main/java/org/jabref/gui/SidePaneComponent.java index aeb44955b4f..87c1cbc0ec7 100644 --- a/src/main/java/org/jabref/gui/SidePaneComponent.java +++ b/src/main/java/org/jabref/gui/SidePaneComponent.java @@ -103,8 +103,9 @@ public final Node getHeader() { BorderPane graphic = new BorderPane(); graphic.setCenter(icon.getGraphicNode()); BorderPane container = new BorderPane(); - container.setLeft(graphic); - container.setCenter(new Label(title)); +// container.setLeft(graphic); + final Label label = new Label(title); + container.setCenter(label); container.setRight(buttonContainer); container.getStyleClass().add("sidePaneComponentHeader"); diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.css b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.css index d548c167665..ae75a747177 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.css +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.css @@ -1,6 +1,6 @@ .text-area { - -fx-text-fill: text-area-foreground; - -fx-control-inner-background: text-area-background; + /*-fx-text-fill: text-area-foreground;*/ + /*-fx-control-inner-background: text-area-background;*/ } .text-area *.text { @@ -10,12 +10,12 @@ .editorPane { -fx-hgap: 10; -fx-vgap: 6; - -fx-background-color: -fx-light-background; + /*-fx-background-color: -jr-white;*/ -fx-padding: 5 5 5 15; } .date-picker > .date-picker-display-node { - -fx-text-fill: text-area-foreground; + /*-fx-text-fill: text-area-foreground;*/ -fx-text-origin: baseline; } @@ -24,12 +24,12 @@ } .combo-box > *.text { - -fx-text-fill: text-area-foreground; + /*-fx-text-fill: text-area-foreground;*/ -fx-text-origin: baseline; } .list-cell:odd { - -fx-background: text-area-background; + /*-fx-background: text-area-background;*/ } /* Selected rows */ @@ -48,7 +48,7 @@ .tree-table-row-cell:filled:selected, .table-row-cell:filled > .table-cell:selected, .tree-table-row-cell:filled > .tree-table-cell:selected { - -fx-background: -fx-selection-bar-non-focused; + -fx-background: -fx-selection-bar; } /* focused cell (keyboard navigation) */ .list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:focused, @@ -64,6 +64,14 @@ -fx-padding: 0.1em; -fx-font-size: 1.166667em; -fx-font-weight: bold; + -fx-text-fill: -jr-icon; +} + +#typeLabel:hover { + -fx-padding: 0.1em; + -fx-font-size: 1.166667em; + -fx-font-weight: bold; + -fx-text-fill: derive(-jr-icon, -30%); } .flatButton.narrow { @@ -78,37 +86,54 @@ -fx-padding: -0.2em 0.1em 0.1em 0.1em; } +/*.flatButton .glyph-icon, .flatButtonNoSpaceTop .glyph-icon, .flatButtonNoSpaceBottom .glyph-icon {*/ + /*-fx-fill: -jr-icon;*/ +/*}*/ + +/*.flatButton .glyph-icon:hover, .flatButtonNoSpaceTop .glyph-icon:hover, .flatButtonNoSpaceBottom .glyph-icon:hover {*/ + /*-fx-fill: derive(-jr-icon, -30%);*/ + /*-fx-effect: dropshadow(one-pass-box, -jr-icon, 5, 0, 1, 1);*/ +/*}*/ + .editorPane .glyph-icon { -glyph-size: 16px; } + .tool-bar { - -fx-background-color: #dadad8; + /*-fx-background-color: -jr-toolbar;*/ -fx-background-insets: 0; + /*-fx-border-color: -jr-gray-1;*/ + /*-fx-border-width: 1 1 1 1;*/ + /*-fx-border-radius: 2 2 2 2;*/ + /*-fx-background-radius: 2 2 2 2;*/ + /*-fx-text-fill: -jr-icon;*/ + /*-fx-fill: -jr-icon;*/ } + .tool-bar > .container > .separator { - -fx-background-color: #5e5f5e; + /*-fx-background-color: -jr-separator;*/ } .tool-bar .glyph-icon { - -glyph-size: 18px; + -glyph-size: 16px; -fx-font-size: 2em; } .warning-icon { - -fx-fill: #ffb500; + -fx-fill: -jr-warn; } .error-icon { - -fx-text-fill: #bb0613; - -fx-fill: #bb0613; + -fx-text-fill: -jr-error; + -fx-fill: -jr-error; } .tooltip-warning { - -fx-background-color: #d69600; + -fx-background-color: -jr-warn; } .tooltip-error { - -fx-background-color: #a80511; + -fx-background-color: -jr-error; } diff --git a/src/main/java/org/jabref/gui/groups/GroupTree.css b/src/main/java/org/jabref/gui/groups/GroupTree.css index ca0fd0eb453..a05f6bbbc19 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTree.css +++ b/src/main/java/org/jabref/gui/groups/GroupTree.css @@ -1,10 +1,10 @@ .tree-table-view, .tree-table-row-cell { - -fx-background-color: #dadad8; + -fx-background-color: -jr-sidepane-background; -fx-table-cell-border-color: transparent; /* hide grid lines */ } .tree-table-cell { - -fx-font-size: 105%; + /*-fx-font-size: 105%;*/ -fx-padding: 0.35em 0em 0.25em 0em; } @@ -14,19 +14,19 @@ } .numberColumn > .hits { - -fx-font-size: 85%; - -fx-background-color: #c6c6c4; + /*-fx-font-size: 85%;*/ + -fx-background-color: -jr-group-hits-bg; -fx-padding: 0.1em 0.4em 0.1em 0.4em; -fx-background-insets: 0; -fx-background-radius: 0.8em; } .numberColumn > .hits:any-selected { - -fx-background-color: #c6c44f; + -fx-background-color: derive(-jr-green, 70%); } .numberColumn > .hits:all-selected { - -fx-background-color: #4dc64f; + -fx-background-color: -jr-green; } .disclosureNodeColumn { @@ -34,19 +34,19 @@ } .tree-table-row-cell:dragOver-bottom { - -fx-border-color: #eea82f; + -fx-border-color: -jr-drag-target; -fx-border-width: 0 0 2 0; -fx-padding: 0 0 -2 0; } .tree-table-row-cell:dragOver-center { - -fx-border-color: #eea82f; + -fx-border-color: -jr-drag-target; -fx-border-width: 2 2 2 2; -fx-padding: -2 -2 -2 -2; } .tree-table-row-cell:dragOver-top { - -fx-border-color: #eea82f; + -fx-border-color: -jr-drag-target; -fx-border-width: 2 0 0 0; -fx-padding: -2 0 0 0; } @@ -61,7 +61,7 @@ .tree-table-row-cell:root { -fx-border-width: 0 0 1 0; - -fx-border-color: darkgrey; + -fx-border-color: -fx-outer-border; } .tree-table-row-cell:root > .tree-table-cell { @@ -76,9 +76,9 @@ -fx-padding: 0.45em 0.2em 0.45em 0.2em; } -.tree-table-row-cell:selected > .tree-table-cell > .tree-disclosure-node > .arrow { - -fx-background-color: white; -} +/*.tree-table-row-cell:selected > .tree-table-cell > .tree-disclosure-node > .arrow {*/ + /*-fx-background-color: -jr-white;*/ +/*}*/ .tree-table-row-cell:empty { -fx-background-color: transparent; /* hide cells which are not bound to a group */ @@ -92,7 +92,6 @@ .tree-table-row-cell > .tree-table-cell > .tree-disclosure-node > .arrow { -fx-max-height: 0.5em; -fx-max-width: 0.5em; - -fx-background-color: #5e5f5e; -fx-padding: 0.333333em 0.229em 0.333333em 0.229em; /* 4 */ -fx-shape: "m64,416l96,96l256,-256l-256,-256l-96,96l160,160l-160,160z"; } @@ -106,12 +105,12 @@ } #barBottom { - -fx-background-color: #dadad8; - -fx-border-color: dimgray; - -fx-border-width: 1 0 0 0; + -fx-border-color: -fx-outer-border; + -fx-border-width: 0 0 1 0; -fx-padding: 0em 1em 0em 1em; } #barBottom .glyph-icon { + -fx-fill: -jr-icon; -fx-font-size: 2em; } diff --git a/src/main/java/org/jabref/gui/icon/IconTheme.java b/src/main/java/org/jabref/gui/icon/IconTheme.java index 4fd2d134f8c..e4e6b291634 100644 --- a/src/main/java/org/jabref/gui/icon/IconTheme.java +++ b/src/main/java/org/jabref/gui/icon/IconTheme.java @@ -33,6 +33,7 @@ import org.jabref.logic.groups.DefaultGroupsFactory; import org.jabref.preferences.JabRefPreferences; +import de.jensd.fx.glyphs.GlyphIcons; import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon; import org.apache.commons.lang3.NotImplementedException; import org.slf4j.Logger; @@ -55,7 +56,13 @@ public class IconTheme { try (InputStream stream = getMaterialDesignIconsStream()) { FONT = Font.createFont(Font.TRUETYPE_FONT, stream); } catch (FontFormatException | IOException e) { - LOGGER.warn("Error loading font", e); + LOGGER.error("Error loading font", e); + } + + try (InputStream stream = getJabRefMaterialDesignIconsStream()) { + javafx.scene.text.Font.loadFont(stream, 7); + } catch (IOException e) { + LOGGER.error("Error loading custom font for custom JabRef icons", e); } } @@ -63,19 +70,12 @@ private static InputStream getMaterialDesignIconsStream() { return FontBasedIcon.class.getResourceAsStream("/fonts/materialdesignicons-webfont.ttf"); } - public static javafx.scene.paint.Color getDefaultColor() { - return ColorUtil.toFX(DEFAULT_COLOR); + private static InputStream getJabRefMaterialDesignIconsStream() throws IOException { + return FontBasedIcon.class.getResource("/fonts/JabRefMaterialDesign.ttf").openStream(); } - /** - * Constructs an ImageIcon for the image representing the given function, in the resource - * file listing images. - * - * @param name The name of the icon, such as "open", "save", "saveAs" etc. - * @return The ImageIcon for the function. - */ - public static ImageIcon getImage(String name) { - return new ImageIcon(getIconUrl(name)); + public static javafx.scene.paint.Color getDefaultColor() { + return ColorUtil.toFX(DEFAULT_COLOR); } public static Image getJabRefImageFX() { @@ -174,26 +174,26 @@ public static List getLogoSetFX() { public enum JabRefIcons implements JabRefIcon { - ADD(MaterialDesignIcon.PLUS_BOX), + ADD(MaterialDesignIcon.PLUS_CIRCLE_OUTLINE), ADD_NOBOX(MaterialDesignIcon.PLUS), - ADD_ENTRY(MaterialDesignIcon.TOOLTIP_OUTLINE_PLUS), + ADD_ENTRY(MaterialDesignIcon.BOOKMARK_PLUS), EDIT_ENTRY(MaterialDesignIcon.TOOLTIP_EDIT), EDIT_STRINGS(MaterialDesignIcon.TOOLTIP_TEXT), FOLDER(MaterialDesignIcon.FOOD_FORK_DRINK), REMOVE(MaterialDesignIcon.MINUS_BOX), REMOVE_NOBOX(MaterialDesignIcon.MINUS), - FILE(MaterialDesignIcon.FILE), + FILE(MaterialDesignIcon.FILE_OUTLINE), PDF_FILE(MaterialDesignIcon.FILE_PDF), DOI(MaterialDesignIcon.BARCODE_SCAN), DUPLICATE(MaterialDesignIcon.CONTENT_DUPLICATE), EDIT(MaterialDesignIcon.PENCIL), - NEW(MaterialDesignIcon.FILE_OUTLINE), + NEW(MaterialDesignIcon.FOLDER_PLUS), SAVE(MaterialDesignIcon.CONTENT_SAVE), SAVE_ALL(MaterialDesignIcon.CONTENT_SAVE_ALL), - CLOSE(MaterialDesignIcon.CLOSE), - PASTE(MaterialDesignIcon.CONTENT_PASTE), + CLOSE(MaterialDesignIcon.CLOSE_CIRCLE), + PASTE(JabRefMaterialDesignIcon.PASTE), CUT(MaterialDesignIcon.CONTENT_CUT), - COPY(MaterialDesignIcon.CONTENT_COPY), + COPY(JabRefMaterialDesignIcon.COPY), COMMENT(MaterialDesignIcon.COMMENT), REDO(MaterialDesignIcon.REDO), UNDO(MaterialDesignIcon.UNDO), @@ -204,8 +204,8 @@ public enum JabRefIcons implements JabRefIcon { ADVANCED_SEARCH(Color.CYAN, MaterialDesignIcon.MAGNIFY), PREFERENCES(MaterialDesignIcon.SETTINGS), HELP(MaterialDesignIcon.HELP_CIRCLE), - UP(MaterialDesignIcon.CHEVRON_UP), - DOWN(MaterialDesignIcon.CHEVRON_DOWN), + UP(MaterialDesignIcon.ARROW_UP), + DOWN(MaterialDesignIcon.ARROW_DOWN), LEFT(MaterialDesignIcon.ARROW_LEFT_BOLD), RIGHT(MaterialDesignIcon.ARROW_RIGHT_BOLD), SOURCE(MaterialDesignIcon.CODE_BRACES), @@ -261,13 +261,13 @@ public enum JabRefIcons implements JabRefIcon { FILE_POWERPOINT(MaterialDesignIcon.FILE_POWERPOINT), /*css: file-powerpoint */ FILE_TEXT(MaterialDesignIcon.FILE_DOCUMENT), /*css: file-document */ FILE_MULTIPLE(MaterialDesignIcon.FILE_MULTIPLE), /*css: file-multiple */ - FILE_OPENOFFICE(IconTheme.getImage("openoffice")), - APPLICATION_EMACS(IconTheme.getImage("emacs")), - APPLICATION_LYX(IconTheme.getImage("lyx")), - APPLICATION_TEXSTUDIO(IconTheme.getImage("texstudio")), - APPLICATION_TEXMAKER(IconTheme.getImage("texmaker")), - APPLICATION_VIM(IconTheme.getImage("vim")), - APPLICATION_WINEDT(IconTheme.getImage("winedt")), + FILE_OPENOFFICE(JabRefMaterialDesignIcon.OPEN_OFFICE), + APPLICATION_EMACS(JabRefMaterialDesignIcon.EMACS), + APPLICATION_LYX(JabRefMaterialDesignIcon.LYX), + APPLICATION_TEXSTUDIO(JabRefMaterialDesignIcon.TEX_STUDIO), + APPLICATION_TEXMAKER(JabRefMaterialDesignIcon.TEX_MAKER), + APPLICATION_VIM(JabRefMaterialDesignIcon.VIM), + APPLICATION_WINEDT(JabRefMaterialDesignIcon.WINEDT), KEY_BINDINGS(MaterialDesignIcon.KEYBOARD), /*css: keyboard */ FIND_DUPLICATES(MaterialDesignIcon.CODE_EQUAL), /*css: code-equal */ PULL(MaterialDesignIcon.SOURCE_PULL), /*source-pull*/ @@ -284,7 +284,7 @@ public enum JabRefIcons implements JabRefIcon { BLOG(MaterialDesignIcon.RSS), /* css: rss */ GLOBAL_SEARCH(MaterialDesignIcon.EARTH), /* css: earth */ DATE_PICKER(MaterialDesignIcon.CALENDAR), /* css: calendar */ - DEFAULT_GROUP_ICON_COLORED(MaterialDesignIcon.CHECKBOX_BLANK_CIRCLE), + DEFAULT_GROUP_ICON_COLORED(MaterialDesignIcon.MENU_RIGHT), DEFAULT_GROUP_ICON(MaterialDesignIcon.LABEL_OUTLINE), ALL_ENTRIES_GROUP_ICON(DefaultGroupsFactory.ALL_ENTRIES_GROUP_DEFAULT_ICON), IMPORT_EXPORT(MaterialDesignIcon.SWAP_VERTICAL), @@ -310,7 +310,7 @@ public enum JabRefIcons implements JabRefIcon { private final JabRefIcon icon; - JabRefIcons(MaterialDesignIcon... icons) { + JabRefIcons(GlyphIcons... icons) { icon = new InternalMaterialDesignIcon(icons); } @@ -318,10 +318,6 @@ public enum JabRefIcons implements JabRefIcon { icon = new InternalMaterialDesignIcon(color, icons); } - JabRefIcons(ImageIcon imageIcon) { - icon = new InternalFileIcon(imageIcon); - } - @Override public Icon getIcon() { return icon.getIcon(); @@ -356,56 +352,6 @@ public String unicode() { public String fontFamily() { return icon.fontFamily(); } - - private class InternalFileIcon implements JabRefIcon { - - private final ImageIcon imageIcon; - - InternalFileIcon(ImageIcon imageIcon) { - this.imageIcon = imageIcon; - } - - @Override - public Icon getIcon() { - return imageIcon; - } - - @Override - public Icon getSmallIcon() { - return imageIcon; - } - - @Override - public Node getGraphicNode() { - return new ImageView(new Image(imageIcon.getDescription())); - } - - @Override - public JabRefIcon disabled() { - throw new NotImplementedException("Cannot create disabled version of a file-based icon"); - } - - @Override - public JabRefIcon withColor(javafx.scene.paint.Color color) { - throw new NotImplementedException("Cannot create colored version of a file-based icon"); - } - - @Override - public String name() { - throw new NotImplementedException("Cannot get name of a file-based icon"); - } - - @Override - public String unicode() { - throw new NotImplementedException("Cannot get unicode of a file-based icon"); - } - - @Override - public String fontFamily() { - throw new NotImplementedException("Cannot get font family of a file-based icon"); - } - } - public Button asButton() { Button button = new Button(); button.setGraphic(getGraphicNode()); diff --git a/src/main/java/org/jabref/gui/icon/InternalMaterialDesignIcon.java b/src/main/java/org/jabref/gui/icon/InternalMaterialDesignIcon.java index af309123c85..1b6f63bdea1 100644 --- a/src/main/java/org/jabref/gui/icon/InternalMaterialDesignIcon.java +++ b/src/main/java/org/jabref/gui/icon/InternalMaterialDesignIcon.java @@ -14,33 +14,34 @@ import org.jabref.gui.util.ColorUtil; import org.jabref.preferences.JabRefPreferences; +import de.jensd.fx.glyphs.GlyphIcons; import de.jensd.fx.glyphs.materialdesignicons.MaterialDesignIcon; public class InternalMaterialDesignIcon implements JabRefIcon { - private final List icons; + private final List icons; private Optional color; private final String unicode; - public InternalMaterialDesignIcon(java.awt.Color color, MaterialDesignIcon... icons) { + public InternalMaterialDesignIcon(java.awt.Color color, GlyphIcons... icons) { this(ColorUtil.toFX(color), Arrays.asList(icons)); } - public InternalMaterialDesignIcon(Color color, MaterialDesignIcon... icons) { + public InternalMaterialDesignIcon(Color color, GlyphIcons... icons) { this(color, Arrays.asList(icons)); } - InternalMaterialDesignIcon(Color color, List icons) { + InternalMaterialDesignIcon(Color color, List icons) { this(icons); this.color = Optional.of(color); } - public InternalMaterialDesignIcon(MaterialDesignIcon... icons) { + public InternalMaterialDesignIcon(GlyphIcons... icons) { this(Arrays.asList(icons)); } - public InternalMaterialDesignIcon(List icons) { + public InternalMaterialDesignIcon(List icons) { this.icons = icons; - this.unicode = icons.stream().map(MaterialDesignIcon::unicode).collect(Collectors.joining()); + this.unicode = icons.stream().map(GlyphIcons::unicode).collect(Collectors.joining()); this.color = Optional.empty(); } @@ -56,7 +57,7 @@ public Icon getSmallIcon() { @Override public Node getGraphicNode() { - MaterialDesignIcon icon = icons.get(0); + GlyphIcons icon = icons.get(0); Text text = new Text(icon.unicode()); text.getStyleClass().add("glyph-icon"); diff --git a/src/main/java/org/jabref/gui/maintable/MainTable.css b/src/main/java/org/jabref/gui/maintable/MainTable.css index 90b6289d03f..c4f1a04fc6c 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTable.css +++ b/src/main/java/org/jabref/gui/maintable/MainTable.css @@ -2,38 +2,41 @@ -fx-border-width: 0; -fx-padding: 0; -fx-border-insets: 0; - -fx-background-color: -fx-light-background; -fx-table-cell-border-color: transparent; + /*-fx-background-color: -jr-foreground;*/ } .table-view .column-header-background { - -fx-background-color: -fx-light-background; + -fx-background-color: -fx-control-inner-background; -fx-border-width: 0 0 1 0; - -fx-border-color: darkgrey; + -fx-border-color: -fx-background; } .table-view .column-header-background:hover { - -fx-background-color: darkgray; + -fx-background-color: derive(-fx-control-inner-background, -10%); } + .table-view .column-header, .table-view .filler { - -fx-background-color: transparent, -fx-light-background; + -fx-background-color: transparent, -fx-control-inner-background; -fx-background-insets: 0, 0 0.02em 0 0.02em; -fx-font-weight: bold; -fx-size: 3em; + -fx-border-width: 0 0 1 0; + /*-fx-border-color: -jr-separator;*/ } .table-view .column-header > .label { -fx-padding: 0 1em 0 1em; -fx-alignment: center-left; - -fx-text-fill: -fx-unimportant; + -fx-text-fill: -jr-theme; } .table-view .column-header .glyph-icon { -fx-alignment: baseline-center; - -fx-text-fill: -fx-unimportant; - -fx-fill: -fx-unimportant; + -fx-text-fill: -jr-icon; + -fx-fill: -jr-icon; } .table-cell { @@ -41,9 +44,9 @@ -fx-cell-size: 4.0em; } -.table-row-cell:odd { - -fx-background: -fx-control-inner-background; -} +/*.table-row-cell:odd {*/ + /*-fx-background: derive(-jr-foreground, -2%);*/ +/*}*/ .column-icon { -fx-alignment: baseline-center; @@ -61,7 +64,7 @@ .table-row-cell:hover .empty-special-field { visibility: visible; - -fx-fill: -fx-unimportant; + /*-fx-fill: -jr-grayed-text;*/ } .rating > .container { diff --git a/src/main/resources/fonts/JabRefMaterialDesign.ttf b/src/main/resources/fonts/JabRefMaterialDesign.ttf new file mode 100644 index 00000000000..c18f51fa3f2 Binary files /dev/null and b/src/main/resources/fonts/JabRefMaterialDesign.ttf differ