20 package net.sf.gridarta.gui.utils.borderpanel;
22 import java.awt.BorderLayout;
23 import java.awt.Component;
24 import java.awt.Container;
25 import java.awt.Dimension;
26 import java.awt.event.HierarchyEvent;
27 import java.awt.event.HierarchyListener;
28 import java.beans.PropertyChangeEvent;
29 import java.beans.PropertyChangeListener;
30 import javax.swing.JSplitPane;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
121 splitPane =
new JSplitPane(location.getSplitPaneOrientation(),
true, null, null);
122 splitPane.setOneTouchExpandable(
false);
123 splitPane.setResizeWeight(location.getSplitPaneResizeWeight());
124 splitPane2 =
new JSplitPane(location.getSplitPaneOppositeOrientation(),
true, null, null);
125 splitPane2.setOneTouchExpandable(
false);
126 splitPane2.setResizeWeight(0.5);
127 setLayout(
new BorderLayout());
130 splitPane.addPropertyChangeListener(
new PropertyChangeListener() {
133 public void propertyChange(
final PropertyChangeEvent evt) {
134 if (ignoreSizeChange) {
137 if (optionalComponents[0] != null || optionalComponents[1] != null) {
140 if (evt.getPropertyName() == JSplitPane.DIVIDER_LOCATION_PROPERTY) {
141 final Object value = evt.getNewValue();
142 if (value != null && value instanceof Integer) {
143 final int newSize = (Integer) value;
145 for (
final Component optionalComponent : optionalComponents) {
146 if (optionalComponent != null) {
147 borderSplitPaneListener.sizeChanged(optionalComponent, splitPaneSize);
157 splitPane2.addPropertyChangeListener(
new PropertyChangeListener() {
160 public void propertyChange(
final PropertyChangeEvent evt) {
161 if (ignoreSizeChange) {
164 if (optionalComponents[0] != null && optionalComponents[1] != null) {
167 if (evt.getPropertyName() == JSplitPane.DIVIDER_LOCATION_PROPERTY) {
168 final Object value = evt.getNewValue();
169 if (value != null && value instanceof Integer) {
170 final int newSize = (Integer) value;
172 borderSplitPaneListener.size2Changed(newSize);
180 final HierarchyListener hierarchyListener =
new HierarchyListener() {
183 public void hierarchyChanged(
final HierarchyEvent e) {
184 if ((e.getChangeFlags() & (long) HierarchyEvent.SHOWING_CHANGED) != 0L && isShowing()) {
185 removeHierarchyListener(
this);
197 addHierarchyListener(hierarchyListener);
209 public void setOptionalComponent(@Nullable
final Component optionalComponent,
final boolean alternativeLocation,
final int size) {
223 public final void setOptionalComponent(@Nullable
final Component optionalComponent,
final boolean alternativeLocation,
final int size,
final boolean force) {
224 final int index = alternativeLocation ? 1 : 0;
225 if (!force && optionalComponents[index] == optionalComponent) {
229 optionalComponents[index] = optionalComponent;
231 final Component centerComponent;
232 final boolean setSize2;
233 if (optionalComponents[0] == null && optionalComponents[1] == null) {
240 if (optionalComponents[0] == null) {
242 tmp = optionalComponents[1];
244 }
else if (optionalComponents[1] == null) {
246 tmp = optionalComponents[0];
251 splitPane2.setTopComponent(optionalComponents[0]);
252 splitPane2.setBottomComponent(optionalComponents[1]);
256 splitPane.setTopComponent(tmp);
257 splitPane.setBottomComponent(component);
259 splitPane.setTopComponent(component);
260 splitPane.setBottomComponent(tmp);
265 add(centerComponent, BorderLayout.CENTER);
266 ignoreSizeChange =
true;
270 ignoreSizeChange =
false;
273 final Component otherComponent = optionalComponents[1 - index];
274 if (optionalComponent == null) {
275 if (otherComponent == null) {
278 final Dimension preferredSizeTmp = otherComponent.getPreferredSize();
279 final int preferredSize =
getSplitPaneSize(preferredSizeTmp == null ? 50 : location.
isTopOrBottom() ? preferredSizeTmp.height : preferredSizeTmp.width);
283 if (otherComponent == null) {
286 final Dimension preferredSizeTmp = otherComponent.getPreferredSize();
287 final int preferredSize =
getSplitPaneSize(preferredSizeTmp == null ? 50 : location.
isTopOrBottom() ? preferredSizeTmp.height : preferredSizeTmp.width);
326 splitPane2.setDividerLocation(size2);
337 preferredSize.height =
size;
339 preferredSize.width =
size;
347 final int splitPaneSize = (location.
isTopOrBottom() ? splitPane.getHeight() : splitPane.getWidth()) - splitPane.getDividerSize();
348 result = Math.max(0, splitPaneSize - size);
359 for (
final Component optionalComponent : optionalComponents) {
360 if (optionalComponent != null) {
361 final Dimension preferredSize = optionalComponent.getPreferredSize();
362 if (preferredSize != null) {
363 return preferredSize;
368 for (
final Component optionalComponent : optionalComponents) {
369 if (optionalComponent != null) {
370 return optionalComponent.getSize();
374 return splitPane.getSize();
382 for (
final Component optionalComponent : optionalComponents) {
383 if (optionalComponent != null) {
384 optionalComponent.setPreferredSize(preferredSize);
boolean ignoreSizeChange
If set, do not report split pane size changes.
void setDividerSize(final int size)
Sets the new size of splitPane.
final JSplitPane splitPane
The JSplitPane to separate component and optionalComponents.
A Component that permanently shows another component and optionally displays a JSplitPane and one or ...
boolean showing
Whether this component is visible.
void setDividerSize2()
Sets the new size of splitPane2.
int getSplitPaneSize(final int size)
Converts between logical and physical sizes of splitPane.
static final long serialVersionUID
The serial version UID.
final Component [] optionalComponents
The two optionally shown Components.
Dimension getSplitPanePreferredSize()
Calculates the preferred size of the split pane.
abstract boolean isTopOrBottom()
Returns whether this location is TOP or BOTTOM.
final JSplitPane splitPane2
The JSplitPane to separate both elements of optionalComponents.
final Location location
The Location of the optional component.
final void setOptionalComponent(@Nullable final Component optionalComponent, final boolean alternativeLocation, final int size, final boolean force)
Sets the optional Component.
final Component component
The permanently shown Component.
void setSplitPanePreferredSize(@NotNull final Dimension preferredSize)
Sets the preferred size of all shown optional components.
Interface for listeners interested in BorderSplitPane related events.
BorderSplitPane(@NotNull final Component component, @NotNull final Location location, @NotNull final BorderSplitPaneListener borderSplitPaneListener, final int size2)
Creates a new instance.
int size2
The pending size of splitPane2.
void setDividerSizeInt(final int size)
Sets the new size of splitPane.
int size
The pending size of splitPane.
void setOptionalComponent(@Nullable final Component optionalComponent, final boolean alternativeLocation, final int size)
Sets the optional Component.
abstract boolean isTopOrLeft()
Returns whether this location is TOP or LEFT.