Listing 1: UIElementListModel class
public class UIElementListModel extends ArrayListModel<UIElement> {
public interface ConstrainedProperties {
final String REMOVE = "remove";
}
private VetoableChangeSupport vcs;
@Override
public UIElement remove(int index) {
boolean okToRemove = true;
UIElement removedElement = get(index);
if (vcs != null) {
try {
vcs.fireVetoableChange(new VetoableChangeEvent(this,
ConstrainedProperties.REMOVE, new, removedElement));
} catch (PropertyVetoException pve) {
okToRemove = false;
}
}
if (okToRemove) {
removedElement = super.remove(index);
}
return removedElement;
}
public void addVetoableChangeListener(VetoableChangeListener listener) {
if (vcs == null) {
vcs = new VetoableChangeSupport(this);
}
vcs.addVetoableChangeListener(listener);
}
public void removeVetoableChangeListener(VetoableChangeListener listener) {
if (vcs != null) {
vcs.removeVetoableChangeListener(listener);
}
}
}
Listing 2: Sample of AbstractUIElement methods
public Icon getSmallIcon() {
if (smallIcon == null || largeIcon == smallIcon) {
if (largeIcon != null) {
smallIcon = scaleIcon(getComponent(), largeIcon, 0.5);
}
}
return smallIcon;
}
public Icon getLargeIcon() {
if (largeIcon == null || largeIcon == smallIcon) {
if (smallIcon != null) {
largeIcon = scaleIcon(getComponent(), smallIcon, 2.0);
}
}
return largeIcon;
}
private Icon scaleIcon(Component component, Icon icon, double scale) {
int newWidth = (int)(icon.getIconWidth() * scale);
int newHeight = (int)(icon.getIconHeight() * scale);
if (!(icon instanceof ImageIcon)) {
BufferedImage bi = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
icon.paintIcon(component, bi.getGraphics(), 0, 0);
icon = new ImageIcon(bi);
}
return new ImageIcon(((ImageIcon)icon).getImage()
.getScaledInstance(newWidth,
newHeight, Image.SCALE_SMOOTH));
}
Listing 3: UIElementListView interface
public interface UIElementListView {
Component getComponent();
UIElementListModel getModel();
void setModel(UIElementListModel model);
UIElement getSelectedItem();
void setSelectedItem(UIElement element);
int getSelectedIndex();
void setSelectedIndex(int index);
SingleSelectionModel getSingleSelectionModel();
}
Listing 4: setModel() Method in AbstractListView
public void setModel(UIElementListModel newModel) {
if (model != newModel) {
if (model != null) {
model.removeListDataListener(this);
model.removeVetoableChangeListener(vcs);
int size = model.size();
for (int i = 0; i < size; i++) {
remove(0);
}
}
if (newModel == null) {
newModel = new UIElementListModel();
}
model = newModel;
model.addListDataListener(this);
model.addVetoableChangeListener(vcs);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
int index = 0;
for (UIElement element : model) {
insert(index++, element);
}
}
});
}
}
Listing 5: InternalFrameAdapter for MDIView
private InternalFrameListener frameListener = new InternalFrameAdapter() {
@Override
public void internalFrameActivated(InternalFrameEvent e) {
int index = frames.indexOf(e.getSource());
setSelectedIndex(index);
selectionModel.setSelectedIndex(index);
}
@Override
public void internalFrameClosing(InternalFrameEvent e) {
UIElement element = ((InternalFrame)e.getSource()).element;
getModel().remove(element);
}
};
Listing 6: Overriding canClose() in an AbstractListView
mdiView = new MDIView() {
@Override
protected boolean canClose(UIElement element) {
boolean canClose =
JOptionPane.showConfirmDialog(ListViewTest2.this,
"Are you sure you want to close this?", "Confirm",
JOptionPane.YES_NO_CANCEL_OPTION)
== JOptionPane.YES_OPTION;
SwingUtilities.invokeLater(new Runnable() {
public void run() { updateToggleState();
}
});
return canClose;
}
};