/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.fib.view.container;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.util.Vector;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import org.openflexo.fib.controller.FIBController;
import org.openflexo.fib.model.ComponentConstraints;
import org.openflexo.fib.model.FIBComponent;
import org.openflexo.fib.model.FIBPanel;
import org.openflexo.fib.model.FIBPanel.Layout;
import org.openflexo.fib.model.GridLayoutConstraints;
import org.openflexo.fib.view.FIBContainerView;
import org.openflexo.fib.view.FIBView;
import org.openflexo.toolbox.StringUtils;
public class FIBPanelView<C extends FIBPanel> extends FIBContainerView<C, JPanel> {
private static final Logger logger = Logger.getLogger(FIBPanelView.class.getPackage().getName());
private JPanel panel;
public FIBPanelView(C model, FIBController controller) {
super(model, controller);
updateBorder();
}
public void updateBorder() {
switch (getComponent().getBorder()) {
case empty:
panel.setBorder(BorderFactory.createEmptyBorder(getComponent().getBorderTop() != null ? getComponent().getBorderTop() : 0,
getComponent().getBorderLeft() != null ? getComponent().getBorderLeft() : 0,
getComponent().getBorderBottom() != null ? getComponent().getBorderBottom() : 0,
getComponent().getBorderRight() != null ? getComponent().getBorderRight() : 0));
break;
case etched:
panel.setBorder(BorderFactory.createEtchedBorder());
break;
case line:
panel.setBorder(BorderFactory.createLineBorder(getComponent().getBorderColor() != null ? getComponent().getBorderColor()
: Color.black));
break;
case lowered:
panel.setBorder(BorderFactory.createLoweredBevelBorder());
break;
case raised:
panel.setBorder(BorderFactory.createRaisedBevelBorder());
break;
case titled:
panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), getLocalized(getComponent()
.getBorderTitle()), TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION, getComponent().retrieveValidFont(),
getComponent().retrieveValidForegroundColor()));
break;
case rounded3d:
panel.setBorder(new RoundedBorder(StringUtils.isNotEmpty(getComponent().getBorderTitle()) ? getLocalized(getComponent()
.getBorderTitle()) : null, getComponent().getBorderTop() != null ? getComponent().getBorderTop() : 0, getComponent()
.getBorderLeft() != null ? getComponent().getBorderLeft() : 0,
getComponent().getBorderBottom() != null ? getComponent().getBorderBottom() : 0,
getComponent().getBorderRight() != null ? getComponent().getBorderRight() : 0, getComponent().getTitleFont(),
getComponent().retrieveValidForegroundColor(), getComponent().getDarkLevel()));
break;
default:
break;
}
}
@Override
public void updateLanguage() {
super.updateLanguage();
updateBorder();
}
private void _setPanelLayoutParameters() {
switch (getComponent().getLayout()) {
case none:
panel.setLayout(null);
break;
case flow:
panel.setLayout(new FlowLayout(getComponent().getFlowAlignment().getAlign(), getComponent().getHGap(), getComponent().getVGap()));
break;
case border:
panel.setLayout(new BorderLayout());
break;
case grid:
// logger.info("rows="+getComponent().getRows()+" cols="+getComponent().getCols());
panel.setLayout(new GridLayout(getComponent().getRows(), getComponent().getCols(), getComponent().getHGap(), getComponent()
.getVGap()));
break;
case box:
panel.setLayout(new BoxLayout(panel, getComponent().getBoxLayoutAxis().getAxis()));
break;
case twocols:
panel.setLayout(new GridBagLayout());
break;
case gridbag:
panel.setLayout(new GridBagLayout());
break;
default:
break;
}
}
@Override
protected JPanel createJComponent() {
class ScrollablePanel extends JPanel implements Scrollable {
@Override
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
switch (orientation) {
case SwingConstants.VERTICAL:
return visibleRect.height / 10;
case SwingConstants.HORIZONTAL:
return visibleRect.width / 10;
default:
throw new IllegalArgumentException("Invalid orientation: " + orientation);
}
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
switch (orientation) {
case SwingConstants.VERTICAL:
return visibleRect.height;
case SwingConstants.HORIZONTAL:
return visibleRect.width;
default:
throw new IllegalArgumentException("Invalid orientation: " + orientation);
}
}
@Override
public boolean getScrollableTracksViewportWidth() {
return FIBPanelView.this.getComponent().isTrackViewPortWidth();
}
@Override
public boolean getScrollableTracksViewportHeight() {
return FIBPanelView.this.getComponent().isTrackViewPortHeight();
}
}
panel = new ScrollablePanel();
updateGraphicalProperties();
_setPanelLayoutParameters();
return panel;
}
@Override
public synchronized void updateLayout() {
if (getSubViews() != null) {
for (FIBView v : getSubViews()) {
v.delete();
}
}
getJComponent().removeAll();
_setPanelLayoutParameters();
buildSubComponents();
updateDataObject(getDataObject());
}
@Override
protected void retrieveContainedJComponentsAndConstraints() {
Vector<FIBComponent> allSubComponents = new Vector<FIBComponent>();
allSubComponents.addAll(getComponent().getSubComponents());
// Vector<FIBComponent> allSubComponents = getComponent().getSubComponents();
if (getComponent().getLayout() == Layout.flow || getComponent().getLayout() == Layout.box
|| getComponent().getLayout() == Layout.twocols || getComponent().getLayout() == Layout.gridbag) {
/*System.out.println("Apres le retrieve: ");
for (FIBComponent c : allSubComponents) {
if (c.getConstraints() != null) {
if (!c.getConstraints().hasIndex()) {
System.out.println("> Index: ? "+c);
}
else {
System.out.println("> Index: "+c.getConstraints().getIndex()+" "+c);
}
}
}
System.out.println("*********************************************");*/
}
if (getComponent().getLayout() == Layout.grid) {
for (FIBComponent subComponent : getComponent().getSubComponents()) {
FIBView subView = getController().buildView(subComponent);
registerViewForComponent(subView, subComponent);
}
for (int i = 0; i < getComponent().getRows(); i++) {
for (int j = 0; j < getComponent().getCols(); j++) {
registerComponentWithConstraints(_getJComponent(j, i), null);
}
}
}
else {
for (FIBComponent subComponent : allSubComponents) {
FIBView subView = getController().buildView(subComponent);
registerViewForComponent(subView, subComponent);
registerComponentWithConstraints(subView.getResultingJComponent(), subComponent.getConstraints());
}
}
}
@Override
protected void addJComponent(JComponent c) {
Object constraint = getConstraints().get(c);
if (constraint instanceof ComponentConstraints) {
((ComponentConstraints) constraint).performConstrainedAddition(getJComponent(), c);
} else {
super.addJComponent(c);
}
}
@Override
public JPanel getJComponent() {
return panel;
}
// Special case for GridLayout
protected JComponent _getJComponent(int col, int row) {
for (FIBComponent subComponent : getComponent().getSubComponents()) {
GridLayoutConstraints glc = (GridLayoutConstraints) subComponent.getConstraints();
if (glc.getX() == col && glc.getY() == row) {
return getController().viewForComponent(subComponent).getResultingJComponent();
}
}
// Otherwise, it's an empty cell
JPanel returned = new JPanel();
returned.setOpaque(false);
return returned;
}
@Override
public void delete() {
super.delete();
}
}