/*
* Copyright (c) 1998-2017 by Richard A. Wilkes. All rights reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, version 2.0. If a copy of the MPL was not distributed with
* this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This Source Code Form is "Incompatible With Secondary Licenses", as
* defined by the Mozilla Public License, version 2.0.
*/
package com.trollworks.gcs.template;
import com.trollworks.gcs.app.GCSFonts;
import com.trollworks.gcs.page.DropPanel;
import com.trollworks.toolkit.ui.TextDrawing;
import com.trollworks.toolkit.ui.border.TitledBorder;
import com.trollworks.toolkit.ui.widget.outline.Column;
import com.trollworks.toolkit.ui.widget.outline.Outline;
import com.trollworks.toolkit.ui.widget.outline.OutlineHeader;
import com.trollworks.toolkit.ui.widget.outline.OutlineModel;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager2;
import java.awt.Rectangle;
import java.util.ArrayList;
import javax.swing.UIManager;
/** The template outline panel. */
public class TemplateOutlinePanel extends DropPanel implements LayoutManager2 {
private OutlineHeader mHeader;
private Outline mOutline;
/**
* Creates a new template outline panel.
*
* @param outline The outline to display.
* @param title The localized title for the panel.
*/
public TemplateOutlinePanel(Outline outline, String title) {
super(null, title, false);
mOutline = outline;
mHeader = mOutline.getHeaderPanel();
TemplateSheet.prepOutline(mOutline);
add(mHeader);
add(mOutline);
setBorder(new TitledBorder());
setLayout(this);
}
@Override
public float getLayoutAlignmentX(Container target) {
return CENTER_ALIGNMENT;
}
@Override
public float getLayoutAlignmentY(Container target) {
return CENTER_ALIGNMENT;
}
@Override
public void invalidateLayout(Container target) {
// Nothing to do...
}
@Override
public Dimension maximumLayoutSize(Container target) {
return getLayoutSizeForOne(mOutline.getMaximumSize());
}
@Override
public void addLayoutComponent(Component comp, Object constraints) {
// Nothing to do...
}
@Override
public void removeLayoutComponent(Component comp) {
// Nothing to do...
}
@Override
public void layoutContainer(Container parent) {
Insets insets = getInsets();
Rectangle bounds = new Rectangle(insets.left, insets.top, getWidth() - (insets.left + insets.right), getHeight() - (insets.top + insets.bottom));
int width = bounds.width;
int height = mHeader.getPreferredSize().height;
OutlineModel outlineModel = mOutline.getModel();
int count = outlineModel.getColumnCount();
ArrayList<Column> changed = new ArrayList<>();
Column column;
mHeader.setBounds(bounds.x, bounds.y, width, height);
bounds.y += height;
bounds.height -= height;
mOutline.setBounds(bounds.x, bounds.y, width, bounds.height);
for (int i = 0; i < count; i++) {
column = outlineModel.getColumnAtIndex(i);
if (column.getID() != 0) {
int prefWidth = column.getPreferredWidth(mOutline);
if (prefWidth != column.getWidth()) {
column.setWidth(mOutline, prefWidth);
changed.add(column);
}
width -= prefWidth;
}
}
if (mOutline.shouldDrawColumnDividers()) {
width -= count;
}
column = outlineModel.getColumnWithID(0);
if (column.getWidth() != width) {
column.setWidth(mOutline, width);
changed.add(column);
}
mOutline.updateRowHeightsIfNeeded(changed);
mOutline.revalidateView();
}
@Override
public void addLayoutComponent(String name, Component comp) {
// Nothing to do...
}
@Override
public Dimension minimumLayoutSize(Container parent) {
Dimension size = mOutline.getMinimumSize();
int minHeight = TextDrawing.getPreferredSize(UIManager.getFont(GCSFonts.KEY_FIELD), "Mg").height; //$NON-NLS-1$
if (size.height < minHeight) {
size.height = minHeight;
}
return getLayoutSizeForOne(size);
}
@Override
public Dimension preferredLayoutSize(Container parent) {
Dimension size = getLayoutSizeForOne(mOutline.getPreferredSize());
Dimension min = getMinimumSize();
if (size.width < min.width) {
size.width = min.width;
}
if (size.height < min.height) {
size.height = min.height;
}
return size;
}
private Dimension getLayoutSizeForOne(Dimension one) {
Insets insets = getInsets();
return new Dimension(1 + insets.left + insets.right + one.width, insets.top + insets.bottom + one.height + mHeader.getPreferredSize().height);
}
}