package org.docear.plugin.core.ui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.util.ArrayList;
import java.util.List;
public class OverlayLayoutManager implements LayoutManager {
public static String WRAPPED_LAYOUT = "overlay_orig_layout|";
public static String ALIGN_TOP = "overlay_align_top|";
public static String ALIGN_CENTER = "overlay_align_center|";
public static String ALIGN_BOTTOM = "overlay_align_bottom|";
public static String FLOAT_LEFT = "overlay_float_left|";
public static String FLOAT_RIGHT = "overlay_float_right|";
public static String FLOAT_MIDDLE = "overlay_float_middle|";
private final LayoutManager wrappedLayout;
private final List<Component> overlayComponents = new ArrayList<Component>();
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public OverlayLayoutManager(LayoutManager layout) {
wrappedLayout = layout;
}
/***********************************************************************************
* METHODS
**********************************************************************************/
public static boolean instanceOf(LayoutManager layout) {
if(layout instanceof OverlayLayoutManager) {
return true;
}
return false;
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
@Override
public void addLayoutComponent(String name, Component comp) {
if(name != null) {
if(name.contains("overlay_")) {
addLayoutComponent(name.split("[|]"), comp);
}
else {
if(wrappedLayout != null) {
wrappedLayout.addLayoutComponent(name, comp);
}
}
}
}
public void addLayoutComponent(String[] positionConstraints, Component comp) {
overlayComponents.add(comp);
}
@Override
public void removeLayoutComponent(Component comp) {
if(!overlayComponents.remove(comp)) {
if(wrappedLayout != null) {
wrappedLayout.removeLayoutComponent(comp);
}
}
}
@Override
public Dimension preferredLayoutSize(Container parent) {
if(wrappedLayout == null) {
return parent.getPreferredSize();
}
return wrappedLayout.preferredLayoutSize(parent);
}
@Override
public Dimension minimumLayoutSize(Container parent) {
if(wrappedLayout == null) {
return parent.getMinimumSize();
}
return wrappedLayout.minimumLayoutSize(parent);
}
@Override
public void layoutContainer(Container parent) {
if(wrappedLayout != null) {
wrappedLayout.layoutContainer(parent);
Insets insets = parent.getInsets();
if(insets == null) {
insets = new Insets(5, 5, 5, 5);
}
int tr = parent.getWidth()-parent.getInsets().right;
// int tl = parent.getInsets().left;
// int cr = parent.getWidth()-parent.getInsets().right;
// int cl = parent.getInsets().left;
// int br = parent.getWidth()-parent.getInsets().right;
// int bl = parent.getInsets().left;
for (Component overlayComp : overlayComponents) {
if(overlayComp.isVisible()) {
Dimension prefSize = overlayComp.getSize();
tr -= prefSize.width - 5;
overlayComp.setBounds(tr, parent.getInsets().top+5, 100, 100);
}
}
}
}
}