/*
* This code is part of Project Waterloo from King's College London
*
*
* Copyright King's College London 2011-
*
* @author Malcolm Lidierth, King's College London [Contact]
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
*/
package kcl.waterloo.graphics;
import java.awt.*;
import java.util.ArrayList;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.SpringLayout;
import kcl.waterloo.swing.layout.GraphUnitLayout;
/**
* Implements the {@code GraphUnitLayout} to support graph containers.
*
* @author Malcolm Lidierth, King's College London [Contact]
*/
public class GraphContainerLayout extends GraphUnitLayout {
public GraphContainerLayout() {
}
/**
* Overridden {@code javax.swing.SpringLayout#layoutContainer} method.
*
* @param parent
*/
@Override
public final void layoutContainer(Container parent) {
GJAbstractGraphContainer container = (GJAbstractGraphContainer) parent;
if (container.getView() != null) {
revalidateAdded(container);
revalidateExtra(container);
}
// for (Component c : parent.getComponents()) {
// if (c instanceof GJCustomGraphLayoutInterface) {
// ((GJCustomGraphLayoutInterface) c).setConstraints();
// }
// }
try {
super.layoutContainer(parent);
} catch (Exception ex) {
}
if (container.getAspectRatio() != 0 && ((Component) container.getView()).getWidth() > 0) {
Rectangle r = ((Component) container.getView()).getBounds();
double requiredHeight = r.getWidth() / container.getAspectRatio();
double requiredWidth = requiredHeight * container.getAspectRatio();
if (requiredHeight > r.getHeight() || requiredWidth > r.getWidth()) {
requiredWidth = r.getHeight() * container.getAspectRatio();
requiredHeight = requiredWidth / container.getAspectRatio();
}
putConstraint(SpringLayout.SOUTH, (Component) container.getView(), (int) requiredHeight, SpringLayout.NORTH, (Component) container.getView());
putConstraint(SpringLayout.EAST, (Component) container.getView(), (int) requiredWidth, SpringLayout.WEST, (Component) container.getView());
putConstraint(SpringLayout.WEST, (Component) container.getView(), -(int) (requiredWidth / 2d), SpringLayout.HORIZONTAL_CENTER, container);
putConstraint(SpringLayout.NORTH, (Component) container.getView(), -(int) (requiredHeight / 2d), SpringLayout.VERTICAL_CENTER, container);
super.layoutContainer(parent);
}
}
/**
* revalidateAdded recalculates the pixel-based SpringLayout constraints
* given the current axes coordinates for those components added using axes
* coordinates
*
* @param container
*/
private void revalidateAdded(GJAbstractGraphContainer container) {
for (Component c : getComponentMap().keySet()) {
revalidateComponent(c, container);
}
}
private void revalidateComponent(Component c, GJAbstractGraphContainer container) {
// Workaround for components not being added during deserialization of XML
// TODO: work out why not and fix at source? Threading issue?
if (c.getParent() == null) {
container.add(c, 0);
}
// super class does the work
super.revalidateComponent(c, container, container.getView(), true);
}
/**
* revalidateExtra is called on the EDT from the overridden revalidate
* method and recalculates the pixel-based SpringLayout constraints for the
* titles and axes coordinates.
*
* @param container
*/
private void revalidateExtra(GJAbstractGraphContainer container) {
GJGraphInterface View = container.getView();
if (container.getComponentCount() == 0) {
return;
}
double topMargin = 0, leftMargin = 0, bottomMargin = 0, rightMargin = 0;
ArrayList Layers = View.getLayers();
int space = GJAxisPanel.getInterAxisSpace();
for (GJGraphInterface layer : Layers) {
if (layer.isTopAxisPainted() && layer.getTopAxisPanel() != null) {
layer.getTopAxisPanel().setOffset((int) topMargin);
layer.getTopAxisPanel().revalidate();
topMargin = topMargin + layer.getTopAxisPanel().getExtent() + space;
}
if (layer.isLeftAxisPainted() && layer.getLeftAxisPanel() != null) {
layer.getLeftAxisPanel().setOffset((int) leftMargin);
layer.getLeftAxisPanel().revalidate();
leftMargin = leftMargin + layer.getLeftAxisPanel().getExtent() + space;
}
if (layer.isBottomAxisPainted() && layer.getBottomAxisPanel() != null) {
layer.getBottomAxisPanel().setOffset((int) bottomMargin);
layer.getBottomAxisPanel().revalidate();
bottomMargin = bottomMargin + layer.getBottomAxisPanel().getExtent() + space;
}
if (layer.isRightAxisPainted() && layer.getRightAxisPanel() != null) {
layer.getRightAxisPanel().setOffset((int) rightMargin);
layer.getRightAxisPanel().revalidate();
rightMargin = rightMargin + layer.getRightAxisPanel().getExtent() + space;
}
}
int minMargin = GJAxisPanel.getMinimumMargin();
Insets summedInsets = new Insets((int) Math.max(minMargin, topMargin),
(int) Math.max(minMargin, leftMargin),
(int) Math.max(minMargin, bottomMargin),
(int) Math.max(minMargin, rightMargin));
putConstraint(SpringLayout.WEST, (Component) View, summedInsets.left, SpringLayout.WEST, container);
putConstraint(SpringLayout.NORTH, (Component) View, summedInsets.top, SpringLayout.NORTH, container);
putConstraint(SpringLayout.EAST, (Component) View, -summedInsets.right, SpringLayout.EAST, container);
putConstraint(SpringLayout.SOUTH, (Component) View, -summedInsets.bottom, SpringLayout.SOUTH, container);
JComponent featurePane = container.getFeaturePane();
if (featurePane != null) {
putConstraint(SpringLayout.WEST, featurePane, 0, SpringLayout.WEST, (Component) View);
putConstraint(SpringLayout.NORTH, featurePane, 0, SpringLayout.NORTH, (Component) View);
putConstraint(SpringLayout.EAST, featurePane, 0, SpringLayout.EAST, (Component) View);
putConstraint(SpringLayout.SOUTH, featurePane, 0, SpringLayout.SOUTH, (Component) View);
}
JFormattedTextField title = container.getTitle();
//FontMetrics metrics = container.getFontMetrics(title.getFont());
//int center = (int) ((View.getWidth() / 2.0d) - (metrics.stringWidth(container.getTitle().getText()) / 2.0d));
//int center = (int) (View.getBounds().getCenterX() - (metrics.stringWidth(container.getTitle().getText()) / 2.0d));
putConstraint(SpringLayout.NORTH, title, 2, SpringLayout.NORTH, container);
putConstraint(SpringLayout.HORIZONTAL_CENTER, title, 0, SpringLayout.HORIZONTAL_CENTER, (Component) container.getView());
//metrics = container.getFontMetrics(container.getSubTitle().getFont());
//center = (int) ((View.getWidth() / 2.0d) - (metrics.stringWidth(container.getSubTitle().getText()) / 2.0d));
//center = center + View.getMargins().left;
//center = (int) (View.getBounds().getCenterX() - (metrics.stringWidth(container.getSubTitle().getText()) / 2.0d));
if (title != null) {
putConstraint(SpringLayout.NORTH, container.getSubTitle(), 2, SpringLayout.SOUTH, title);
putConstraint(SpringLayout.HORIZONTAL_CENTER, container.getSubTitle(), 0, SpringLayout.HORIZONTAL_CENTER, (Component) container.getView());
//putConstraint(SpringLayout.WEST, container.getSubTitle(), center, SpringLayout.WEST, container);
} else {
putConstraint(SpringLayout.NORTH, container.getSubTitle(), 10, SpringLayout.NORTH, container);
putConstraint(SpringLayout.HORIZONTAL_CENTER, container.getSubTitle(), 0, SpringLayout.HORIZONTAL_CENTER, (Component) container.getView());
//putConstraint(SpringLayout.WEST, container.getSubTitle(), center, SpringLayout.WEST, container);
}
}
}
Ads help maintain this website.