Additional Code - Dat File

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;
}
};

Additional Code - Dat File