package simtools.ui;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JComponent;
import simtools.util.ListenerManager;
/**
*
* The default implementation of PageListModel.
* This model is used by stackPanel to aggregate the components contained in its stack
* @author zxpletran007
*
*/
public class DefaultPageListModel implements PageListModel{
/** List of pages */
protected List pages;
/** Current selected page */
protected PageModel selectedPage;
/** Page list model listeners. */
protected ListenerManager listeners;
public DefaultPageListModel(){
pages = new ArrayList(); // Create an empty list
listeners = new ListenerManager();
selectedPage = null;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#addPageAt(simtools.ui.PageListModel.PageModel, int)
*/
public void addPageAt(PageModel page, int index) {
checkIndex(index);
pages.add(index, page);
fireContentsChanged();
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#addPage(simtools.ui.PageListModel.PageModel)
*/
public void addPage(PageModel page) {
boolean listHasChanged = pages.add(page);
if (listHasChanged){
fireContentsChanged();
}
}
public void addPage(String pageTitle, Icon pageIcon, JComponent pageContent) {
addPage(new DefaultPageModel(pageTitle, pageIcon, pageContent));
}
public void addPage(String pageTitle, JComponent pageContent) {
addPage(pageTitle, null, pageContent);
}
/**
* Assert that the given index is a valid index (0 to size of list -1)
* @param index
*/
private void checkIndex(int index) {
if (index < 0 || index >= pages.size()) {
throw new IndexOutOfBoundsException("Index: "+index+", Tab count: " + pages.size());
}
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#deletePage(simtools.ui.PageListModel.PageModel)
*/
public void deletePage(PageModel page) {
boolean listHasChanged = pages.remove(page);
if (listHasChanged){
fireContentsChanged();
}
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#getPageAt(int)
*/
public PageModel getPageAt(int index) {
checkIndex(index);
return (PageModel)pages.get(index);
}
/**
* get the page whose title is equal to given String
* @param pageTitle
* @return the page corresponding to the given title or null is no page matches.
*/
public PageModel getPageFromTitle(String pageTitle) {
PageModel res = null;
for(int i = 0; i < getSize() && res == null; i++) {
PageModel c = (PageModel)pages.get(i);
if ((c != null && c.getPageTitle().equals(pageTitle))) {
res = c;
}
}
return res;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#getSelectedPage()
*/
public PageModel getSelectedPage() {
return selectedPage;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#getSelectedIndex()
*/
public int getSelectedIndex(){
return indexOfPage(selectedPage);
}
private int indexOfPage(PageModel page) {
for(int i = 0; i < getSize(); i++) {
PageModel c = (PageModel)pages.get(i);
if ((c != null && c.equals(page)) || (c == null && c == page)) {
return i;
}
}
return -1;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#getSize()
*/
public int getSize() {
return pages.size();
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#setSelectedPage(simtools.ui.PageListModel.PageModel)
*/
public void setSelectedPage(PageModel aPage) {
PageModel oldSelectedPage = selectedPage;
if (aPage == null || indexOfPage(aPage)==-1) {
selectedPage = null;
} else {
selectedPage = aPage;
}
if (oldSelectedPage != selectedPage){
fireSelectionHasChanged();
}
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#setSelectedPage(java.lang.String)
*/
public void setSelectedPage(String pageTitle){
setSelectedPage(getPageFromTitle(pageTitle));
}
// Listeners related functions. Take care of duplicates
public void addListener(PageListListener dsl) {
listeners.add(dsl);
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel#removeListener(simtools.ui.PageListModel.PageListListener)
*/
public void removeListener(PageListListener dsl) {
listeners.remove(dsl);
}
private void fireContentsChanged(){
int n = listeners.size(); // only one call outside loop
for (int i = 0; i < n; ++i) {
PageListListener pll = (PageListListener) listeners.get(i);
if (pll != null) {
pll.contentHasChanged();
}
}
}
private void fireSelectionHasChanged(){
int n = listeners.size(); // only one call outside loop
for (int i = 0; i < n; ++i) {
PageListListener pll = (PageListListener) listeners.get(i);
if (pll != null) {
pll.selectionHasChanged();
}
}
}
/**
* @author zxpletran007
*
*/
public static class DefaultPageModel implements PageModel{
String pageTitle;
Icon pageIcon;
JComponent pageContent;
public DefaultPageModel(String pageTitle, Icon pageIcon, JComponent pageContent) {
super();
this.pageTitle = pageTitle;
this.pageIcon = pageIcon;
this.pageContent = pageContent;
}
public DefaultPageModel(String pageTitle, JComponent pageContent) {
this(pageTitle, null, pageContent);
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel.PageModel#getPageContent()
*/
public JComponent getPageContent() {
return pageContent;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel.PageModel#getPageIcon()
*/
public Icon getPageIcon() {
return pageIcon;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel.PageModel#getPageTitle()
*/
public String getPageTitle() {
return pageTitle;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel.PageModel#setPageContent(javax.swing.JComponent)
*/
public void setPageContent(JComponent pageContent) {
this.pageContent = pageContent;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel.PageModel#setPageIcon(javax.swing.Icon)
*/
public void setPageIcon(Icon pageIcon) {
this.pageIcon = pageIcon;
}
/* (non-Javadoc)
* @see simtools.ui.PageListModel.PageModel#setPageTitle(java.lang.String)
*/
public void setPageTitle(String pageTitle) {
this.pageTitle = pageTitle;
}
}
}