/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.bearsoft.gui.grid.selection;
import com.bearsoft.gui.grid.events.insets.InsetAfterLastChangedEvent;
import com.bearsoft.gui.grid.events.insets.InsetChangeListener;
import com.bearsoft.gui.grid.events.insets.InsetPreFirstChangedEvent;
import com.bearsoft.gui.grid.insets.InsetContent;
import com.bearsoft.gui.grid.insets.InsetPart;
import com.bearsoft.gui.grid.insets.LinearInset;
import javax.swing.DefaultListSelectionModel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
*
* @author Gala
*/
public class InsettedListSelectionModel extends DefaultListSelectionModel {
protected LinearInset inset;
protected InsetContent informer;
protected ListSelectionModel delegate;
protected class InsetListener implements InsetChangeListener
{
public void insetPreFirstChanged(InsetPreFirstChangedEvent anEvent) {
fireValueChanged(false);
}
public void insetAfterLastChanged(InsetAfterLastChangedEvent anEvent) {
fireValueChanged(false);
}
}
protected class DelegateListSelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent delegateEvent) {
int firstRow = inset.toOuterSpace(new InsetPart(InsetPart.PartKind.CONTENT, delegateEvent.getFirstIndex()), LinearInset.EMPTY_CONTENT);
int lastRow = inset.toOuterSpace(new InsetPart(InsetPart.PartKind.CONTENT, delegateEvent.getLastIndex()), LinearInset.EMPTY_CONTENT);
fireValueChanged(firstRow, lastRow, delegateEvent.getValueIsAdjusting());
}
}
public InsettedListSelectionModel(ListSelectionModel aDelegate, LinearInset aInset, InsetContent aInformer) {
super();
delegate = aDelegate;
inset = aInset;
informer = aInformer;
delegate.addListSelectionListener(new DelegateListSelectionListener());
inset.addInsetChangeListener(new InsetListener());
setSelectionMode(delegate.getSelectionMode());
}
@Override
public void setSelectionInterval(int index0, int index1) {
super.setSelectionInterval(index0, index1);
int contentSize = informer.getContentSize();
InsetPart part0 = inset.toInnerSpace(index0, contentSize);
InsetPart part1 = inset.toInnerSpace(index1, contentSize);
if (part0.getKind() == InsetPart.PartKind.CONTENT
|| part1.getKind() == InsetPart.PartKind.CONTENT
|| (part0.getKind() == InsetPart.PartKind.BEFORE && part1.getKind() == InsetPart.PartKind.AFTER)) {
if (part0.getKind() == InsetPart.PartKind.BEFORE) {
index0 = 0;
} else {
index0 = part0.getValue();
}
if (part1.getKind() == InsetPart.PartKind.AFTER) {
index1 = contentSize - 1;
} else {
index1 = part1.getValue();
}
delegate.setSelectionInterval(index0, index1);
} else {
delegate.clearSelection();
}
}
@Override
public void addSelectionInterval(int index0, int index1) {
super.addSelectionInterval(index0, index1);
int contentSize = informer.getContentSize();
InsetPart part0 = inset.toInnerSpace(index0, contentSize);
InsetPart part1 = inset.toInnerSpace(index1, contentSize);
if (part0.getKind() == InsetPart.PartKind.CONTENT
|| part1.getKind() == InsetPart.PartKind.CONTENT
|| (part0.getKind() == InsetPart.PartKind.BEFORE && part1.getKind() == InsetPart.PartKind.AFTER)) {
if (part0.getKind() == InsetPart.PartKind.BEFORE) {
index0 = 0;
} else {
index0 = part0.getValue();
}
if (part1.getKind() == InsetPart.PartKind.AFTER) {
index1 = contentSize - 1;
} else {
index1 = part1.getValue();
}
delegate.addSelectionInterval(index0, index1);
}//else ...
}
@Override
public void removeSelectionInterval(int index0, int index1) {
super.removeSelectionInterval(index0, index1);
int contentSize = informer.getContentSize();
InsetPart part0 = inset.toInnerSpace(index0, contentSize);
InsetPart part1 = inset.toInnerSpace(index1, contentSize);
if (part0.getKind() == InsetPart.PartKind.CONTENT
|| part1.getKind() == InsetPart.PartKind.CONTENT
|| (part0.getKind() == InsetPart.PartKind.BEFORE && part1.getKind() == InsetPart.PartKind.AFTER)) {
if (part0.getKind() == InsetPart.PartKind.BEFORE) {
index0 = 0;
} else {
index0 = part0.getValue();
}
if (part1.getKind() == InsetPart.PartKind.AFTER) {
index1 = contentSize - 1;
} else {
index1 = part1.getValue();
}
delegate.removeSelectionInterval(index0, index1);
}//else ...
}
@Override
public void insertIndexInterval(int index, int length, boolean before) {
super.insertIndexInterval(index, length, before);
/* The first new index will appear at insMinIndex and the last
* one will appear at insMaxIndex
*/
int index0 = before ? index : index + 1;
int index1 = (index0 + length) - 1;
int contentSize = informer.getContentSize();
InsetPart part0 = inset.toInnerSpace(index0, contentSize);
InsetPart part1 = inset.toInnerSpace(index1, contentSize);
if (part0.getKind() == InsetPart.PartKind.CONTENT
|| part1.getKind() == InsetPart.PartKind.CONTENT
|| (part0.getKind() == InsetPart.PartKind.BEFORE && part1.getKind() == InsetPart.PartKind.AFTER)) {
if (part0.getKind() == InsetPart.PartKind.BEFORE) {
index0 = 0;
} else {
index0 = part0.getValue();
}
if (part1.getKind() == InsetPart.PartKind.AFTER) {
index1 = contentSize - 1;
} else {
index1 = part1.getValue();
}
length = index1 - index0 + 1;
delegate.insertIndexInterval(before ? index0 : index0 - 1, length, before);
}//else ...
}
@Override
public void removeIndexInterval(int index0, int index1) {
super.removeIndexInterval(index0, index1);
int contentSize = informer.getContentSize();
InsetPart part0 = inset.toInnerSpace(index0, contentSize);
InsetPart part1 = inset.toInnerSpace(index1, contentSize);
if (part0.getKind() == InsetPart.PartKind.CONTENT
|| part1.getKind() == InsetPart.PartKind.CONTENT
|| (part0.getKind() == InsetPart.PartKind.BEFORE && part1.getKind() == InsetPart.PartKind.AFTER)) {
if (part0.getKind() == InsetPart.PartKind.BEFORE) {
index0 = 0;
} else {
index0 = part0.getValue();
}
if (part1.getKind() == InsetPart.PartKind.AFTER) {
index1 = contentSize - 1;
} else {
index1 = part1.getValue();
}
delegate.removeIndexInterval(index0, index1);
}//else ...
}
@Override
public void setLeadSelectionIndex(int index) {
super.setLeadSelectionIndex(index);
}
@Override
public void setAnchorSelectionIndex(int index) {
super.setAnchorSelectionIndex(index);
}
@Override
public void clearSelection() {
super.clearSelection();
delegate.clearSelection();
}
@Override
public void setValueIsAdjusting(boolean valueIsAdjusting) {
super.setValueIsAdjusting(valueIsAdjusting);
delegate.setValueIsAdjusting(valueIsAdjusting);
}
@Override
public void setSelectionMode(int selectionMode) {
super.setSelectionMode(selectionMode);
delegate.setSelectionMode(selectionMode);
}
@Override
public int getMinSelectionIndex() {
int minFormDelegate = delegate.getMinSelectionIndex();
if(minFormDelegate != -1)
{
return inset.toOuterSpace(new InsetPart(InsetPart.PartKind.CONTENT, minFormDelegate), informer.getContentSize());
}
return super.getMinSelectionIndex();
}
@Override
public int getMaxSelectionIndex() {
int maxFormDelegate = delegate.getMaxSelectionIndex();
if(maxFormDelegate != -1)
{
return inset.toOuterSpace(new InsetPart(InsetPart.PartKind.CONTENT, maxFormDelegate), informer.getContentSize());
}
return super.getMaxSelectionIndex();
}
@Override
public boolean isSelectedIndex(int index) {
InsetPart part = inset.toInnerSpace(index, informer.getContentSize());
if(part.getKind() == InsetPart.PartKind.CONTENT)
{
return delegate.isSelectedIndex(part.getValue());
}
return super.isSelectedIndex(index);
}
@Override
public int getAnchorSelectionIndex() {
/*
int anchorFormDelegate = delegate.getAnchorSelectionIndex();
if(anchorFormDelegate != -1)
{
return inset.toOuterSpace(new InsetPart(InsetPart.PartKind.CONTENT, anchorFormDelegate), informer.getContentSize());
}
*/
return super.getAnchorSelectionIndex();
}
@Override
public int getLeadSelectionIndex() {
/*
int leadFormDelegate = delegate.getLeadSelectionIndex();
if(leadFormDelegate != -1)
{
return inset.toOuterSpace(new InsetPart(InsetPart.PartKind.CONTENT, leadFormDelegate), informer.getContentSize());
}
*/
return super.getLeadSelectionIndex();
}
@Override
public boolean isSelectionEmpty() {
return delegate.isSelectionEmpty() && super.isSelectionEmpty();
}
@Override
public boolean getValueIsAdjusting() {
return super.getValueIsAdjusting();
}
@Override
public int getSelectionMode() {
return super.getSelectionMode();
}
}