Feature Enhancement: room exits dialog upgraded to be full GUI for exits

Now gives user full control over room exits from selected room.  Enforces
validity and cleans up controls of exit stubs, doors, exit weights, and
exit "locks" (referred to as "no route" as it prevents route calculator
code from using that exit).

For normal exits:
* A valid exit is mutually exclusive with a stub for that direction.
* A door can only be set on an exit with a stub OR a valid exit.
* The no route option can only be set on a valid exit.
tool-tips on the normal exit QLineEdits entry boxes are colour coded, blue
for valid (and they report the destination room name if there is one) or red
for invalid.  Doors can be set on up, down, in or out exits although they
do not currently show on the 2D map.

For special exits:
* a control has been added for exit weight.
* four check-boxes that act as mutually exclusive radio-buttons allow
for the allocation of doors - although these do not currently show (on
custom exit lines) on the 2D map.
* the exit command or script has been place last on the lines of controls
for each special exit which permits the best use of spare space on the
line.
* an additional control button was needed to end editing of special exits
(removes the selection highlighting)

The dialog enables/disables the "save" button and the dialog modified
indicator in the title bar as appropriate.  Special exits will be removed
from the room on saving if the destination room is set to zero, it was
intended that deleting the command would also delete the exit but that
doesn't work - needs further work.

N.B. Some TRoom class methods have been overhauled or modified or added:
{A} (was int, now:) bool TRoom::hasExitStub( int direction ) :
as this is a true/false type function it has been changed to a bool
return type.

{B} void TRoom::setExitStub( int direction, (was int now:) bool status ) :
as well as changing second argument, it now refrains from adding a
duplicate stub - the QList container used to hold exit stubs allows
multiple instances of the same value to be stored therein, for the same
reason when removing a stub in a particular direction it removes ALL
instance of that direction value not just the first one.

{C} bool TRoom::hasExit( int (was id now:) direction) :
was not used and did a different function, now it was to be used in room
exit dialog for exit detection but in fact was not needed.

{D} void TRoom::setExitLock( int direction, bool locked ):
same issues as {B} above in regard to multiple entries for the same exit
direction.

{E} bool TRoom::setExit( int to, int direction )
&
{F} int TRoom::getExit( int direction ):
New methods to allow set/get of normal exits with a numeric direction
argument.  Helps when iterating though all of them instead of having to
repeat code with different distinct access methods for each exit.

{G} bool TRoom::hasSpecialExitLock( int to, QString cmd ):
Original code failed to check that the cmd matched as well as the
destination, whilst the chance that two different special exits in the
same room might lead to the SAME destination might be infinitesimal it
is logically a valid scenario.

{H} void TRoom::addSpecialExit( int to, QString cmd ):
Previous code did not handle the case if the cmd already exists as an
special exit, now it will replace the destination with the new one,
maintaining the original lock status if not overridden in the supplied
cmd argument.

{I} bool TRoom::hasSpecialExit( QString cmd ):
&
{J} void TRoom::setSpecialExitLock( QString cmd, bool doLock ):
&
{K} bool TRoom::removedSpecialExit( QString cmd );
These new methods do not need the destination room to be specified,
which is more logical from a conceptual point of view.

{L} void TRoom::calcRoomDimensions() :
Restuctured so the extremes of the custom lines of the room are now
relative to the room centre and now reports via qWarning() a couple of
error cases.  Storing the min and max x and y figures like this eases
the calculations for an area's extremes as an anticipated future
enhancement would paint a background on the 2D mapper only just over
the limits of the area.

{M} void TRoom::auditExits() :
Restructured to avoid the use of the "goto" command and to report
missing exit destination rooms, prior code attempted to find an exit
destination when it was already set to the -1 non-exit value.

Signed-off-by: Stephen Lyons <slysven@virginmedia.com>