/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.util.gui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import javax.swing.Scrollable;
import javax.swing.ViewportLayout;
import com.servoy.j2db.util.HtmlUtils;
import com.servoy.j2db.util.Utils;
/**
* @author jblok
*
* Fix for bad calling if no scrollbars used ever
*/
public class FixedJScrollPane extends JScrollPane
{
public FixedJScrollPane()
{
super();
}
public FixedJScrollPane(Component c)
{
super(c);
}
/**
* Fix for scrollpane not scrolleble (no vertical or horizontal scrollbar) the viewport should NOT ask the viewport component for
* getPreferredScrollableViewportSize but for getPreferredSize
*/
@Override
protected JViewport createViewport()
{
return new FixedJViewport();
}
@Override
public void setToolTipText(String tip)
{
if (!Utils.stringIsEmpty(tip))
{
if (!Utils.stringContainsIgnoreCase(tip, "<html")) //$NON-NLS-1$
{
super.setToolTipText(tip);
}
else if (HtmlUtils.hasUsefulHtmlContent(tip))
{
super.setToolTipText(tip);
}
}
else
{
super.setToolTipText(null);
}
}
static class FixedJViewport extends JViewport
{
@Override
protected LayoutManager createLayoutManager()
{
return new FixedViewportLayout();
}
/*
* (non-Javadoc)
*
* @see javax.swing.JViewport#getView()
*/
@Override
public Component getView()
{
if (getComponentCount() != 0)
{
return super.getView();
}
return null;
}
/**
* @see javax.swing.JComponent#getPreferredSize()
*/
@Override
public Dimension getPreferredSize()
{
Dimension dim = super.getPreferredSize();
return dim;
}
//private Dimension lastPreferredSize = new
/**
* @see javax.swing.JViewport#getExtentSize()
*/
@Override
public Dimension getExtentSize()
{
// Dimension pref = getPreferredSize();
Dimension dim = super.getExtentSize();
// System.err.println("extended: " + dim);
// System.err.println("pref: " + pref);
// System.err.println("view: " + getViewSize());
// if (dim.width <= pref.width || dim.height <= pref.height)
// {
// return pref ;
// }
return dim;
}
/**
* @see java.awt.Component#setSize(java.awt.Dimension)
*/
@Override
public void setSize(Dimension d)
{
super.setSize(d);
}
/**
* @see java.awt.Component#setSize(int, int)
*/
@Override
public void setSize(int width, int height)
{
super.setSize(width, height);
}
/**
* @see javax.swing.JViewport#getViewSize()
*/
@Override
public Dimension getViewSize()
{
Dimension viewSize = super.getViewSize();
return viewSize;
}
}
static class FixedViewportLayout extends ViewportLayout
{
@Override
public Dimension preferredLayoutSize(Container parent)
{
JScrollPane scrollPane = (JScrollPane)parent.getParent();
Component view = ((JViewport)parent).getView();
if (view == null)
{
return new Dimension(0, 0);
}
else if (scrollPane != null && scrollPane.getHorizontalScrollBarPolicy() == ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER &&
scrollPane.getVerticalScrollBarPolicy() == ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER)
{
return view.getPreferredSize();
}
else if (view instanceof Scrollable)
{
return ((Scrollable)view).getPreferredScrollableViewportSize();
}
else
{
return view.getPreferredSize();
}
}
}
}