From 90a452a4b2b2efca3ebff6016dc1afbac3dfe6d3 Mon Sep 17 00:00:00 2001 From: Andrew Auclair Date: Wed, 3 Jul 2024 20:38:02 -0400 Subject: [PATCH 1/2] Maven central links (#236) Making badges actually go a maven central link. --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1c2a092..a31a1e5 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,12 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-api?label=modern-docking-api) +[![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-api?label=modern-docking-api)](https://mvnrepository.com/artifact/io.github.andrewauclair/modern-docking-api) -![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-single-app?label=modern-docking-single-app) -![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-multi-app?label=modern-docking-multi-app) +[![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-single-app?label=modern-docking-single-app)](https://mvnrepository.com/artifact/io.github.andrewauclair/modern-docking-single-app) +[![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-multi-app?label=modern-docking-multi-app)](https://mvnrepository.com/artifact/io.github.andrewauclair/modern-docking-multi-app) -![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-ui?label=modern-docking-ui) +[![Maven Central](https://img.shields.io/maven-central/v/io.github.andrewauclair/modern-docking-ui?label=modern-docking-ui)](https://mvnrepository.com/artifact/io.github.andrewauclair/modern-docking-ui) Modern Docking is a simple framework designed for adding docking features to Java Swing applications. @@ -41,7 +41,7 @@ docs). - Requires FlatLaf L&F -![Maven Central](https://img.shields.io/maven-central/v/com.formdev/flatlaf) +[![Maven Central](https://img.shields.io/maven-central/v/com.formdev/flatlaf)](https://mvnrepository.com/artifact/com.formdev/flatlaf) # Building From 209651d9d7d7a8cce852a7f7decfbdbc00231667 Mon Sep 17 00:00:00 2001 From: Andrew Auclair Date: Fri, 5 Jul 2024 12:46:53 -0400 Subject: [PATCH 2/2] Issue #162 (#235) Replace Settings.alwaysDisplayTabsMode(Dockable) and Settings.setAlwaysDisplayTabMode with Settings.defaultTabPreference and Settings.setDefaultTabPreference. This new setting makes it possible to specify tab location preference as top or bottom. It also makes it possible to always display tabs by using DockableTabPreference.TOP_ALWAYS and DockableTabPreference.BOTTOM_ALWAYS. The Dockable.getTabPosition method has been replaced with Dockable.getTabPreference, which now returns an instance of DockableTabPreference and returns NONE by default. --- .../src/basic/AlwaysDisplayedPanel.java | 6 ++-- demo-single-app/src/basic/MainFrame.java | 17 ++++++++-- docking-api/src/ModernDocking/Dockable.java | 8 +++++ .../ModernDocking/DockableTabPreference.java | 32 ++++++++++++++++++ .../api/RootDockingPanelAPI.java | 3 +- .../floating/DisplayPanelFloatListener.java | 2 +- .../floating/TempFloatingFrame.java | 2 +- .../ModernDocking/internal/DisplayPanel.java | 2 +- .../internal/DockedSimplePanel.java | 2 +- .../internal/DockedSplitPanel.java | 2 +- .../internal/DockedTabbedPanel.java | 33 +++++++++++++++---- .../layouts/DockingLayoutRootNode.java | 2 +- .../layouts/DockingSimplePanelNode.java | 2 +- .../layouts/DockingSplitPanelNode.java | 2 +- .../layouts/DockingTabPanelNode.java | 2 +- .../src/ModernDocking/settings/Settings.java | 30 ++++++++++++++--- 16 files changed, 122 insertions(+), 25 deletions(-) create mode 100644 docking-api/src/ModernDocking/DockableTabPreference.java diff --git a/demo-single-app/src/basic/AlwaysDisplayedPanel.java b/demo-single-app/src/basic/AlwaysDisplayedPanel.java index e027b4a..f776cdf 100644 --- a/demo-single-app/src/basic/AlwaysDisplayedPanel.java +++ b/demo-single-app/src/basic/AlwaysDisplayedPanel.java @@ -21,6 +21,8 @@ of this software and associated documentation files (the "Software"), to deal */ package basic; +import ModernDocking.DockableTabPreference; + import javax.swing.*; // Docking panel that is always displayed and cannot be closed @@ -46,7 +48,7 @@ public boolean isLimitedToRoot() { } @Override - public int getTabPosition() { - return SwingConstants.TOP; + public DockableTabPreference getTabPreference() { + return DockableTabPreference.TOP; } } diff --git a/demo-single-app/src/basic/MainFrame.java b/demo-single-app/src/basic/MainFrame.java index bb7abb1..cace5f2 100644 --- a/demo-single-app/src/basic/MainFrame.java +++ b/demo-single-app/src/basic/MainFrame.java @@ -60,6 +60,9 @@ public class MainFrame extends JFrame implements Callable { @CommandLine.Option(names = "--always-use-tabs", defaultValue = "false", description = "always use tabs, even when there is only 1 dockable in the tab group") boolean alwaysUseTabs; + @CommandLine.Option(names = "--tab-location", defaultValue = "NONE", description = "Location to display tabs. values: ${COMPLETION-CANDIDATES}") + DockableTabPreference tabLocation; + @CommandLine.Option(names = "--create-docking-instance", defaultValue = "false", description = "create a separate instance of the framework for this MainFrame") boolean createDockingInstance; @@ -86,11 +89,21 @@ public void setVisible(boolean visible) { setTitle("Modern Docking Basic Demo"); + if (alwaysUseTabs) { + if (tabLocation == DockableTabPreference.TOP) { + Settings.setDefaultTabPreference(DockableTabPreference.TOP_ALWAYS); + } + else { + Settings.setDefaultTabPreference(DockableTabPreference.BOTTOM_ALWAYS); + } + } + else { + Settings.setDefaultTabPreference(tabLocation); + } + Docking.initialize(this); DockingUI.initialize(); - Settings.setAlwaysDisplayTabMode(alwaysUseTabs); - JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); diff --git a/docking-api/src/ModernDocking/Dockable.java b/docking-api/src/ModernDocking/Dockable.java index 410cbfa..4612de3 100644 --- a/docking-api/src/ModernDocking/Dockable.java +++ b/docking-api/src/ModernDocking/Dockable.java @@ -191,10 +191,18 @@ default boolean getHasMoreOptions() { return false; } + /** + * @deprecated Replaced with getTabPreference. Will be removed in future release. + */ + @Deprecated(since = "0.12.0", forRemoval = true) default int getTabPosition() { return SwingConstants.BOTTOM; } + default DockableTabPreference getTabPreference() { + return DockableTabPreference.NONE; + } + /** * add the more options to the popup menu. defaults to an empty block to handle the case of hasMoreOptions() = false * diff --git a/docking-api/src/ModernDocking/DockableTabPreference.java b/docking-api/src/ModernDocking/DockableTabPreference.java new file mode 100644 index 0000000..3596cd4 --- /dev/null +++ b/docking-api/src/ModernDocking/DockableTabPreference.java @@ -0,0 +1,32 @@ +/* +Copyright (c) 2024 Andrew Auclair + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + */ +package ModernDocking; + +public enum DockableTabPreference { + NONE, + BOTTOM, + TOP, + + // use these options with Settings.setDefaultTabPreference to force tabs to always display, even with a single dockable + BOTTOM_ALWAYS, + TOP_ALWAYS +} diff --git a/docking-api/src/ModernDocking/api/RootDockingPanelAPI.java b/docking-api/src/ModernDocking/api/RootDockingPanelAPI.java index 2fd5335..4cc6329 100644 --- a/docking-api/src/ModernDocking/api/RootDockingPanelAPI.java +++ b/docking-api/src/ModernDocking/api/RootDockingPanelAPI.java @@ -22,6 +22,7 @@ of this software and associated documentation files (the "Software"), to deal package ModernDocking.api; import ModernDocking.Dockable; +import ModernDocking.DockableTabPreference; import ModernDocking.DockingRegion; import ModernDocking.internal.*; import ModernDocking.settings.Settings; @@ -296,7 +297,7 @@ public void dock(Dockable dockable, DockingRegion region, double dividerProporti if (panel != null) { panel.dock(dockable, region, dividerProportion); } - else if (Settings.alwaysDisplayTabsMode(dockable)) { + else if (Settings.alwaysDisplayTabsMode()) { setPanel(new DockedTabbedPanel(docking, wrapper)); wrapper.setWindow(window); } diff --git a/docking-api/src/ModernDocking/floating/DisplayPanelFloatListener.java b/docking-api/src/ModernDocking/floating/DisplayPanelFloatListener.java index 210c607..bd16ee8 100644 --- a/docking-api/src/ModernDocking/floating/DisplayPanelFloatListener.java +++ b/docking-api/src/ModernDocking/floating/DisplayPanelFloatListener.java @@ -70,7 +70,7 @@ protected void undock() { @Override protected JFrame createFloatingFrame() { - if (Settings.alwaysDisplayTabsMode(panel.getWrapper().getDockable())) { + if (Settings.alwaysDisplayTabsMode()) { return new TempFloatingFrame(Collections.singletonList(panel.getWrapper()), 0, panel, panel.getSize()); } return new TempFloatingFrame(panel.getWrapper(), panel, panel.getSize()); diff --git a/docking-api/src/ModernDocking/floating/TempFloatingFrame.java b/docking-api/src/ModernDocking/floating/TempFloatingFrame.java index 6f1460b..39b3922 100644 --- a/docking-api/src/ModernDocking/floating/TempFloatingFrame.java +++ b/docking-api/src/ModernDocking/floating/TempFloatingFrame.java @@ -57,7 +57,7 @@ public TempFloatingFrame(List dockables, int selectedIndex, JCo // we only support tabs on top if we have FlatLaf because we can add a trailing component for our menu boolean usingFlatLaf = tabs.getUI().getClass().getPackageName().startsWith("com.formdev.flatlaf"); - if (Settings.alwaysDisplayTabsMode(dockables.get(0).getDockable()) && usingFlatLaf) { + if (Settings.alwaysDisplayTabsMode() && usingFlatLaf) { tabs.setTabPlacement(JTabbedPane.TOP); } else { diff --git a/docking-api/src/ModernDocking/internal/DisplayPanel.java b/docking-api/src/ModernDocking/internal/DisplayPanel.java index 095265b..5f086f5 100644 --- a/docking-api/src/ModernDocking/internal/DisplayPanel.java +++ b/docking-api/src/ModernDocking/internal/DisplayPanel.java @@ -58,7 +58,7 @@ private void buildUI() { gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 1.0; - if (!Settings.alwaysDisplayTabsMode(wrapper.getDockable()) || wrapper.isHidden()) { + if (!Settings.alwaysDisplayTabsMode() || wrapper.isHidden()) { if (!(wrapper.getParent() instanceof DockedTabbedPanel) || ((DockedTabbedPanel) wrapper.getParent()).isUsingBottomTabs()) { add((Component) wrapper.getHeaderUI(), gbc); gbc.gridy++; diff --git a/docking-api/src/ModernDocking/internal/DockedSimplePanel.java b/docking-api/src/ModernDocking/internal/DockedSimplePanel.java index e626ab2..38176ec 100644 --- a/docking-api/src/ModernDocking/internal/DockedSimplePanel.java +++ b/docking-api/src/ModernDocking/internal/DockedSimplePanel.java @@ -114,7 +114,7 @@ else if (region == DockingRegion.CENTER) { DockingPanel newPanel; - if (Settings.alwaysDisplayTabsMode(wrapper.getDockable())) { + if (Settings.alwaysDisplayTabsMode()) { newPanel = new DockedTabbedPanel(docking, wrapper); } else { diff --git a/docking-api/src/ModernDocking/internal/DockedSplitPanel.java b/docking-api/src/ModernDocking/internal/DockedSplitPanel.java index e56aaf0..cc6dd6c 100644 --- a/docking-api/src/ModernDocking/internal/DockedSplitPanel.java +++ b/docking-api/src/ModernDocking/internal/DockedSplitPanel.java @@ -283,7 +283,7 @@ public void dock(Dockable dockable, DockingRegion region, double dividerProporti DockingPanel newPanel; - if (Settings.alwaysDisplayTabsMode(wrapper.getDockable())) { + if (Settings.alwaysDisplayTabsMode()) { newPanel = new DockedTabbedPanel(docking, wrapper); } else { diff --git a/docking-api/src/ModernDocking/internal/DockedTabbedPanel.java b/docking-api/src/ModernDocking/internal/DockedTabbedPanel.java index ff6e01d..9bd7c08 100644 --- a/docking-api/src/ModernDocking/internal/DockedTabbedPanel.java +++ b/docking-api/src/ModernDocking/internal/DockedTabbedPanel.java @@ -22,6 +22,7 @@ of this software and associated documentation files (the "Software"), to deal package ModernDocking.internal; import ModernDocking.Dockable; +import ModernDocking.DockableTabPreference; import ModernDocking.DockingRegion; import ModernDocking.api.DockingAPI; import ModernDocking.floating.DockedTabbedPanelFloatListener; @@ -85,7 +86,7 @@ public DockedTabbedPanel(DockingAPI docking, DockableWrapper dockable) { // we only support tabs on top if we have FlatLaf because we can add a trailing component for our menu boolean usingFlatLaf = tabs.getUI().getClass().getPackageName().startsWith("com.formdev.flatlaf"); - if (Settings.alwaysDisplayTabsMode(dockable.getDockable()) && usingFlatLaf) { + if (Settings.alwaysDisplayTabsMode() && usingFlatLaf) { tabs.setTabPlacement(JTabbedPane.TOP); } else { @@ -94,7 +95,7 @@ public DockedTabbedPanel(DockingAPI docking, DockableWrapper dockable) { tabs.setTabLayoutPolicy(Settings.getTabLayoutPolicy()); - if (Settings.alwaysDisplayTabsMode(dockable.getDockable())) { + if (Settings.alwaysDisplayTabsMode()) { configureTrailingComponent(); } @@ -203,17 +204,35 @@ public void addPanel(DockableWrapper dockable) { dockable.getFloatListener().addAlternateDragSource(tabs, draggingFromTabPanel); - // if any of the dockables use top tab position, switch this tabbedpanel to top tabs - if (tabs.getTabPlacement() != SwingConstants.TOP && dockable.getDockable().getTabPosition() == SwingConstants.TOP) { + DockableTabPreference tabPreference = Settings.defaultTabPreference(); + + // we only support tabs on top if we have FlatLaf because we can add a trailing component for our menu + boolean usingFlatLaf = tabs.getUI().getClass().getPackageName().startsWith("com.formdev.flatlaf"); + + if (tabPreference == DockableTabPreference.TOP_ALWAYS && usingFlatLaf) { tabs.setTabPlacement(SwingConstants.TOP); } + else if (tabPreference == DockableTabPreference.BOTTOM_ALWAYS) { + tabs.setTabPlacement(SwingConstants.BOTTOM); + } + else if (tabPreference == DockableTabPreference.TOP && usingFlatLaf) { + // in the normal top preference case, only switch if we add a dockable that prefers the top tab position + if (dockable.getDockable().getTabPreference() == DockableTabPreference.TOP) { + tabs.setTabPlacement(SwingConstants.TOP); + } + } + + // if any of the dockables use top tab position, switch this tabbedpanel to top tabs +// if (tabs.getTabPlacement() != SwingConstants.TOP && dockable.getDockable().getTabPosition() == SwingConstants.TOP) { +// tabs.setTabPlacement(SwingConstants.TOP); +// } tabs.setToolTipTextAt(tabs.getTabCount() - 1, dockable.getDockable().getTabTooltip()); tabs.setIconAt(tabs.getTabCount() - 1, dockable.getDockable().getIcon()); tabs.setSelectedIndex(tabs.getTabCount() - 1); selectedTab = tabs.getSelectedIndex(); - if (Settings.alwaysDisplayTabsMode(dockable.getDockable()) && dockable.getDockable().isClosable()) { + if (Settings.alwaysDisplayTabsMode() && dockable.getDockable().isClosable()) { dockable.getDisplayPanel().putClientProperty("JTabbedPane.tabClosable", true); } @@ -267,7 +286,7 @@ public void dock(Dockable dockable, DockingRegion region, double dividerProporti DockingPanel newPanel; - if (Settings.alwaysDisplayTabsMode(wrapper.getDockable())) { + if (Settings.alwaysDisplayTabsMode()) { newPanel = new DockedTabbedPanel(docking, wrapper); } else { @@ -322,7 +341,7 @@ public void dockAtIndex(Dockable dockable, int index) { public void undock(Dockable dockable) { removePanel(DockingInternal.get(docking).getWrapper(dockable)); - if (!Floating.isFloatingTabbedPane() && !Settings.alwaysDisplayTabsMode(dockable) && panels.size() == 1 && parent != null && panels.get(0).getDockable().getTabPosition() != SwingConstants.TOP) { + if (!Floating.isFloatingTabbedPane() && !Settings.alwaysDisplayTabsMode() && panels.size() == 1 && parent != null && panels.get(0).getDockable().getTabPosition() != SwingConstants.TOP) { parent.replaceChild(this, new DockedSimplePanel(docking, panels.get(0))); } diff --git a/docking-api/src/ModernDocking/layouts/DockingLayoutRootNode.java b/docking-api/src/ModernDocking/layouts/DockingLayoutRootNode.java index 4421d56..964755a 100644 --- a/docking-api/src/ModernDocking/layouts/DockingLayoutRootNode.java +++ b/docking-api/src/ModernDocking/layouts/DockingLayoutRootNode.java @@ -47,7 +47,7 @@ public void dock(String persistentID, DockingRegion region, double dividerPropor if (node != null) { node.dock(persistentID, region, dividerProportion); } - else if (Settings.alwaysDisplayTabsMode(DockingInternal.get(docking).getDockable(persistentID))) { + else if (Settings.alwaysDisplayTabsMode()) { node = new DockingTabPanelNode(docking, persistentID); node.setParent(this); } diff --git a/docking-api/src/ModernDocking/layouts/DockingSimplePanelNode.java b/docking-api/src/ModernDocking/layouts/DockingSimplePanelNode.java index a3ddccc..a61a477 100644 --- a/docking-api/src/ModernDocking/layouts/DockingSimplePanelNode.java +++ b/docking-api/src/ModernDocking/layouts/DockingSimplePanelNode.java @@ -102,7 +102,7 @@ else if (region == DockingRegion.CENTER) { DockingLayoutNode left; DockingLayoutNode right; - if (Settings.alwaysDisplayTabsMode(DockingInternal.get(docking).getDockable(persistentID))) { + if (Settings.alwaysDisplayTabsMode()) { if (orientation == JSplitPane.HORIZONTAL_SPLIT) { left = region == DockingRegion.EAST ? this : new DockingTabPanelNode(docking, persistentID); right = region == DockingRegion.EAST ? new DockingTabPanelNode(docking, persistentID) : this; diff --git a/docking-api/src/ModernDocking/layouts/DockingSplitPanelNode.java b/docking-api/src/ModernDocking/layouts/DockingSplitPanelNode.java index ced2924..9818130 100644 --- a/docking-api/src/ModernDocking/layouts/DockingSplitPanelNode.java +++ b/docking-api/src/ModernDocking/layouts/DockingSplitPanelNode.java @@ -97,7 +97,7 @@ public void dock(String persistentID, DockingRegion region, double dividerPropor DockingLayoutNode left; DockingLayoutNode right; - if (Settings.alwaysDisplayTabsMode(DockingInternal.get(docking).getDockable(persistentID))) { + if (Settings.alwaysDisplayTabsMode()) { left = region == DockingRegion.NORTH || region == DockingRegion.WEST ? new DockingTabPanelNode(docking, persistentID) : this; right = region == DockingRegion.NORTH || region == DockingRegion.WEST ? this : new DockingTabPanelNode(docking, persistentID); } diff --git a/docking-api/src/ModernDocking/layouts/DockingTabPanelNode.java b/docking-api/src/ModernDocking/layouts/DockingTabPanelNode.java index 05f7b2c..4be178e 100644 --- a/docking-api/src/ModernDocking/layouts/DockingTabPanelNode.java +++ b/docking-api/src/ModernDocking/layouts/DockingTabPanelNode.java @@ -185,7 +185,7 @@ public void dock(String persistentID, DockingRegion region, double dividerPropor DockingLayoutNode left; DockingLayoutNode right; - if (Settings.alwaysDisplayTabsMode(DockingInternal.get(docking).getDockable(persistentID))) { + if (Settings.alwaysDisplayTabsMode()) { left = region == DockingRegion.NORTH || region == DockingRegion.WEST ? new DockingTabPanelNode(docking, persistentID) : this; right = region == DockingRegion.NORTH || region == DockingRegion.WEST ? this : new DockingTabPanelNode(docking, persistentID); } diff --git a/docking-api/src/ModernDocking/settings/Settings.java b/docking-api/src/ModernDocking/settings/Settings.java index 61d34a0..322f331 100644 --- a/docking-api/src/ModernDocking/settings/Settings.java +++ b/docking-api/src/ModernDocking/settings/Settings.java @@ -22,26 +22,48 @@ of this software and associated documentation files (the "Software"), to deal package ModernDocking.settings; import ModernDocking.Dockable; +import ModernDocking.DockableTabPreference; import javax.swing.*; public class Settings { - private static boolean alwaysDisplayTabsMode = false; + private static DockableTabPreference defaultTabPreference = DockableTabPreference.BOTTOM; private static int tabLayoutPolicy = JTabbedPane.SCROLL_TAB_LAYOUT; private static boolean enableActiveHighlighter = true; public static boolean alwaysDisplayTabsMode() { - return alwaysDisplayTabsMode; + return defaultTabPreference == DockableTabPreference.TOP_ALWAYS || defaultTabPreference == DockableTabPreference.BOTTOM_ALWAYS; } + /** + * @deprecated Replaced with defaultTabPreference. Will be removed in future release. + */ + @Deprecated(since = "0.12.0", forRemoval = true) public static boolean alwaysDisplayTabsMode(Dockable dockable) { - return alwaysDisplayTabsMode || dockable.getTabPosition() == SwingConstants.TOP; + return defaultTabPreference == DockableTabPreference.TOP || dockable.getTabPosition() == SwingConstants.TOP; } + /** + * @deprecated Replaced with setDefaultTabPreference. Will be removed in future release. + */ + @Deprecated(since = "0.12.0", forRemoval = true) public static void setAlwaysDisplayTabMode(boolean alwaysDisplayTabsMode) { - Settings.alwaysDisplayTabsMode = alwaysDisplayTabsMode; + defaultTabPreference = alwaysDisplayTabsMode ? DockableTabPreference.TOP : DockableTabPreference.BOTTOM; + } + + public static DockableTabPreference defaultTabPreference() { + return defaultTabPreference; + } + + /** + * Set the applications preference for default tab location when adding dockables to tab groups. + * + * @param tabPreference The new default tab location preference + */ + public static void setDefaultTabPreference(DockableTabPreference tabPreference) { + defaultTabPreference = tabPreference; } public static int getTabLayoutPolicy() {