# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

"README.attributes"

Each IO has the following attributes which have to be managed by a
container:
			setVia
-------------------------------------------------------------------
- callbacks
- title			immutable			restore
- toolbarActions		immutable	selection
- toolTipText		IOTab				restore
- icon			IOTab				restore
- connected (shows up as bold text)
- isClosable
- findState					selection

'immutable' means that the attribute is set at IO creation time and there
are no mutator API's for them.
'IOTab' means attribute is set using the IOTab API.

'selection' means that this attribute has to be multiplexed by the
container based on the "selected" component. I.e. when a new tab is
selected the action buttons have to be adjusted.

'restore' means the attribute is managed by the tabbed pane. As a result,
when a component is added or re-added after having been removed
(aka closed) these attributes need to be restored.

The interesting question is ... what hapens to these attributes when
they are not part of a container (aka closed?). For example, the icon
is set using JTabbedPane.setIconAt(index, icon). How can it
be "set" when there is no tabbedPane or it's been taken out of
the tabbedPane?

The answer is that the attributes are saved in class 
TerminalContainerImpl.Attributes an instance of whch is "attached" to
the component using JComponent.putClientProperty(PROP_ATTRIBUTES, a).

output2 uses a per-attribute method. Some of them are saved
using their own client properties, some are saved using 
existing real JComponent properties (like 'name').

Important methods in TerminalContainerImpl for managing Attributes are:

	attributesFor()
		Maps components to their Attributes.
	checkSelectionChange()
		Multiplexes attributes with the keyword "selection".
	restoreAttrsFor()
		Restores attributes with the keyword "restore".
		output2 does this is a somewhat more ad-hoc way and
		as a result fails to restore icons and tips for 
		components that get closed and then re-selected.

These attributes are a bit redundant versus their copies in Terminal.
The reason for this is that IOContainer only knows about JComponents 
and we do't want it to have implementation-specific knowledge of
Terminal ... so it can work with output2 components as well!
