Initial import.
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/LICENSE	Sun Jan 30 12:58:47 2005 +0000
     1.3 @@ -0,0 +1,308 @@
     1.4 +    VYM - View Your Mind
     1.5 +    Copyright (C) 2004  Uwe Drechsel  
     1.6 +
     1.7 +    This program is free software; you can redistribute it and/or modify
     1.8 +    it under the terms of the GNU General Public License as published by
     1.9 +    the Free Software Foundation; either version 2 of the License, or
    1.10 +    (at your option) any later version.
    1.11 +
    1.12 +    This program is distributed in the hope that it will be useful,
    1.13 +    but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.14 +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.15 +    GNU General Public License below for more details.
    1.16 +
    1.17 +	In addition, as a special exception, Uwe Drechsel
    1.18 +	gives permission to link the code of this program with the QT 
    1.19 +	libraries from trolltech.com (or with modified versions of QT that
    1.20 +	use the same license as QT), and distribute linked combinations
    1.21 +	including the two. You must obey the GNU General Public License in
    1.22 +	all respects for all of the code used other than QT. If you modify
    1.23 +	this file, you may extend this exception to your version of the
    1.24 +	file, but you are not obligated to do so. If you do not wish to do
    1.25 +	so, delete this exception statement from your version.
    1.26 +
    1.27 +
    1.28 +	Uwe Drechsel can be contacted at <vym@insilmaril.de>
    1.29 +
    1.30 +-----------------------------------------------------------------------------
    1.31 +
    1.32 +            GNU GENERAL PUBLIC LICENSE
    1.33 +		       Version 2, June 1991
    1.34 +
    1.35 + Copyright (C) 1989, 1991 Free Software Foundation, Inc.
    1.36 +     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    1.37 + Everyone is permitted to copy and distribute verbatim copies
    1.38 + of this license document, but changing it is not allowed.
    1.39 +
    1.40 +			    Preamble
    1.41 +
    1.42 +  The licenses for most software are designed to take away your
    1.43 +freedom to share and change it.  By contrast, the GNU General Public
    1.44 +License is intended to guarantee your freedom to share and change free
    1.45 +software--to make sure the software is free for all its users.  This
    1.46 +General Public License applies to most of the Free Software
    1.47 +Foundation's software and to any other program whose authors commit to
    1.48 +using it.  (Some other Free Software Foundation software is covered by
    1.49 +the GNU Library General Public License instead.)  You can apply it to
    1.50 +your programs, too.
    1.51 +
    1.52 +  When we speak of free software, we are referring to freedom, not
    1.53 +price.  Our General Public Licenses are designed to make sure that you
    1.54 +have the freedom to distribute copies of free software (and charge for
    1.55 +this service if you wish), that you receive source code or can get it
    1.56 +if you want it, that you can change the software or use pieces of it
    1.57 +in new free programs; and that you know you can do these things.
    1.58 +
    1.59 +  To protect your rights, we need to make restrictions that forbid
    1.60 +anyone to deny you these rights or to ask you to surrender the rights.
    1.61 +These restrictions translate to certain responsibilities for you if you
    1.62 +distribute copies of the software, or if you modify it.
    1.63 +
    1.64 +  For example, if you distribute copies of such a program, whether
    1.65 +gratis or for a fee, you must give the recipients all the rights that
    1.66 +you have.  You must make sure that they, too, receive or can get the
    1.67 +source code.  And you must show them these terms so they know their
    1.68 +rights.
    1.69 +
    1.70 +  We protect your rights with two steps: (1) copyright the software, and
    1.71 +(2) offer you this license which gives you legal permission to copy,
    1.72 +distribute and/or modify the software.
    1.73 +
    1.74 +  Also, for each author's protection and ours, we want to make certain
    1.75 +that everyone understands that there is no warranty for this free
    1.76 +software.  If the software is modified by someone else and passed on, we
    1.77 +want its recipients to know that what they have is not the original, so
    1.78 +that any problems introduced by others will not reflect on the original
    1.79 +authors' reputations.
    1.80 +
    1.81 +  Finally, any free program is threatened constantly by software
    1.82 +patents.  We wish to avoid the danger that redistributors of a free
    1.83 +program will individually obtain patent licenses, in effect making the
    1.84 +program proprietary.  To prevent this, we have made it clear that any
    1.85 +patent must be licensed for everyone's free use or not licensed at all.
    1.86 +
    1.87 +  The precise terms and conditions for copying, distribution and
    1.88 +modification follow.
    1.89 +
    1.90 +		    GNU GENERAL PUBLIC LICENSE
    1.91 +   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    1.92 +
    1.93 +  0. This License applies to any program or other work which contains
    1.94 +a notice placed by the copyright holder saying it may be distributed
    1.95 +under the terms of this General Public License.  The "Program", below,
    1.96 +refers to any such program or work, and a "work based on the Program"
    1.97 +means either the Program or any derivative work under copyright law:
    1.98 +that is to say, a work containing the Program or a portion of it,
    1.99 +either verbatim or with modifications and/or translated into another
   1.100 +language.  (Hereinafter, translation is included without limitation in
   1.101 +the term "modification".)  Each licensee is addressed as "you".
   1.102 +
   1.103 +Activities other than copying, distribution and modification are not
   1.104 +covered by this License; they are outside its scope.  The act of
   1.105 +running the Program is not restricted, and the output from the Program
   1.106 +is covered only if its contents constitute a work based on the
   1.107 +Program (independent of having been made by running the Program).
   1.108 +Whether that is true depends on what the Program does.
   1.109 +
   1.110 +  1. You may copy and distribute verbatim copies of the Program's
   1.111 +source code as you receive it, in any medium, provided that you
   1.112 +conspicuously and appropriately publish on each copy an appropriate
   1.113 +copyright notice and disclaimer of warranty; keep intact all the
   1.114 +notices that refer to this License and to the absence of any warranty;
   1.115 +and give any other recipients of the Program a copy of this License
   1.116 +along with the Program.
   1.117 +
   1.118 +You may charge a fee for the physical act of transferring a copy, and
   1.119 +you may at your option offer warranty protection in exchange for a fee.
   1.120 +
   1.121 +  2. You may modify your copy or copies of the Program or any portion
   1.122 +of it, thus forming a work based on the Program, and copy and
   1.123 +distribute such modifications or work under the terms of Section 1
   1.124 +above, provided that you also meet all of these conditions:
   1.125 +
   1.126 +    a) You must cause the modified files to carry prominent notices
   1.127 +    stating that you changed the files and the date of any change.
   1.128 +
   1.129 +    b) You must cause any work that you distribute or publish, that in
   1.130 +    whole or in part contains or is derived from the Program or any
   1.131 +    part thereof, to be licensed as a whole at no charge to all third
   1.132 +    parties under the terms of this License.
   1.133 +
   1.134 +    c) If the modified program normally reads commands interactively
   1.135 +    when run, you must cause it, when started running for such
   1.136 +    interactive use in the most ordinary way, to print or display an
   1.137 +    announcement including an appropriate copyright notice and a
   1.138 +    notice that there is no warranty (or else, saying that you provide
   1.139 +    a warranty) and that users may redistribute the program under
   1.140 +    these conditions, and telling the user how to view a copy of this
   1.141 +    License.  (Exception: if the Program itself is interactive but
   1.142 +    does not normally print such an announcement, your work based on
   1.143 +    the Program is not required to print an announcement.)
   1.144 +
   1.145 +These requirements apply to the modified work as a whole.  If
   1.146 +identifiable sections of that work are not derived from the Program,
   1.147 +and can be reasonably considered independent and separate works in
   1.148 +themselves, then this License, and its terms, do not apply to those
   1.149 +sections when you distribute them as separate works.  But when you
   1.150 +distribute the same sections as part of a whole which is a work based
   1.151 +on the Program, the distribution of the whole must be on the terms of
   1.152 +this License, whose permissions for other licensees extend to the
   1.153 +entire whole, and thus to each and every part regardless of who wrote it.
   1.154 +
   1.155 +Thus, it is not the intent of this section to claim rights or contest
   1.156 +your rights to work written entirely by you; rather, the intent is to
   1.157 +exercise the right to control the distribution of derivative or
   1.158 +collective works based on the Program.
   1.159 +
   1.160 +In addition, mere aggregation of another work not based on the Program
   1.161 +with the Program (or with a work based on the Program) on a volume of
   1.162 +a storage or distribution medium does not bring the other work under
   1.163 +the scope of this License.
   1.164 +
   1.165 +  3. You may copy and distribute the Program (or a work based on it,
   1.166 +under Section 2) in object code or executable form under the terms of
   1.167 +Sections 1 and 2 above provided that you also do one of the following:
   1.168 +
   1.169 +    a) Accompany it with the complete corresponding machine-readable
   1.170 +    source code, which must be distributed under the terms of Sections
   1.171 +    1 and 2 above on a medium customarily used for software interchange; or,
   1.172 +
   1.173 +    b) Accompany it with a written offer, valid for at least three
   1.174 +    years, to give any third party, for a charge no more than your
   1.175 +    cost of physically performing source distribution, a complete
   1.176 +    machine-readable copy of the corresponding source code, to be
   1.177 +    distributed under the terms of Sections 1 and 2 above on a medium
   1.178 +    customarily used for software interchange; or,
   1.179 +
   1.180 +    c) Accompany it with the information you received as to the offer
   1.181 +    to distribute corresponding source code.  (This alternative is
   1.182 +    allowed only for noncommercial distribution and only if you
   1.183 +    received the program in object code or executable form with such
   1.184 +    an offer, in accord with Subsection b above.)
   1.185 +
   1.186 +The source code for a work means the preferred form of the work for
   1.187 +making modifications to it.  For an executable work, complete source
   1.188 +code means all the source code for all modules it contains, plus any
   1.189 +associated interface definition files, plus the scripts used to
   1.190 +control compilation and installation of the executable.  However, as a
   1.191 +special exception, the source code distributed need not include
   1.192 +anything that is normally distributed (in either source or binary
   1.193 +form) with the major components (compiler, kernel, and so on) of the
   1.194 +operating system on which the executable runs, unless that component
   1.195 +itself accompanies the executable.
   1.196 +
   1.197 +If distribution of executable or object code is made by offering
   1.198 +access to copy from a designated place, then offering equivalent
   1.199 +access to copy the source code from the same place counts as
   1.200 +distribution of the source code, even though third parties are not
   1.201 +compelled to copy the source along with the object code.
   1.202 +
   1.203 +  4. You may not copy, modify, sublicense, or distribute the Program
   1.204 +except as expressly provided under this License.  Any attempt
   1.205 +otherwise to copy, modify, sublicense or distribute the Program is
   1.206 +void, and will automatically terminate your rights under this License.
   1.207 +However, parties who have received copies, or rights, from you under
   1.208 +this License will not have their licenses terminated so long as such
   1.209 +parties remain in full compliance.
   1.210 +
   1.211 +  5. You are not required to accept this License, since you have not
   1.212 +signed it.  However, nothing else grants you permission to modify or
   1.213 +distribute the Program or its derivative works.  These actions are
   1.214 +prohibited by law if you do not accept this License.  Therefore, by
   1.215 +modifying or distributing the Program (or any work based on the
   1.216 +Program), you indicate your acceptance of this License to do so, and
   1.217 +all its terms and conditions for copying, distributing or modifying
   1.218 +the Program or works based on it.
   1.219 +
   1.220 +  6. Each time you redistribute the Program (or any work based on the
   1.221 +Program), the recipient automatically receives a license from the
   1.222 +original licensor to copy, distribute or modify the Program subject to
   1.223 +these terms and conditions.  You may not impose any further
   1.224 +restrictions on the recipients' exercise of the rights granted herein.
   1.225 +You are not responsible for enforcing compliance by third parties to
   1.226 +this License.
   1.227 +
   1.228 +  7. If, as a consequence of a court judgment or allegation of patent
   1.229 +infringement or for any other reason (not limited to patent issues),
   1.230 +conditions are imposed on you (whether by court order, agreement or
   1.231 +otherwise) that contradict the conditions of this License, they do not
   1.232 +excuse you from the conditions of this License.  If you cannot
   1.233 +distribute so as to satisfy simultaneously your obligations under this
   1.234 +License and any other pertinent obligations, then as a consequence you
   1.235 +may not distribute the Program at all.  For example, if a patent
   1.236 +license would not permit royalty-free redistribution of the Program by
   1.237 +all those who receive copies directly or indirectly through you, then
   1.238 +the only way you could satisfy both it and this License would be to
   1.239 +refrain entirely from distribution of the Program.
   1.240 +
   1.241 +If any portion of this section is held invalid or unenforceable under
   1.242 +any particular circumstance, the balance of the section is intended to
   1.243 +apply and the section as a whole is intended to apply in other
   1.244 +circumstances.
   1.245 +
   1.246 +It is not the purpose of this section to induce you to infringe any
   1.247 +patents or other property right claims or to contest validity of any
   1.248 +such claims; this section has the sole purpose of protecting the
   1.249 +integrity of the free software distribution system, which is
   1.250 +implemented by public license practices.  Many people have made
   1.251 +generous contributions to the wide range of software distributed
   1.252 +through that system in reliance on consistent application of that
   1.253 +system; it is up to the author/donor to decide if he or she is willing
   1.254 +to distribute software through any other system and a licensee cannot
   1.255 +impose that choice.
   1.256 +
   1.257 +This section is intended to make thoroughly clear what is believed to
   1.258 +be a consequence of the rest of this License.
   1.259 +
   1.260 +  8. If the distribution and/or use of the Program is restricted in
   1.261 +certain countries either by patents or by copyrighted interfaces, the
   1.262 +original copyright holder who places the Program under this License
   1.263 +may add an explicit geographical distribution limitation excluding
   1.264 +those countries, so that distribution is permitted only in or among
   1.265 +countries not thus excluded.  In such case, this License incorporates
   1.266 +the limitation as if written in the body of this License.
   1.267 +
   1.268 +  9. The Free Software Foundation may publish revised and/or new versions
   1.269 +of the General Public License from time to time.  Such new versions will
   1.270 +be similar in spirit to the present version, but may differ in detail to
   1.271 +address new problems or concerns.
   1.272 +
   1.273 +Each version is given a distinguishing version number.  If the Program
   1.274 +specifies a version number of this License which applies to it and "any
   1.275 +later version", you have the option of following the terms and conditions
   1.276 +either of that version or of any later version published by the Free
   1.277 +Software Foundation.  If the Program does not specify a version number of
   1.278 +this License, you may choose any version ever published by the Free Software
   1.279 +Foundation.
   1.280 +
   1.281 +  10. If you wish to incorporate parts of the Program into other free
   1.282 +programs whose distribution conditions are different, write to the author
   1.283 +to ask for permission.  For software which is copyrighted by the Free
   1.284 +Software Foundation, write to the Free Software Foundation; we sometimes
   1.285 +make exceptions for this.  Our decision will be guided by the two goals
   1.286 +of preserving the free status of all derivatives of our free software and
   1.287 +of promoting the sharing and reuse of software generally.
   1.288 +
   1.289 +			    NO WARRANTY
   1.290 +
   1.291 +  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
   1.292 +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
   1.293 +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
   1.294 +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
   1.295 +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   1.296 +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
   1.297 +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
   1.298 +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
   1.299 +REPAIR OR CORRECTION.
   1.300 +
   1.301 +  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
   1.302 +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
   1.303 +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
   1.304 +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
   1.305 +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
   1.306 +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
   1.307 +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
   1.308 +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
   1.309 +POSSIBILITY OF SUCH DAMAGES.
   1.310 +
   1.311 +		     END OF TERMS AND CONDITIONS
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/Makefile	Sun Jan 30 12:58:47 2005 +0000
     2.3 @@ -0,0 +1,737 @@
     2.4 +#############################################################################
     2.5 +# Makefile for building: vym
     2.6 +# Generated by qmake (1.07a) (Qt 3.3.1) on: Tue Jan  4 10:40:21 2005
     2.7 +# Project:  vym.pro
     2.8 +# Template: app
     2.9 +# Command: $(QMAKE) -o Makefile vym.pro
    2.10 +#############################################################################
    2.11 +
    2.12 +####### Compiler, tools and options
    2.13 +
    2.14 +CC       = gcc
    2.15 +CXX      = g++
    2.16 +LEX      = flex
    2.17 +YACC     = yacc
    2.18 +CFLAGS   = -pipe -O2 -fmessage-length=0 -Wall -fPIC -Wall -W -O2 -fmessage-length=0 -Wall -fPIC  -DQT_NO_DEBUG -DQT_SHARED -DQT_TABLET_SUPPORT -DQT_THREAD_SUPPORT
    2.19 +CXXFLAGS = -pipe -O2 -fmessage-length=0 -Wall -fPIC -Wall -W -O2 -fmessage-length=0 -Wall -fPIC  -DQT_NO_DEBUG -DQT_SHARED -DQT_TABLET_SUPPORT -DQT_THREAD_SUPPORT
    2.20 +LEXFLAGS = 
    2.21 +YACCFLAGS= -d
    2.22 +INCPATH  = -I/usr/lib/qt3/mkspecs/linux-g++ -I. -I/usr/include -I$(QTDIR)/include
    2.23 +LINK     = g++
    2.24 +LFLAGS   = 
    2.25 +LIBS     = $(SUBLIBS) -L/usr/lib64/ -L$(QTDIR)/lib64/ -L/usr/X11R6/lib64/ -lqt-mt -lXext -lX11 -lm
    2.26 +AR       = ar cqs
    2.27 +RANLIB   = 
    2.28 +MOC      = $(QTDIR)/bin/moc
    2.29 +UIC      = $(QTDIR)/bin/uic
    2.30 +QMAKE    = qmake
    2.31 +TAR      = tar -cf
    2.32 +GZIP     = gzip -9f
    2.33 +COPY     = cp -f
    2.34 +COPY_FILE= $(COPY)
    2.35 +COPY_DIR = $(COPY) -r
    2.36 +INSTALL_FILE= $(COPY_FILE)
    2.37 +INSTALL_DIR = $(COPY_DIR)
    2.38 +DEL_FILE = rm -f
    2.39 +SYMLINK  = ln -sf
    2.40 +DEL_DIR  = rmdir
    2.41 +MOVE     = mv -f
    2.42 +CHK_DIR_EXISTS= test -d
    2.43 +MKDIR    = mkdir -p
    2.44 +
    2.45 +####### Output directory
    2.46 +
    2.47 +OBJECTS_DIR = ./
    2.48 +
    2.49 +####### Files
    2.50 +
    2.51 +HEADERS = branchobj.h \
    2.52 +		exports.h \
    2.53 +		findwindow.h \
    2.54 +		flagobj.h \
    2.55 +		flagrowobj.h \
    2.56 +		floatimageobj.h \
    2.57 +		floatobj.h \
    2.58 +		frameobj.h \
    2.59 +		headingobj.h \
    2.60 +		imageobj.h \
    2.61 +		linkablemapobj.h \
    2.62 +		mainwindow.h \
    2.63 +		mapcenterobj.h \
    2.64 +		mapeditor.h \
    2.65 +		mapobj.h \
    2.66 +		misc.h \
    2.67 +		noteobj.h \
    2.68 +		ornamentedobj.h \
    2.69 +		process.h \
    2.70 +		selection.h \
    2.71 +		texteditor.h \
    2.72 +		version.h \
    2.73 +		xml.h \
    2.74 +		settings.h \
    2.75 +		options.h
    2.76 +SOURCES = branchobj.cpp \
    2.77 +		exports.cpp \
    2.78 +		findwindow.cpp \
    2.79 +		flagobj.cpp \
    2.80 +		flagrowobj.cpp \
    2.81 +		floatimageobj.cpp \
    2.82 +		floatobj.cpp \
    2.83 +		frameobj.cpp \
    2.84 +		headingobj.cpp \
    2.85 +		imageobj.cpp \
    2.86 +		linkablemapobj.cpp \
    2.87 +		main.cpp \
    2.88 +		mainwindow.cpp \
    2.89 +		mapcenterobj.cpp \
    2.90 +		mapeditor.cpp \
    2.91 +		mapobj.cpp \
    2.92 +		misc.cpp \
    2.93 +		noteobj.cpp \
    2.94 +		ornamentedobj.cpp \
    2.95 +		process.cpp \
    2.96 +		selection.cpp \
    2.97 +		texteditor.cpp \
    2.98 +		xml.cpp \
    2.99 +		settings.cpp \
   2.100 +		options.cpp
   2.101 +OBJECTS = branchobj.o \
   2.102 +		exports.o \
   2.103 +		findwindow.o \
   2.104 +		flagobj.o \
   2.105 +		flagrowobj.o \
   2.106 +		floatimageobj.o \
   2.107 +		floatobj.o \
   2.108 +		frameobj.o \
   2.109 +		headingobj.o \
   2.110 +		imageobj.o \
   2.111 +		linkablemapobj.o \
   2.112 +		main.o \
   2.113 +		mainwindow.o \
   2.114 +		mapcenterobj.o \
   2.115 +		mapeditor.o \
   2.116 +		mapobj.o \
   2.117 +		misc.o \
   2.118 +		noteobj.o \
   2.119 +		ornamentedobj.o \
   2.120 +		process.o \
   2.121 +		selection.o \
   2.122 +		texteditor.o \
   2.123 +		xml.o \
   2.124 +		settings.o \
   2.125 +		options.o \
   2.126 +		exporthtmldialog.o \
   2.127 +		exportxhtmldialog.o \
   2.128 +		showtextdialog.o \
   2.129 +		extrainfodialog.o
   2.130 +FORMS = exporthtmldialog.ui \
   2.131 +		exportxhtmldialog.ui \
   2.132 +		showtextdialog.ui \
   2.133 +		extrainfodialog.ui
   2.134 +UICDECLS = exporthtmldialog.h \
   2.135 +		exportxhtmldialog.h \
   2.136 +		showtextdialog.h \
   2.137 +		extrainfodialog.h
   2.138 +UICIMPLS = exporthtmldialog.cpp \
   2.139 +		exportxhtmldialog.cpp \
   2.140 +		showtextdialog.cpp \
   2.141 +		extrainfodialog.cpp
   2.142 +SRCMOC   = moc_findwindow.cpp \
   2.143 +		moc_linkablemapobj.cpp \
   2.144 +		moc_mainwindow.cpp \
   2.145 +		moc_mapeditor.cpp \
   2.146 +		moc_ornamentedobj.cpp \
   2.147 +		moc_process.cpp \
   2.148 +		moc_texteditor.cpp \
   2.149 +		moc_exporthtmldialog.cpp \
   2.150 +		moc_exportxhtmldialog.cpp \
   2.151 +		moc_showtextdialog.cpp \
   2.152 +		moc_extrainfodialog.cpp
   2.153 +OBJMOC = moc_findwindow.o \
   2.154 +		moc_linkablemapobj.o \
   2.155 +		moc_mainwindow.o \
   2.156 +		moc_mapeditor.o \
   2.157 +		moc_ornamentedobj.o \
   2.158 +		moc_process.o \
   2.159 +		moc_texteditor.o \
   2.160 +		moc_exporthtmldialog.o \
   2.161 +		moc_exportxhtmldialog.o \
   2.162 +		moc_showtextdialog.o \
   2.163 +		moc_extrainfodialog.o
   2.164 +DIST	   = vym.pro
   2.165 +QMAKE_TARGET = vym
   2.166 +DESTDIR  = 
   2.167 +TARGET   = vym
   2.168 +
   2.169 +first: all
   2.170 +####### Implicit rules
   2.171 +
   2.172 +.SUFFIXES: .c .o .cpp .cc .cxx .C
   2.173 +
   2.174 +.cpp.o:
   2.175 +	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
   2.176 +
   2.177 +.cc.o:
   2.178 +	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
   2.179 +
   2.180 +.cxx.o:
   2.181 +	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
   2.182 +
   2.183 +.C.o:
   2.184 +	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
   2.185 +
   2.186 +.c.o:
   2.187 +	$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
   2.188 +
   2.189 +####### Build rules
   2.190 +
   2.191 +all: Makefile $(TARGET)
   2.192 +
   2.193 +$(TARGET):  $(UICDECLS) $(OBJECTS) $(OBJMOC)  
   2.194 +	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(OBJCOMP) $(LIBS)
   2.195 +
   2.196 +mocables: $(SRCMOC)
   2.197 +uicables: $(UICDECLS) $(UICIMPLS)
   2.198 +
   2.199 +$(MOC): 
   2.200 +	( cd $(QTDIR)/src/moc && $(MAKE) )
   2.201 +
   2.202 +Makefile: vym.pro  /usr/lib/qt3/mkspecs/linux-g++/qmake.conf /usr/lib/qt3/lib64/libqt-mt.prl
   2.203 +	$(QMAKE) -o Makefile vym.pro
   2.204 +qmake: 
   2.205 +	@$(QMAKE) -o Makefile vym.pro
   2.206 +
   2.207 +dist: 
   2.208 +	@mkdir -p .tmp/vym && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/vym/ && $(COPY_FILE) --parents vym_de.ts .tmp/vym/ && $(COPY_FILE) --parents exporthtmldialog.ui.h exportxhtmldialog.ui.h showtextdialog.ui.h extrainfodialog.ui.h .tmp/vym/ && ( cd `dirname .tmp/vym` && $(TAR) vym.tar vym && $(GZIP) vym.tar ) && $(MOVE) `dirname .tmp/vym`/vym.tar.gz . && $(DEL_FILE) -r .tmp/vym
   2.209 +
   2.210 +mocclean:
   2.211 +	-$(DEL_FILE) $(OBJMOC)
   2.212 +	-$(DEL_FILE) $(SRCMOC)
   2.213 +
   2.214 +uiclean:
   2.215 +	-$(DEL_FILE) $(UICIMPLS) $(UICDECLS)
   2.216 +
   2.217 +yaccclean:
   2.218 +lexclean:
   2.219 +clean: mocclean uiclean
   2.220 +	-$(DEL_FILE) $(OBJECTS)
   2.221 +	-$(DEL_FILE) *~ core *.core
   2.222 +
   2.223 +
   2.224 +####### Sub-libraries
   2.225 +
   2.226 +distclean: clean
   2.227 +	-$(DEL_FILE) $(TARGET) $(TARGET)
   2.228 +
   2.229 +
   2.230 +FORCE:
   2.231 +
   2.232 +####### Compile
   2.233 +
   2.234 +branchobj.o: branchobj.cpp branchobj.h \
   2.235 +		texteditor.h \
   2.236 +		mapeditor.h \
   2.237 +		mainwindow.h \
   2.238 +		floatimageobj.h \
   2.239 +		linkablemapobj.h \
   2.240 +		ornamentedobj.h \
   2.241 +		floatobj.h \
   2.242 +		frameobj.h \
   2.243 +		noteobj.h \
   2.244 +		headingobj.h \
   2.245 +		flagrowobj.h \
   2.246 +		mapobj.h \
   2.247 +		misc.h \
   2.248 +		flagobj.h \
   2.249 +		imageobj.h \
   2.250 +		mapcenterobj.h \
   2.251 +		version.h \
   2.252 +		xml.h \
   2.253 +		findwindow.h
   2.254 +
   2.255 +exports.o: exports.cpp exports.h \
   2.256 +		linkablemapobj.h \
   2.257 +		mapcenterobj.h \
   2.258 +		branchobj.h \
   2.259 +		version.h \
   2.260 +		floatimageobj.h \
   2.261 +		ornamentedobj.h \
   2.262 +		floatobj.h \
   2.263 +		frameobj.h \
   2.264 +		noteobj.h \
   2.265 +		headingobj.h \
   2.266 +		flagrowobj.h \
   2.267 +		mapobj.h \
   2.268 +		misc.h \
   2.269 +		flagobj.h \
   2.270 +		imageobj.h
   2.271 +
   2.272 +findwindow.o: findwindow.cpp findwindow.h
   2.273 +
   2.274 +flagobj.o: flagobj.cpp flagobj.h \
   2.275 +		mapobj.h \
   2.276 +		imageobj.h \
   2.277 +		misc.h
   2.278 +
   2.279 +flagrowobj.o: flagrowobj.cpp flagrowobj.h \
   2.280 +		mapobj.h \
   2.281 +		flagobj.h \
   2.282 +		misc.h \
   2.283 +		imageobj.h
   2.284 +
   2.285 +floatimageobj.o: floatimageobj.cpp floatimageobj.h \
   2.286 +		branchobj.h \
   2.287 +		floatobj.h \
   2.288 +		linkablemapobj.h \
   2.289 +		frameobj.h \
   2.290 +		noteobj.h \
   2.291 +		headingobj.h \
   2.292 +		flagrowobj.h \
   2.293 +		mapobj.h \
   2.294 +		misc.h \
   2.295 +		flagobj.h \
   2.296 +		imageobj.h \
   2.297 +		ornamentedobj.h
   2.298 +
   2.299 +floatobj.o: floatobj.cpp floatobj.h \
   2.300 +		linkablemapobj.h \
   2.301 +		frameobj.h \
   2.302 +		noteobj.h \
   2.303 +		headingobj.h \
   2.304 +		flagrowobj.h \
   2.305 +		mapobj.h \
   2.306 +		misc.h \
   2.307 +		flagobj.h \
   2.308 +		imageobj.h
   2.309 +
   2.310 +frameobj.o: frameobj.cpp frameobj.h \
   2.311 +		mapobj.h \
   2.312 +		misc.h
   2.313 +
   2.314 +headingobj.o: headingobj.cpp headingobj.h \
   2.315 +		mapobj.h \
   2.316 +		misc.h
   2.317 +
   2.318 +imageobj.o: imageobj.cpp imageobj.h \
   2.319 +		mapobj.h \
   2.320 +		misc.h
   2.321 +
   2.322 +linkablemapobj.o: linkablemapobj.cpp linkablemapobj.h \
   2.323 +		branchobj.h \
   2.324 +		mapeditor.h \
   2.325 +		version.h \
   2.326 +		frameobj.h \
   2.327 +		noteobj.h \
   2.328 +		headingobj.h \
   2.329 +		flagrowobj.h \
   2.330 +		mapobj.h \
   2.331 +		misc.h \
   2.332 +		flagobj.h \
   2.333 +		imageobj.h \
   2.334 +		floatimageobj.h \
   2.335 +		ornamentedobj.h \
   2.336 +		floatobj.h \
   2.337 +		mapcenterobj.h
   2.338 +
   2.339 +main.o: main.cpp settings.h \
   2.340 +		options.h \
   2.341 +		mainwindow.h \
   2.342 +		icons/vym-48x48.xpm \
   2.343 +		icons/vym-editor.xpm \
   2.344 +		flagrowobj.h \
   2.345 +		misc.h \
   2.346 +		xml.h \
   2.347 +		texteditor.h \
   2.348 +		mapeditor.h \
   2.349 +		findwindow.h \
   2.350 +		mapcenterobj.h \
   2.351 +		branchobj.h \
   2.352 +		version.h \
   2.353 +		floatimageobj.h \
   2.354 +		linkablemapobj.h \
   2.355 +		ornamentedobj.h \
   2.356 +		floatobj.h \
   2.357 +		frameobj.h \
   2.358 +		noteobj.h \
   2.359 +		headingobj.h \
   2.360 +		mapobj.h \
   2.361 +		flagobj.h \
   2.362 +		imageobj.h
   2.363 +
   2.364 +mainwindow.o: mainwindow.cpp mainwindow.h \
   2.365 +		version.h \
   2.366 +		icons/filenew.xpm \
   2.367 +		icons/fileopen.xpm \
   2.368 +		icons/filesave.xpm \
   2.369 +		icons/fileprint.xpm \
   2.370 +		icons/editundo.xpm \
   2.371 +		icons/editcopy.xpm \
   2.372 +		icons/editcut.xpm \
   2.373 +		icons/editpaste.xpm \
   2.374 +		icons/editmoveup.xpm \
   2.375 +		icons/editmovedown.xpm \
   2.376 +		icons/formatcoloritem.xpm \
   2.377 +		icons/formatcolorbranch.xpm \
   2.378 +		icons/formatcolorpicker.xpm \
   2.379 +		icons/viewzoomreset.xpm \
   2.380 +		icons/viewzoomin.xpm \
   2.381 +		icons/viewzoomout.xpm \
   2.382 +		icons/vym-48x48.xpm \
   2.383 +		icons/flag-note.xpm \
   2.384 +		icons/flag-url.xpm \
   2.385 +		icons/flag-vymlink.xpm \
   2.386 +		icons/flag-scrolled-right.xpm \
   2.387 +		flagrowobj.h \
   2.388 +		texteditor.h \
   2.389 +		mapeditor.h \
   2.390 +		exporthtmldialog.h \
   2.391 +		exportxhtmldialog.h \
   2.392 +		showtextdialog.h \
   2.393 +		process.h \
   2.394 +		settings.h \
   2.395 +		options.h \
   2.396 +		xml.h \
   2.397 +		findwindow.h \
   2.398 +		mapcenterobj.h \
   2.399 +		branchobj.h \
   2.400 +		floatimageobj.h \
   2.401 +		linkablemapobj.h \
   2.402 +		ornamentedobj.h \
   2.403 +		floatobj.h \
   2.404 +		frameobj.h \
   2.405 +		noteobj.h \
   2.406 +		headingobj.h \
   2.407 +		mapobj.h \
   2.408 +		misc.h \
   2.409 +		flagobj.h \
   2.410 +		imageobj.h
   2.411 +
   2.412 +mapcenterobj.o: mapcenterobj.cpp mapcenterobj.h \
   2.413 +		floatimageobj.h \
   2.414 +		mapeditor.h \
   2.415 +		branchobj.h \
   2.416 +		version.h \
   2.417 +		linkablemapobj.h \
   2.418 +		ornamentedobj.h \
   2.419 +		floatobj.h \
   2.420 +		frameobj.h \
   2.421 +		noteobj.h \
   2.422 +		headingobj.h \
   2.423 +		flagrowobj.h \
   2.424 +		mapobj.h \
   2.425 +		misc.h \
   2.426 +		flagobj.h \
   2.427 +		imageobj.h
   2.428 +
   2.429 +mapeditor.o: mapeditor.cpp mapeditor.h \
   2.430 +		version.h \
   2.431 +		xml.h \
   2.432 +		texteditor.h \
   2.433 +		linkablemapobj.h \
   2.434 +		exports.h \
   2.435 +		misc.h \
   2.436 +		mainwindow.h \
   2.437 +		extrainfodialog.h \
   2.438 +		settings.h \
   2.439 +		icons/flag-note.xpm \
   2.440 +		icons/flag-url.xpm \
   2.441 +		icons/flag-vymlink.xpm \
   2.442 +		icons/flag-scrolled-right.xpm \
   2.443 +		icons/flag-tmpUnscrolled-right.xpm \
   2.444 +		icons/flag-questionmark.xpm \
   2.445 +		icons/flag-exclamationmark.xpm \
   2.446 +		icons/flag-hook-green.xpm \
   2.447 +		icons/flag-cross-red.xpm \
   2.448 +		icons/flag-stopsign.xpm \
   2.449 +		icons/flag-smiley-good.xpm \
   2.450 +		icons/flag-smiley-sad.xpm \
   2.451 +		icons/flag-clock.xpm \
   2.452 +		icons/flag-lamp.xpm \
   2.453 +		icons/flag-arrow-up.xpm \
   2.454 +		icons/flag-arrow-down.xpm \
   2.455 +		icons/flag-thumb-up.xpm \
   2.456 +		icons/flag-thumb-down.xpm \
   2.457 +		icons/flag-heart.xpm \
   2.458 +		icons/flag-flash.xpm \
   2.459 +		icons/flag-lifebelt.xpm \
   2.460 +		mapcenterobj.h \
   2.461 +		branchobj.h \
   2.462 +		floatimageobj.h \
   2.463 +		ornamentedobj.h \
   2.464 +		floatobj.h \
   2.465 +		frameobj.h \
   2.466 +		noteobj.h \
   2.467 +		headingobj.h \
   2.468 +		flagrowobj.h \
   2.469 +		mapobj.h \
   2.470 +		flagobj.h \
   2.471 +		imageobj.h \
   2.472 +		findwindow.h
   2.473 +
   2.474 +mapobj.o: mapobj.cpp mapobj.h \
   2.475 +		misc.h
   2.476 +
   2.477 +misc.o: misc.cpp misc.h
   2.478 +
   2.479 +noteobj.o: noteobj.cpp noteobj.h \
   2.480 +		misc.h
   2.481 +
   2.482 +ornamentedobj.o: ornamentedobj.cpp ornamentedobj.h \
   2.483 +		texteditor.h \
   2.484 +		mapeditor.h \
   2.485 +		linkablemapobj.h \
   2.486 +		frameobj.h \
   2.487 +		noteobj.h \
   2.488 +		headingobj.h \
   2.489 +		flagrowobj.h \
   2.490 +		mapobj.h \
   2.491 +		misc.h \
   2.492 +		flagobj.h \
   2.493 +		imageobj.h \
   2.494 +		mapcenterobj.h \
   2.495 +		branchobj.h \
   2.496 +		version.h \
   2.497 +		floatimageobj.h \
   2.498 +		floatobj.h
   2.499 +
   2.500 +process.o: process.cpp process.h
   2.501 +
   2.502 +selection.o: selection.cpp selection.h \
   2.503 +		linkablemapobj.h \
   2.504 +		frameobj.h \
   2.505 +		noteobj.h \
   2.506 +		headingobj.h \
   2.507 +		flagrowobj.h \
   2.508 +		mapobj.h \
   2.509 +		misc.h \
   2.510 +		flagobj.h \
   2.511 +		imageobj.h
   2.512 +
   2.513 +texteditor.o: texteditor.cpp texteditor.h \
   2.514 +		icons/fileopen.xpm \
   2.515 +		icons/filesave.xpm \
   2.516 +		icons/fileprint.xpm \
   2.517 +		icons/editundo.xpm \
   2.518 +		icons/editredo.xpm \
   2.519 +		icons/editcopy.xpm \
   2.520 +		icons/editcut.xpm \
   2.521 +		icons/editpaste.xpm \
   2.522 +		icons/edittrash.xpm \
   2.523 +		icons/formatfixedfont.xpm \
   2.524 +		icons/formattextbold.xpm \
   2.525 +		icons/formattextitalic.xpm \
   2.526 +		icons/formattextunder.xpm \
   2.527 +		icons/formattextleft.xpm \
   2.528 +		icons/formattextcenter.xpm \
   2.529 +		icons/formattextright.xpm \
   2.530 +		icons/formattextjustify.xpm
   2.531 +
   2.532 +xml.o: xml.cpp xml.h \
   2.533 +		misc.h \
   2.534 +		settings.h \
   2.535 +		version.h \
   2.536 +		mapcenterobj.h \
   2.537 +		mapeditor.h \
   2.538 +		branchobj.h \
   2.539 +		floatimageobj.h \
   2.540 +		linkablemapobj.h \
   2.541 +		ornamentedobj.h \
   2.542 +		floatobj.h \
   2.543 +		frameobj.h \
   2.544 +		noteobj.h \
   2.545 +		headingobj.h \
   2.546 +		flagrowobj.h \
   2.547 +		mapobj.h \
   2.548 +		flagobj.h \
   2.549 +		imageobj.h
   2.550 +
   2.551 +settings.o: settings.cpp settings.h \
   2.552 +		misc.h
   2.553 +
   2.554 +options.o: options.cpp options.h
   2.555 +
   2.556 +exporthtmldialog.h: exporthtmldialog.ui showtextdialog.h
   2.557 +	$(UIC) exporthtmldialog.ui -o exporthtmldialog.h
   2.558 +
   2.559 +exporthtmldialog.cpp: exporthtmldialog.h exporthtmldialog.ui showtextdialog.h
   2.560 +	$(UIC) exporthtmldialog.ui -i exporthtmldialog.h -o exporthtmldialog.cpp
   2.561 +
   2.562 +exportxhtmldialog.h: exportxhtmldialog.ui process.h \
   2.563 +		showtextdialog.h
   2.564 +	$(UIC) exportxhtmldialog.ui -o exportxhtmldialog.h
   2.565 +
   2.566 +exportxhtmldialog.cpp: exportxhtmldialog.h exportxhtmldialog.ui process.h \
   2.567 +		showtextdialog.h
   2.568 +	$(UIC) exportxhtmldialog.ui -i exportxhtmldialog.h -o exportxhtmldialog.cpp
   2.569 +
   2.570 +showtextdialog.h: showtextdialog.ui 
   2.571 +	$(UIC) showtextdialog.ui -o showtextdialog.h
   2.572 +
   2.573 +showtextdialog.cpp: showtextdialog.h showtextdialog.ui 
   2.574 +	$(UIC) showtextdialog.ui -i showtextdialog.h -o showtextdialog.cpp
   2.575 +
   2.576 +extrainfodialog.h: extrainfodialog.ui 
   2.577 +	$(UIC) extrainfodialog.ui -o extrainfodialog.h
   2.578 +
   2.579 +extrainfodialog.cpp: extrainfodialog.h extrainfodialog.ui 
   2.580 +	$(UIC) extrainfodialog.ui -i extrainfodialog.h -o extrainfodialog.cpp
   2.581 +
   2.582 +exporthtmldialog.o: exporthtmldialog.cpp settings.h \
   2.583 +		misc.h \
   2.584 +		icons/flag-url.xpm \
   2.585 +		exporthtmldialog.ui.h \
   2.586 +		exporthtmldialog.h
   2.587 +
   2.588 +exportxhtmldialog.o: exportxhtmldialog.cpp settings.h \
   2.589 +		icons/flag-url.xpm \
   2.590 +		exportxhtmldialog.ui.h \
   2.591 +		exportxhtmldialog.h
   2.592 +
   2.593 +showtextdialog.o: showtextdialog.cpp showtextdialog.ui.h \
   2.594 +		showtextdialog.h
   2.595 +
   2.596 +extrainfodialog.o: extrainfodialog.cpp extrainfodialog.ui.h \
   2.597 +		extrainfodialog.h
   2.598 +
   2.599 +moc_findwindow.o: moc_findwindow.cpp  findwindow.h 
   2.600 +
   2.601 +moc_linkablemapobj.o: moc_linkablemapobj.cpp  linkablemapobj.h frameobj.h \
   2.602 +		noteobj.h \
   2.603 +		headingobj.h \
   2.604 +		flagrowobj.h \
   2.605 +		mapobj.h \
   2.606 +		misc.h \
   2.607 +		flagobj.h \
   2.608 +		imageobj.h
   2.609 +
   2.610 +moc_mainwindow.o: moc_mainwindow.cpp  mainwindow.h xml.h \
   2.611 +		texteditor.h \
   2.612 +		mapeditor.h \
   2.613 +		findwindow.h \
   2.614 +		mapcenterobj.h \
   2.615 +		branchobj.h \
   2.616 +		version.h \
   2.617 +		floatimageobj.h \
   2.618 +		linkablemapobj.h \
   2.619 +		ornamentedobj.h \
   2.620 +		floatobj.h \
   2.621 +		frameobj.h \
   2.622 +		noteobj.h \
   2.623 +		headingobj.h \
   2.624 +		flagrowobj.h \
   2.625 +		mapobj.h \
   2.626 +		misc.h \
   2.627 +		flagobj.h \
   2.628 +		imageobj.h
   2.629 +
   2.630 +moc_mapeditor.o: moc_mapeditor.cpp  mapeditor.h mapcenterobj.h \
   2.631 +		misc.h \
   2.632 +		branchobj.h \
   2.633 +		version.h \
   2.634 +		floatimageobj.h \
   2.635 +		linkablemapobj.h \
   2.636 +		ornamentedobj.h \
   2.637 +		floatobj.h \
   2.638 +		frameobj.h \
   2.639 +		noteobj.h \
   2.640 +		headingobj.h \
   2.641 +		flagrowobj.h \
   2.642 +		mapobj.h \
   2.643 +		flagobj.h \
   2.644 +		imageobj.h
   2.645 +
   2.646 +moc_ornamentedobj.o: moc_ornamentedobj.cpp  ornamentedobj.h linkablemapobj.h \
   2.647 +		frameobj.h \
   2.648 +		noteobj.h \
   2.649 +		headingobj.h \
   2.650 +		flagrowobj.h \
   2.651 +		mapobj.h \
   2.652 +		misc.h \
   2.653 +		flagobj.h \
   2.654 +		imageobj.h
   2.655 +
   2.656 +moc_process.o: moc_process.cpp  process.h 
   2.657 +
   2.658 +moc_texteditor.o: moc_texteditor.cpp  texteditor.h 
   2.659 +
   2.660 +moc_exporthtmldialog.o: moc_exporthtmldialog.cpp  exporthtmldialog.h showtextdialog.h
   2.661 +
   2.662 +moc_exportxhtmldialog.o: moc_exportxhtmldialog.cpp  exportxhtmldialog.h process.h \
   2.663 +		showtextdialog.h
   2.664 +
   2.665 +moc_showtextdialog.o: moc_showtextdialog.cpp  showtextdialog.h 
   2.666 +
   2.667 +moc_extrainfodialog.o: moc_extrainfodialog.cpp  extrainfodialog.h 
   2.668 +
   2.669 +moc_findwindow.cpp: $(MOC) findwindow.h
   2.670 +	$(MOC) findwindow.h -o moc_findwindow.cpp
   2.671 +
   2.672 +moc_linkablemapobj.cpp: $(MOC) linkablemapobj.h
   2.673 +	$(MOC) linkablemapobj.h -o moc_linkablemapobj.cpp
   2.674 +
   2.675 +moc_mainwindow.cpp: $(MOC) mainwindow.h
   2.676 +	$(MOC) mainwindow.h -o moc_mainwindow.cpp
   2.677 +
   2.678 +moc_mapeditor.cpp: $(MOC) mapeditor.h
   2.679 +	$(MOC) mapeditor.h -o moc_mapeditor.cpp
   2.680 +
   2.681 +moc_ornamentedobj.cpp: $(MOC) ornamentedobj.h
   2.682 +	$(MOC) ornamentedobj.h -o moc_ornamentedobj.cpp
   2.683 +
   2.684 +moc_process.cpp: $(MOC) process.h
   2.685 +	$(MOC) process.h -o moc_process.cpp
   2.686 +
   2.687 +moc_texteditor.cpp: $(MOC) texteditor.h
   2.688 +	$(MOC) texteditor.h -o moc_texteditor.cpp
   2.689 +
   2.690 +moc_exporthtmldialog.cpp: $(MOC) exporthtmldialog.h
   2.691 +	$(MOC) exporthtmldialog.h -o moc_exporthtmldialog.cpp
   2.692 +
   2.693 +moc_exportxhtmldialog.cpp: $(MOC) exportxhtmldialog.h
   2.694 +	$(MOC) exportxhtmldialog.h -o moc_exportxhtmldialog.cpp
   2.695 +
   2.696 +moc_showtextdialog.cpp: $(MOC) showtextdialog.h
   2.697 +	$(MOC) showtextdialog.h -o moc_showtextdialog.cpp
   2.698 +
   2.699 +moc_extrainfodialog.cpp: $(MOC) extrainfodialog.h
   2.700 +	$(MOC) extrainfodialog.h -o moc_extrainfodialog.cpp
   2.701 +
   2.702 +####### Install
   2.703 +
   2.704 +install_target: all 
   2.705 +	@$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/bin/" || $(MKDIR) "$(INSTALL_ROOT)/usr/bin/"
   2.706 +	-$(INSTALL_FILE) "$(QMAKE_TARGET)" "$(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET)"
   2.707 +
   2.708 +uninstall_target: 
   2.709 +	-$(DEL_FILE) "$(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET)"
   2.710 +	-$(DEL_DIR) "$(INSTALL_ROOT)/usr/bin/"
   2.711 +
   2.712 +
   2.713 +install_support: all 
   2.714 +	@$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/share/vym/" || $(MKDIR) "$(INSTALL_ROOT)/usr/share/vym/"
   2.715 +	-$(INSTALL_DIR) "styles" "$(INSTALL_ROOT)/usr/share/vym/"
   2.716 +	-$(INSTALL_DIR) "scripts" "$(INSTALL_ROOT)/usr/share/vym/"
   2.717 +	-$(INSTALL_DIR) "icons" "$(INSTALL_ROOT)/usr/share/vym/"
   2.718 +
   2.719 +
   2.720 +uninstall_support: 
   2.721 +	-$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/styles"
   2.722 +	-$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/scripts"
   2.723 +	-$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/icons"
   2.724 +	-$(DEL_DIR) "$(INSTALL_ROOT)/usr/share/vym/"
   2.725 +
   2.726 +
   2.727 +install_demo: all 
   2.728 +	@$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/share/vym/" || $(MKDIR) "$(INSTALL_ROOT)/usr/share/vym/"
   2.729 +	-$(INSTALL_DIR) "demos" "$(INSTALL_ROOT)/usr/share/vym/"
   2.730 +
   2.731 +
   2.732 +uninstall_demo: 
   2.733 +	-$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/demos"
   2.734 +	-$(DEL_DIR) "$(INSTALL_ROOT)/usr/share/vym/"
   2.735 +
   2.736 +
   2.737 +install: install_target install_support install_demo  
   2.738 +
   2.739 +uninstall: uninstall_target uninstall_support uninstall_demo  
   2.740 +
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/branchobj.cpp	Sun Jan 30 12:58:47 2005 +0000
     3.3 @@ -0,0 +1,1184 @@
     3.4 +#include "branchobj.h"
     3.5 +#include "texteditor.h"
     3.6 +#include "mapeditor.h"
     3.7 +#include "mainwindow.h"
     3.8 +
     3.9 +extern TextEditor *textEditor;
    3.10 +extern Main *mainWindow;
    3.11 +extern FlagRowObj *standardFlagsDefault;
    3.12 +extern QAction *actionEditOpenURL;
    3.13 +
    3.14 +
    3.15 +/////////////////////////////////////////////////////////////////
    3.16 +// BranchObj
    3.17 +/////////////////////////////////////////////////////////////////
    3.18 +
    3.19 +BranchObj* BranchObj::itLast=NULL;
    3.20 +
    3.21 +
    3.22 +BranchObj::BranchObj () :OrnamentedObj()
    3.23 +{
    3.24 +//    cout << "Const BranchObj ()\n";
    3.25 +    setParObj (this);	
    3.26 +    init();
    3.27 +    depth=-1;
    3.28 +}
    3.29 +
    3.30 +BranchObj::BranchObj (QCanvas* c):OrnamentedObj (c)
    3.31 +{
    3.32 +//    cout << "Const BranchObj (c)  called from MapCenterObj (c)\n";
    3.33 +    canvas=c;
    3.34 +}
    3.35 +
    3.36 +BranchObj::BranchObj (QCanvas* c, LinkableMapObj* p):OrnamentedObj (c)
    3.37 +{
    3.38 +//    cout << "Const BranchObj (c,p)\n";
    3.39 +    canvas=c;
    3.40 +    setParObj (p);	
    3.41 +    depth=p->getDepth()+1;
    3.42 +	if (depth==1)
    3.43 +		// Calc angle to mapCenter if I am a mainbranch
    3.44 +		// needed for reordering the mainbranches clockwise 
    3.45 +		// around mapcenter 
    3.46 +		angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ), 
    3.47 +								(int)(y() - parObj->getChildPos().y() ) ) );
    3.48 +    init();
    3.49 +}
    3.50 +
    3.51 +BranchObj::~BranchObj ()
    3.52 +{
    3.53 +    //cout << "Destr BranchObj\n";
    3.54 +	// Check, if this branch was the last child to be deleted
    3.55 +	// If so, unset the scrolled flags
    3.56 +
    3.57 +	BranchObj *po=(BranchObj*)(parObj);
    3.58 +	if (po)
    3.59 +	{
    3.60 +		BranchObj *bo=((BranchObj*)(parObj))->getLastBranch();
    3.61 +		if (!bo) po->unScroll();
    3.62 +	}
    3.63 +}
    3.64 +
    3.65 +bool BranchObj::operator< ( const BranchObj & other )
    3.66 +{
    3.67 +    return  angle < other.angle;
    3.68 +}
    3.69 +
    3.70 +bool BranchObj::operator== ( const BranchObj & other )
    3.71 +{
    3.72 +    return angle == other.angle;
    3.73 +}
    3.74 +
    3.75 +int BranchObjPtrList::compareItems ( QPtrCollection::Item i, QPtrCollection::Item j)
    3.76 +{
    3.77 +	// Make sure PtrList::find works
    3.78 +	if (i==j) return 0;
    3.79 +
    3.80 +	if ( ((BranchObj*)(i))->angle > ((BranchObj*)(j))->angle )
    3.81 +		return 1;
    3.82 +	else
    3.83 +		return -1;
    3.84 +}
    3.85 +
    3.86 +void BranchObj::init () 
    3.87 +{
    3.88 +    branch.setAutoDelete (true);
    3.89 +    floatimage.setAutoDelete (true);
    3.90 +
    3.91 +	absPos=getRandPos();
    3.92 +	absPos+=parObj->getChildPos();
    3.93 +
    3.94 +    // TODO This should be done in TextObj later
    3.95 +    QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0");
    3.96 +//    font.setPointSize(12);
    3.97 +   heading->setFont(font );
    3.98 +//    heading->setText(QObject::tr("new branch"));
    3.99 +
   3.100 +    lastSelectedBranch=-1;
   3.101 +
   3.102 +    setChildObj(this);
   3.103 +
   3.104 +	scrolled=false;
   3.105 +	tmpUnscrolled=false;
   3.106 +
   3.107 +	url="";
   3.108 +	vymLink="";
   3.109 +}
   3.110 +
   3.111 +void BranchObj::copy (BranchObj* other)
   3.112 +{
   3.113 +    OrnamentedObj::copy(other);
   3.114 +
   3.115 +	branch.clear();
   3.116 +    BranchObj* b;
   3.117 +    for (b=other->branch.first(); b;b=other->branch.next() ) 
   3.118 +		// Make deep copy of b
   3.119 +		// Because addBranch again calls copy for the childs,
   3.120 +		// Those will get a deep copy, too
   3.121 +		addBranch(b);	
   3.122 +
   3.123 +	FloatImageObj *fi;
   3.124 +	for (fi=other->floatimage.first(); fi;fi=other->floatimage.next() )
   3.125 +		addFloatImage (fi);
   3.126 +
   3.127 +	scrolled=other->scrolled;
   3.128 +	tmpUnscrolled=other->tmpUnscrolled;
   3.129 +	setVisibility (other->visible);
   3.130 +
   3.131 +	url=other->url;
   3.132 +	vymLink=other->vymLink;
   3.133 +
   3.134 +	angle=other->angle;
   3.135 +
   3.136 +    positionBBox();
   3.137 +}
   3.138 +
   3.139 +void BranchObj::clear() 
   3.140 +{
   3.141 +	branch.clear();
   3.142 +	floatimage.clear();
   3.143 +}
   3.144 +
   3.145 +int BranchObj::getNum()
   3.146 +{
   3.147 +	if (parObj)
   3.148 +		return ((BranchObj*)(parObj))->getNum ((BranchObj*)(this));
   3.149 +	else
   3.150 +		return 0;
   3.151 +}
   3.152 +
   3.153 +int BranchObj::getNum(BranchObj *bo)
   3.154 +{
   3.155 +	return branch.findRef (bo);
   3.156 +}
   3.157 +
   3.158 +int BranchObj::getFloatImageNum(FloatImageObj *fio)
   3.159 +{
   3.160 +	return floatimage.findRef (fio);
   3.161 +}
   3.162 +
   3.163 +int BranchObj::countBranches()
   3.164 +{
   3.165 +	return branch.count();
   3.166 +}
   3.167 +
   3.168 +int BranchObj::countFloatImages()
   3.169 +{
   3.170 +	return floatimage.count();
   3.171 +}
   3.172 +
   3.173 +void BranchObj::setParObjTmp(LinkableMapObj* lmo, QPoint m, int off)
   3.174 +{
   3.175 +	// Temporary link to lmo
   3.176 +	// m is position of mouse pointer 
   3.177 +	// offset 0: default 1: below lmo   -1 above lmo  (if possible)
   3.178 +
   3.179 +
   3.180 +	BranchObj* o=(BranchObj*)(lmo);
   3.181 +	if (!parObjTmpBuf) 
   3.182 +		parObjTmpBuf=parObj;
   3.183 +
   3.184 +	// ignore mapcenter and mainbranch
   3.185 +	if (lmo->getDepth()<2) off=0;
   3.186 +	if (off==0)
   3.187 +	{
   3.188 +		link2ParPos=false;
   3.189 +		parObj=o;
   3.190 +	}	
   3.191 +	else
   3.192 +	{	
   3.193 +		link2ParPos=true;
   3.194 +		if (off>0)
   3.195 +			parObj=o->getParObj();
   3.196 +		else	
   3.197 +			parObj=o->getParObj();
   3.198 +		parObj=o;
   3.199 +	}		
   3.200 +
   3.201 +	depth=parObj->getDepth()+1;
   3.202 +
   3.203 +	// setLinkStyle calls updateLink, only set it once
   3.204 +	if (style!=getDefLinkStyle() ) setLinkStyle (getDefLinkStyle());
   3.205 +
   3.206 +	// Move temporary to new position at destination
   3.207 +	// Usually the positioning would be done by reposition(),
   3.208 +	// but then also the destination branch would "Jump" around...
   3.209 +	// Better just do it approximately
   3.210 +	if (depth==1)
   3.211 +	{	// new parent is the mapcenter itself
   3.212 +
   3.213 +		QPoint p= normalise ( QPoint (m.x() - o->getChildPos().x(),
   3.214 +									  m.y() - o->getChildPos().y() ));
   3.215 +		if (p.x()<0) p.setX( p.x()-bbox.width() );
   3.216 +		move2RelPos (p);
   3.217 +	} else
   3.218 +	{	
   3.219 +		int y;
   3.220 +		if (off==0)
   3.221 +		{
   3.222 +			// new parent is just a branch, link to it
   3.223 +			QRect t=o->getBBoxSizeWithChilds();
   3.224 +			if (o->getLastBranch())
   3.225 +				y=t.y() + t.height() ;
   3.226 +			else
   3.227 +				y=t.y();
   3.228 +
   3.229 +		} else
   3.230 +		{
   3.231 +			if (off<0)
   3.232 +				// we want to link above lmo
   3.233 +				y=o->y() - height() + 5;
   3.234 +			else	
   3.235 +				// we want to link below lmo
   3.236 +				// Bottom of sel should be 5 pixels above
   3.237 +				// the bottom of the branch _below_ the target:
   3.238 +				// Don't try to find that branch, guess 12 pixels
   3.239 +				y=o->getChildPos().y()  -height() + 12; 
   3.240 +		}	
   3.241 +		if (o->getOrientation()==OrientLeftOfCenter)
   3.242 +			move ( o->getChildPos().x() - linkwidth, y );
   3.243 +		else	
   3.244 +			move (o->getChildPos().x() + linkwidth, y );
   3.245 +	}	
   3.246 +
   3.247 +	// updateLink is called implicitly in move
   3.248 +	reposition();	// FIXME shouldn't be this a request?
   3.249 +}
   3.250 +
   3.251 +void BranchObj::unsetParObjTmp()
   3.252 +{
   3.253 +	if (parObjTmpBuf) 
   3.254 +	{
   3.255 +		link2ParPos=false;
   3.256 +		parObj=parObjTmpBuf;
   3.257 +		parObjTmpBuf=NULL;
   3.258 +		depth=parObj->getDepth()+1;
   3.259 +		setLinkStyle (getDefLinkStyle() );
   3.260 +	}		
   3.261 +}
   3.262 +
   3.263 +void BranchObj::unScroll()
   3.264 +{
   3.265 +	if (tmpUnscrolled) resetTmpUnscroll();
   3.266 +	if (scrolled) toggleScroll();
   3.267 +}
   3.268 +
   3.269 +void BranchObj::toggleScroll()
   3.270 +{
   3.271 +	BranchObj *bo;
   3.272 +	if (scrolled)
   3.273 +	{
   3.274 +		scrolled=false;
   3.275 +		systemFlags->deactivate("scrolledright");
   3.276 +		for (bo=branch.first(); bo; bo=branch.next() )
   3.277 +		{
   3.278 +			bo->setVisibility(true);
   3.279 +		}
   3.280 +	} else
   3.281 +	{
   3.282 +		scrolled=true;
   3.283 +		systemFlags->activate("scrolledright");
   3.284 +		for (bo=branch.first(); bo; bo=branch.next() )
   3.285 +		{
   3.286 +			bo->setVisibility(false);
   3.287 +		}
   3.288 +	}
   3.289 +	calcBBoxSize();
   3.290 +	positionBBox();	
   3.291 +	move (absPos.x(), absPos.y() );
   3.292 +	forceReposition();
   3.293 +}
   3.294 +
   3.295 +bool BranchObj::isScrolled()
   3.296 +{
   3.297 +	return scrolled;
   3.298 +}
   3.299 +
   3.300 +bool BranchObj::hasScrolledParent(BranchObj *start)
   3.301 +{
   3.302 +	// Calls parents recursivly to
   3.303 +	// find out, if we are scrolled at all.
   3.304 +	// But ignore myself, just look at parents.
   3.305 +
   3.306 +	if (this !=start && scrolled) return true;
   3.307 +
   3.308 +	BranchObj* bo=(BranchObj*)(parObj);
   3.309 +	if (bo) 
   3.310 +		return bo->hasScrolledParent(start);
   3.311 +	else
   3.312 +		return false;
   3.313 +}
   3.314 +
   3.315 +void BranchObj::tmpUnscroll()
   3.316 +{
   3.317 +	// Unscroll parent (recursivly)
   3.318 +	BranchObj* bo=(BranchObj*)(parObj);
   3.319 +	if (bo) bo->tmpUnscroll();
   3.320 +		
   3.321 +	// Unscroll myself
   3.322 +	if (scrolled)
   3.323 +	{
   3.324 +		tmpUnscrolled=true;
   3.325 +		systemFlags->activate("tmpUnscrolledright");
   3.326 +		toggleScroll();
   3.327 +	}	
   3.328 +}
   3.329 +
   3.330 +void BranchObj::resetTmpUnscroll()
   3.331 +{
   3.332 +	// Unscroll parent (recursivly)
   3.333 +	BranchObj* bo=(BranchObj*)(parObj);
   3.334 +	if (bo)
   3.335 +		bo->resetTmpUnscroll();
   3.336 +		
   3.337 +	// Unscroll myself
   3.338 +	if (tmpUnscrolled)
   3.339 +	{
   3.340 +		tmpUnscrolled=false;
   3.341 +		systemFlags->deactivate("tmpUnscrolledright");
   3.342 +		toggleScroll();
   3.343 +	}	
   3.344 +}
   3.345 +
   3.346 +void BranchObj::setVisibility(bool v, int toDepth)
   3.347 +{
   3.348 +    if (depth <= toDepth)
   3.349 +    {
   3.350 +		frame->setVisibility(v);
   3.351 +		heading->setVisibility(v);
   3.352 +		systemFlags->setVisibility(v);
   3.353 +		standardFlags->setVisibility(v);
   3.354 +		LinkableMapObj::setVisibility (v);
   3.355 +		
   3.356 +		if (!scrolled && (depth < toDepth))
   3.357 +		{
   3.358 +			// Now go recursivly through all childs
   3.359 +			BranchObj* b;
   3.360 +			for (b=branch.first(); b;b=branch.next() ) 
   3.361 +				b->setVisibility (v,toDepth);	
   3.362 +			FloatImageObj *fio;
   3.363 +			for (fio=floatimage.first(); fio; fio=floatimage.next())
   3.364 +				fio->setVisibility (v);
   3.365 +		}
   3.366 +    } // depth <= toDepth	
   3.367 +	move (absPos.x(), absPos.y() );
   3.368 +	requestReposition();
   3.369 +}	
   3.370 +
   3.371 +void BranchObj::setVisibility(bool v)
   3.372 +{
   3.373 +    setVisibility (v,MAX_DEPTH);
   3.374 +}
   3.375 +
   3.376 +
   3.377 +void BranchObj::setLinkColor ()
   3.378 +{
   3.379 +	// Overloaded from LinkableMapObj
   3.380 +	// BranchObj can use color of heading
   3.381 +
   3.382 +	if (mapEditor->getLinkColorHint()==HeadingColor)
   3.383 +		LinkableMapObj::setLinkColor (heading->getColor() );
   3.384 +	else	
   3.385 +		LinkableMapObj::setLinkColor ();
   3.386 +}
   3.387 +
   3.388 +void BranchObj::setColor (QColor col, bool colorChilds)
   3.389 +{
   3.390 +    heading->setColor(col);
   3.391 +	setLinkColor();
   3.392 +    if (colorChilds) 
   3.393 +    {
   3.394 +		BranchObj *bo;
   3.395 +		for (bo=branch.first(); bo; bo=branch.next() )
   3.396 +			bo->setColor(col,colorChilds);
   3.397 +    }	
   3.398 +}
   3.399 +
   3.400 +
   3.401 +BranchObj* BranchObj::first()
   3.402 +{
   3.403 +	itLast=NULL;	
   3.404 +	return this; 
   3.405 +}
   3.406 +	
   3.407 +BranchObj* BranchObj::next()
   3.408 +{
   3.409 +	BranchObj *lmo;
   3.410 +	BranchObj *bo=branch.first();
   3.411 +	BranchObj *po=(BranchObj*)(parObj);
   3.412 +
   3.413 +	if (!itLast)
   3.414 +	{	// We are just beginning at the mapCenter
   3.415 +		if (bo) 
   3.416 +		{
   3.417 +			itLast=this;
   3.418 +			return bo;
   3.419 +		}	
   3.420 +		else
   3.421 +		{
   3.422 +			itLast=NULL;
   3.423 +			return NULL;
   3.424 +		}	
   3.425 +	}
   3.426 +
   3.427 +	if (itLast==parObj)
   3.428 +	{	// We come from above
   3.429 +		if (bo)
   3.430 +		{
   3.431 +			// there are childs, go there
   3.432 +			itLast=this;
   3.433 +			return bo;
   3.434 +		}	
   3.435 +		else
   3.436 +		{	// no childs, try to go up again
   3.437 +			if (po)
   3.438 +			{
   3.439 +				// go up
   3.440 +				itLast=this;
   3.441 +				lmo=po->next();
   3.442 +				itLast=this;
   3.443 +				return lmo;
   3.444 +
   3.445 +			}	
   3.446 +			else
   3.447 +			{
   3.448 +				// can't go up, I am mapCenter
   3.449 +				itLast=NULL;
   3.450 +				return NULL;
   3.451 +			}	
   3.452 +		}
   3.453 +	}
   3.454 +
   3.455 +	// Try to find last child, we came from, in my own childs
   3.456 +	bool searching=true;
   3.457 +	while (bo && searching)
   3.458 +	{
   3.459 +		if (itLast==bo) searching=false;
   3.460 +		bo=branch.next();
   3.461 +	}
   3.462 +	if (!searching)
   3.463 +	{	// found lastLMO in my childs
   3.464 +		if (bo)
   3.465 +		{
   3.466 +			// found a brother of lastLMO 
   3.467 +			itLast=this;
   3.468 +			return bo;
   3.469 +		}	
   3.470 +		else
   3.471 +		{
   3.472 +			if (po)
   3.473 +			{
   3.474 +				// go up
   3.475 +				itLast=this;
   3.476 +				lmo=po->next();
   3.477 +				itLast=this;
   3.478 +				return lmo;
   3.479 +			}
   3.480 +			else
   3.481 +			{
   3.482 +				// can't go up, I am mapCenter
   3.483 +				itLast=NULL;
   3.484 +				return NULL;
   3.485 +			}	
   3.486 +		}
   3.487 +	}
   3.488 +
   3.489 +	// couldn't find last child, it must be a nephew of mine
   3.490 +	bo=branch.first();
   3.491 +	if (bo)
   3.492 +	{
   3.493 +		// proceed with my first child
   3.494 +		itLast=this;	
   3.495 +		return bo;
   3.496 +	}	
   3.497 +	else
   3.498 +	{
   3.499 +		// or go back to my parents
   3.500 +		if (po)
   3.501 +		{
   3.502 +			// go up
   3.503 +			itLast=this;
   3.504 +			lmo=po->next();
   3.505 +			itLast=this;
   3.506 +			return lmo;
   3.507 +		}	
   3.508 +		else
   3.509 +		{
   3.510 +			// can't go up, I am mapCenter
   3.511 +			itLast=NULL;
   3.512 +			return NULL;
   3.513 +		}	
   3.514 +	}	
   3.515 +}
   3.516 +
   3.517 +BranchObj* BranchObj::getLastIterator()
   3.518 +{
   3.519 +	return itLast;
   3.520 +}
   3.521 +
   3.522 +void BranchObj::setLastIterator(BranchObj* it)
   3.523 +{
   3.524 +	itLast=it;
   3.525 +}
   3.526 +
   3.527 +
   3.528 +void BranchObj::move (double x, double y)
   3.529 +{
   3.530 +	OrnamentedObj::move (x,y);
   3.531 +    positionBBox();
   3.532 +}
   3.533 +
   3.534 +void BranchObj::move (QPoint p)
   3.535 +{
   3.536 +	move (p.x(), p.y());
   3.537 +}
   3.538 +
   3.539 +void BranchObj::moveBy (double x, double y)
   3.540 +{
   3.541 +	OrnamentedObj::moveBy (x,y);
   3.542 +    positionBBox();
   3.543 +    BranchObj* b;
   3.544 +    for (b=branch.first(); b;b=branch.next() ) 
   3.545 +		b->moveBy (x,y);
   3.546 +}
   3.547 +
   3.548 +void BranchObj::moveBy (QPoint p)
   3.549 +{
   3.550 +	moveBy (p.x(), p.y());
   3.551 +}
   3.552 +
   3.553 +
   3.554 +void BranchObj::positionBBox()
   3.555 +{
   3.556 +
   3.557 +    heading->positionBBox();
   3.558 +	systemFlags->positionBBox();
   3.559 +	standardFlags->positionBBox();
   3.560 +	// It seems that setting x,y also affects width,height
   3.561 +	int w_old=bbox.width();
   3.562 +	int h_old=bbox.height();
   3.563 +    bbox.setX (absPos.x() );
   3.564 +	bbox.setY (absPos.y() );
   3.565 +	bbox.setWidth(w_old);
   3.566 +	bbox.setHeight(h_old);
   3.567 +
   3.568 +
   3.569 +	setSelBox();
   3.570 +
   3.571 +	// set the frame
   3.572 +	frame->setRect(QRect(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) );
   3.573 +}
   3.574 +
   3.575 +void BranchObj::calcBBoxSize()
   3.576 +{
   3.577 +    QSize heading_r=heading->getSize();
   3.578 +    int heading_w=static_cast <int> (heading_r.width() );
   3.579 +    int heading_h=static_cast <int> (heading_r.height() );
   3.580 +    QSize sysflags_r=systemFlags->getSize();
   3.581 +	int sysflags_h=sysflags_r.height();
   3.582 +	int sysflags_w=sysflags_r.width();
   3.583 +    QSize stanflags_r=standardFlags->getSize();
   3.584 +	int stanflags_h=stanflags_r.height();
   3.585 +	int stanflags_w=stanflags_r.width();
   3.586 +    int w;
   3.587 +    int h;
   3.588 +
   3.589 +	// set width to sum of all widths
   3.590 +	w=heading_w + sysflags_w + stanflags_w;
   3.591 +	// set height to maximum needed height
   3.592 +	h=max (sysflags_h,stanflags_h);
   3.593 +	h=max (h,heading_h);
   3.594 +
   3.595 +    w+=frame->getBorder();
   3.596 +    h+=frame->getBorder();
   3.597 +    bbox.setSize (QSize (w,h));
   3.598 +}
   3.599 +
   3.600 +LinkableMapObj* BranchObj::findMapObj(QPoint p, LinkableMapObj* excludeLMO)
   3.601 +{
   3.602 +	// Search branches
   3.603 +    BranchObj *b;
   3.604 +    LinkableMapObj *lmo;
   3.605 +    for (b=branch.first(); b; b=branch.next() )
   3.606 +    {	
   3.607 +		lmo=b->findMapObj(p, excludeLMO);
   3.608 +		if (lmo != NULL) return lmo;
   3.609 +    }
   3.610 +	
   3.611 +	// Search myself
   3.612 +    if (inBBox (p) && (this != excludeLMO) && isVisibleObj() ) 
   3.613 +		return this;
   3.614 +
   3.615 +	// Search float images
   3.616 +	FloatImageObj *foi;
   3.617 +    for (foi=floatimage.first(); foi; foi=floatimage.next() )
   3.618 +		if (foi->inBBox(p) && (foi != excludeLMO) && foi->getParObj()!= excludeLMO) return foi;
   3.619 +
   3.620 +    return NULL;
   3.621 +}
   3.622 +
   3.623 +void BranchObj::setHeading(QString s)
   3.624 +{
   3.625 +    // Adjusting font size
   3.626 +    QFont font=heading->getFont();
   3.627 +	if (depth==0)
   3.628 +		font.setPointSize(16);
   3.629 +	else	
   3.630 +		if (depth>1) 
   3.631 +			font.setPointSize(10);
   3.632 +		else
   3.633 +			font.setPointSize(12);
   3.634 +    heading->setFont(font);
   3.635 +    heading->setText(s);	// set new heading
   3.636 +	calcBBoxSize();			// recalculate bbox
   3.637 +    positionBBox();			// rearrange contents
   3.638 +	requestReposition();
   3.639 +}
   3.640 +
   3.641 +void BranchObj::setURL(QString s)
   3.642 +{
   3.643 +	url=s;
   3.644 +	if (!url.isEmpty())
   3.645 +		systemFlags->activate("url");
   3.646 +	else	
   3.647 +		systemFlags->deactivate("url");
   3.648 +	calcBBoxSize();			// recalculate bbox
   3.649 +    positionBBox();			// rearrange contents
   3.650 +	forceReposition();
   3.651 +}
   3.652 +
   3.653 +QString BranchObj::getURL()
   3.654 +{
   3.655 +	return url;
   3.656 +}
   3.657 +
   3.658 +void BranchObj::setVymLink(QString s)
   3.659 +{
   3.660 +	if (!s.isEmpty())
   3.661 +	{
   3.662 +		// We need the relative (from loading) 
   3.663 +		// or absolute path (from User event)
   3.664 +		// and build the absolute path.
   3.665 +		// Note: If we have relative, use path of
   3.666 +		// current map to build absolute path
   3.667 +		QDir d(s);
   3.668 +		if (!d.path().startsWith ("/"))
   3.669 +		{
   3.670 +			QString p=mapEditor->getDestPath();
   3.671 +			int i=p.findRev("/",-1);
   3.672 +			d.setPath(p.left(i)+"/"+s);
   3.673 +			d.convertToAbs();
   3.674 +		}
   3.675 +		vymLink=d.path();
   3.676 +		systemFlags->activate("vymLink");
   3.677 +	}	
   3.678 +	else	
   3.679 +	{
   3.680 +		systemFlags->deactivate("vymLink");
   3.681 +		vymLink="";
   3.682 +	}	
   3.683 +	calcBBoxSize();			// recalculate bbox
   3.684 +    positionBBox();			// rearrange contents
   3.685 +	forceReposition();
   3.686 +}
   3.687 +
   3.688 +QString BranchObj::getVymLink()
   3.689 +{
   3.690 +	return vymLink;
   3.691 +}
   3.692 +
   3.693 +QString BranchObj::saveToDir (const QString &tmpdir,const QString &prefix, const QPoint& offset)
   3.694 +{
   3.695 +    QString s,a;
   3.696 +	QString scrolledAttr;
   3.697 +	if (scrolled) 
   3.698 +		scrolledAttr=attribut ("scrolled","yes");
   3.699 +	else
   3.700 +		scrolledAttr="";
   3.701 +
   3.702 +	QString posAttr;
   3.703 +	if (depth<2) posAttr=
   3.704 +		attribut("absPosX",QString().setNum(absPos.x(),10)) +
   3.705 +		attribut("absPosY",QString().setNum(absPos.y(),10)); 
   3.706 +	else
   3.707 +		posAttr="";
   3.708 +
   3.709 +	QString urlAttr;
   3.710 +	if (!url.isEmpty())
   3.711 +		urlAttr=attribut ("url",url);
   3.712 +
   3.713 +	QString vymLinkAttr;
   3.714 +	if (!vymLink.isEmpty())
   3.715 +		vymLinkAttr=attribut ("vymLink",convertToRel(mapEditor->getDestPath(),vymLink) );
   3.716 +
   3.717 +	QString frameAttr;
   3.718 +	if (frame->getFrameType()!=NoFrame)
   3.719 +		frameAttr=attribut ("frameType",frame->getFrameTypeName());
   3.720 +	else
   3.721 +		frameAttr="";
   3.722 +
   3.723 +	// save area, if not scrolled
   3.724 +	QString areaAttr;
   3.725 +	if (!((BranchObj*)(parObj))->isScrolled() )
   3.726 +	{
   3.727 +		areaAttr=
   3.728 +			attribut("x1",QString().setNum(absPos.x()-offset.x(),10)) +
   3.729 +			attribut("y1",QString().setNum(absPos.y()-offset.y(),10)) +
   3.730 +			attribut("x2",QString().setNum(absPos.x()+width()-offset.x(),10)) +
   3.731 +			attribut("y2",QString().setNum(absPos.y()+height()-offset.y(),10));
   3.732 +
   3.733 +	} else
   3.734 +		areaAttr="";
   3.735 +	
   3.736 +    s=beginElement ("branch" +scrolledAttr +posAttr +urlAttr +vymLinkAttr +frameAttr +areaAttr);
   3.737 +    incIndent();
   3.738 +
   3.739 +	// save heading
   3.740 +    s=s+valueElement("heading", getHeading(),
   3.741 +		attribut ("textColor",QColor(heading->getColor()).name()));
   3.742 +
   3.743 +	// save names of flags set
   3.744 +	s+=standardFlags->saveToDir(tmpdir,prefix,0);
   3.745 +	
   3.746 +	// save note
   3.747 +	if (!note.isEmpty() )
   3.748 +		s+=note.saveToDir();
   3.749 +	
   3.750 +	// Save branches
   3.751 +    BranchObj *bo;
   3.752 +    for (bo=branch.first(); bo; bo=branch.next() )
   3.753 +		s+=bo->saveToDir(tmpdir,prefix,offset);
   3.754 +    decIndent();
   3.755 +
   3.756 +	// Save FloatImages
   3.757 +	FloatImageObj *fio;
   3.758 +	for (fio=floatimage.first(); fio; fio=floatimage.next() )
   3.759 +		s+=fio->saveToDir (tmpdir,prefix);
   3.760 +
   3.761 +    s+=endElement   ("branch");
   3.762 +    return s;
   3.763 +}
   3.764 +
   3.765 +LinkableMapObj* BranchObj::addFloatImage ()
   3.766 +{
   3.767 +	FloatImageObj *newfi=new FloatImageObj (canvas,this);
   3.768 +	floatimage.append (newfi);
   3.769 +	if (hasScrolledParent(this) )
   3.770 +		newfi->setVisibility (false);
   3.771 +	else	
   3.772 +		newfi->setVisibility(visible);
   3.773 +	requestReposition();
   3.774 +	return newfi;
   3.775 +}
   3.776 +
   3.777 +LinkableMapObj* BranchObj::addFloatImage (FloatImageObj *fio)
   3.778 +{
   3.779 +	FloatImageObj *newfi=new FloatImageObj (canvas,this);
   3.780 +	floatimage.append (newfi);
   3.781 +	newfi->copy (fio);
   3.782 +	if (hasScrolledParent(this) )
   3.783 +		newfi->setVisibility (false);
   3.784 +	else	
   3.785 +		newfi->setVisibility(visible);
   3.786 +	requestReposition();
   3.787 +	return newfi;
   3.788 +}
   3.789 +
   3.790 +FloatImageObj* BranchObj::getFirstFloatImage ()
   3.791 +{
   3.792 +    return floatimage.first();
   3.793 +}
   3.794 +
   3.795 +FloatImageObj* BranchObj::getLastFloatImage ()
   3.796 +{
   3.797 +    return floatimage.last();
   3.798 +}
   3.799 +
   3.800 +FloatImageObj* BranchObj::getFloatImageNum (const uint &i)
   3.801 +{
   3.802 +    return floatimage.at(i);
   3.803 +}
   3.804 +
   3.805 +void BranchObj::removeFloatImage (FloatImageObj *fio)
   3.806 +{
   3.807 +	floatimage.remove (fio);
   3.808 +	requestReposition();
   3.809 +}
   3.810 +
   3.811 +void BranchObj::savePosInAngle ()
   3.812 +{
   3.813 +	// Save position in angle
   3.814 +    BranchObj *b;
   3.815 +	int i=0;
   3.816 +    for (b=branch.first(); b; b=branch.next() )
   3.817 +	{
   3.818 +		b->angle=i;
   3.819 +		i++;
   3.820 +	}
   3.821 +}
   3.822 +
   3.823 +BranchObj* BranchObj::addBranch()
   3.824 +{
   3.825 +    BranchObj* newbo=new BranchObj(canvas,this);
   3.826 +    branch.append (newbo);
   3.827 +    newbo->setParObj(this);
   3.828 +    newbo->setColor(getColor(),false);	
   3.829 +    newbo->setLinkColor();	
   3.830 +    newbo->setHeading ("new");
   3.831 +	newbo->setLinkStyle (newbo->getDefLinkStyle());
   3.832 +	if (scrolled)
   3.833 +		newbo->setVisibility (false);
   3.834 +	else	
   3.835 +		newbo->setVisibility(visible);
   3.836 +	requestReposition();
   3.837 +	return newbo;
   3.838 +}
   3.839 +
   3.840 +BranchObj* BranchObj::addBranch(BranchObj* bo)
   3.841 +{
   3.842 +    BranchObj* newbo=new BranchObj(canvas,this);
   3.843 +    branch.append (newbo);
   3.844 +    newbo->copy(bo);
   3.845 +    newbo->setParObj(this);
   3.846 +	newbo->setHeading (newbo->getHeading());	// adjust fontsize to depth
   3.847 +	newbo->setLinkStyle (newbo->getDefLinkStyle());
   3.848 +	if (scrolled)
   3.849 +		newbo->setVisibility (false);
   3.850 +	else	
   3.851 +		newbo->setVisibility(bo->visible);
   3.852 +	requestReposition();
   3.853 +	return newbo;
   3.854 +}
   3.855 +
   3.856 +BranchObj* BranchObj::insertBranch(int pos)
   3.857 +{
   3.858 +	savePosInAngle();
   3.859 +	// Add new bo and resort branches
   3.860 +	BranchObj *newbo=addBranch ();
   3.861 +	newbo->angle=pos-0.5;
   3.862 +	branch.sort();
   3.863 +	return newbo;
   3.864 +}
   3.865 +
   3.866 +BranchObj* BranchObj::insertBranch(BranchObj* bo, int pos)
   3.867 +{
   3.868 +	savePosInAngle();
   3.869 +	// Add new bo and resort branches
   3.870 +	bo->angle=pos-0.5;
   3.871 +	BranchObj *newbo=addBranch (bo);
   3.872 +	branch.sort();
   3.873 +	return newbo;
   3.874 +}
   3.875 +
   3.876 +void BranchObj::removeBranch(BranchObj* bo)
   3.877 +{
   3.878 +    // if bo is not in branch remove returns false, we
   3.879 +    // don't care...
   3.880 +    branch.remove (bo);
   3.881 +	requestReposition();
   3.882 +}
   3.883 +
   3.884 +void BranchObj::setLastSelectedBranch (BranchObj* bo)
   3.885 +{
   3.886 +    lastSelectedBranch=branch.find(bo);
   3.887 +}
   3.888 +
   3.889 +BranchObj* BranchObj::getLastSelectedBranch ()
   3.890 +{
   3.891 +    if (lastSelectedBranch>=0) 
   3.892 +	{
   3.893 +		BranchObj* bo=branch.at(lastSelectedBranch);
   3.894 +		if (bo) return bo;
   3.895 +    }	
   3.896 +    return branch.first();
   3.897 +}
   3.898 +
   3.899 +BranchObj* BranchObj::getFirstBranch ()
   3.900 +{
   3.901 +    return branch.first();
   3.902 +}
   3.903 +
   3.904 +BranchObj* BranchObj::getLastBranch ()
   3.905 +{
   3.906 +    return branch.last();
   3.907 +}
   3.908 +
   3.909 +BranchObj* BranchObj::getBranchNum (const uint &i)
   3.910 +{
   3.911 +    return branch.at(i);
   3.912 +}
   3.913 +
   3.914 +
   3.915 +BranchObj* BranchObj::moveBranchUp(BranchObj* bo1) // move a branch up (modify myself)
   3.916 +{
   3.917 +	savePosInAngle();
   3.918 +    int i=branch.find(bo1);
   3.919 +    if (i>0) 
   3.920 +	{	// -1 if bo1 not found 
   3.921 +		branch.at(i)->angle--;
   3.922 +		branch.at(i-1)->angle++;
   3.923 +		branch.sort();
   3.924 +		return branch.at(i-1);
   3.925 +	} else
   3.926 +		return branch.at(i);
   3.927 +}
   3.928 +
   3.929 +BranchObj* BranchObj::moveBranchDown(BranchObj* bo1)
   3.930 +{
   3.931 +	savePosInAngle();
   3.932 +    int i=branch.find(bo1);
   3.933 +	int j;
   3.934 +	if (branch.next())
   3.935 +	{
   3.936 +		j = branch.at();
   3.937 +		branch.at(i)->angle++;
   3.938 +		branch.at(j)->angle--;
   3.939 +		branch.sort();
   3.940 +		return branch.at(j);
   3.941 +	} else
   3.942 +		return branch.at(i);
   3.943 +}
   3.944 +
   3.945 +void BranchObj::alignRelativeTo (QPoint ref)
   3.946 +{
   3.947 +/* FIXME testing
   3.948 +	if (!getHeading().isEmpty())
   3.949 +		cout << "BO::alignRelTo "<<getHeading()<<endl;
   3.950 +	else	
   3.951 +		cout << "BO::alignRelTo  ???"<<endl;
   3.952 +	cout << "  d="<<depth<<endl;
   3.953 +*/	
   3.954 +	int th = bboxTotal.height();	
   3.955 +
   3.956 +	// If I am the mapcenter or a mainbranch, reposition heading
   3.957 +	if (depth<2)
   3.958 +	{
   3.959 +		move (absPos.x(),absPos.y());
   3.960 +		if (depth==1)
   3.961 +		{
   3.962 +			// Calc angle to mapCenter if I am a mainbranch
   3.963 +			// needed for reordering the mainbranches clockwise 
   3.964 +			// around mapcenter 
   3.965 +			angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ), 
   3.966 +									(int)(y() - parObj->getChildPos().y() ) ) );
   3.967 +		}	
   3.968 +	} 
   3.969 +	else
   3.970 +    {
   3.971 +		// Align myself depending on orientation and parent, but
   3.972 +		// only if I am not the mainbranch or mapcenter itself
   3.973 +		switch (orientation) 
   3.974 +		{
   3.975 +			case OrientLeftOfCenter:
   3.976 +				move (ref.x()-bbox.width(), ref.y() + (th-bbox.height())/2 );
   3.977 +			break;
   3.978 +			case OrientRightOfCenter:	
   3.979 +				move (ref.x(), ref.y() + (th-bbox.height())/2 );
   3.980 +			break;
   3.981 +			default:
   3.982 +				cout <<"LMO::alignRelativeTo: oops, no orientation given...\n";
   3.983 +			break;
   3.984 +		}		
   3.985 +    }		
   3.986 +
   3.987 +	FloatImageObj *fio;
   3.988 +    for (fio=floatimage.first(); fio; fio=floatimage.next() )
   3.989 +		fio->reposition();
   3.990 +
   3.991 +	if (scrolled) return;
   3.992 +
   3.993 +    // Set reference point for alignment of childs
   3.994 +    QPoint ref2;
   3.995 +    if (orientation==OrientLeftOfCenter)
   3.996 +		ref2.setX(childPos.x() - linkwidth);
   3.997 +    else	
   3.998 +		ref2.setX(childPos.x() + linkwidth);
   3.999 +
  3.1000 +	if (depth==1)
  3.1001 +		ref2.setY(absPos.y()-(bboxTotal.height()-bbox.height())/2);
  3.1002 +	else	
  3.1003 +		ref2.setY(ref.y() );	
  3.1004 +
  3.1005 +    // Align the childs depending on reference point 
  3.1006 +    BranchObj *b;
  3.1007 +    for (b=branch.first(); b; b=branch.next() )
  3.1008 +    {	
  3.1009 +		b->alignRelativeTo (ref2);
  3.1010 +		ref2.setY(ref2.y() + b->getBBoxSizeWithChilds().height() );
  3.1011 +    }
  3.1012 +}
  3.1013 +
  3.1014 +
  3.1015 +void BranchObj::reposition()
  3.1016 +{	
  3.1017 +/* FIXME testing
  3.1018 +	if (!getHeading().isEmpty())
  3.1019 +		cout << "BO::reposition  "<<getHeading()<<endl;
  3.1020 +	else	
  3.1021 +		cout << "BO::reposition  ???"<<endl;
  3.1022 +*/		
  3.1023 +	if (depth==0)
  3.1024 +	{
  3.1025 +		// only calculate the sizes once. If the deepest LMO 
  3.1026 +		// changes its height,
  3.1027 +		// all upper LMOs have to change, too.
  3.1028 +		calcBBoxSizeWithChilds();
  3.1029 +	    alignRelativeTo ( QPoint (absPos.x(),
  3.1030 +			absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  3.1031 +		branch.sort();	
  3.1032 +	} else
  3.1033 +	{
  3.1034 +		// This is only important for moving branches:
  3.1035 +		// For editing a branch it isn't called...
  3.1036 +	    alignRelativeTo ( QPoint (absPos.x(),
  3.1037 +							absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  3.1038 +	}
  3.1039 +}
  3.1040 +
  3.1041 +
  3.1042 +QRect BranchObj::getTotalBBox()
  3.1043 +{
  3.1044 +	QRect r=bbox;
  3.1045 +
  3.1046 +	if (scrolled) return r;
  3.1047 +
  3.1048 +	BranchObj* b;
  3.1049 +	for (b=branch.first();b ;b=branch.next() )
  3.1050 +		r=addBBox(b->getTotalBBox(),r);
  3.1051 +
  3.1052 +	FloatImageObj* fio;
  3.1053 +	for (fio=floatimage.first();fio ;fio=floatimage.next() )
  3.1054 +		r=addBBox(fio->getTotalBBox(),r);
  3.1055 +		
  3.1056 +	return r;
  3.1057 +}
  3.1058 +
  3.1059 +QRect BranchObj::getBBoxSizeWithChilds()
  3.1060 +{
  3.1061 +	return bboxTotal;
  3.1062 +}
  3.1063 +
  3.1064 +void BranchObj::calcBBoxSizeWithChilds()
  3.1065 +{
  3.1066 +	// This is called only from reposition and
  3.1067 +	// and only for mapcenter. So it won't be
  3.1068 +	// called more than once for a single user 
  3.1069 +	// action
  3.1070 +	
  3.1071 +	// Calculate size of LMO including all childs (to align them later)
  3.1072 +
  3.1073 +	bboxTotal.setX(bbox.x() );
  3.1074 +	bboxTotal.setY(bbox.y() );
  3.1075 +
  3.1076 +	// if branch is scrolled, ignore childs, but still consider floatimages
  3.1077 +	if (scrolled)
  3.1078 +	{
  3.1079 +		bboxTotal.setWidth (bbox.width());
  3.1080 +		bboxTotal.setHeight(bbox.height());
  3.1081 +		return;
  3.1082 +	}
  3.1083 +	
  3.1084 +	QRect r(0,0,0,0);
  3.1085 +	QRect br;
  3.1086 +	// Now calculate recursivly
  3.1087 +	// sum of heights 
  3.1088 +	// maximum of widths 
  3.1089 +	// minimum of y
  3.1090 +	BranchObj* b;
  3.1091 +	for (b=branch.first();b ;b=branch.next() )
  3.1092 +	{
  3.1093 +		b->calcBBoxSizeWithChilds();
  3.1094 +		br=b->getBBoxSizeWithChilds();
  3.1095 +		r.setWidth( max (br.width(), r.width() ));
  3.1096 +		r.setHeight(br.height() + r.height() );
  3.1097 +		if (br.y()<bboxTotal.y()) bboxTotal.setY(br.y());
  3.1098 +	}
  3.1099 +	// Add myself and also
  3.1100 +	// add width of link to sum if necessary
  3.1101 +	if (branch.isEmpty())
  3.1102 +		bboxTotal.setWidth (bbox.width() + r.width() );
  3.1103 +	else	
  3.1104 +		bboxTotal.setWidth (bbox.width() + r.width() + linkwidth);
  3.1105 +	bboxTotal.setHeight(max (r.height(),  bbox.height() ) );
  3.1106 +//	frame->setRect(QRect(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) );
  3.1107 +}
  3.1108 +
  3.1109 +void BranchObj::select()
  3.1110 +{
  3.1111 +    LinkableMapObj::select();
  3.1112 +	// Tell parent that I am selected now:
  3.1113 +	BranchObj* po=(BranchObj*)(parObj);
  3.1114 +    if (po)	// TODO	    Try to get rid of this cast...
  3.1115 +        po->setLastSelectedBranch(this);
  3.1116 +		
  3.1117 +	// temporary unscroll, if we have scrolled parents somewhere
  3.1118 +	if (parObj) ((BranchObj*)(parObj))->tmpUnscroll();
  3.1119 +
  3.1120 +	// set Text in Editor	
  3.1121 +	textEditor->setText(note.getNote() );
  3.1122 +	textEditor->setFilename(note.getFilenameHint() );
  3.1123 +	textEditor->setFontHint (note.getFontHint() );
  3.1124 +	connect (textEditor, SIGNAL (textHasChanged() ), this, SLOT (updateNoteFlag() ) ); 
  3.1125 +	connect (textEditor, SIGNAL (fontSizeHasChanged() ), this, SLOT (updateNoteFlag() ) ); 
  3.1126 +
  3.1127 +	// Show URL and link in statusbar
  3.1128 +	QString status;
  3.1129 +	if (!url.isEmpty()) status+="URL: "+url+"  ";
  3.1130 +	if (!vymLink.isEmpty()) status+="Link: "+vymLink;
  3.1131 +	if (!status.isEmpty()) mainWindow->statusMessage (status);
  3.1132 +
  3.1133 +	// Update Toolbar
  3.1134 +	standardFlags->updateToolBar();
  3.1135 +
  3.1136 +	// Update Browserbutton
  3.1137 +	if (!url.isEmpty())
  3.1138 +		actionEditOpenURL->setEnabled (true);
  3.1139 +	else	
  3.1140 +		actionEditOpenURL->setEnabled (false);
  3.1141 +
  3.1142 +	// Update actions in mapeditor
  3.1143 +	mapEditor->updateActions();
  3.1144 +}
  3.1145 +
  3.1146 +void BranchObj::unselect()
  3.1147 +{
  3.1148 +	LinkableMapObj::unselect();
  3.1149 +	// Delete any messages like vymLink in StatusBar
  3.1150 +	mainWindow->statusMessage ("");
  3.1151 +
  3.1152 +	// save note from editor and set flag
  3.1153 +	// text is done by updateNoteFlag(), just save
  3.1154 +	// filename here
  3.1155 +	note.setFilenameHint (textEditor->getFilename());
  3.1156 +
  3.1157 +	// reset temporary unscroll, if we have scrolled parents somewhere
  3.1158 +	if (parObj) ((BranchObj*)(parObj))->resetTmpUnscroll();
  3.1159 +
  3.1160 +	// Disconnect textEditor from this LMO
  3.1161 +	disconnect( textEditor, SIGNAL(textHasChanged()), 0, 0 );
  3.1162 +	disconnect( textEditor, SIGNAL (fontSizeHasChanged()),0,0 ); 
  3.1163 +
  3.1164 +	// Erase content of editor 
  3.1165 +	textEditor->setInactive();
  3.1166 +
  3.1167 +	// unselect all buttons in toolbar
  3.1168 +	standardFlagsDefault->updateToolBar();
  3.1169 +}
  3.1170 +
  3.1171 +QString BranchObj::getSelectString()
  3.1172 +{
  3.1173 +	QString s;
  3.1174 +	if (parObj)
  3.1175 +	{
  3.1176 +		if (parObj->getDepth()==0)
  3.1177 +			s= "bo:" + QString("%1").arg(getNum());
  3.1178 +		else	
  3.1179 +			s= ((BranchObj*)(parObj))->getSelectString() + ",bo:" + QString("%1").arg(getNum());
  3.1180 +	} else
  3.1181 +	{
  3.1182 +		s="mc:";
  3.1183 +	}
  3.1184 +	
  3.1185 +	return s;
  3.1186 +}
  3.1187 +
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/branchobj.h	Sun Jan 30 12:58:47 2005 +0000
     4.3 @@ -0,0 +1,113 @@
     4.4 +#ifndef BRANCHOBJ_H
     4.5 +#define BRANCHOBJ_H
     4.6 +
     4.7 +#include "floatimageobj.h"
     4.8 +#include "linkablemapobj.h"
     4.9 +#include "ornamentedobj.h"
    4.10 +
    4.11 +class BranchObjPtrList : public QPtrList<BranchObj>
    4.12 +{
    4.13 +	virtual int compareItems (QPtrCollection::Item i, QPtrCollection::Item j);
    4.14 +};
    4.15 +
    4.16 +/////////////////////////////////////////////////////////////////////////////
    4.17 +class BranchObj:public OrnamentedObj {
    4.18 +public:
    4.19 +    BranchObj ();
    4.20 +    BranchObj (QCanvas*);
    4.21 +    BranchObj (QCanvas*, LinkableMapObj* parent);
    4.22 +    ~BranchObj ();
    4.23 +	bool operator< ( const BranchObj & );
    4.24 +	bool operator== ( const BranchObj & );
    4.25 +    virtual void init ();
    4.26 +    virtual void copy (BranchObj*);
    4.27 +    void clear();
    4.28 +	virtual int getNum();				// return number of this in parent
    4.29 +	virtual int getNum(BranchObj*);		// return number of this in parent
    4.30 +	virtual int getFloatImageNum(FloatImageObj*);		
    4.31 +	virtual int countBranches();		
    4.32 +	virtual int countFloatImages();		
    4.33 +    virtual void setParObjTmp (LinkableMapObj*,QPoint,int);// Only for moving Obj around
    4.34 +	virtual void unsetParObjTmp();			// reuse original ParObj
    4.35 +
    4.36 +	virtual void unScroll();				
    4.37 +	virtual void toggleScroll();			// scroll or unscroll
    4.38 +	virtual bool isScrolled();				// returns scroll state
    4.39 +	virtual bool hasScrolledParent(BranchObj*);	// true, if any of the parents is scrolled
    4.40 +	virtual void tmpUnscroll();				// unscroll scrolled parents temporary e.g. during "find" process
    4.41 +	virtual void resetTmpUnscroll();		// scroll all tmp scrolled parents again e.g. when unselecting
    4.42 +
    4.43 +	virtual void setVisibility(bool,int);	// set visibility
    4.44 +    virtual void setVisibility(bool);	    // set vis. for w
    4.45 +	virtual void setLinkColor();			// set the color of link
    4.46 +	virtual void setColor(QColor,bool);		// set the color of heading
    4.47 +
    4.48 +
    4.49 +	BranchObj* first ();				// set Iterator to first LMO
    4.50 +	BranchObj* next ();					// find next LMO after given one
    4.51 +	BranchObj* getLastIterator();		// to interrupt and resume next iteration
    4.52 +	void setLastIterator (BranchObj*);	// needed by next() 
    4.53 +
    4.54 +    virtual void move (double x,double y);
    4.55 +    virtual void move (QPoint);
    4.56 +    virtual void moveBy (double x,double y);
    4.57 +    virtual void moveBy (QPoint);
    4.58 +    virtual void positionBBox();
    4.59 +    virtual void calcBBoxSize();
    4.60 +    virtual LinkableMapObj* findMapObj(QPoint,LinkableMapObj*);	// find MapObj 
    4.61 +    virtual void setHeading (QString);
    4.62 +    virtual void setURL (QString);
    4.63 +    virtual QString getURL ();
    4.64 +    virtual void setVymLink (QString);
    4.65 +    virtual QString getVymLink ();
    4.66 +	virtual QString saveToDir (const QString&,const QString&, const QPoint&);// Save data recursivly to tempdir
    4.67 +	virtual LinkableMapObj* addFloatImage();
    4.68 +	virtual LinkableMapObj* addFloatImage(FloatImageObj*);
    4.69 +	virtual void removeFloatImage(FloatImageObj*);
    4.70 +    virtual FloatImageObj* getFirstFloatImage();
    4.71 +    virtual FloatImageObj* getLastFloatImage();
    4.72 +	virtual FloatImageObj* getFloatImageNum(const uint &);
    4.73 +protected:	
    4.74 +	virtual void savePosInAngle();			// write pos in angle for resorting			
    4.75 +public:	
    4.76 +    virtual BranchObj* addBranch();
    4.77 +    virtual BranchObj* addBranch(BranchObj*);		// makes deep copy of BranchObj
    4.78 +    virtual BranchObj* insertBranch(int);
    4.79 +    virtual BranchObj* insertBranch(BranchObj*,int);
    4.80 +    virtual void removeBranch(BranchObj*);  
    4.81 +    virtual void setLastSelectedBranch(BranchObj*);
    4.82 +    virtual BranchObj* getLastSelectedBranch();
    4.83 +    virtual BranchObj* getFirstBranch();
    4.84 +    virtual BranchObj* getLastBranch();
    4.85 +	virtual BranchObj* getBranchNum(const uint &);
    4.86 +    virtual BranchObj* moveBranchUp(BranchObj*);
    4.87 +    virtual BranchObj* moveBranchDown(BranchObj*);
    4.88 +
    4.89 +    virtual void alignRelativeTo(const QPoint );
    4.90 +	virtual void reposition();
    4.91 +
    4.92 +	virtual QRect getTotalBBox();			// return BBox including childs			
    4.93 +	virtual QRect getBBoxSizeWithChilds();	// return size of BBox including childs  
    4.94 +	virtual void calcBBoxSizeWithChilds();	// calc size of  BBox including childs recursivly
    4.95 +
    4.96 +    virtual void select();
    4.97 +    virtual void unselect();
    4.98 +	virtual QString getSelectString();
    4.99 +
   4.100 +protected:
   4.101 +	static BranchObj* itLast;		// iterator for first(), next()
   4.102 +    BranchObjPtrList branch;		// all child branches
   4.103 +	QPtrList<FloatImageObj> floatimage;	// child images
   4.104 +public:	
   4.105 +	float angle;					// used in mainbranch to reorder mainbranches
   4.106 +protected:	
   4.107 +    int lastSelectedBranch;			// for going deeper into tree
   4.108 +	bool scrolled;					// true if all childs are scrolled and thus invisible
   4.109 +	bool tmpUnscrolled;				// can only be true (temporary) for a scrolled subtree
   4.110 +	QString url;					// url to external doc
   4.111 +	QString vymLink;				// path to another map
   4.112 +};
   4.113 +
   4.114 +
   4.115 +#endif
   4.116 +
     5.1 Binary file doc/vym.pdf has changed
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/exporthtmldialog.ui	Sun Jan 30 12:58:47 2005 +0000
     6.3 @@ -0,0 +1,321 @@
     6.4 +<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
     6.5 +<class>ExportHTMLDialog</class>
     6.6 +<author>Uwe Drechsel</author>
     6.7 +<widget class="QDialog">
     6.8 +    <property name="name">
     6.9 +        <cstring>ExportHTMLDialog</cstring>
    6.10 +    </property>
    6.11 +    <property name="geometry">
    6.12 +        <rect>
    6.13 +            <x>0</x>
    6.14 +            <y>0</y>
    6.15 +            <width>364</width>
    6.16 +            <height>346</height>
    6.17 +        </rect>
    6.18 +    </property>
    6.19 +    <property name="caption">
    6.20 +        <string>Export HTML</string>
    6.21 +    </property>
    6.22 +    <property name="modal">
    6.23 +        <bool>false</bool>
    6.24 +    </property>
    6.25 +    <vbox>
    6.26 +        <property name="name">
    6.27 +            <cstring>unnamed</cstring>
    6.28 +        </property>
    6.29 +        <widget class="QLayoutWidget">
    6.30 +            <property name="name">
    6.31 +                <cstring>layout33</cstring>
    6.32 +            </property>
    6.33 +            <hbox>
    6.34 +                <property name="name">
    6.35 +                    <cstring>unnamed</cstring>
    6.36 +                </property>
    6.37 +                <widget class="QLabel">
    6.38 +                    <property name="name">
    6.39 +                        <cstring>textLabel1</cstring>
    6.40 +                    </property>
    6.41 +                    <property name="text">
    6.42 +                        <string>Directory:</string>
    6.43 +                    </property>
    6.44 +                </widget>
    6.45 +                <widget class="QLineEdit">
    6.46 +                    <property name="name">
    6.47 +                        <cstring>lineEdit1</cstring>
    6.48 +                    </property>
    6.49 +                </widget>
    6.50 +                <widget class="QPushButton">
    6.51 +                    <property name="name">
    6.52 +                        <cstring>browseButton</cstring>
    6.53 +                    </property>
    6.54 +                    <property name="text">
    6.55 +                        <string>Browse</string>
    6.56 +                    </property>
    6.57 +                </widget>
    6.58 +            </hbox>
    6.59 +        </widget>
    6.60 +        <widget class="QButtonGroup">
    6.61 +            <property name="name">
    6.62 +                <cstring>buttonGroup2</cstring>
    6.63 +            </property>
    6.64 +            <property name="sizePolicy">
    6.65 +                <sizepolicy>
    6.66 +                    <hsizetype>3</hsizetype>
    6.67 +                    <vsizetype>5</vsizetype>
    6.68 +                    <horstretch>0</horstretch>
    6.69 +                    <verstretch>0</verstretch>
    6.70 +                </sizepolicy>
    6.71 +            </property>
    6.72 +            <property name="minimumSize">
    6.73 +                <size>
    6.74 +                    <width>0</width>
    6.75 +                    <height>230</height>
    6.76 +                </size>
    6.77 +            </property>
    6.78 +            <property name="title">
    6.79 +                <string>Options</string>
    6.80 +            </property>
    6.81 +            <vbox>
    6.82 +                <property name="name">
    6.83 +                    <cstring>unnamed</cstring>
    6.84 +                </property>
    6.85 +                <widget class="QCheckBox">
    6.86 +                    <property name="name">
    6.87 +                        <cstring>checkBox4</cstring>
    6.88 +                    </property>
    6.89 +                    <property name="text">
    6.90 +                        <string>Include image of map</string>
    6.91 +                    </property>
    6.92 +                </widget>
    6.93 +                <widget class="QCheckBox">
    6.94 +                    <property name="name">
    6.95 +                        <cstring>checkBox5_2</cstring>
    6.96 +                    </property>
    6.97 +                    <property name="text">
    6.98 +                        <string>create image only</string>
    6.99 +                    </property>
   6.100 +                </widget>
   6.101 +                <widget class="QCheckBox">
   6.102 +                    <property name="name">
   6.103 +                        <cstring>checkBox5</cstring>
   6.104 +                    </property>
   6.105 +                    <property name="text">
   6.106 +                        <string>use WIKI style</string>
   6.107 +                    </property>
   6.108 +                </widget>
   6.109 +                <widget class="QCheckBox">
   6.110 +                    <property name="name">
   6.111 +                        <cstring>checkBox4_2</cstring>
   6.112 +                    </property>
   6.113 +                    <property name="text">
   6.114 +                        <string>use heading for URLs (instead of link target)</string>
   6.115 +                    </property>
   6.116 +                </widget>
   6.117 +                <widget class="QCheckBox">
   6.118 +                    <property name="name">
   6.119 +                        <cstring>checkBox6</cstring>
   6.120 +                    </property>
   6.121 +                    <property name="text">
   6.122 +                        <string>use image of earth to mark URLs in text</string>
   6.123 +                    </property>
   6.124 +                </widget>
   6.125 +                <widget class="QCheckBox">
   6.126 +                    <property name="name">
   6.127 +                        <cstring>checkBox7</cstring>
   6.128 +                    </property>
   6.129 +                    <property name="text">
   6.130 +                        <string>use default CSS file</string>
   6.131 +                    </property>
   6.132 +                </widget>
   6.133 +                <widget class="QCheckBox">
   6.134 +                    <property name="name">
   6.135 +                        <cstring>checkBox3</cstring>
   6.136 +                    </property>
   6.137 +                    <property name="sizePolicy">
   6.138 +                        <sizepolicy>
   6.139 +                            <hsizetype>1</hsizetype>
   6.140 +                            <vsizetype>0</vsizetype>
   6.141 +                            <horstretch>0</horstretch>
   6.142 +                            <verstretch>0</verstretch>
   6.143 +                        </sizepolicy>
   6.144 +                    </property>
   6.145 +                    <property name="text">
   6.146 +                        <string>show output of external scripts</string>
   6.147 +                    </property>
   6.148 +                </widget>
   6.149 +            </vbox>
   6.150 +        </widget>
   6.151 +        <spacer>
   6.152 +            <property name="name">
   6.153 +                <cstring>spacer6</cstring>
   6.154 +            </property>
   6.155 +            <property name="orientation">
   6.156 +                <enum>Vertical</enum>
   6.157 +            </property>
   6.158 +            <property name="sizeType">
   6.159 +                <enum>Expanding</enum>
   6.160 +            </property>
   6.161 +            <property name="sizeHint">
   6.162 +                <size>
   6.163 +                    <width>21</width>
   6.164 +                    <height>60</height>
   6.165 +                </size>
   6.166 +            </property>
   6.167 +        </spacer>
   6.168 +        <widget class="QLayoutWidget">
   6.169 +            <property name="name">
   6.170 +                <cstring>layout17</cstring>
   6.171 +            </property>
   6.172 +            <hbox>
   6.173 +                <property name="name">
   6.174 +                    <cstring>unnamed</cstring>
   6.175 +                </property>
   6.176 +                <spacer>
   6.177 +                    <property name="name">
   6.178 +                        <cstring>spacer5</cstring>
   6.179 +                    </property>
   6.180 +                    <property name="orientation">
   6.181 +                        <enum>Horizontal</enum>
   6.182 +                    </property>
   6.183 +                    <property name="sizeType">
   6.184 +                        <enum>Expanding</enum>
   6.185 +                    </property>
   6.186 +                    <property name="sizeHint">
   6.187 +                        <size>
   6.188 +                            <width>61</width>
   6.189 +                            <height>21</height>
   6.190 +                        </size>
   6.191 +                    </property>
   6.192 +                </spacer>
   6.193 +                <widget class="QPushButton">
   6.194 +                    <property name="name">
   6.195 +                        <cstring>pushButton4</cstring>
   6.196 +                    </property>
   6.197 +                    <property name="text">
   6.198 +                        <string>Export</string>
   6.199 +                    </property>
   6.200 +                    <property name="default">
   6.201 +                        <bool>true</bool>
   6.202 +                    </property>
   6.203 +                </widget>
   6.204 +                <widget class="QPushButton">
   6.205 +                    <property name="name">
   6.206 +                        <cstring>pushButton5</cstring>
   6.207 +                    </property>
   6.208 +                    <property name="text">
   6.209 +                        <string>Cancel</string>
   6.210 +                    </property>
   6.211 +                </widget>
   6.212 +            </hbox>
   6.213 +        </widget>
   6.214 +    </vbox>
   6.215 +</widget>
   6.216 +<connections>
   6.217 +    <connection>
   6.218 +        <sender>pushButton5</sender>
   6.219 +        <signal>pressed()</signal>
   6.220 +        <receiver>ExportHTMLDialog</receiver>
   6.221 +        <slot>reject()</slot>
   6.222 +    </connection>
   6.223 +    <connection>
   6.224 +        <sender>pushButton4</sender>
   6.225 +        <signal>clicked()</signal>
   6.226 +        <receiver>ExportHTMLDialog</receiver>
   6.227 +        <slot>accept()</slot>
   6.228 +    </connection>
   6.229 +    <connection>
   6.230 +        <sender>browseButton</sender>
   6.231 +        <signal>pressed()</signal>
   6.232 +        <receiver>ExportHTMLDialog</receiver>
   6.233 +        <slot>browseDirectory()</slot>
   6.234 +    </connection>
   6.235 +    <connection>
   6.236 +        <sender>checkBox4</sender>
   6.237 +        <signal>toggled(bool)</signal>
   6.238 +        <receiver>ExportHTMLDialog</receiver>
   6.239 +        <slot>includeImage(bool)</slot>
   6.240 +    </connection>
   6.241 +    <connection>
   6.242 +        <sender>checkBox5</sender>
   6.243 +        <signal>toggled(bool)</signal>
   6.244 +        <receiver>ExportHTMLDialog</receiver>
   6.245 +        <slot>useWIKIpressed(bool)</slot>
   6.246 +    </connection>
   6.247 +    <connection>
   6.248 +        <sender>lineEdit1</sender>
   6.249 +        <signal>textChanged(const QString&)</signal>
   6.250 +        <receiver>ExportHTMLDialog</receiver>
   6.251 +        <slot>dirChanged()</slot>
   6.252 +    </connection>
   6.253 +    <connection>
   6.254 +        <sender>checkBox3</sender>
   6.255 +        <signal>toggled(bool)</signal>
   6.256 +        <receiver>ExportHTMLDialog</receiver>
   6.257 +        <slot>showOut(bool)</slot>
   6.258 +    </connection>
   6.259 +    <connection>
   6.260 +        <sender>checkBox4_2</sender>
   6.261 +        <signal>toggled(bool)</signal>
   6.262 +        <receiver>ExportHTMLDialog</receiver>
   6.263 +        <slot>useHeadingPressed(bool)</slot>
   6.264 +    </connection>
   6.265 +    <connection>
   6.266 +        <sender>checkBox5_2</sender>
   6.267 +        <signal>toggled(bool)</signal>
   6.268 +        <receiver>ExportHTMLDialog</receiver>
   6.269 +        <slot>imgOnly(bool)</slot>
   6.270 +    </connection>
   6.271 +    <connection>
   6.272 +        <sender>checkBox6</sender>
   6.273 +        <signal>toggled(bool)</signal>
   6.274 +        <receiver>ExportHTMLDialog</receiver>
   6.275 +        <slot>useURLImagePressed(bool)</slot>
   6.276 +    </connection>
   6.277 +</connections>
   6.278 +<includes>
   6.279 +    <include location="local" impldecl="in declaration">showtextdialog.h</include>
   6.280 +    <include location="global" impldecl="in declaration">qprocess.h</include>
   6.281 +    <include location="global" impldecl="in implementation">iostream</include>
   6.282 +    <include location="local" impldecl="in implementation">settings.h</include>
   6.283 +    <include location="global" impldecl="in implementation">qfiledialog.h</include>
   6.284 +    <include location="global" impldecl="in implementation">qmessagebox.h</include>
   6.285 +    <include location="local" impldecl="in implementation">misc.h</include>
   6.286 +    <include location="local" impldecl="in implementation">icons/flag-url.xpm</include>
   6.287 +    <include location="local" impldecl="in implementation">exporthtmldialog.ui.h</include>
   6.288 +</includes>
   6.289 +<variables>
   6.290 +    <variable>QString css;</variable>
   6.291 +    <variable>QString xsl;</variable>
   6.292 +    <variable>QString scriptpath;</variable>
   6.293 +    <variable>QString stylepath;</variable>
   6.294 +    <variable>QString dir;</variable>
   6.295 +    <variable>bool image;</variable>
   6.296 +    <variable>bool wikistyle;</variable>
   6.297 +    <variable>QString script;</variable>
   6.298 +    <variable>bool showOutput;</variable>
   6.299 +    <variable>QProcess *proc;</variable>
   6.300 +    <variable>ShowTextDialog *dia;</variable>
   6.301 +    <variable>bool imageOnly;</variable>
   6.302 +    <variable>bool useHeading;</variable>
   6.303 +    <variable>bool useURLImage;</variable>
   6.304 +</variables>
   6.305 +<slots>
   6.306 +    <slot>browseDirectory()</slot>
   6.307 +    <slot>useWIKIpressed( bool b )</slot>
   6.308 +    <slot>includeImage( bool b )</slot>
   6.309 +    <slot>imgOnly( bool b )</slot>
   6.310 +    <slot>useHeadingPressed( bool b )</slot>
   6.311 +    <slot>useURLImagePressed( bool b )</slot>
   6.312 +    <slot>showOut( bool b )</slot>
   6.313 +    <slot>dirChanged()</slot>
   6.314 +    <slot>doExport( const QString & mapname )</slot>
   6.315 +    <slot returnType="QString">getDir()</slot>
   6.316 +    <slot>readOutput()</slot>
   6.317 +</slots>
   6.318 +<functions>
   6.319 +    <function access="private" specifier="non virtual">init()</function>
   6.320 +    <function access="private" specifier="non virtual">destroy()</function>
   6.321 +</functions>
   6.322 +<pixmapinproject/>
   6.323 +<layoutdefaults spacing="6" margin="11"/>
   6.324 +</UI>
     7.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.2 +++ b/exporthtmldialog.ui.h	Sun Jan 30 12:58:47 2005 +0000
     7.3 @@ -0,0 +1,218 @@
     7.4 +/****************************************************************************
     7.5 +** ui.h extension file, included from the uic-generated form implementation.
     7.6 +**
     7.7 +** If you wish to add, delete or rename functions or slots use
     7.8 +** Qt Designer which will update this file, preserving your code. Create an
     7.9 +** init() function in place of a constructor, and a destroy() function in
    7.10 +** place of a destructor.
    7.11 +*****************************************************************************/
    7.12 +
    7.13 +
    7.14 +extern Settings settings;
    7.15 +
    7.16 +void ExportHTMLDialog::init()
    7.17 +{
    7.18 +	dir=settings.readEntry ("/vym/export/html/dir","" );
    7.19 +	lineEdit1->setText(dir);
    7.20 +	
    7.21 +    if ( settings.readEntry ("/vym/export/html/image","yes")=="yes")
    7.22 +		image=true;
    7.23 +	else	
    7.24 +		image=false;
    7.25 +	checkBox4->setChecked(image);
    7.26 +	
    7.27 +	if ( settings.readEntry ("/vym/export/html/imageOnly","no")=="yes")
    7.28 +		imageOnly=true;
    7.29 +	else	
    7.30 +		imageOnly=false;
    7.31 +	checkBox5_2->setChecked(imageOnly);
    7.32 +		
    7.33 +    if ( settings.readEntry ("/vym/export/html/wiki","no")=="yes")
    7.34 +		wikistyle=true;
    7.35 +	else	
    7.36 +		wikistyle=false;
    7.37 +	checkBox5->setChecked(wikistyle);
    7.38 +	
    7.39 +	if ( settings.readEntry ("/vym/export/html/useHeading","no")=="yes")
    7.40 +		useHeading=true;
    7.41 +	else	
    7.42 +		useHeading=false;
    7.43 +	checkBox4_2->setChecked(useHeading);
    7.44 +		
    7.45 +	if ( settings.readEntry ("/vym/export/html/useURLImage","yes")=="yes")
    7.46 +		useURLImage=true;
    7.47 +	else	
    7.48 +		useURLImage=false;
    7.49 +	checkBox6->setChecked(useURLImage);
    7.50 +	
    7.51 +	if ( settings.readEntry ("/vym/export/html/showOutput","no")=="yes")
    7.52 +		showOutput=true;
    7.53 +	else	
    7.54 +		showOutput=false;
    7.55 +	checkBox3->setChecked(showOutput);
    7.56 +		
    7.57 +	stylepath=settings.readEntry
    7.58 +		("/vym/export/html/styles","styles");
    7.59 +	scriptpath=settings.readEntry 
    7.60 +		("/vym/export/html/scripts","scripts");
    7.61 +	xsl=settings.readEntry 
    7.62 +		("/vym/export/html/xsl","vym2html.xsl");
    7.63 +	css=settings.readEntry 
    7.64 +		("/vym/export/html/css","vym.css");	
    7.65 +	script=settings.readEntry 
    7.66 +		("/vym/export/html/script","vym2html.sh");	
    7.67 +	
    7.68 +	proc = new QProcess( this );
    7.69 +	connect( proc, SIGNAL(readyReadStdout()),
    7.70 +			 this, SLOT(readOutput()) );
    7.71 +
    7.72 +	dia=new ShowTextDialog ();
    7.73 +}
    7.74 +
    7.75 +void ExportHTMLDialog::destroy()
    7.76 +{
    7.77 +	delete (proc);
    7.78 +	delete (dia);
    7.79 +}
    7.80 +
    7.81 +void ExportHTMLDialog::browseDirectory()
    7.82 +{
    7.83 +   	QFileDialog fd( this, tr("VYM - Export HTML to directory"));
    7.84 +	fd.setMode (QFileDialog::DirectoryOnly);
    7.85 +	fd.setCaption(tr("VYM - Export HTML to directory"));
    7.86 +	fd.setModal (true);
    7.87 +	fd.show();
    7.88 +
    7.89 +	if ( fd.exec() == QDialog::Accepted )
    7.90 +	{
    7.91 +		dir=fd.selectedFile();
    7.92 +		lineEdit1->setText (dir );
    7.93 +	}
    7.94 +}
    7.95 +
    7.96 +void ExportHTMLDialog::useWIKIpressed(bool b)
    7.97 +{
    7.98 +	wikistyle=b;
    7.99 +}
   7.100 +
   7.101 +void ExportHTMLDialog::includeImage(bool b)
   7.102 +{
   7.103 +	image=b;
   7.104 +}
   7.105 +
   7.106 +void ExportHTMLDialog::imgOnly(bool b)
   7.107 +{
   7.108 +	imageOnly=b;
   7.109 +}
   7.110 +
   7.111 +void ExportHTMLDialog::useHeadingPressed(bool b)
   7.112 +{
   7.113 +	useHeading=b;
   7.114 +}
   7.115 +
   7.116 +void ExportHTMLDialog::useURLImagePressed(bool b)
   7.117 +{
   7.118 +	useURLImage=b;
   7.119 +}
   7.120 +
   7.121 +void ExportHTMLDialog::showOut(bool b)
   7.122 +{
   7.123 +	showOutput=b;
   7.124 +}
   7.125 +
   7.126 +void ExportHTMLDialog::dirChanged()
   7.127 +{
   7.128 +	dir=lineEdit1->text();
   7.129 +}
   7.130 +
   7.131 +
   7.132 +
   7.133 +
   7.134 +void ExportHTMLDialog::doExport (const QString &mapname)
   7.135 +{
   7.136 +	// Save options to settings file 
   7.137 +	// (but don't save at destructor, which
   7.138 +	// is called for "cancel", too)
   7.139 +	settings.writeEntry ("/vym/export/html/dir",lineEdit1->text() );
   7.140 +
   7.141 +	if (wikistyle)
   7.142 +		settings.writeEntry ("/vym/export/html/wiki","yes");
   7.143 +	else	
   7.144 +		settings.writeEntry ("/vym/export/html/wiki","no");
   7.145 +
   7.146 +    if (image)
   7.147 +		settings.writeEntry ("/vym/export/html/image","yes");
   7.148 +    else
   7.149 +		settings.writeEntry ("/vym/export/html/image","no");	
   7.150 +	
   7.151 +  if (imageOnly)
   7.152 +		settings.writeEntry ("/vym/export/html/imageOnly","yes");
   7.153 +    else
   7.154 +		settings.writeEntry ("/vym/export/html/imageOnly","no");	
   7.155 +	
   7.156 +  if (useHeading)
   7.157 +		settings.writeEntry ("/vym/export/html/useHeading","yes");
   7.158 +    else
   7.159 +		settings.writeEntry ("/vym/export/html/useHeading","no");	
   7.160 +			
   7.161 +    if (showOutput)
   7.162 +		settings.writeEntry ("/vym/export/html/showOutput","yes");
   7.163 +    else
   7.164 +		settings.writeEntry ("/vym/export/html/showOutput","no");	
   7.165 +		
   7.166 +	settings.writeEntry
   7.167 +		("/vym/export/html/styles",stylepath);
   7.168 +	settings.writeEntry 
   7.169 +		("/vym/export/html/scripts",scriptpath);
   7.170 +	settings.writeEntry 
   7.171 +		("/vym/export/html/xsl",xsl);
   7.172 +	settings.writeEntry 
   7.173 +		("/vym/export/html/css",css);	
   7.174 +	settings.writeEntry 
   7.175 +		("/vym/export/html/script",script);	
   7.176 +
   7.177 +	proc->addArgument (scriptpath + "/" + script );
   7.178 +	proc->addArgument(dir + maskPath(mapname) + ".xml");
   7.179 +	proc->addArgument("-sp=" + stylepath +"/" + xsl );
   7.180 +	proc->addArgument("-css=" + css );
   7.181 +	if (image) proc->addArgument("-image" );
   7.182 +	if (wikistyle) proc->addArgument("-wikistyle" );
   7.183 +	if (useHeading) proc->addArgument("-useURLHeading" );
   7.184 +	if (useURLImage) 
   7.185 +	{	
   7.186 +		proc->addArgument("-useURLImage" );
   7.187 +		QPixmap pm (flag_url_xpm);
   7.188 +		pm.save (dir + "/flags/url.png","PNG");
   7.189 +	}	
   7.190 +
   7.191 +	dia->append ("vym is executing: " + proc->arguments().join(" ") );
   7.192 +	if ( !proc->start() ) 
   7.193 +	{
   7.194 +		// error handling
   7.195 +		dia->show();
   7.196 +		QString s;
   7.197 +		QStringList list = proc->arguments();
   7.198 +		QStringList::Iterator it = list.begin();
   7.199 +		while( it != list.end() ) 
   7.200 +		{
   7.201 +			s+= ( *it ) + "\n";
   7.202 +			++it;
   7.203 +		}
   7.204 +		QMessageBox::critical(0, tr("Critcal export error"),"Couldn't start script to export:\n"+s);
   7.205 +	} else 
   7.206 +		if (showOutput) dia->exec();
   7.207 +	
   7.208 +
   7.209 +}
   7.210 +
   7.211 +
   7.212 +QString ExportHTMLDialog::getDir()
   7.213 +{
   7.214 +	return dir;
   7.215 +}
   7.216 +
   7.217 +
   7.218 +void ExportHTMLDialog::readOutput()
   7.219 +{
   7.220 +	dia->append (proc->readStdout() );
   7.221 +}
     8.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.2 +++ b/exports.cpp	Sun Jan 30 12:58:47 2005 +0000
     8.3 @@ -0,0 +1,132 @@
     8.4 +#include "exports.h"
     8.5 +
     8.6 +#include "linkablemapobj.h"
     8.7 +
     8.8 +
     8.9 +Export::Export()
    8.10 +{
    8.11 +	indentPerDepth="  ";
    8.12 +}
    8.13 +
    8.14 +bool Export::setOutputDir(QString dirname)
    8.15 +{
    8.16 +	outdir.setPath (dirname);
    8.17 +	if ( outdir.exists() )
    8.18 +	{
    8.19 +		// FIXME
    8.20 +		// ask for confirmation
    8.21 +		// then delete outdir
    8.22 +		return true;
    8.23 +	} else
    8.24 +	{
    8.25 +		// try to create directory
    8.26 +		//return outdir.mkdir (outdir.absPath());
    8.27 +		// FIXME
    8.28 +		return true;
    8.29 +	}
    8.30 +}
    8.31 +
    8.32 +void Export::setPath (const QString &p)
    8.33 +{
    8.34 +	filepath=p;
    8.35 +}
    8.36 +
    8.37 +void Export::setMapCenter(MapCenterObj *mc)
    8.38 +{
    8.39 +	mapCenter=mc;
    8.40 +}
    8.41 +
    8.42 +void Export::exportMap()
    8.43 +{
    8.44 +	QFile file (filepath);
    8.45 +	if ( !file.open( IO_WriteOnly ) )
    8.46 +	{
    8.47 +		// FIXME
    8.48 +		cout << "Export::exportMap  couldn't open "<<filepath<<endl;
    8.49 +		return;
    8.50 +	}
    8.51 +	QTextStream ts( &file );	// use LANG decoding here...
    8.52 +
    8.53 +	// Main loop over all branches
    8.54 +	QString s;
    8.55 +	QString actIndent("");
    8.56 +	int i;
    8.57 +	BranchObj *bo;
    8.58 +	bo=mapCenter->first();
    8.59 +	while (bo) 
    8.60 +	{
    8.61 +		// Make indentstring
    8.62 +		for (i=0;i<bo->getDepth();i++) actIndent+= indentPerDepth;
    8.63 +
    8.64 +		// Write heading
    8.65 +		//	write (actIndent + getSectionString(bo) + bo->getHeading()+ "\n");
    8.66 +		if (bo->getDepth()==1)
    8.67 +			ts << (getSectionString(bo) + bo->getHeading()+ "\n");
    8.68 +		else	
    8.69 +			ts << (actIndent + " - " + bo->getHeading()+ "\n");
    8.70 +		
    8.71 +		// If necessary, write note
    8.72 +		if (!bo->getNote().isEmpty())
    8.73 +		{
    8.74 +			ts << ("-------------------Begin of Note-----------------\n");
    8.75 +			ts << (bo->getNote());
    8.76 +			ts << ("\n");
    8.77 +			ts << ("-------------------End of Note-------------------\n");
    8.78 +		}
    8.79 +		
    8.80 +		bo=bo->next();
    8.81 +		actIndent="";
    8.82 +	}
    8.83 +	file.close();
    8.84 +}
    8.85 +
    8.86 +QString Export::getSectionString(BranchObj *bostart)
    8.87 +{
    8.88 +	QString r;
    8.89 +	BranchObj *bo=bostart;
    8.90 +	int depth=bo->getDepth();
    8.91 +	while (depth>0)
    8.92 +	{
    8.93 +		r=QString("%1").arg(1+bo->getNum(),0,10)+"." + r;
    8.94 +		bo=(BranchObj*)(bo->getParObj());
    8.95 +		depth=bo->getDepth();
    8.96 +	}	
    8.97 +	if (r.isEmpty())
    8.98 +		return r;
    8.99 +	else	
   8.100 +		return r + " ";
   8.101 +}
   8.102 +
   8.103 +void Export::exportAsHTML()
   8.104 +{
   8.105 +	// FIXME  just testing...
   8.106 +	// Main loop over all branches
   8.107 +	QString s;
   8.108 +	QString actIndent("");
   8.109 +	int i;
   8.110 +	BranchObj *bo;
   8.111 +	bo=mapCenter->first();
   8.112 +	while (bo) 
   8.113 +	{
   8.114 +		// Make indentstring
   8.115 +		for (i=0;i<bo->getDepth();i++) actIndent+= indentPerDepth;
   8.116 +
   8.117 +		// Write heading
   8.118 +		write (actIndent + getSectionString(bo) + bo->getHeading()+ "\n");
   8.119 +		
   8.120 +		// If necessary, write note
   8.121 +		if (!bo->getNote().isEmpty())
   8.122 +		{
   8.123 +			write (bo->getNote());
   8.124 +		}
   8.125 +		
   8.126 +		bo=bo->next();
   8.127 +		actIndent="";
   8.128 +	}
   8.129 +}
   8.130 +
   8.131 +void Export::write(QString s)
   8.132 +{
   8.133 +	cout << s;
   8.134 +}
   8.135 +
     9.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.2 +++ b/exports.h	Sun Jan 30 12:58:47 2005 +0000
     9.3 @@ -0,0 +1,34 @@
     9.4 +#ifndef EXPORTS_H
     9.5 +#define EXPORTS_H
     9.6 +
     9.7 +#include <qdir.h>
     9.8 +#include <qstring.h>
     9.9 +#include <iostream>
    9.10 +
    9.11 +#include "mapcenterobj.h"
    9.12 +
    9.13 +using namespace std;
    9.14 +
    9.15 +/////////////////////////////////////////////////////////////////////////////
    9.16 +class Export
    9.17 +{
    9.18 +public:
    9.19 +	Export();
    9.20 +	bool setOutputDir (QString);
    9.21 +	void setPath(const QString &);
    9.22 +	void setMapCenter (MapCenterObj*);
    9.23 +	void setIndentPerDepth (QString);
    9.24 +	void exportMap();
    9.25 +	void exportAsHTML();
    9.26 +protected:  
    9.27 +	QString getSectionString (BranchObj*);
    9.28 +	void write (QString);
    9.29 +
    9.30 +private:
    9.31 +	QDir outdir;
    9.32 +	QString filepath;
    9.33 +	MapCenterObj *mapCenter;
    9.34 +	QString	indentPerDepth;
    9.35 +};
    9.36 +
    9.37 +#endif
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/exportxhtmldialog.ui	Sun Jan 30 12:58:47 2005 +0000
    10.3 @@ -0,0 +1,555 @@
    10.4 +<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
    10.5 +<class>ExportXHTMLDialog</class>
    10.6 +<widget class="QDialog">
    10.7 +    <property name="name">
    10.8 +        <cstring>ExportXHTMLDialog</cstring>
    10.9 +    </property>
   10.10 +    <property name="geometry">
   10.11 +        <rect>
   10.12 +            <x>0</x>
   10.13 +            <y>0</y>
   10.14 +            <width>582</width>
   10.15 +            <height>599</height>
   10.16 +        </rect>
   10.17 +    </property>
   10.18 +    <property name="minimumSize">
   10.19 +        <size>
   10.20 +            <width>0</width>
   10.21 +            <height>130</height>
   10.22 +        </size>
   10.23 +    </property>
   10.24 +    <property name="caption">
   10.25 +        <string>Export XHTML</string>
   10.26 +    </property>
   10.27 +    <vbox>
   10.28 +        <property name="name">
   10.29 +            <cstring>unnamed</cstring>
   10.30 +        </property>
   10.31 +        <widget class="QLayoutWidget">
   10.32 +            <property name="name">
   10.33 +                <cstring>layout33</cstring>
   10.34 +            </property>
   10.35 +            <hbox>
   10.36 +                <property name="name">
   10.37 +                    <cstring>unnamed</cstring>
   10.38 +                </property>
   10.39 +                <widget class="QLabel">
   10.40 +                    <property name="name">
   10.41 +                        <cstring>textLabel1</cstring>
   10.42 +                    </property>
   10.43 +                    <property name="text">
   10.44 +                        <string>Export to directory:</string>
   10.45 +                    </property>
   10.46 +                </widget>
   10.47 +                <widget class="QLineEdit">
   10.48 +                    <property name="name">
   10.49 +                        <cstring>lineEditDir</cstring>
   10.50 +                    </property>
   10.51 +                </widget>
   10.52 +                <widget class="QPushButton">
   10.53 +                    <property name="name">
   10.54 +                        <cstring>browseExportDirButton</cstring>
   10.55 +                    </property>
   10.56 +                    <property name="text">
   10.57 +                        <string>Browse</string>
   10.58 +                    </property>
   10.59 +                </widget>
   10.60 +            </hbox>
   10.61 +        </widget>
   10.62 +        <widget class="QButtonGroup">
   10.63 +            <property name="name">
   10.64 +                <cstring>buttonGroup2</cstring>
   10.65 +            </property>
   10.66 +            <property name="sizePolicy">
   10.67 +                <sizepolicy>
   10.68 +                    <hsizetype>3</hsizetype>
   10.69 +                    <vsizetype>3</vsizetype>
   10.70 +                    <horstretch>0</horstretch>
   10.71 +                    <verstretch>0</verstretch>
   10.72 +                </sizepolicy>
   10.73 +            </property>
   10.74 +            <property name="minimumSize">
   10.75 +                <size>
   10.76 +                    <width>0</width>
   10.77 +                    <height>160</height>
   10.78 +                </size>
   10.79 +            </property>
   10.80 +            <property name="title">
   10.81 +                <string>Options</string>
   10.82 +            </property>
   10.83 +            <vbox>
   10.84 +                <property name="name">
   10.85 +                    <cstring>unnamed</cstring>
   10.86 +                </property>
   10.87 +                <widget class="QCheckBox">
   10.88 +                    <property name="name">
   10.89 +                        <cstring>imageButton</cstring>
   10.90 +                    </property>
   10.91 +                    <property name="text">
   10.92 +                        <string>Include image</string>
   10.93 +                    </property>
   10.94 +                </widget>
   10.95 +                <widget class="QCheckBox">
   10.96 +                    <property name="name">
   10.97 +                        <cstring>textColorButton</cstring>
   10.98 +                    </property>
   10.99 +                    <property name="text">
  10.100 +                        <string>Colored headings in text</string>
  10.101 +                    </property>
  10.102 +                </widget>
  10.103 +                <widget class="QCheckBox">
  10.104 +                    <property name="name">
  10.105 +                        <cstring>saveSettingsInMapButton</cstring>
  10.106 +                    </property>
  10.107 +                    <property name="text">
  10.108 +                        <string>Save settings in map</string>
  10.109 +                    </property>
  10.110 +                </widget>
  10.111 +                <widget class="QCheckBox">
  10.112 +                    <property name="name">
  10.113 +                        <cstring>warningsButton</cstring>
  10.114 +                    </property>
  10.115 +                    <property name="text">
  10.116 +                        <string>showWarnings e.g. if directory is not empty</string>
  10.117 +                    </property>
  10.118 +                </widget>
  10.119 +                <widget class="QCheckBox">
  10.120 +                    <property name="name">
  10.121 +                        <cstring>outputButton</cstring>
  10.122 +                    </property>
  10.123 +                    <property name="sizePolicy">
  10.124 +                        <sizepolicy>
  10.125 +                            <hsizetype>1</hsizetype>
  10.126 +                            <vsizetype>0</vsizetype>
  10.127 +                            <horstretch>0</horstretch>
  10.128 +                            <verstretch>0</verstretch>
  10.129 +                        </sizepolicy>
  10.130 +                    </property>
  10.131 +                    <property name="text">
  10.132 +                        <string>show output of external scripts</string>
  10.133 +                    </property>
  10.134 +                </widget>
  10.135 +            </vbox>
  10.136 +        </widget>
  10.137 +        <widget class="QButtonGroup">
  10.138 +            <property name="name">
  10.139 +                <cstring>buttonGroup2_2</cstring>
  10.140 +            </property>
  10.141 +            <property name="sizePolicy">
  10.142 +                <sizepolicy>
  10.143 +                    <hsizetype>3</hsizetype>
  10.144 +                    <vsizetype>3</vsizetype>
  10.145 +                    <horstretch>0</horstretch>
  10.146 +                    <verstretch>0</verstretch>
  10.147 +                </sizepolicy>
  10.148 +            </property>
  10.149 +            <property name="title">
  10.150 +                <string>Stylesheets</string>
  10.151 +            </property>
  10.152 +            <widget class="QLayoutWidget">
  10.153 +                <property name="name">
  10.154 +                    <cstring>layout7</cstring>
  10.155 +                </property>
  10.156 +                <property name="geometry">
  10.157 +                    <rect>
  10.158 +                        <x>10</x>
  10.159 +                        <y>30</y>
  10.160 +                        <width>540</width>
  10.161 +                        <height>84</height>
  10.162 +                    </rect>
  10.163 +                </property>
  10.164 +                <vbox>
  10.165 +                    <property name="name">
  10.166 +                        <cstring>unnamed</cstring>
  10.167 +                    </property>
  10.168 +                    <widget class="QLayoutWidget">
  10.169 +                        <property name="name">
  10.170 +                            <cstring>layout5</cstring>
  10.171 +                        </property>
  10.172 +                        <hbox>
  10.173 +                            <property name="name">
  10.174 +                                <cstring>unnamed</cstring>
  10.175 +                            </property>
  10.176 +                            <widget class="QLabel">
  10.177 +                                <property name="name">
  10.178 +                                    <cstring>textLabel1_2</cstring>
  10.179 +                                </property>
  10.180 +                                <property name="text">
  10.181 +                                    <string>CSS:</string>
  10.182 +                                </property>
  10.183 +                            </widget>
  10.184 +                            <widget class="QLineEdit">
  10.185 +                                <property name="name">
  10.186 +                                    <cstring>lineEditCSS</cstring>
  10.187 +                                </property>
  10.188 +                            </widget>
  10.189 +                            <widget class="QPushButton">
  10.190 +                                <property name="name">
  10.191 +                                    <cstring>browseCSSButton</cstring>
  10.192 +                                </property>
  10.193 +                                <property name="text">
  10.194 +                                    <string>Browse</string>
  10.195 +                                </property>
  10.196 +                            </widget>
  10.197 +                        </hbox>
  10.198 +                    </widget>
  10.199 +                    <widget class="QLayoutWidget">
  10.200 +                        <property name="name">
  10.201 +                            <cstring>layout6</cstring>
  10.202 +                        </property>
  10.203 +                        <hbox>
  10.204 +                            <property name="name">
  10.205 +                                <cstring>unnamed</cstring>
  10.206 +                            </property>
  10.207 +                            <widget class="QLabel">
  10.208 +                                <property name="name">
  10.209 +                                    <cstring>textLabel2</cstring>
  10.210 +                                </property>
  10.211 +                                <property name="text">
  10.212 +                                    <string>XSL:</string>
  10.213 +                                </property>
  10.214 +                            </widget>
  10.215 +                            <widget class="QLineEdit">
  10.216 +                                <property name="name">
  10.217 +                                    <cstring>lineEditXSL</cstring>
  10.218 +                                </property>
  10.219 +                            </widget>
  10.220 +                            <widget class="QPushButton">
  10.221 +                                <property name="name">
  10.222 +                                    <cstring>browseXSLButton</cstring>
  10.223 +                                </property>
  10.224 +                                <property name="text">
  10.225 +                                    <string>Browse</string>
  10.226 +                                </property>
  10.227 +                            </widget>
  10.228 +                        </hbox>
  10.229 +                    </widget>
  10.230 +                </vbox>
  10.231 +            </widget>
  10.232 +        </widget>
  10.233 +        <widget class="QGroupBox">
  10.234 +            <property name="name">
  10.235 +                <cstring>groupBox1</cstring>
  10.236 +            </property>
  10.237 +            <property name="title">
  10.238 +                <string>Scripts</string>
  10.239 +            </property>
  10.240 +            <widget class="QLabel">
  10.241 +                <property name="name">
  10.242 +                    <cstring>textLabel1_3</cstring>
  10.243 +                </property>
  10.244 +                <property name="geometry">
  10.245 +                    <rect>
  10.246 +                        <x>12</x>
  10.247 +                        <y>22</y>
  10.248 +                        <width>110</width>
  10.249 +                        <height>36</height>
  10.250 +                    </rect>
  10.251 +                </property>
  10.252 +                <property name="text">
  10.253 +                    <string>Before export:</string>
  10.254 +                </property>
  10.255 +            </widget>
  10.256 +            <widget class="QLineEdit">
  10.257 +                <property name="name">
  10.258 +                    <cstring>lineEditPreScript</cstring>
  10.259 +                </property>
  10.260 +                <property name="geometry">
  10.261 +                    <rect>
  10.262 +                        <x>128</x>
  10.263 +                        <y>26</y>
  10.264 +                        <width>322</width>
  10.265 +                        <height>28</height>
  10.266 +                    </rect>
  10.267 +                </property>
  10.268 +            </widget>
  10.269 +            <widget class="QPushButton">
  10.270 +                <property name="name">
  10.271 +                    <cstring>browsePreExportButton</cstring>
  10.272 +                </property>
  10.273 +                <property name="geometry">
  10.274 +                    <rect>
  10.275 +                        <x>456</x>
  10.276 +                        <y>22</y>
  10.277 +                        <width>94</width>
  10.278 +                        <height>36</height>
  10.279 +                    </rect>
  10.280 +                </property>
  10.281 +                <property name="text">
  10.282 +                    <string>Browse</string>
  10.283 +                </property>
  10.284 +            </widget>
  10.285 +            <widget class="QLabel">
  10.286 +                <property name="name">
  10.287 +                    <cstring>textLabel2_2</cstring>
  10.288 +                </property>
  10.289 +                <property name="geometry">
  10.290 +                    <rect>
  10.291 +                        <x>11</x>
  10.292 +                        <y>61</y>
  10.293 +                        <width>99</width>
  10.294 +                        <height>36</height>
  10.295 +                    </rect>
  10.296 +                </property>
  10.297 +                <property name="text">
  10.298 +                    <string>After Export:</string>
  10.299 +                </property>
  10.300 +            </widget>
  10.301 +            <widget class="QLineEdit">
  10.302 +                <property name="name">
  10.303 +                    <cstring>lineEditPostScript</cstring>
  10.304 +                </property>
  10.305 +                <property name="geometry">
  10.306 +                    <rect>
  10.307 +                        <x>116</x>
  10.308 +                        <y>65</y>
  10.309 +                        <width>333</width>
  10.310 +                        <height>28</height>
  10.311 +                    </rect>
  10.312 +                </property>
  10.313 +            </widget>
  10.314 +            <widget class="QPushButton">
  10.315 +                <property name="name">
  10.316 +                    <cstring>browsePostExportButton</cstring>
  10.317 +                </property>
  10.318 +                <property name="geometry">
  10.319 +                    <rect>
  10.320 +                        <x>455</x>
  10.321 +                        <y>61</y>
  10.322 +                        <width>94</width>
  10.323 +                        <height>36</height>
  10.324 +                    </rect>
  10.325 +                </property>
  10.326 +                <property name="text">
  10.327 +                    <string>Browse</string>
  10.328 +                </property>
  10.329 +            </widget>
  10.330 +        </widget>
  10.331 +        <spacer>
  10.332 +            <property name="name">
  10.333 +                <cstring>spacer3</cstring>
  10.334 +            </property>
  10.335 +            <property name="orientation">
  10.336 +                <enum>Vertical</enum>
  10.337 +            </property>
  10.338 +            <property name="sizeType">
  10.339 +                <enum>Expanding</enum>
  10.340 +            </property>
  10.341 +            <property name="sizeHint">
  10.342 +                <size>
  10.343 +                    <width>20</width>
  10.344 +                    <height>31</height>
  10.345 +                </size>
  10.346 +            </property>
  10.347 +        </spacer>
  10.348 +        <widget class="QLayoutWidget">
  10.349 +            <property name="name">
  10.350 +                <cstring>layout17</cstring>
  10.351 +            </property>
  10.352 +            <hbox>
  10.353 +                <property name="name">
  10.354 +                    <cstring>unnamed</cstring>
  10.355 +                </property>
  10.356 +                <spacer>
  10.357 +                    <property name="name">
  10.358 +                        <cstring>spacer5</cstring>
  10.359 +                    </property>
  10.360 +                    <property name="orientation">
  10.361 +                        <enum>Horizontal</enum>
  10.362 +                    </property>
  10.363 +                    <property name="sizeType">
  10.364 +                        <enum>Expanding</enum>
  10.365 +                    </property>
  10.366 +                    <property name="sizeHint">
  10.367 +                        <size>
  10.368 +                            <width>61</width>
  10.369 +                            <height>21</height>
  10.370 +                        </size>
  10.371 +                    </property>
  10.372 +                </spacer>
  10.373 +                <widget class="QPushButton">
  10.374 +                    <property name="name">
  10.375 +                        <cstring>exportButton</cstring>
  10.376 +                    </property>
  10.377 +                    <property name="text">
  10.378 +                        <string>Export</string>
  10.379 +                    </property>
  10.380 +                    <property name="default">
  10.381 +                        <bool>true</bool>
  10.382 +                    </property>
  10.383 +                </widget>
  10.384 +                <widget class="QPushButton">
  10.385 +                    <property name="name">
  10.386 +                        <cstring>cancelButton</cstring>
  10.387 +                    </property>
  10.388 +                    <property name="text">
  10.389 +                        <string>Cancel</string>
  10.390 +                    </property>
  10.391 +                </widget>
  10.392 +            </hbox>
  10.393 +        </widget>
  10.394 +    </vbox>
  10.395 +</widget>
  10.396 +<connections>
  10.397 +    <connection>
  10.398 +        <sender>outputButton</sender>
  10.399 +        <signal>toggled(bool)</signal>
  10.400 +        <receiver>ExportXHTMLDialog</receiver>
  10.401 +        <slot>outputButtonPressed(bool)</slot>
  10.402 +    </connection>
  10.403 +    <connection>
  10.404 +        <sender>exportButton</sender>
  10.405 +        <signal>pressed()</signal>
  10.406 +        <receiver>ExportXHTMLDialog</receiver>
  10.407 +        <slot>accept()</slot>
  10.408 +    </connection>
  10.409 +    <connection>
  10.410 +        <sender>cancelButton</sender>
  10.411 +        <signal>pressed()</signal>
  10.412 +        <receiver>ExportXHTMLDialog</receiver>
  10.413 +        <slot>close()</slot>
  10.414 +    </connection>
  10.415 +    <connection>
  10.416 +        <sender>browseExportDirButton</sender>
  10.417 +        <signal>pressed()</signal>
  10.418 +        <receiver>ExportXHTMLDialog</receiver>
  10.419 +        <slot>browseDirectoryPressed()</slot>
  10.420 +    </connection>
  10.421 +    <connection>
  10.422 +        <sender>browseXSLButton</sender>
  10.423 +        <signal>pressed()</signal>
  10.424 +        <receiver>ExportXHTMLDialog</receiver>
  10.425 +        <slot>browseXSLPressed()</slot>
  10.426 +    </connection>
  10.427 +    <connection>
  10.428 +        <sender>browseCSSButton</sender>
  10.429 +        <signal>pressed()</signal>
  10.430 +        <receiver>ExportXHTMLDialog</receiver>
  10.431 +        <slot>browseCSSPressed()</slot>
  10.432 +    </connection>
  10.433 +    <connection>
  10.434 +        <sender>imageButton</sender>
  10.435 +        <signal>toggled(bool)</signal>
  10.436 +        <receiver>ExportXHTMLDialog</receiver>
  10.437 +        <slot>imageButtonPressed(bool)</slot>
  10.438 +    </connection>
  10.439 +    <connection>
  10.440 +        <sender>textColorButton</sender>
  10.441 +        <signal>toggled(bool)</signal>
  10.442 +        <receiver>ExportXHTMLDialog</receiver>
  10.443 +        <slot>textcolorButtonPressed(bool)</slot>
  10.444 +    </connection>
  10.445 +    <connection>
  10.446 +        <sender>lineEditDir</sender>
  10.447 +        <signal>textChanged(const QString&)</signal>
  10.448 +        <receiver>ExportXHTMLDialog</receiver>
  10.449 +        <slot>dirChanged()</slot>
  10.450 +    </connection>
  10.451 +    <connection>
  10.452 +        <sender>lineEditCSS</sender>
  10.453 +        <signal>textChanged(const QString&)</signal>
  10.454 +        <receiver>ExportXHTMLDialog</receiver>
  10.455 +        <slot>cssChanged()</slot>
  10.456 +    </connection>
  10.457 +    <connection>
  10.458 +        <sender>lineEditXSL</sender>
  10.459 +        <signal>textChanged(const QString&)</signal>
  10.460 +        <receiver>ExportXHTMLDialog</receiver>
  10.461 +        <slot>xslChanged()</slot>
  10.462 +    </connection>
  10.463 +    <connection>
  10.464 +        <sender>browsePreExportButton</sender>
  10.465 +        <signal>pressed()</signal>
  10.466 +        <receiver>ExportXHTMLDialog</receiver>
  10.467 +        <slot>browsePreExportButtonPressed()</slot>
  10.468 +    </connection>
  10.469 +    <connection>
  10.470 +        <sender>browsePostExportButton</sender>
  10.471 +        <signal>pressed()</signal>
  10.472 +        <receiver>ExportXHTMLDialog</receiver>
  10.473 +        <slot>browsePostExportButtonPressed()</slot>
  10.474 +    </connection>
  10.475 +    <connection>
  10.476 +        <sender>lineEditPreScript</sender>
  10.477 +        <signal>textChanged(const QString&)</signal>
  10.478 +        <receiver>ExportXHTMLDialog</receiver>
  10.479 +        <slot>prescriptChanged()</slot>
  10.480 +    </connection>
  10.481 +    <connection>
  10.482 +        <sender>lineEditPostScript</sender>
  10.483 +        <signal>textChanged(const QString&)</signal>
  10.484 +        <receiver>ExportXHTMLDialog</receiver>
  10.485 +        <slot>postscriptChanged()</slot>
  10.486 +    </connection>
  10.487 +    <connection>
  10.488 +        <sender>warningsButton</sender>
  10.489 +        <signal>toggled(bool)</signal>
  10.490 +        <receiver>ExportXHTMLDialog</receiver>
  10.491 +        <slot>warningsButtonPressed(bool)</slot>
  10.492 +    </connection>
  10.493 +    <connection>
  10.494 +        <sender>saveSettingsInMapButton</sender>
  10.495 +        <signal>toggled(bool)</signal>
  10.496 +        <receiver>ExportXHTMLDialog</receiver>
  10.497 +        <slot>saveSettingsInMapButtonPressed(bool)</slot>
  10.498 +    </connection>
  10.499 +</connections>
  10.500 +<includes>
  10.501 +    <include location="local" impldecl="in declaration">process.h</include>
  10.502 +    <include location="local" impldecl="in declaration">showtextdialog.h</include>
  10.503 +    <include location="global" impldecl="in implementation">qfiledialog.h</include>
  10.504 +    <include location="global" impldecl="in implementation">qmessagebox.h</include>
  10.505 +    <include location="local" impldecl="in implementation">settings.h</include>
  10.506 +    <include location="local" impldecl="in implementation">icons/flag-url.xpm</include>
  10.507 +    <include location="local" impldecl="in implementation">exportxhtmldialog.ui.h</include>
  10.508 +</includes>
  10.509 +<variables>
  10.510 +    <variable>bool useTextColor;</variable>
  10.511 +    <variable>bool showWarnings;</variable>
  10.512 +    <variable>QString xsl;</variable>
  10.513 +    <variable>QString css;</variable>
  10.514 +    <variable>bool useImage;</variable>
  10.515 +    <variable>bool showOutput;</variable>
  10.516 +    <variable>Process *xsltProc;</variable>
  10.517 +    <variable>ShowTextDialog *dia;</variable>
  10.518 +    <variable>QString dir;</variable>
  10.519 +    <variable>QString xsltprocessor;</variable>
  10.520 +    <variable>QString filepath;</variable>
  10.521 +    <variable>QString prescript;</variable>
  10.522 +    <variable>QString postscript;</variable>
  10.523 +    <variable>bool settingsChanged;</variable>
  10.524 +    <variable>QString mapname;</variable>
  10.525 +    <variable>bool saveSettingsInMap;</variable>
  10.526 +</variables>
  10.527 +<slots>
  10.528 +    <slot>readSettings()</slot>
  10.529 +    <slot>dirChanged()</slot>
  10.530 +    <slot>browseDirectoryPressed()</slot>
  10.531 +    <slot>imageButtonPressed( bool b )</slot>
  10.532 +    <slot>textcolorButtonPressed( bool b )</slot>
  10.533 +    <slot>saveSettingsInMapButtonPressed( bool b )</slot>
  10.534 +    <slot>warningsButtonPressed( bool b )</slot>
  10.535 +    <slot>outputButtonPressed( bool b )</slot>
  10.536 +    <slot>cssChanged()</slot>
  10.537 +    <slot>browseCSSPressed()</slot>
  10.538 +    <slot>xslChanged()</slot>
  10.539 +    <slot>prescriptChanged()</slot>
  10.540 +    <slot>browseXSLPressed()</slot>
  10.541 +    <slot>postscriptChanged()</slot>
  10.542 +    <slot>browsePreExportButtonPressed()</slot>
  10.543 +    <slot>browsePostExportButtonPressed()</slot>
  10.544 +    <slot>doExport( const QString & mapname )</slot>
  10.545 +    <slot>setFilePath( const QString & s )</slot>
  10.546 +    <slot>setMapName( const QString & s )</slot>
  10.547 +</slots>
  10.548 +<functions>
  10.549 +    <function access="private" specifier="non virtual">init()</function>
  10.550 +    <function access="private" specifier="non virtual">destroy()</function>
  10.551 +    <function returnType="QString">getDir()</function>
  10.552 +    <function returnType="bool">warnings()</function>
  10.553 +    <function returnType="bool">hasChanged()</function>
  10.554 +    <function access="private" specifier="non virtual">runScript( QString spath, QString fpath )</function>
  10.555 +</functions>
  10.556 +<pixmapinproject/>
  10.557 +<layoutdefaults spacing="6" margin="11"/>
  10.558 +</UI>
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/exportxhtmldialog.ui.h	Sun Jan 30 12:58:47 2005 +0000
    11.3 @@ -0,0 +1,412 @@
    11.4 +/****************************************************************************
    11.5 +** ui.h extension file, included from the uic-generated form implementation.
    11.6 +**
    11.7 +** If you wish to add, delete or rename functions or slots use
    11.8 +** Qt Designer which will update this file, preserving your code. Create an
    11.9 +** init() function in place of a constructor, and a destroy() function in
   11.10 +** place of a destructor.
   11.11 +*****************************************************************************/
   11.12 +
   11.13 +
   11.14 +extern Settings settings;
   11.15 +
   11.16 +void ExportXHTMLDialog::init()
   11.17 +{
   11.18 +	dia=new ShowTextDialog ();
   11.19 +	xsltprocessor="xsltproc";
   11.20 +	filepath="";
   11.21 +	settingsChanged=false;
   11.22 +}
   11.23 +
   11.24 +void ExportXHTMLDialog::readSettings()
   11.25 +{
   11.26 +
   11.27 +	dir=settings.readLocalEntry (filepath,"/vym/export/xhtml/exportDir","./" );
   11.28 +	lineEditDir->setText(dir);
   11.29 +	
   11.30 +	
   11.31 +    if ( settings.readLocalEntry (filepath,"/vym/export/xhtml/useImage","yes")=="yes")
   11.32 +		useImage=true;
   11.33 +	else	
   11.34 +		useImage=false;
   11.35 +	imageButton->setChecked(useImage);
   11.36 +		
   11.37 +	if ( settings.readLocalEntry (filepath,"/vym/export/xhtml/useTextColor","no")=="yes")
   11.38 +		useTextColor=true;
   11.39 +	else	
   11.40 +		useTextColor=false;
   11.41 +	textColorButton->setChecked(useTextColor);
   11.42 +	
   11.43 +/* FIXME this was used in old html export, is not yet in new stylesheet
   11.44 +	if ( settings.readEntry ("/vym/export/html/useHeading","no")=="yes")
   11.45 +		useHeading=true;
   11.46 +	else	
   11.47 +		useHeading=false;
   11.48 +	checkBox4_2->setChecked(useHeading);
   11.49 +*/		
   11.50 +
   11.51 +	if ( settings.readLocalEntry (filepath,"/vym/export/xhtml/saveSettingsInMap","no")=="yes")
   11.52 +		saveSettingsInMap=true;
   11.53 +	else	
   11.54 +		saveSettingsInMap=false;
   11.55 +	saveSettingsInMapButton->setChecked(saveSettingsInMap);
   11.56 +
   11.57 +	if ( settings.readEntry ("/vym/export/xhtml/showWarnings","yes")=="yes")
   11.58 +		showWarnings=true;
   11.59 +	else	
   11.60 +		showWarnings=false;
   11.61 +	warningsButton->setChecked(showWarnings);
   11.62 +	
   11.63 +	if ( settings.readEntry ("/vym/export/xhtml/showOutput","no")=="yes")
   11.64 +		showOutput=true;
   11.65 +	else	
   11.66 +		showOutput=false;
   11.67 +	outputButton->setChecked(showOutput);
   11.68 +
   11.69 +	xsl=settings.readLocalEntry 
   11.70 +		(filepath,"/vym/export/xhtml/xsl","/usr/share/vym/styles/vym2xhtml.xsl");
   11.71 +	lineEditXSL->setText(xsl);
   11.72 +	
   11.73 +	css=settings.readLocalEntry 
   11.74 +		(filepath,"/vym/export/xhtml/css","/usr/share/vym/styles/vym.css");	
   11.75 +	lineEditCSS->setText(css);
   11.76 +	
   11.77 +	prescript=settings.readLocalEntry
   11.78 +		(filepath,"/vym/export/xhtml/prescript","");
   11.79 +	lineEditPreScript->setText (prescript);	
   11.80 +	
   11.81 +	postscript=settings.readLocalEntry
   11.82 +		(filepath,"/vym/export/xhtml/postscript","");
   11.83 +	lineEditPostScript->setText (postscript);	
   11.84 +
   11.85 +	if (!prescript.isEmpty() || !postscript.isEmpty())
   11.86 +	{
   11.87 +		QMessageBox::warning( 0, tr( "Warning" ),tr(
   11.88 +		"The settings saved in the map "
   11.89 +		"would like to run scripts:\n\n") +
   11.90 +		prescript +"  "+postscript +"\n\n"+
   11.91 +		tr("Please check, if you really\n"
   11.92 +		"want to allow this in your system!"));
   11.93 +		
   11.94 +	}
   11.95 +}
   11.96 +
   11.97 +void ExportXHTMLDialog::destroy()
   11.98 +{
   11.99 +	delete (dia);
  11.100 +}
  11.101 +
  11.102 +void ExportXHTMLDialog::dirChanged()
  11.103 +{
  11.104 +	dir=lineEditDir->text();
  11.105 +	if (dir.right(1)!="/")
  11.106 +		dir+="/";
  11.107 +	settingsChanged=true;
  11.108 +}
  11.109 +
  11.110 +void ExportXHTMLDialog::browseDirectoryPressed()
  11.111 +{
  11.112 +   	QFileDialog fd( this, tr("VYM - Export HTML to directory"));
  11.113 +	fd.setMode (QFileDialog::DirectoryOnly);
  11.114 +	fd.setCaption(tr("VYM - Export HTML to directory"));
  11.115 +	fd.setModal (true);
  11.116 +	fd.show();
  11.117 +
  11.118 +	if ( fd.exec() == QDialog::Accepted )
  11.119 +	{
  11.120 +		dir=fd.selectedFile();
  11.121 +		lineEditDir->setText (dir );
  11.122 +		settingsChanged=true;
  11.123 +	}
  11.124 +}
  11.125 +
  11.126 +void ExportXHTMLDialog::imageButtonPressed(bool b)
  11.127 +{
  11.128 +	useImage=b;
  11.129 +	settingsChanged=true;
  11.130 +}
  11.131 +
  11.132 +void ExportXHTMLDialog::textcolorButtonPressed(bool b)
  11.133 +{
  11.134 +	useTextColor=b;	
  11.135 +	settingsChanged=true;
  11.136 +}
  11.137 +
  11.138 +void ExportXHTMLDialog::saveSettingsInMapButtonPressed(bool b)
  11.139 +{
  11.140 +	saveSettingsInMap=b;	
  11.141 +	settingsChanged=true;
  11.142 +}
  11.143 +
  11.144 +void ExportXHTMLDialog::warningsButtonPressed(bool b)
  11.145 +{
  11.146 +	showWarnings=b;
  11.147 +	settingsChanged=true;
  11.148 +}
  11.149 +
  11.150 +
  11.151 +void ExportXHTMLDialog::outputButtonPressed(bool b)
  11.152 +{
  11.153 +	showOutput=b;
  11.154 +	settingsChanged=true;
  11.155 +}
  11.156 +
  11.157 +void ExportXHTMLDialog::cssChanged()
  11.158 +{
  11.159 +	css=lineEditCSS->text();
  11.160 +	settingsChanged=true;
  11.161 +}
  11.162 +
  11.163 +void ExportXHTMLDialog::browseCSSPressed()
  11.164 +{
  11.165 +   	QFileDialog fd( this, tr("VYM - Path to CSS file"));
  11.166 +	fd.setModal (true);
  11.167 +	fd.addFilter ("Cascading Stylesheet (*.css)");
  11.168 +	fd.show();
  11.169 +
  11.170 +	if ( fd.exec() == QDialog::Accepted )
  11.171 +	{
  11.172 +		css=fd.selectedFile();
  11.173 +		lineEditCSS->setText (css );
  11.174 +		settingsChanged=true;
  11.175 +	}
  11.176 +}
  11.177 +
  11.178 +void ExportXHTMLDialog::xslChanged()
  11.179 +{
  11.180 +	xsl=lineEditXSL->text();
  11.181 +	settingsChanged=true;
  11.182 +}
  11.183 +
  11.184 +void ExportXHTMLDialog::prescriptChanged()
  11.185 +{
  11.186 +	prescript=lineEditPreScript->text();
  11.187 +	settingsChanged=true;
  11.188 +}
  11.189 +
  11.190 +void ExportXHTMLDialog::browseXSLPressed()
  11.191 +{
  11.192 +   	QFileDialog fd( this, tr("VYM - Path to XSL file"));
  11.193 +	fd.setModal (true);
  11.194 +	fd.addFilter ("Extensible Styleshee Language (*.xsl)");
  11.195 +	fd.show();
  11.196 +
  11.197 +	if ( fd.exec() == QDialog::Accepted )
  11.198 +	{
  11.199 +		xsl=fd.selectedFile();
  11.200 +		lineEditXSL->setText (xsl );
  11.201 +		settingsChanged=true;
  11.202 +	}
  11.203 +}
  11.204 +
  11.205 +void ExportXHTMLDialog::postscriptChanged()
  11.206 +{
  11.207 +	postscript=lineEditPostScript->text();
  11.208 +	settingsChanged=true;
  11.209 +}
  11.210 +
  11.211 +void ExportXHTMLDialog::browsePreExportButtonPressed()
  11.212 +{
  11.213 +	QFileDialog fd( this, tr("VYM - Path to pre export script"));
  11.214 +	fd.setModal (true);
  11.215 +	fd.addFilter ("Scripts (*.sh *.pl *.py *.php)");
  11.216 +	fd.show();
  11.217 +
  11.218 +	if ( fd.exec() == QDialog::Accepted )
  11.219 +	{
  11.220 +		prescript=fd.selectedFile();
  11.221 +		lineEditPreScript->setText (prescript );
  11.222 +		settingsChanged=true;
  11.223 +	}
  11.224 +
  11.225 +}
  11.226 +
  11.227 +void ExportXHTMLDialog::browsePostExportButtonPressed()
  11.228 +{
  11.229 +	QFileDialog fd( this, tr("VYM - Path to post export script"));
  11.230 +	fd.setModal (true);
  11.231 +	fd.addFilter ("Scripts (*.sh *.pl *.py *.php)");
  11.232 +	fd.show();
  11.233 +
  11.234 +	if ( fd.exec() == QDialog::Accepted )
  11.235 +	{
  11.236 +		postscript=fd.selectedFile();
  11.237 +		lineEditPostScript->setText (postscript );
  11.238 +		settingsChanged=true;
  11.239 +	}
  11.240 +}
  11.241 +
  11.242 +
  11.243 +void ExportXHTMLDialog::doExport (const QString &mapname)
  11.244 +{
  11.245 +	// Save options to settings file 
  11.246 +	// (but don't save at destructor, which
  11.247 +	// is called for "cancel", too)
  11.248 +	settings.setLocalEntry (filepath,"/vym/export/xhtml/exportDir",dir);
  11.249 +
  11.250 +	settings.setLocalEntry (filepath,"/vym/export/xhtml/prescript",prescript);
  11.251 +	settings.setLocalEntry (filepath,"/vym/export/xhtml/postscript",postscript);
  11.252 +
  11.253 +    if (useImage)
  11.254 +		settings.setLocalEntry (filepath,"/vym/export/xhtml/useImage","yes");
  11.255 +    else
  11.256 +		settings.setLocalEntry (filepath,"/vym/export/xhtml/useImage","no");	
  11.257 +	
  11.258 +  if (useTextColor)
  11.259 +		settings.setLocalEntry (filepath,"/vym/export/xhtml/useTextColor","yes");
  11.260 +    else
  11.261 +		settings.setLocalEntry (filepath,"/vym/export/xhtml/useTextColor","no");	
  11.262 +	
  11.263 +   if (showWarnings)
  11.264 +		settings.writeEntry ("/vym/export/xhtml/showWarnings","yes");
  11.265 +    else
  11.266 +		settings.writeEntry ("/vym/export/xhtml/showWarnings","no");	
  11.267 +			
  11.268 +	if (showOutput)
  11.269 +		settings.writeEntry ("/vym/export/xhtml/showOutput","yes");
  11.270 +	else
  11.271 +		settings.writeEntry ("/vym/export/xhtml/showOutput","no");	
  11.272 +		
  11.273 +	settings.setLocalEntry 
  11.274 +		(filepath,"/vym/export/xhtml/xsl",xsl);
  11.275 +	settings.setLocalEntry 
  11.276 +		(filepath,"/vym/export/xhtml/css",css);	
  11.277 +
  11.278 +	//FIXME add option for url image (globe flag) here	
  11.279 +	if (true) 
  11.280 +	{	
  11.281 +		QPixmap pm (flag_url_xpm);
  11.282 +		pm.save (dir + "/flags/url.png","PNG");
  11.283 +	}
  11.284 +
  11.285 +	if (!saveSettingsInMap)
  11.286 +		settings.clearLocal("/vym/export/xhtml");
  11.287 +	else	
  11.288 +		settings.setLocalEntry 
  11.289 +			(filepath,"/vym/export/xhtml/saveSettingsInMap","yes");
  11.290 +
  11.291 +	// Copy CSS file
  11.292 +	QFile css_src (css);
  11.293 +	QFile css_dst (dir+"vym.css");
  11.294 +	if (!css_src.open ( IO_ReadOnly))
  11.295 +		QMessageBox::warning( 0, tr( "Warning" ),css +tr(" could not be opened!"));
  11.296 +	else
  11.297 +	{
  11.298 +		if (!css_dst.open( IO_WriteOnly))
  11.299 +			QMessageBox::warning( 0, tr( "Warning" ), dir+"vym.css" +tr(" could not be opened!"));
  11.300 +		else
  11.301 +		{	
  11.302 +		
  11.303 +			QTextStream tsout( &css_dst);
  11.304 +			QTextStream tsin ( &css_src);
  11.305 +			QString s= tsin.read();
  11.306 +			tsout << s;
  11.307 +			css_dst.close();
  11.308 +		}	
  11.309 +		css_src.close();
  11.310 +	}
  11.311 +
  11.312 +	if (!prescript.isEmpty()) runScript (prescript,dir+mapname+".xml");
  11.313 +	
  11.314 +	Process *xsltProc=new Process ();
  11.315 +	xsltProc->clearArguments();
  11.316 +	xsltProc->addArgument (xsltprocessor);	
  11.317 +	if (useImage)
  11.318 +	{
  11.319 +		xsltProc->addArgument ("--stringparam");
  11.320 +		xsltProc->addArgument ("imagemap");
  11.321 +		xsltProc->addArgument ("images/"+mapname+".png");
  11.322 +	}	
  11.323 +	if (useTextColor)
  11.324 +	{
  11.325 +		xsltProc->addArgument ("--stringparam");
  11.326 +		xsltProc->addArgument ("use.textcolor");
  11.327 +		xsltProc->addArgument ("1");
  11.328 +	}	
  11.329 +	xsltProc->addArgument ("--stringparam");
  11.330 +	xsltProc->addArgument ("mapname");
  11.331 +	xsltProc->addArgument (mapname+".vym");
  11.332 +	
  11.333 +	xsltProc->addArgument ("--output");
  11.334 +	xsltProc->addArgument (dir+mapname+".html");
  11.335 +	xsltProc->addArgument (xsl);
  11.336 +	xsltProc->addArgument (dir+mapname+".xml");
  11.337 +	dia->append ("vym is executing: \n" + xsltProc->arguments().join(" ") );	
  11.338 +	if (!xsltProc->start() )
  11.339 +	{
  11.340 +		QMessageBox::critical( 0, tr( "Critical Error" ),
  11.341 +					   tr("Couldn't start ") + xsltprocessor );
  11.342 +	} else
  11.343 +	{
  11.344 +		xsltProc->waitFinished();
  11.345 +		if (!xsltProc->normalExit() )
  11.346 +			QMessageBox::critical( 0, tr( "Critical Error" ),
  11.347 +			   xsltprocessor +" " +tr("didn't exit normally") +
  11.348 +			   xsltProc->getErrout() );
  11.349 +		else
  11.350 +			if (xsltProc->exitStatus()>0) showOutput=true;
  11.351 +			
  11.352 +	}	
  11.353 +	dia->append ("\n");
  11.354 +	dia->append (xsltProc->getErrout());
  11.355 +	dia->append (xsltProc->getStdout());
  11.356 +	
  11.357 +	if (!postscript.isEmpty()) runScript (postscript,dir+mapname+".html");
  11.358 +
  11.359 +	if (showOutput) dia->exec();
  11.360 +}
  11.361 +
  11.362 +void ExportXHTMLDialog::setFilePath(const QString &s)
  11.363 +{
  11.364 +	filepath=s;
  11.365 +}
  11.366 +
  11.367 +void ExportXHTMLDialog::setMapName(const QString &s)
  11.368 +{
  11.369 +	mapname=s;
  11.370 +}
  11.371 +
  11.372 +QString ExportXHTMLDialog::getDir()
  11.373 +{
  11.374 +	return dir;
  11.375 +}
  11.376 +
  11.377 +bool ExportXHTMLDialog::warnings()
  11.378 +{
  11.379 +	return showWarnings;
  11.380 +}
  11.381 +
  11.382 +bool ExportXHTMLDialog::hasChanged()
  11.383 +{
  11.384 +	return settingsChanged;
  11.385 +}
  11.386 +
  11.387 +
  11.388 +void ExportXHTMLDialog::runScript(QString spath, QString fpath)
  11.389 +{
  11.390 +	spath.replace ("%f",fpath);
  11.391 +	QStringList args=QStringList::split (' ',spath,false);
  11.392 +		
  11.393 +	Process *scriptProc=new Process ();
  11.394 +	scriptProc->clearArguments();
  11.395 +	scriptProc->setArguments (args);	
  11.396 +	dia->append ("vym is executing: \n" + scriptProc->arguments().join(" ") );	
  11.397 +	if (!scriptProc->start() )
  11.398 +	{
  11.399 +		QMessageBox::critical( 0, tr( "Critical Error" ),
  11.400 +					   tr("Couldn't start ") + spath );
  11.401 +	} else
  11.402 +	{
  11.403 +		scriptProc->waitFinished();
  11.404 +		if (!scriptProc->normalExit() )
  11.405 +			QMessageBox::critical( 0, tr( "Critical Error" ),
  11.406 +			   spath +" " +tr("didn't exit normally") +
  11.407 +			   scriptProc->getErrout() );
  11.408 +		else
  11.409 +			if (scriptProc->exitStatus()>0) showOutput=true;
  11.410 +			
  11.411 +	}	
  11.412 +	dia->append ("\n");
  11.413 +	dia->append (scriptProc->getErrout());
  11.414 +	dia->append (scriptProc->getStdout());
  11.415 +}
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/extrainfodialog.ui	Sun Jan 30 12:58:47 2005 +0000
    12.3 @@ -0,0 +1,204 @@
    12.4 +<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
    12.5 +<class>ExtraInfoDialog</class>
    12.6 +<author>Uwe Drechsel</author>
    12.7 +<widget class="QDialog">
    12.8 +    <property name="name">
    12.9 +        <cstring>ExtraInfoDialog</cstring>
   12.10 +    </property>
   12.11 +    <property name="geometry">
   12.12 +        <rect>
   12.13 +            <x>0</x>
   12.14 +            <y>0</y>
   12.15 +            <width>338</width>
   12.16 +            <height>410</height>
   12.17 +        </rect>
   12.18 +    </property>
   12.19 +    <property name="caption">
   12.20 +        <string>VYM - Info</string>
   12.21 +    </property>
   12.22 +    <vbox>
   12.23 +        <property name="name">
   12.24 +            <cstring>unnamed</cstring>
   12.25 +        </property>
   12.26 +        <widget class="QLabel">
   12.27 +            <property name="name">
   12.28 +                <cstring>textLabel1_2</cstring>
   12.29 +            </property>
   12.30 +            <property name="text">
   12.31 +                <string>Map:</string>
   12.32 +            </property>
   12.33 +        </widget>
   12.34 +        <widget class="QLineEdit">
   12.35 +            <property name="name">
   12.36 +                <cstring>lineEdit7</cstring>
   12.37 +            </property>
   12.38 +            <property name="paletteBackgroundColor">
   12.39 +                <color>
   12.40 +                    <red>225</red>
   12.41 +                    <green>225</green>
   12.42 +                    <blue>225</blue>
   12.43 +                </color>
   12.44 +            </property>
   12.45 +            <property name="backgroundOrigin">
   12.46 +                <enum>WidgetOrigin</enum>
   12.47 +            </property>
   12.48 +            <property name="readOnly">
   12.49 +                <bool>true</bool>
   12.50 +            </property>
   12.51 +        </widget>
   12.52 +        <widget class="QLabel">
   12.53 +            <property name="name">
   12.54 +                <cstring>textLabel1</cstring>
   12.55 +            </property>
   12.56 +            <property name="text">
   12.57 +                <string>Author:</string>
   12.58 +            </property>
   12.59 +        </widget>
   12.60 +        <widget class="QLineEdit">
   12.61 +            <property name="name">
   12.62 +                <cstring>lineEdit2</cstring>
   12.63 +            </property>
   12.64 +        </widget>
   12.65 +        <widget class="QLabel">
   12.66 +            <property name="name">
   12.67 +                <cstring>textLabel2</cstring>
   12.68 +            </property>
   12.69 +            <property name="text">
   12.70 +                <string>Comment:</string>
   12.71 +            </property>
   12.72 +        </widget>
   12.73 +        <widget class="QTextEdit">
   12.74 +            <property name="name">
   12.75 +                <cstring>textEdit4</cstring>
   12.76 +            </property>
   12.77 +            <property name="sizePolicy">
   12.78 +                <sizepolicy>
   12.79 +                    <hsizetype>7</hsizetype>
   12.80 +                    <vsizetype>4</vsizetype>
   12.81 +                    <horstretch>0</horstretch>
   12.82 +                    <verstretch>0</verstretch>
   12.83 +                </sizepolicy>
   12.84 +            </property>
   12.85 +            <property name="maximumSize">
   12.86 +                <size>
   12.87 +                    <width>32767</width>
   12.88 +                    <height>76</height>
   12.89 +                </size>
   12.90 +            </property>
   12.91 +        </widget>
   12.92 +        <widget class="QLabel">
   12.93 +            <property name="name">
   12.94 +                <cstring>textLabel2_2</cstring>
   12.95 +            </property>
   12.96 +            <property name="text">
   12.97 +                <string>Statistics:</string>
   12.98 +            </property>
   12.99 +        </widget>
  12.100 +        <widget class="QTextEdit">
  12.101 +            <property name="name">
  12.102 +                <cstring>textEdit4_2</cstring>
  12.103 +            </property>
  12.104 +            <property name="paletteBackgroundColor">
  12.105 +                <color>
  12.106 +                    <red>225</red>
  12.107 +                    <green>225</green>
  12.108 +                    <blue>225</blue>
  12.109 +                </color>
  12.110 +            </property>
  12.111 +            <property name="font">
  12.112 +                <font>
  12.113 +                    <family>Courier</family>
  12.114 +                    <pointsize>12</pointsize>
  12.115 +                </font>
  12.116 +            </property>
  12.117 +            <property name="textFormat">
  12.118 +                <enum>PlainText</enum>
  12.119 +            </property>
  12.120 +            <property name="readOnly">
  12.121 +                <bool>true</bool>
  12.122 +            </property>
  12.123 +        </widget>
  12.124 +        <widget class="QLayoutWidget">
  12.125 +            <property name="name">
  12.126 +                <cstring>layout21</cstring>
  12.127 +            </property>
  12.128 +            <hbox>
  12.129 +                <property name="name">
  12.130 +                    <cstring>unnamed</cstring>
  12.131 +                </property>
  12.132 +                <spacer>
  12.133 +                    <property name="name">
  12.134 +                        <cstring>spacer10</cstring>
  12.135 +                    </property>
  12.136 +                    <property name="orientation">
  12.137 +                        <enum>Horizontal</enum>
  12.138 +                    </property>
  12.139 +                    <property name="sizeType">
  12.140 +                        <enum>Expanding</enum>
  12.141 +                    </property>
  12.142 +                    <property name="sizeHint">
  12.143 +                        <size>
  12.144 +                            <width>160</width>
  12.145 +                            <height>21</height>
  12.146 +                        </size>
  12.147 +                    </property>
  12.148 +                </spacer>
  12.149 +                <widget class="QPushButton">
  12.150 +                    <property name="name">
  12.151 +                        <cstring>pushButton13</cstring>
  12.152 +                    </property>
  12.153 +                    <property name="text">
  12.154 +                        <string>Cancel</string>
  12.155 +                    </property>
  12.156 +                </widget>
  12.157 +                <widget class="QPushButton">
  12.158 +                    <property name="name">
  12.159 +                        <cstring>pushButton7</cstring>
  12.160 +                    </property>
  12.161 +                    <property name="text">
  12.162 +                        <string>Close</string>
  12.163 +                    </property>
  12.164 +                </widget>
  12.165 +            </hbox>
  12.166 +        </widget>
  12.167 +    </vbox>
  12.168 +</widget>
  12.169 +<connections>
  12.170 +    <connection>
  12.171 +        <sender>pushButton7</sender>
  12.172 +        <signal>clicked()</signal>
  12.173 +        <receiver>ExtraInfoDialog</receiver>
  12.174 +        <slot>accept()</slot>
  12.175 +    </connection>
  12.176 +    <connection>
  12.177 +        <sender>pushButton13</sender>
  12.178 +        <signal>clicked()</signal>
  12.179 +        <receiver>ExtraInfoDialog</receiver>
  12.180 +        <slot>reject()</slot>
  12.181 +    </connection>
  12.182 +</connections>
  12.183 +<tabstops>
  12.184 +    <tabstop>lineEdit2</tabstop>
  12.185 +    <tabstop>textEdit4</tabstop>
  12.186 +    <tabstop>pushButton7</tabstop>
  12.187 +    <tabstop>pushButton13</tabstop>
  12.188 +    <tabstop>lineEdit7</tabstop>
  12.189 +    <tabstop>textEdit4_2</tabstop>
  12.190 +</tabstops>
  12.191 +<includes>
  12.192 +    <include location="global" impldecl="in implementation">qstring.h</include>
  12.193 +    <include location="local" impldecl="in implementation">extrainfodialog.ui.h</include>
  12.194 +</includes>
  12.195 +<slots>
  12.196 +    <slot>setMapName( const QString & s )</slot>
  12.197 +    <slot>setComment( const QString & s )</slot>
  12.198 +    <slot>setAuthor( const QString & s )</slot>
  12.199 +</slots>
  12.200 +<functions>
  12.201 +    <function returnType="QString">getComment()</function>
  12.202 +    <function returnType="QString">getAuthor()</function>
  12.203 +    <function>setStats( const QString & s )</function>
  12.204 +</functions>
  12.205 +<pixmapinproject/>
  12.206 +<layoutdefaults spacing="6" margin="11"/>
  12.207 +</UI>
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/extrainfodialog.ui.h	Sun Jan 30 12:58:47 2005 +0000
    13.3 @@ -0,0 +1,39 @@
    13.4 +/****************************************************************************
    13.5 +** ui.h extension file, included from the uic-generated form implementation.
    13.6 +**
    13.7 +** If you wish to add, delete or rename functions or slots use
    13.8 +** Qt Designer which will update this file, preserving your code. Create an
    13.9 +** init() function in place of a constructor, and a destroy() function in
   13.10 +** place of a destructor.
   13.11 +*****************************************************************************/
   13.12 +
   13.13 +void ExtraInfoDialog::setMapName(const QString &s)
   13.14 +{
   13.15 +	lineEdit7->setText (s);
   13.16 +}
   13.17 +
   13.18 +void ExtraInfoDialog::setComment (const QString &s)
   13.19 +{
   13.20 +	textEdit4->setText (s);
   13.21 +}
   13.22 +
   13.23 +QString ExtraInfoDialog::getComment()
   13.24 +{
   13.25 +	return textEdit4->text();
   13.26 +}	
   13.27 +
   13.28 +
   13.29 +void ExtraInfoDialog::setAuthor(const QString &s)
   13.30 +{
   13.31 +	lineEdit2->setText (s);
   13.32 +}
   13.33 +
   13.34 +QString ExtraInfoDialog::getAuthor()
   13.35 +{
   13.36 +	return lineEdit2->text();
   13.37 +}
   13.38 +
   13.39 +void ExtraInfoDialog::setStats(const QString &s)
   13.40 +{
   13.41 +	textEdit4_2->setText (s);
   13.42 +}
    14.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.2 +++ b/findwindow.cpp	Sun Jan 30 12:58:47 2005 +0000
    14.3 @@ -0,0 +1,85 @@
    14.4 +#include <qlineedit.h>
    14.5 +
    14.6 +#include "findwindow.h"
    14.7 +
    14.8 +
    14.9 +FindWindow::FindWindow(QWidget* parent, const char* name, WFlags f) 
   14.10 +	: QGroupBox( 0, Horizontal, "Find", parent, name )
   14.11 +
   14.12 +{
   14.13 +	setCaption ("VYM - Find Text");
   14.14 +	//resize (180,130);
   14.15 +	move (130,130);
   14.16 +
   14.17 +	setMargin( 100 );
   14.18 +
   14.19 +    QVBoxLayout* box = new QVBoxLayout( layout() );
   14.20 +    
   14.21 +    QHBoxLayout *row1 = new QHBoxLayout( box );
   14.22 +    row1->setMargin( 10 );
   14.23 +
   14.24 +    // Create a Label
   14.25 +    QLabel* label = new QLabel( "Text to find: ", this);
   14.26 +    row1->addWidget( label );
   14.27 +
   14.28 +	// Create LineEdit (here QComboBox)
   14.29 +    QHBoxLayout *row2 = new QHBoxLayout( box );
   14.30 +    row2->setMargin( 10 );
   14.31 +    findcombo = new QComboBox( true, this );
   14.32 +	findcombo->setMinimumWidth(150);
   14.33 +    row2->addWidget( findcombo );
   14.34 +	connect ( findcombo, SIGNAL( highlighted(int) ), 
   14.35 +		this, SLOT( findPressed() ) );
   14.36 +	connect ( findcombo, SIGNAL( textChanged(const QString &) ), 
   14.37 +		this, SLOT( findTextChanged(const QString&) ) );
   14.38 +    //findcombo->insertItem( "Normal", -1 );
   14.39 +
   14.40 +	// Create Buttons
   14.41 +    QHBoxLayout *row3 = new QHBoxLayout( box );
   14.42 +    row3->setMargin( 10 );
   14.43 +	clearbutton = new QPushButton (tr("Clear"),this);
   14.44 +	connect ( clearbutton, SIGNAL( clicked() ), 
   14.45 +		findcombo, SLOT( clearEdit() ) );
   14.46 +	row3->addWidget (clearbutton);
   14.47 +	
   14.48 +	QSpacerItem *si1= new QSpacerItem (10,0,QSizePolicy::Minimum, QSizePolicy::Expanding );
   14.49 +	row3->addItem(si1);
   14.50 +	
   14.51 +	cancelbutton = new QPushButton (tr("Cancel"),this);
   14.52 +	cancelbutton->setAccel (Key_Escape);
   14.53 +	connect ( cancelbutton, SIGNAL( clicked() ), 
   14.54 +		this, SLOT( cancelPressed() ) );
   14.55 +	row3->addWidget (cancelbutton);
   14.56 +
   14.57 +	QSpacerItem *si2= new QSpacerItem (10,0,QSizePolicy::Fixed, QSizePolicy::Fixed);
   14.58 +	row3->addItem(si2);
   14.59 +	
   14.60 +	findbutton = new QPushButton (tr("Find"),this);
   14.61 +	findbutton->setDefault (true);
   14.62 +	connect ( findbutton, SIGNAL( clicked() ), 
   14.63 +		this, SLOT( findPressed() ) );
   14.64 +	row3->add(findbutton);
   14.65 +	
   14.66 +	findcombo->setFocus();
   14.67 +}
   14.68 +
   14.69 +void FindWindow::popup()
   14.70 +{
   14.71 +	findcombo->lineEdit()->selectAll();
   14.72 +	show();
   14.73 +}
   14.74 +
   14.75 +void FindWindow::cancelPressed()
   14.76 +{
   14.77 +	hide();
   14.78 +}
   14.79 +
   14.80 +void FindWindow::findPressed()
   14.81 +{
   14.82 +	emit (findButton(findcombo->currentText() ) );
   14.83 +}
   14.84 +
   14.85 +void FindWindow::findTextChanged(const QString&)
   14.86 +{
   14.87 +	emit (somethingChanged() );
   14.88 +}
    15.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.2 +++ b/findwindow.h	Sun Jan 30 12:58:47 2005 +0000
    15.3 @@ -0,0 +1,38 @@
    15.4 +#ifndef FINDWINDOW_H 
    15.5 +#define FINDWINDOW_H
    15.6 +
    15.7 +#include <qmainwindow.h>
    15.8 +#include <qcombobox.h>
    15.9 +#include <qpushbutton.h>
   15.10 +#include <qgroupbox.h>
   15.11 +#include <qlayout.h>
   15.12 +#include <qlabel.h>
   15.13 +
   15.14 +
   15.15 +class FindWindow : public QGroupBox
   15.16 +{
   15.17 +	Q_OBJECT
   15.18 +
   15.19 +public:
   15.20 +	FindWindow (QWidget* parent=0, const char* namme=0, WFlags f=0);
   15.21 +
   15.22 +public slots:	
   15.23 +	void popup();
   15.24 +	void cancelPressed();
   15.25 +	void findPressed();
   15.26 +	void findTextChanged(const QString&);
   15.27 +
   15.28 +signals:
   15.29 +	void findButton(QString);		// emit to mainwindow
   15.30 +	void somethingChanged();	// emit to mainwindow
   15.31 +
   15.32 +private:
   15.33 +	QGroupBox *findbox;
   15.34 +	QComboBox *findcombo;
   15.35 +	QPushButton *clearbutton;
   15.36 +	QPushButton *findbutton;
   15.37 +	QPushButton *cancelbutton;
   15.38 +};
   15.39 +
   15.40 +
   15.41 +#endif
    16.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2 +++ b/flagobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    16.3 @@ -0,0 +1,201 @@
    16.4 +#include "flagobj.h"
    16.5 +
    16.6 +/////////////////////////////////////////////////////////////////
    16.7 +// FlagObj
    16.8 +/////////////////////////////////////////////////////////////////
    16.9 +FlagObj::FlagObj()
   16.10 +{
   16.11 +//    cout << "Const FlagObj ()\n";
   16.12 +    init ();
   16.13 +}
   16.14 +
   16.15 +FlagObj::FlagObj(QCanvas* c):MapObj(c) 
   16.16 +{
   16.17 +//    cout << "Const FlagObj\n";
   16.18 +    init ();
   16.19 +}
   16.20 +
   16.21 +FlagObj::FlagObj (FlagObj* io)
   16.22 +{
   16.23 +    copy (io);
   16.24 +}
   16.25 +
   16.26 +FlagObj::~FlagObj()
   16.27 +{
   16.28 +//    cout << "Destr FlagObj  " << name << "\n";
   16.29 +	delete (icon);
   16.30 +}
   16.31 +
   16.32 +
   16.33 +void FlagObj::init ()
   16.34 +{
   16.35 +	name="undefined";
   16.36 +
   16.37 +	icon=new ImageObj (canvas);
   16.38 +	icon->move (absPos.x(), absPos.y() );
   16.39 +	button=NULL;
   16.40 +	state=false;
   16.41 +}
   16.42 +
   16.43 +void FlagObj::copy (FlagObj* other)
   16.44 +{
   16.45 +    MapObj::copy(other);
   16.46 +	name=other->name;
   16.47 +	tooltip=other->tooltip;
   16.48 +	state=other->state;
   16.49 +	icon->copy(other->icon);
   16.50 +	setVisibility (other->isVisibleObj() );
   16.51 +	// button is not copied, because
   16.52 +	// we won't copy to a parentRow and
   16.53 +	// all others don't need a button
   16.54 +}
   16.55 +
   16.56 +void FlagObj::move(double x, double y)
   16.57 +{
   16.58 +    MapObj::move(x,y);
   16.59 +	icon->move(x,y);
   16.60 +	positionBBox();
   16.61 +}
   16.62 +
   16.63 +void FlagObj::moveBy(double x, double y)
   16.64 +{
   16.65 +    move (x+absPos.x(),y+absPos.y() );
   16.66 +}
   16.67 +
   16.68 +void FlagObj::setVisibility (bool v)
   16.69 +{
   16.70 +    MapObj::setVisibility(v);
   16.71 +	if (v && state)
   16.72 +	    icon->setVisibility(true);
   16.73 +	else
   16.74 +	    icon->setVisibility(false);
   16.75 +}
   16.76 +
   16.77 +void FlagObj::load (const QString &fn)
   16.78 +{
   16.79 +	icon->load(fn);
   16.80 +	calcBBoxSize();
   16.81 +	positionBBox();
   16.82 +}
   16.83 +
   16.84 +void FlagObj::load (const QPixmap &pm)
   16.85 +{
   16.86 +	icon->load(pm);
   16.87 +	calcBBoxSize();
   16.88 +	positionBBox();
   16.89 +}
   16.90 +
   16.91 +void FlagObj::setName(const QString &n)
   16.92 +{
   16.93 +	name=n;
   16.94 +}
   16.95 +
   16.96 +const QString FlagObj::getName()
   16.97 +{
   16.98 +	return name;
   16.99 +}
  16.100 +
  16.101 +void FlagObj::setToolTip(const QString &n)
  16.102 +{
  16.103 +	tooltip=n;
  16.104 +}
  16.105 +
  16.106 +const QString FlagObj::getToolTip()
  16.107 +{
  16.108 +	return tooltip;
  16.109 +}
  16.110 +
  16.111 +void FlagObj::setButton(QAction* b)
  16.112 +{
  16.113 +    button=b;
  16.114 +}
  16.115 +
  16.116 +void FlagObj::updateButton()
  16.117 +{
  16.118 +	if (button)
  16.119 +		button->setOn(state);
  16.120 +	else
  16.121 +		qWarning ("FlagObj::updateButton  no button defined");
  16.122 +}
  16.123 +
  16.124 +QPixmap FlagObj::getPixmap()
  16.125 +{
  16.126 +	return icon->getPixmap();
  16.127 +}
  16.128 +
  16.129 +bool FlagObj::isActive()
  16.130 +{
  16.131 +	return state;
  16.132 +}
  16.133 +
  16.134 +void FlagObj::toggle()
  16.135 +{
  16.136 +	if (state)
  16.137 +		deactivate();
  16.138 +	else
  16.139 +		activate();
  16.140 +}
  16.141 +
  16.142 +void FlagObj::activate()
  16.143 +{
  16.144 +	state=true;
  16.145 +	// only show icon, if flag itself is visible 
  16.146 +	if (visible) 
  16.147 +	{
  16.148 +		icon->setVisibility (true);
  16.149 +		calcBBoxSize();
  16.150 +	}	
  16.151 +}
  16.152 +
  16.153 +void FlagObj::deactivate()
  16.154 +{
  16.155 +	state=false;
  16.156 +	// if flag itself is invisible we don't need to call 
  16.157 +	if (visible) 
  16.158 +	{
  16.159 +		icon->setVisibility (false);
  16.160 +		calcBBoxSize();
  16.161 +	}	
  16.162 +}
  16.163 +
  16.164 +void FlagObj::setEnabled(bool b)
  16.165 +{
  16.166 +	button->setEnabled (b);
  16.167 +}	
  16.168 +	
  16.169 +
  16.170 +void FlagObj::setUsed (bool b)
  16.171 +{
  16.172 +	used=b;
  16.173 +}
  16.174 +
  16.175 +bool FlagObj::isUsed()
  16.176 +{
  16.177 +	return used;
  16.178 +}
  16.179 +
  16.180 +void FlagObj::saveToDir (const QString &tmpdir, const QString &prefix)
  16.181 +{
  16.182 +	QString fn=tmpdir + prefix + name + ".png";
  16.183 +	icon->save (fn,"PNG");
  16.184 +}
  16.185 +
  16.186 +void FlagObj::positionBBox()
  16.187 +{
  16.188 +    bbox.setX (absPos.x() );
  16.189 +    bbox.setY (absPos.y() );
  16.190 +}
  16.191 +
  16.192 +void FlagObj::calcBBoxSize()
  16.193 +{
  16.194 +	if (visible && state)
  16.195 +	{
  16.196 +		bbox.setSize (	QSize(
  16.197 +			icon->boundingRect().width(), 
  16.198 +			icon->boundingRect().height() ) );
  16.199 +	} else
  16.200 +	{
  16.201 +		bbox.setSize (QSize(0,0));
  16.202 +	}
  16.203 +}
  16.204 +
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/flagobj.h	Sun Jan 30 12:58:47 2005 +0000
    17.3 @@ -0,0 +1,53 @@
    17.4 +#ifndef FLAGOBJ_H
    17.5 +#define FLAGOBJ_H
    17.6 +
    17.7 +
    17.8 +#include <qcanvas.h>
    17.9 +#include <qaction.h>
   17.10 +
   17.11 +#include "mapobj.h"
   17.12 +#include "imageobj.h"
   17.13 +
   17.14 +/////////////////////////////////////////////////////////////////////////////
   17.15 +class FlagObj:public MapObj {
   17.16 +public:
   17.17 +    FlagObj ();
   17.18 +    FlagObj (QCanvas*);
   17.19 +    FlagObj (FlagObj*);
   17.20 +    ~FlagObj ();
   17.21 +    virtual void init ();
   17.22 +    virtual void copy (FlagObj*);
   17.23 +    virtual void move (double x,double y);      // move to absolute Position
   17.24 +    virtual void moveBy (double x,double y);    // move to relative Position
   17.25 +    virtual void setVisibility(bool);
   17.26 +	void load (const QString&);
   17.27 +	void load (const QPixmap&);
   17.28 +	void setName (const QString&);
   17.29 +	const QString getName ();
   17.30 +	void setToolTip(const QString&);
   17.31 +	const QString getToolTip();
   17.32 +	void setButton (QAction*);
   17.33 +	void updateButton ();
   17.34 +	QPixmap getPixmap();
   17.35 +	bool isActive();
   17.36 +	void toggle();
   17.37 +	void activate();
   17.38 +	void deactivate();
   17.39 +	void setEnabled (bool);
   17.40 +	void setUsed (bool);
   17.41 +	bool isUsed();
   17.42 +	void saveToDir (const QString&, const QString&);
   17.43 +	
   17.44 +protected:	
   17.45 +	QString name;
   17.46 +	QString tooltip;
   17.47 +	bool state;
   17.48 +	bool used;
   17.49 +    virtual void positionBBox();
   17.50 +    virtual void calcBBoxSize();
   17.51 +private:
   17.52 +	ImageObj* icon;
   17.53 +	QAction* button;
   17.54 +};
   17.55 +
   17.56 +#endif
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/flagrowobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    18.3 @@ -0,0 +1,322 @@
    18.4 +#include "flagrowobj.h"
    18.5 +
    18.6 +/////////////////////////////////////////////////////////////////
    18.7 +// FlagRowObj
    18.8 +/////////////////////////////////////////////////////////////////
    18.9 +FlagRowObj::FlagRowObj()
   18.10 +{
   18.11 +    cout << "Const FlagRowObj ()\n";
   18.12 +    init ();
   18.13 +}
   18.14 +
   18.15 +FlagRowObj::FlagRowObj(QCanvas* c):MapObj(c) 
   18.16 +{
   18.17 +//    cout << "Const FlagRowObj\n";
   18.18 +    init ();
   18.19 +}
   18.20 +
   18.21 +FlagRowObj::~FlagRowObj()
   18.22 +{
   18.23 +//    cout << "Destr FlagRowObj\n";
   18.24 +	flag.clear();
   18.25 +}
   18.26 +
   18.27 +void FlagRowObj::init ()
   18.28 +{
   18.29 +    flag.setAutoDelete (true);
   18.30 +	parentRow=NULL;
   18.31 +}
   18.32 +
   18.33 +void FlagRowObj::copy (FlagRowObj* other)
   18.34 +{
   18.35 +    MapObj::copy(other);
   18.36 +	parentRow=other->parentRow;
   18.37 +	flag.clear();
   18.38 +	FlagObj *fo;
   18.39 +    for (fo=other->flag.first(); fo; fo=other->flag.next() )
   18.40 +		addFlag (fo);
   18.41 +}
   18.42 +
   18.43 +void FlagRowObj::clone (FlagRowObj* pr)
   18.44 +{
   18.45 +	// Difference to copy:
   18.46 +	// We don't copy the flags here, they
   18.47 +	// are created on the fly by toggle and activate
   18.48 +	// This saves lots of canvas objects.
   18.49 +	MapObj::copy(pr);
   18.50 +	flag.clear();
   18.51 +	parentRow=pr;
   18.52 +}
   18.53 +
   18.54 +void FlagRowObj::move(double x, double y)
   18.55 +{
   18.56 +    MapObj::move(x,y);
   18.57 +	int dx=0;
   18.58 +	FlagObj *fo;
   18.59 +    for (fo=flag.first(); fo; fo=flag.next() )
   18.60 +	{
   18.61 +		fo->move(x+dx,y);
   18.62 +		dx+=QSize(fo->getSize() ).width();
   18.63 +	}
   18.64 +}
   18.65 +
   18.66 +void FlagRowObj::moveBy(double x, double y)
   18.67 +{
   18.68 +    move (x+absPos.x(),y+absPos.y() );
   18.69 +}
   18.70 +
   18.71 +void FlagRowObj::setVisibility (bool v)
   18.72 +{
   18.73 +	MapObj::setVisibility(v);
   18.74 +	FlagObj *fo;
   18.75 +	for (fo=flag.first(); fo; fo=flag.next() )
   18.76 +		fo->setVisibility (v);
   18.77 +}
   18.78 +
   18.79 +FlagObj* FlagRowObj::addFlag (FlagObj *fo)
   18.80 +{
   18.81 +	FlagObj *newfo=new FlagObj (canvas);
   18.82 +	newfo->move (absPos.x() + bbox.width(), absPos.y() );
   18.83 +	newfo->copy (fo);	// create a deep copy of fo
   18.84 +	flag.append(newfo);
   18.85 +	calcBBoxSize();
   18.86 +	positionBBox();
   18.87 +	return newfo;
   18.88 +}
   18.89 +
   18.90 +void FlagRowObj::positionBBox()
   18.91 +{
   18.92 +    bbox.setX (absPos.x() );
   18.93 +    bbox.setY (absPos.y() );
   18.94 +}
   18.95 +
   18.96 +void FlagRowObj::calcBBoxSize()
   18.97 +{
   18.98 +	QSize size(0,0);
   18.99 +	QSize boxsize(0,0);
  18.100 +	FlagObj *fo;
  18.101 +    for (fo=flag.first(); fo; fo=flag.next() )
  18.102 +	{
  18.103 +		size=fo->getSize();
  18.104 +		// add widths
  18.105 +		boxsize.setWidth(boxsize.width() + size.width() );
  18.106 +		// maximize height
  18.107 +		if (size.height() > boxsize.height() ) 
  18.108 +			boxsize.setHeight(size.height() );
  18.109 +	}
  18.110 +	bbox.setSize (QSize(boxsize.width(), boxsize.height() ));
  18.111 +}
  18.112 +
  18.113 +QString FlagRowObj::getFlagName (const QPoint &p)
  18.114 +{
  18.115 +	if (!inBBox (p)) return "";
  18.116 +	FlagObj *fo;
  18.117 +	for (fo=flag.first();fo; fo=flag.next() )
  18.118 +		if (fo->inBBox (p)) return fo->getName();
  18.119 +	return "";	
  18.120 +
  18.121 +	
  18.122 +}
  18.123 +
  18.124 +bool FlagRowObj::isActive (const QString &foname)
  18.125 +{
  18.126 +	FlagObj *fo=findFlag (foname);
  18.127 +	if (parentRow)
  18.128 +	{
  18.129 +		if (fo)
  18.130 +			return fo->isActive();
  18.131 +		else
  18.132 +			qWarning ("FlagRowObj::isActive of "+name+" couldn't find "+foname);
  18.133 +			
  18.134 +	} else
  18.135 +		if (fo) return true;
  18.136 +	return false;
  18.137 +}
  18.138 +
  18.139 +void FlagRowObj::toggle (const QString &foname)
  18.140 +{
  18.141 +	FlagObj *fo=findFlag (foname);
  18.142 +	if (fo)
  18.143 +	{
  18.144 +		// FlagObj is here, it will be active, too.
  18.145 +		// Deactivate it by removing it from this row.
  18.146 +		flag.remove (fo);
  18.147 +	} else
  18.148 +	{
  18.149 +		// FlagObj is not present in this row.
  18.150 +		// Copy it from parentRow
  18.151 +		fo=parentRow->findFlag (foname);
  18.152 +		if (fo)
  18.153 +		{
  18.154 +			fo=addFlag (fo);
  18.155 +			fo->activate();
  18.156 +		} else
  18.157 +			qWarning ("FlagRowObj ("+name+")::toggle ("+foname+")  failed - could not find it in parentRow");
  18.158 +	}	
  18.159 +	calcBBoxSize();
  18.160 +	positionBBox();	
  18.161 +}
  18.162 +
  18.163 +void FlagRowObj::activate (const QString &foname)
  18.164 +{
  18.165 +	FlagObj *fo=findFlag (foname);
  18.166 +	if (parentRow)
  18.167 +	{
  18.168 +		if (!fo)
  18.169 +		{
  18.170 +			// FlagObj is not present in this row.
  18.171 +			// Copy it from parentRow and activate there
  18.172 +			fo=parentRow->findFlag (foname);
  18.173 +			if (fo)
  18.174 +			{
  18.175 +				fo=addFlag (fo);
  18.176 +				fo->activate();
  18.177 +				fo->setVisibility (visible);
  18.178 +				calcBBoxSize();
  18.179 +				positionBBox();
  18.180 +			} else
  18.181 +				qWarning ("FlagRowObj ("+name+")::activate ("+foname+")  failed - could not find it in parentRow");
  18.182 +		}	
  18.183 +	} else
  18.184 +	{
  18.185 +		// I am the parentRow, mark flag as used
  18.186 +		if (fo)
  18.187 +		{
  18.188 +			fo->setUsed(true);
  18.189 +			fo->activate();
  18.190 +		}	
  18.191 +		else
  18.192 +			qWarning ("FlagRowObj::activate no FlagObj \""+foname+"\" found in parentRow");
  18.193 +	}
  18.194 +}
  18.195 +
  18.196 +void FlagRowObj::deactivate (const QString &foname)
  18.197 +{
  18.198 +	FlagObj *fo=findFlag (foname);
  18.199 +	if (fo) flag.remove(fo);
  18.200 +	calcBBoxSize();
  18.201 +	positionBBox();
  18.202 +}
  18.203 +
  18.204 +void FlagRowObj::deactivateAll ()
  18.205 +{
  18.206 +	if (!parentRow)
  18.207 +	{
  18.208 +		FlagObj *fo;
  18.209 +		for (fo=flag.first();fo; fo=flag.next() )
  18.210 +		{
  18.211 +			fo->deactivate();
  18.212 +		}
  18.213 +	} else
  18.214 +		qWarning ("FlagRowObj::deactivateAll mustn't be called for ordinary rows");
  18.215 +}
  18.216 +
  18.217 +void FlagRowObj::setEnabled (bool b)
  18.218 +{
  18.219 +	// If we have no parent, we are the default FlagRowObj
  18.220 +	// and have QToolbarButtons
  18.221 +	if (!parentRow)
  18.222 +	{
  18.223 +		FlagObj *fo;
  18.224 +		for (fo=flag.first();fo; fo=flag.next() )
  18.225 +			fo->setEnabled (b);
  18.226 +	}
  18.227 +}
  18.228 +
  18.229 +void FlagRowObj::resetUsedCounter()
  18.230 +{
  18.231 +	FlagObj *fo;
  18.232 +	for (fo=flag.first();fo; fo=flag.next() )
  18.233 +		fo->setUsed (false);
  18.234 +}
  18.235 +
  18.236 +QString FlagRowObj::saveToDir (const QString &tmpdir,const QString &prefix, bool writeflags)
  18.237 +{
  18.238 +	// Build xml string
  18.239 +	QString s;
  18.240 +	FlagObj *fo;
  18.241 +	if (parentRow)
  18.242 +		for (fo=flag.first();fo; fo=flag.next() )
  18.243 +		{
  18.244 +			// save flag to xml, if flag is set 
  18.245 +			s+=valueElement("standardflag",fo->getName() );
  18.246 +
  18.247 +			// and tell parentRow, that this flag is used
  18.248 +			parentRow->activate(fo->getName() );
  18.249 +		}	
  18.250 +	else
  18.251 +		// Save icons to dir, if verbose is set (xml export)
  18.252 +		// and I am a parentRow 
  18.253 +		// and this flag is really used somewhere
  18.254 +		if (writeflags)
  18.255 +			for (fo=flag.first();fo; fo=flag.next() )
  18.256 +				if (fo->isUsed()) fo->saveToDir (tmpdir,prefix);
  18.257 +	return s;		
  18.258 +
  18.259 +}
  18.260 +
  18.261 +void FlagRowObj::setName (const QString &n)
  18.262 +{
  18.263 +	name=n;
  18.264 +}
  18.265 +
  18.266 +void FlagRowObj::makeToolbar (QMainWindow *w, const QString &n)
  18.267 +{
  18.268 +	if (!parentRow)
  18.269 +	{
  18.270 +		// create bar and buttons
  18.271 +		QToolBar* tb = new QToolBar( w);
  18.272 +		tb->setLabel (n);
  18.273 +		QAction *a;
  18.274 +		FlagObj *fo;
  18.275 +		for (fo=flag.first();fo; fo=flag.next() )
  18.276 +		{
  18.277 +			a=new QAction (
  18.278 +				fo->getToolTip(),
  18.279 +				fo->getPixmap(),
  18.280 +				fo->getName(),
  18.281 +				0,
  18.282 +				w,
  18.283 +				fo->getName()
  18.284 +			);
  18.285 +			a->setToggleAction(true);
  18.286 +			// FIXME should not be enabled by default, later in updateToolbar
  18.287 +			a->setEnabled(true);
  18.288 +			a->addTo (tb);
  18.289 +			fo->setButton (a);
  18.290 +			connect(a, SIGNAL( activated() ), 
  18.291 +					w, SLOT( standardFlagChanged() ) );
  18.292 +		}
  18.293 +	} else
  18.294 +		qWarning ("FlagRowObj::makeToolbar mustn't be called for ordinary rows");
  18.295 +}
  18.296 +
  18.297 +void  FlagRowObj::updateToolBar()
  18.298 +{
  18.299 +	FlagObj *fo;
  18.300 +	if (parentRow)
  18.301 +	{
  18.302 +		// We are just a branch, not the toolbar default
  18.303 +		parentRow->deactivateAll();
  18.304 +		// In parentRow activate all existing (==active) flags
  18.305 +		for (fo=flag.first();fo; fo=flag.next() ) 
  18.306 +			parentRow->activate(fo->getName());
  18.307 +		parentRow->updateToolBar();	
  18.308 +	} else
  18.309 +	{
  18.310 +		// We are the toolbar default
  18.311 +		for (fo=flag.first();fo; fo=flag.next() ) 
  18.312 +			fo->updateButton();
  18.313 +	}
  18.314 +}
  18.315 +
  18.316 +FlagObj* FlagRowObj::findFlag (const QString &name)
  18.317 +{
  18.318 +	FlagObj *fo;
  18.319 +	for (fo=flag.first();fo; fo=flag.next() )
  18.320 +	{
  18.321 +		if (fo->getName()==name) return fo;
  18.322 +	}
  18.323 +	return NULL;
  18.324 +}
  18.325 +
    19.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.2 +++ b/flagrowobj.h	Sun Jan 30 12:58:47 2005 +0000
    19.3 @@ -0,0 +1,41 @@
    19.4 +#ifndef FLAGROWOBJ_H
    19.5 +#define FLAGROWOBJ_H
    19.6 +
    19.7 +#include <qmainwindow.h>
    19.8 +
    19.9 +#include "mapobj.h"
   19.10 +#include "flagobj.h"
   19.11 +
   19.12 +class FlagRowObj:public QObject,public MapObj {
   19.13 +public:
   19.14 +    FlagRowObj ();
   19.15 +    FlagRowObj (QCanvas*);
   19.16 +    ~FlagRowObj ();
   19.17 +    virtual void init ();
   19.18 +    virtual void copy (FlagRowObj*);
   19.19 +    virtual void clone(FlagRowObj*);
   19.20 +    virtual void move   (double,double);
   19.21 +    virtual void moveBy (double,double);
   19.22 +    virtual void setVisibility(bool);
   19.23 +    virtual FlagObj* addFlag (FlagObj *fo);			// make deep copy of FlagObj
   19.24 +    virtual void positionBBox();
   19.25 +    virtual void calcBBoxSize();
   19.26 +	virtual QString getFlagName (const QPoint &p);	// Find flag by position
   19.27 +	bool isActive(const QString&);
   19.28 +	void toggle (const QString&);
   19.29 +	void activate(const QString&);
   19.30 +	void deactivate(const QString&);
   19.31 +	void deactivateAll();
   19.32 +	void setEnabled (bool);
   19.33 +	void resetUsedCounter();
   19.34 +	QString saveToDir (const QString &,const QString &,bool);
   19.35 +	void setName (const QString&);			// prefix for exporting flags to dir
   19.36 +	void makeToolbar (QMainWindow*, const QString &);	// Create Toolbar buttons
   19.37 +	void updateToolBar();					// Update Toolbar buttons	
   19.38 +private:	
   19.39 +	FlagRowObj* parentRow;					// look for flags in this row
   19.40 +	FlagObj* findFlag (const QString&);
   19.41 +    QPtrList <FlagObj> flag; 
   19.42 +	QString name;
   19.43 +};
   19.44 +#endif
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/floatimageobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    20.3 @@ -0,0 +1,219 @@
    20.4 +#include "floatimageobj.h"
    20.5 +#include "branchobj.h"
    20.6 +#include <math.h>
    20.7 +
    20.8 +
    20.9 +/////////////////////////////////////////////////////////////////
   20.10 +// FloatImageObj
   20.11 +/////////////////////////////////////////////////////////////////
   20.12 +
   20.13 +int FloatImageObj::counter=0;		// make instance 
   20.14 +
   20.15 +
   20.16 +FloatImageObj::FloatImageObj ():FloatObj()
   20.17 +{
   20.18 +//    cout << "Const FloatImageObj ()\n";
   20.19 +    setParObj (this);	
   20.20 +    init();
   20.21 +    depth=-1;
   20.22 +}
   20.23 +
   20.24 +FloatImageObj::FloatImageObj (QCanvas* c):FloatObj(c)
   20.25 +{
   20.26 + //   cout << "Const FloatImageObj (c)  called from MapCenterObj (c)\n";
   20.27 +    setParObj (this);	
   20.28 +    init();
   20.29 +    depth=-1;
   20.30 +}
   20.31 +
   20.32 +FloatImageObj::FloatImageObj (QCanvas* c, LinkableMapObj* p):FloatObj(c,p)
   20.33 +{
   20.34 + //   cout << "Const FloatImageObj (c,p)\n";
   20.35 +    init();
   20.36 +}
   20.37 +
   20.38 +FloatImageObj::~FloatImageObj ()
   20.39 +{
   20.40 +//	cout << "Destr FloatImageObj "<<this<<"\n";
   20.41 +	delete(icon);
   20.42 +}
   20.43 +
   20.44 +void FloatImageObj::init () 
   20.45 +{
   20.46 +	icon=new ImageObj (canvas);
   20.47 +	icon->move (absPos.x(), absPos.y() );
   20.48 +	icon->setVisibility (true);
   20.49 +	bbox.setSize (QSize(icon->size().width(), icon->size().height()));
   20.50 +	filename="";
   20.51 +	originalFilename="no original name available";
   20.52 +	filetype="";
   20.53 +	saveInMap=true;
   20.54 +}
   20.55 +
   20.56 +void FloatImageObj::copy (FloatImageObj* other)
   20.57 +{					
   20.58 +	FloatObj::copy (other);
   20.59 +	icon->copy (other->icon);
   20.60 +	filename=other->filename;
   20.61 +	saveInMap=other->saveInMap;
   20.62 +    positionBBox();
   20.63 +}
   20.64 +
   20.65 +void FloatImageObj::setZ (const int &i)
   20.66 +{
   20.67 +	icon->setZ (i);
   20.68 +	zPlane=i;
   20.69 +}
   20.70 +
   20.71 +int FloatImageObj::z ()
   20.72 +{
   20.73 +	return lrint (icon->z());
   20.74 +}
   20.75 +
   20.76 +bool FloatImageObj::load (const QString &fn)
   20.77 +{	
   20.78 +	if( icon->load (fn))
   20.79 +	{
   20.80 +		bbox.setSize (QSize(icon->size().width()+8, icon->size().height()+8));
   20.81 +		positionBBox();
   20.82 +		filename=fn;
   20.83 +		filetype=QPixmap::imageFormat (fn);
   20.84 +		return true;
   20.85 +	} else
   20.86 +		return false;
   20.87 +	
   20.88 +}
   20.89 +
   20.90 +void FloatImageObj::save (const QString &fn, const char *format)
   20.91 +{	
   20.92 +	icon->save (fn,format);
   20.93 +}
   20.94 +
   20.95 +void FloatImageObj::setOriginalFilename(const QString & fn)
   20.96 +{
   20.97 +	originalFilename=fn;
   20.98 +}
   20.99 +
  20.100 +QString FloatImageObj::getOriginalFilename()
  20.101 +{
  20.102 +	return originalFilename;
  20.103 +}
  20.104 +
  20.105 +void FloatImageObj::setVisibility(bool v)
  20.106 +{
  20.107 +    LinkableMapObj::setVisibility(v);
  20.108 +	if (v)
  20.109 +	    icon->setVisibility(true);
  20.110 +	else
  20.111 +	    icon->setVisibility(false);
  20.112 +}
  20.113 +
  20.114 +void FloatImageObj::move (double x, double y)
  20.115 +{
  20.116 +	FloatObj::move(x,y);
  20.117 +	icon->move (x+4,y+4);
  20.118 +    positionBBox();
  20.119 +}
  20.120 +
  20.121 +void FloatImageObj::move (QPoint p)
  20.122 +{
  20.123 +	move (p.x(), p.y());
  20.124 +}
  20.125 +
  20.126 +void FloatImageObj::positionBBox()
  20.127 +{
  20.128 +	// TODO
  20.129 +}
  20.130 +
  20.131 +void FloatImageObj::calcBBoxSize()
  20.132 +{
  20.133 +	// TODO
  20.134 +}
  20.135 +
  20.136 +QString FloatImageObj::saveToDir (const QString &tmpdir,const QString &prefix)
  20.137 +{
  20.138 +	counter++;
  20.139 +
  20.140 +	QString posAttr=
  20.141 +		attribut("relPosX",QString().setNum(relPos.x(),10)) +
  20.142 +		attribut("relPosY",QString().setNum(relPos.y(),10)); 
  20.143 +
  20.144 +	QString useOrientAttr;
  20.145 +	if (useOrientation)
  20.146 +		useOrientAttr=attribut ("useOrientation","true");
  20.147 +	else	
  20.148 +		useOrientAttr=attribut ("useOrientation","false");
  20.149 +		
  20.150 +	QString saveInMapAttr;
  20.151 +	if (saveInMap)
  20.152 +		saveInMapAttr=attribut ("saveInMap","true");
  20.153 +	else	
  20.154 +		
  20.155 +		saveInMapAttr=attribut ("saveInMap","false");
  20.156 +
  20.157 +	QString exportAttr;
  20.158 +	if (floatExport)
  20.159 +		exportAttr=attribut ("floatExport","true");
  20.160 +	else	
  20.161 +		exportAttr=attribut ("floatExport","false");
  20.162 +
  20.163 +	QString zAttr=attribut ("zPlane",QString().setNum(zPlane));
  20.164 +	QString url;
  20.165 +
  20.166 +	// prevent saving as GIF
  20.167 +	if (filetype=="GIF")
  20.168 +		filetype="PNG";
  20.169 +		
  20.170 +	url="images/"+prefix+"image-" + QString().number(counter,10) + "." +filetype;
  20.171 +
  20.172 +	// And really save the image
  20.173 +	icon->save (tmpdir + "/" + url, filetype);
  20.174 +
  20.175 +    return singleElement ("floatimage",  
  20.176 +		posAttr + 
  20.177 +		useOrientAttr + 
  20.178 +		saveInMapAttr + 
  20.179 +		exportAttr + 
  20.180 +		zAttr + 
  20.181 +		attribut ("href",QString ("file:")+url)
  20.182 +	);	
  20.183 +}
  20.184 +
  20.185 +void FloatImageObj::resetSaveCounter()
  20.186 +{
  20.187 +	counter=0;
  20.188 +}
  20.189 +
  20.190 +
  20.191 +QRect FloatImageObj::getTotalBBox()
  20.192 +{
  20.193 +	return bbox;
  20.194 +}
  20.195 +
  20.196 +QRect FloatImageObj::getBBoxSizeWithChilds()
  20.197 +{
  20.198 +	//FIXME  abstract in linkablemapobj.h, not calculated
  20.199 +	return bboxTotal;
  20.200 +}
  20.201 +
  20.202 +void FloatImageObj::calcBBoxSizeWithChilds()
  20.203 +{
  20.204 +	//FIXME  abstract in linkablemapobj.h
  20.205 +}
  20.206 +
  20.207 +QString FloatImageObj::getSelectString()
  20.208 +{
  20.209 +	QString s;
  20.210 +	if (parObj)
  20.211 +	{
  20.212 +		if (parObj->getDepth()==0)
  20.213 +			s= "fi:" + QString("%1").arg( ((BranchObj*)(parObj))->getFloatImageNum(this));
  20.214 +		else	
  20.215 +			s= ((BranchObj*)(parObj))->getSelectString() + ",fi:" + QString("%1").arg( ((BranchObj*)(parObj))->getFloatImageNum(this));
  20.216 +	} else
  20.217 +		s="mc:";
  20.218 +	
  20.219 +	return s;
  20.220 +
  20.221 +}
  20.222 +
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/floatimageobj.h	Sun Jan 30 12:58:47 2005 +0000
    21.3 @@ -0,0 +1,44 @@
    21.4 +#ifndef FLOATIMAGEOBJ_H
    21.5 +#define FLOATIMAGEOBJ_H
    21.6 +
    21.7 +#include "floatobj.h"
    21.8 +
    21.9 +/////////////////////////////////////////////////////////////////////////////
   21.10 +class FloatImageObj:public FloatObj {
   21.11 +public:
   21.12 +    FloatImageObj ();
   21.13 +    FloatImageObj (QCanvas*);
   21.14 +    FloatImageObj (QCanvas*, LinkableMapObj* parent);
   21.15 +    ~FloatImageObj ();
   21.16 +    virtual void init ();
   21.17 +    virtual void copy (FloatImageObj*);
   21.18 +	virtual void setZ (const int&);
   21.19 +	virtual int z();
   21.20 +
   21.21 +	virtual bool load (const QString &);
   21.22 +	virtual void save (const QString &, const char *);
   21.23 +	virtual void setOriginalFilename(const QString &);
   21.24 +	virtual QString getOriginalFilename();
   21.25 +    virtual void setVisibility(bool);	    // set vis. for w
   21.26 +    virtual void move (double x,double y);
   21.27 +    virtual void move (QPoint);
   21.28 +	virtual void positionBBox();
   21.29 +	virtual void calcBBoxSize();
   21.30 +	virtual QRect getTotalBBox();			// return BBox including childs			
   21.31 +	virtual QRect getBBoxSizeWithChilds();	// return size of BBox including childs  
   21.32 +	virtual void calcBBoxSizeWithChilds();	// calc size of  BBox including childs recursivly
   21.33 +	virtual QString saveToDir(const QString &,const QString&);
   21.34 +	virtual void resetSaveCounter();
   21.35 +	virtual QString getSelectString();
   21.36 +
   21.37 +
   21.38 +protected:
   21.39 +	ImageObj *icon;
   21.40 +	bool saveInMap;
   21.41 +	static int counter;			// numerate the files during saveToDir
   21.42 +	QString filetype;
   21.43 +	QString filename;
   21.44 +	QString originalFilename;
   21.45 +};
   21.46 +
   21.47 +#endif
    22.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.2 +++ b/floatobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    22.3 @@ -0,0 +1,163 @@
    22.4 +#include "floatobj.h"
    22.5 +
    22.6 +extern QAction* actionEditToggleFloatExport;
    22.7 +
    22.8 +/////////////////////////////////////////////////////////////////
    22.9 +// FloatObj
   22.10 +/////////////////////////////////////////////////////////////////
   22.11 +
   22.12 +FloatObj::FloatObj ():LinkableMapObj() 
   22.13 +{
   22.14 +//    cout << "Const FloatObj ()\n";
   22.15 +    setParObj (this);	
   22.16 +    init();
   22.17 +    depth=-1;
   22.18 +}
   22.19 +
   22.20 +FloatObj::FloatObj (QCanvas* c):LinkableMapObj(c)
   22.21 +{
   22.22 +//	cout << "Const FloatObj (c)  called from MapCenterObj (c)\n";
   22.23 +    setParObj (this);	
   22.24 +    init();
   22.25 +    depth=-1;
   22.26 +}
   22.27 +
   22.28 +FloatObj::FloatObj (QCanvas* c, LinkableMapObj* p):LinkableMapObj (c)
   22.29 +{
   22.30 +//    cout << "Const FloatObj (c,p)\n";
   22.31 +    setParObj (p);	
   22.32 +    depth=p->getDepth()+1;
   22.33 +    init();
   22.34 +}
   22.35 +
   22.36 +FloatObj::~FloatObj ()
   22.37 +{
   22.38 +//   cout << "Destr FloatObj\n";
   22.39 +}
   22.40 +
   22.41 +void FloatObj::init () 
   22.42 +{
   22.43 +    setChildObj(this);
   22.44 +	relPos=getRandPos();
   22.45 +	useOrientation=true;
   22.46 +	floatExport=true;
   22.47 +	zPlane=Z_ICON;
   22.48 +}
   22.49 +
   22.50 +void FloatObj::copy (FloatObj* other)
   22.51 +{
   22.52 +	LinkableMapObj::copy (other);
   22.53 +	relPos=other->relPos;
   22.54 +	useOrientation=other->useOrientation;
   22.55 +	setVisibility (other->visible);
   22.56 +}
   22.57 +
   22.58 +void FloatObj::setRelPos()
   22.59 +{
   22.60 +	if (useOrientation)
   22.61 +	{
   22.62 +		if (parObj->getOrientation()==OrientLeftOfCenter)
   22.63 +			relPos.setX ( parObj->x() +parObj->width() - bbox.width() -absPos.x());
   22.64 +		else	
   22.65 +			relPos.setX (absPos.x() - parObj->x() );
   22.66 +	}
   22.67 +	else
   22.68 +		relPos.setX (absPos.x() - parObj->x() );
   22.69 +	relPos.setY (absPos.y() - parObj->y() );
   22.70 +}
   22.71 +
   22.72 +void FloatObj::setRelPos(const QPoint &p)
   22.73 +{
   22.74 +	relPos=p;
   22.75 +}
   22.76 +
   22.77 +void FloatObj::setZ(const int &i)
   22.78 +{
   22.79 +	zPlane=i;
   22.80 +}
   22.81 +
   22.82 +int FloatObj::z()
   22.83 +{
   22.84 +	return zPlane;
   22.85 +}
   22.86 +
   22.87 +
   22.88 +void FloatObj::setUseOrientation (const bool &b)
   22.89 +{	
   22.90 +	if (useOrientation!=b)
   22.91 +	{
   22.92 +		useOrientation=b;
   22.93 +		requestReposition();
   22.94 +	}	
   22.95 +}
   22.96 +
   22.97 +void FloatObj::setFloatExport(const bool& b)
   22.98 +{
   22.99 +	floatExport=b;
  22.100 +}
  22.101 +
  22.102 +bool FloatObj::getFloatExport()
  22.103 +{
  22.104 +	return floatExport;
  22.105 +}
  22.106 +
  22.107 +void FloatObj::move (double x, double y)
  22.108 +{
  22.109 +	MapObj::move(x,y);
  22.110 +	selbox->move(x,y);
  22.111 +}
  22.112 +
  22.113 +void FloatObj::move (QPoint p)
  22.114 +{
  22.115 +	move (p.x(), p.y());
  22.116 +}
  22.117 +
  22.118 +void FloatObj::reposition()
  22.119 +{
  22.120 +	if (useOrientation)
  22.121 +	{
  22.122 +		if (parObj->getOrientation()==OrientLeftOfCenter)
  22.123 +			move (parObj->x() - relPos.x() + parObj->width() - bbox.width(), parObj->y()+relPos.y());
  22.124 +		else	
  22.125 +			move (parObj->x()+relPos.x(), parObj->y()+relPos.y());
  22.126 +	}		
  22.127 +	else
  22.128 +		move (parObj->x()+relPos.x(), parObj->y()+relPos.y());
  22.129 +	updateLink();	
  22.130 +}
  22.131 +
  22.132 +QRect FloatObj::getTotalBBox()
  22.133 +{
  22.134 +	return bbox;
  22.135 +}
  22.136 +
  22.137 +QRect FloatObj::getBBoxSizeWithChilds()
  22.138 +{
  22.139 +	return bboxTotal;
  22.140 +}
  22.141 +
  22.142 +void FloatObj::select()
  22.143 +{
  22.144 +    LinkableMapObj::select();
  22.145 +	// Temporary draw the link while FO is selected
  22.146 +	if (style==StyleUndef) 
  22.147 +	{
  22.148 +		setLinkStyle(getDefLinkStyle());
  22.149 +		setLinkColor(parObj->getLinkColor());
  22.150 +	}	
  22.151 +
  22.152 +	// Update FloatExport switch in context menu
  22.153 +	if (floatExport)
  22.154 +		actionEditToggleFloatExport->setEnabled (true);
  22.155 +	else	
  22.156 +		actionEditToggleFloatExport->setEnabled (true);
  22.157 +
  22.158 +
  22.159 +}
  22.160 +
  22.161 +void FloatObj::unselect()
  22.162 +{
  22.163 +	LinkableMapObj::unselect();
  22.164 +	setLinkStyle (StyleUndef);
  22.165 +}
  22.166 +
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/floatobj.h	Sun Jan 30 12:58:47 2005 +0000
    23.3 @@ -0,0 +1,45 @@
    23.4 +#ifndef FLOATOBJ_H
    23.5 +#define FLOATOBJ_H
    23.6 +
    23.7 +#include "linkablemapobj.h"
    23.8 +
    23.9 +/////////////////////////////////////////////////////////////////////////////
   23.10 +class FloatObj:public LinkableMapObj {
   23.11 +public:
   23.12 +    FloatObj ();
   23.13 +    FloatObj (QCanvas*);
   23.14 +    FloatObj (QCanvas*, LinkableMapObj* parent);
   23.15 +    ~FloatObj ();
   23.16 +    virtual void init ();
   23.17 +    virtual void copy (FloatObj*);
   23.18 +	virtual bool load (const QString&)=0;
   23.19 +	virtual void setRelPos();				// set relPos to current parentPos
   23.20 +	virtual void setRelPos(const QPoint&);	
   23.21 +	virtual void setZ(const int&);		// set zPlane
   23.22 +	virtual int z();
   23.23 +	virtual void setUseOrientation (const bool &);
   23.24 +	virtual void setFloatExport (const bool &);
   23.25 +	virtual bool getFloatExport ();
   23.26 +
   23.27 +	virtual void move (double,double);
   23.28 +	virtual void move (QPoint);
   23.29 +
   23.30 +	virtual void reposition();
   23.31 +											
   23.32 +	virtual QRect getTotalBBox();			// return BBox including childs			
   23.33 +	virtual QRect getBBoxSizeWithChilds();	// return size of BBox including childs  
   23.34 +
   23.35 +	virtual QString saveToDir(const QString &,const QString&)=0;
   23.36 +	virtual void resetSaveCounter()=0;
   23.37 +
   23.38 +	virtual void select();
   23.39 +	virtual void unselect();
   23.40 +
   23.41 +protected:
   23.42 +	QPoint relPos;
   23.43 +	bool useOrientation;		
   23.44 +	bool floatExport;
   23.45 +	int zPlane;
   23.46 +};
   23.47 +
   23.48 +#endif
    24.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    24.2 +++ b/frameobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    24.3 @@ -0,0 +1,146 @@
    24.4 +#include "frameobj.h"
    24.5 +
    24.6 +#include <qcolor.h>
    24.7 +
    24.8 +/////////////////////////////////////////////////////////////////
    24.9 +// FrameObj
   24.10 +/////////////////////////////////////////////////////////////////
   24.11 +FrameObj::FrameObj() : MapObj()
   24.12 +{
   24.13 +//    cout << "Const FrameObj ()\n";
   24.14 +    init ();
   24.15 +}
   24.16 +
   24.17 +FrameObj::FrameObj(QCanvas* c) :MapObj(c)
   24.18 +{
   24.19 +//    cout << "Const FrameObj\n";
   24.20 +    init ();
   24.21 +}
   24.22 +
   24.23 +FrameObj::~FrameObj()
   24.24 +{
   24.25 +	clear();
   24.26 +}
   24.27 +
   24.28 +void FrameObj::init()
   24.29 +{
   24.30 +    type=NoFrame;
   24.31 +    border=0;
   24.32 +}
   24.33 +
   24.34 +void FrameObj::clear()
   24.35 +{
   24.36 +    switch (type)
   24.37 +    {
   24.38 +		case NoFrame:
   24.39 +			break;
   24.40 +		case Rectangle:
   24.41 +			delete rectFrame;
   24.42 +			break;
   24.43 +    }
   24.44 +	type=NoFrame;
   24.45 +	border=0;
   24.46 +}
   24.47 +
   24.48 +void FrameObj::move(double x, double y)
   24.49 +{
   24.50 +    switch (type)
   24.51 +    {
   24.52 +		case NoFrame:
   24.53 +			break;
   24.54 +		case Rectangle:
   24.55 +			rectFrame->move (x,y);
   24.56 +			break;
   24.57 +    }
   24.58 +}
   24.59 +
   24.60 +void FrameObj::moveBy(double x, double y)
   24.61 +{
   24.62 +	MapObj::moveBy (x,y);
   24.63 +}
   24.64 +
   24.65 +void FrameObj::positionBBox()
   24.66 +{
   24.67 +}
   24.68 +
   24.69 +void FrameObj::calcBBoxSize()
   24.70 +{
   24.71 +}
   24.72 +
   24.73 +void FrameObj::setRect(const QRect &r)
   24.74 +{
   24.75 +	bbox=r;
   24.76 +    switch (type)
   24.77 +    {
   24.78 +		case NoFrame:
   24.79 +			break;
   24.80 +		case Rectangle:
   24.81 +			rectFrame->setX (bbox.x() );
   24.82 +			rectFrame->setY (bbox.y() );
   24.83 +			rectFrame->setSize (bbox.width(),bbox.height() );
   24.84 +			break;
   24.85 +    }
   24.86 +}
   24.87 +
   24.88 +int FrameObj::getBorder()
   24.89 +{
   24.90 +	return border;
   24.91 +}
   24.92 +
   24.93 +FrameType FrameObj::getFrameType()
   24.94 +{
   24.95 +	return type;
   24.96 +}
   24.97 +
   24.98 +QString FrameObj::getFrameTypeName()
   24.99 +{
  24.100 +    switch (type)
  24.101 +    {
  24.102 +		case Rectangle:
  24.103 +			return "Rectangle";
  24.104 +			break;
  24.105 +		default:
  24.106 +			return "NoFrame";
  24.107 +    }
  24.108 +}
  24.109 +
  24.110 +void FrameObj::setFrameType(const FrameType &t)
  24.111 +{
  24.112 +	if (t!=type)
  24.113 +	{
  24.114 +		clear();
  24.115 +		type=t;
  24.116 +		switch (type)
  24.117 +		{
  24.118 +			case NoFrame:
  24.119 +				border=0;
  24.120 +				break;
  24.121 +			case Rectangle:
  24.122 +				border=10;
  24.123 +				rectFrame = new QCanvasRectangle (canvas);
  24.124 +				rectFrame->setZ(Z_FRAME);
  24.125 +				rectFrame->setBrush( QColor("white") );
  24.126 +				rectFrame->setPen( QPen(QColor("black") ));
  24.127 +				if (visible)
  24.128 +					rectFrame->show();
  24.129 +				else    
  24.130 +					rectFrame->hide();
  24.131 +				break;
  24.132 +		}
  24.133 +	}
  24.134 +}
  24.135 +
  24.136 +void FrameObj::setFrameType(const QString &t)
  24.137 +{
  24.138 +	if (t=="Rectangle")
  24.139 +		FrameObj::setFrameType (Rectangle);
  24.140 +	else	
  24.141 +		FrameObj::setFrameType (NoFrame);
  24.142 +}
  24.143 +
  24.144 +void FrameObj::setVisibility (bool v)
  24.145 +{
  24.146 +    MapObj::setVisibility(v);
  24.147 +    setFrameType (type);    // changes on visibility depend on type...
  24.148 +}
  24.149 +
    25.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    25.2 +++ b/frameobj.h	Sun Jan 30 12:58:47 2005 +0000
    25.3 @@ -0,0 +1,33 @@
    25.4 +#ifndef FRAMEOBJ_H
    25.5 +#define FRAMEOBJ_H
    25.6 +
    25.7 +#include "mapobj.h"
    25.8 +
    25.9 +enum FrameType {NoFrame,Rectangle};
   25.10 +
   25.11 +class FrameObj:public MapObj {
   25.12 +public:
   25.13 +    FrameObj();
   25.14 +    FrameObj(QCanvas*);
   25.15 +    ~FrameObj();
   25.16 +    void init();
   25.17 +    void clear();
   25.18 +    void move (double x,double y);    // move to absolute Position
   25.19 +    void moveBy (double x,double y);  // move to relative Position
   25.20 +	void positionBBox();			 
   25.21 +	void calcBBoxSize();			
   25.22 +	void setRect (const QRect &);	  // set dimensions			
   25.23 +    int getBorder();
   25.24 +    FrameType getFrameType ();
   25.25 +    QString getFrameTypeName ();
   25.26 +    void setFrameType (const FrameType &);
   25.27 +    void setFrameType (const QString &);
   25.28 +    void setVisibility(bool);
   25.29 +
   25.30 +protected:
   25.31 +    FrameType type;
   25.32 +    QCanvasRectangle* rectFrame;
   25.33 +    int border;									// distance text - frame
   25.34 +};
   25.35 +#endif
   25.36 +
    26.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    26.2 +++ b/headingobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    26.3 @@ -0,0 +1,246 @@
    26.4 +#include "headingobj.h"
    26.5 +
    26.6 +/////////////////////////////////////////////////////////////////
    26.7 +// HeadingObj
    26.8 +/////////////////////////////////////////////////////////////////
    26.9 +HeadingObj::HeadingObj() : MapObj()
   26.10 +{
   26.11 +//    cout << "Const HeadingObj ()\n";
   26.12 +    init ();
   26.13 +}
   26.14 +
   26.15 +HeadingObj::HeadingObj(QCanvas* c) :MapObj(c)
   26.16 +{
   26.17 +//    cout << "Const HeadingObj\n";
   26.18 +    init ();
   26.19 +}
   26.20 +
   26.21 +HeadingObj::~HeadingObj()
   26.22 +{
   26.23 +    textline.clear();
   26.24 +}
   26.25 +
   26.26 +void HeadingObj::init()
   26.27 +{
   26.28 +    textline.setAutoDelete (TRUE);
   26.29 +    textwidth=40;
   26.30 +    color=QColor ("black");
   26.31 +    font=QFont();
   26.32 +}
   26.33 +
   26.34 +void HeadingObj::copy(HeadingObj *other)
   26.35 +{
   26.36 +    MapObj::copy (other);
   26.37 +    textwidth=other->textwidth;
   26.38 +    color=other->color;
   26.39 +    font=other->font;
   26.40 +    setText (other->text() );
   26.41 +}
   26.42 +
   26.43 +void HeadingObj::move(double x, double y)
   26.44 +{
   26.45 +    MapObj::move(x,y);
   26.46 +    int h;	// height of a textline
   26.47 +    int ho;	// offset of height while drawing all lines
   26.48 +    if (textline.first() )
   26.49 +		h=textline.first()->boundingRect().height();
   26.50 +    else
   26.51 +		h=2;
   26.52 +    QCanvasText *t;
   26.53 +    ho=0;
   26.54 +    for (t=textline.first(); t; t=textline.next() )
   26.55 +    {
   26.56 +		t->move(x,y+ho);
   26.57 +		ho=ho+h;
   26.58 +    }	
   26.59 +}
   26.60 +
   26.61 +
   26.62 +void HeadingObj::moveBy(double x, double y)
   26.63 +{
   26.64 +    move (x+absPos.x(),y+absPos.y() );
   26.65 +}
   26.66 +
   26.67 +void HeadingObj::positionBBox()
   26.68 +{
   26.69 +    bbox.setX (absPos.x());
   26.70 +    bbox.setY (absPos.y());
   26.71 +}
   26.72 +
   26.73 +void HeadingObj::calcBBoxSize()
   26.74 +{	
   26.75 +	int w=0;
   26.76 +	int h=0;
   26.77 +	// Using Backspace an empty heading might easily be created, then there
   26.78 +	// would be textline.first()==NULL This can be worked around by the following, but
   26.79 +	// then no selection would be visible, thus we prevent it in ::setText()
   26.80 +	if (!textline.isEmpty() )
   26.81 +	{
   26.82 +		QCanvasText *t;
   26.83 +		for (t=textline.first(); t; t=textline.next() )
   26.84 +		{
   26.85 +			h+=t->boundingRect().height();
   26.86 +			if (w<t->boundingRect().width() )
   26.87 +				w=t->boundingRect().width();
   26.88 +		}	
   26.89 +	} 
   26.90 +    bbox.setSize (QSize(w,h));
   26.91 +}
   26.92 +
   26.93 +QCanvasText* HeadingObj::newLine(QString s)
   26.94 +{
   26.95 +    QCanvasText *t;
   26.96 +    t = new QCanvasText(canvas);
   26.97 +    t->setFont (font);
   26.98 +    t->setColor (color);
   26.99 +    t->setZ(Z_TEXT);
  26.100 +    t->setText(s);
  26.101 +    t->show();
  26.102 +    return t;
  26.103 +}
  26.104 +
  26.105 +void HeadingObj::setText (QString s)
  26.106 +{
  26.107 +    heading=s;
  26.108 +
  26.109 +    // remove old textlines and prepare generating new ones
  26.110 +    textline.clear();
  26.111 +
  26.112 +	// prevent empty textline, so at least a small selection stays
  26.113 +	// visible for this heading
  26.114 +	if (s.length()==0) s="  ";
  26.115 +
  26.116 +    int i=0;	// index for actual search for ws
  26.117 +    int j=0;	// index of last ws
  26.118 +	int k=0;	// index of "<br>" or similar linebreak
  26.119 +	int br=0;	// width of found break, e.g. for <br> it is 4
  26.120 +
  26.121 +    // set the text and wrap lines
  26.122 +    while (s.length()>0)
  26.123 +    {
  26.124 +		// ok, some people wanted manual linebreaks, here we go
  26.125 +		k=s.find ("<br>",i,false);
  26.126 +		if (k>=0)
  26.127 +		{
  26.128 +			br=4;
  26.129 +			i=k;
  26.130 +		} else
  26.131 +			i=s.find (" ",i,false);
  26.132 +		if (i<0 && j==0)
  26.133 +		{   // no ws found at all in s
  26.134 +			// append whole s
  26.135 +			textline.append (newLine(s));
  26.136 +			s="";
  26.137 +		} else
  26.138 +		{
  26.139 +			if (i<0 && j>0)
  26.140 +			{	// no ws found in actual search
  26.141 +				if (s.length()<=textwidth)
  26.142 +				{
  26.143 +					textline.append (newLine(s));
  26.144 +					s="";
  26.145 +				} else
  26.146 +				{
  26.147 +					textline.append (newLine(s.left(j)));
  26.148 +					s=s.mid(j+1,s.length());
  26.149 +					j=0;
  26.150 +				}		    
  26.151 +			} else
  26.152 +			{
  26.153 +				if (i>= 0 && i<=static_cast <int> (textwidth))
  26.154 +				{   // there is a ws in textwidth
  26.155 +					if (br>0)
  26.156 +					{
  26.157 +						// here is a linebreak
  26.158 +						textline.append (newLine(s.left(i)));
  26.159 +						s=s.mid(i+br,s.length());
  26.160 +						i=0;
  26.161 +						j=0;
  26.162 +						br=0;
  26.163 +					} else
  26.164 +					{
  26.165 +						j=i;
  26.166 +						i++;
  26.167 +					}
  26.168 +				} else
  26.169 +				{
  26.170 +					if (i>static_cast <int> (textwidth)  )
  26.171 +					{	
  26.172 +						if (j>0)
  26.173 +						{   // a ws out of textwidth, but we have also one in
  26.174 +							textline.append (newLine(s.left(j)));
  26.175 +							s=s.mid(j+1,s.length());
  26.176 +							i=0;
  26.177 +							j=0;
  26.178 +						} else
  26.179 +						{   // a ws out of text, but none in
  26.180 +							textline.append (newLine(s.left(i)));
  26.181 +							s=s.mid(i+1,s.length());
  26.182 +							i=0;
  26.183 +						}
  26.184 +					}
  26.185 +				} 
  26.186 +			}	  
  26.187 +		}		    
  26.188 +    }
  26.189 +	setVisibility (visible);
  26.190 +	calcBBoxSize();
  26.191 +}
  26.192 +
  26.193 +QString HeadingObj::text ()
  26.194 +{
  26.195 +    return heading;
  26.196 +}
  26.197 +
  26.198 +void HeadingObj::setFont (QFont f)
  26.199 +{
  26.200 +    if (font!=f) 
  26.201 +    {
  26.202 +		font=f;
  26.203 +		setText (text());
  26.204 +    }
  26.205 +}
  26.206 +
  26.207 +QFont HeadingObj::getFont()
  26.208 +{
  26.209 +    return font;
  26.210 +}    
  26.211 +	
  26.212 +	
  26.213 +void HeadingObj::setColor (QColor c)
  26.214 +{
  26.215 +    if (color!=c)
  26.216 +    {
  26.217 +		color=c;
  26.218 +		QCanvasText *t;
  26.219 +		for (t=textline.first(); t; t=textline.next() )
  26.220 +			t->setColor(c);
  26.221 +    }	    
  26.222 +}
  26.223 +
  26.224 +QColor HeadingObj::getColor()
  26.225 +{
  26.226 +    return color;
  26.227 +}    
  26.228 +
  26.229 +void HeadingObj::setVisibility (bool v)
  26.230 +{
  26.231 +    MapObj::setVisibility(v);
  26.232 +    QCanvasText *t;
  26.233 +    for (t=textline.first(); t; t=textline.next() )
  26.234 +		if (v)
  26.235 +			t->show();
  26.236 +		else
  26.237 +			t->hide();
  26.238 +}
  26.239 +
  26.240 +int HeadingObj::getHeight ()
  26.241 +{
  26.242 +	return bbox.height();
  26.243 +}
  26.244 +
  26.245 +int HeadingObj::getWidth()
  26.246 +{
  26.247 +	return bbox.width();
  26.248 +}
  26.249 +
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/headingobj.h	Sun Jan 30 12:58:47 2005 +0000
    27.3 @@ -0,0 +1,37 @@
    27.4 +#ifndef HEADINGOBJ_H
    27.5 +#define HEADINGOBJ_H
    27.6 +
    27.7 +#include "mapobj.h"
    27.8 +
    27.9 +class HeadingObj:public MapObj {
   27.10 +public:
   27.11 +    HeadingObj();
   27.12 +    HeadingObj(QCanvas*);
   27.13 +    virtual ~HeadingObj();
   27.14 +    virtual void init();
   27.15 +    virtual void copy(HeadingObj*);
   27.16 +    virtual void move (double x,double y);      // move to absolute Position
   27.17 +    virtual void moveBy (double x,double y);    // move to relative Position
   27.18 +    virtual void positionBBox();
   27.19 +	virtual void calcBBoxSize();
   27.20 +private:
   27.21 +    QCanvasText* newLine(QString);				// generate new textline
   27.22 +public:    
   27.23 +    virtual void setText(QString);
   27.24 +    virtual QString text();
   27.25 +    virtual void setFont(QFont);
   27.26 +    virtual QFont getFont();
   27.27 +    virtual void setColor(QColor);
   27.28 +    virtual QColor getColor();
   27.29 +    virtual void setVisibility(bool);
   27.30 +	virtual int getHeight();
   27.31 +	virtual int getWidth();
   27.32 +
   27.33 +protected:
   27.34 +    QString heading;
   27.35 +    uint textwidth;								// width for formatting text
   27.36 +    QPtrList <QCanvasText> textline;			// a part of e.g. the parabel
   27.37 +    QColor color;
   27.38 +    QFont font;
   27.39 +};
   27.40 +#endif
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/imageobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    28.3 @@ -0,0 +1,100 @@
    28.4 +#include "imageobj.h"
    28.5 +
    28.6 +/////////////////////////////////////////////////////////////////
    28.7 +// ImageObj
    28.8 +/////////////////////////////////////////////////////////////////
    28.9 +ImageObj::ImageObj( QCanvas *canvas )
   28.10 +    : QCanvasRectangle( canvas )
   28.11 +{
   28.12 +//	cout << "Const ImageObj (canvas)\n";
   28.13 +    setZ(Z_ICON);	
   28.14 +	type=undef;
   28.15 +}
   28.16 +
   28.17 +ImageObj::~ImageObj()
   28.18 +{
   28.19 +//   cout << "Destr ImageObj\n";
   28.20 +}
   28.21 +
   28.22 +void ImageObj::copy(ImageObj* other)
   28.23 +{
   28.24 +	setSize (other->width(), other->height() );
   28.25 +	setVisibility (other->isVisible() );
   28.26 +	type=other->type;
   28.27 +//	if (type==qimage)
   28.28 +		image=other->image;
   28.29 +//	if (type==qpixmap)
   28.30 +		pixmap=other->pixmap;
   28.31 +}
   28.32 +
   28.33 +void ImageObj::setVisibility (bool v)
   28.34 +{
   28.35 +	if (v)	
   28.36 +		show();
   28.37 +	else
   28.38 +		hide();
   28.39 +}
   28.40 +
   28.41 +void ImageObj::save(const QString &fn, const char *format)
   28.42 +{
   28.43 +	switch (type)
   28.44 +	{
   28.45 +		case undef: qWarning("undef");break;
   28.46 +		case qimage: image.save (fn,format,-1);break;
   28.47 +		case qpixmap: pixmap.save (fn,format,-1);break;
   28.48 +	}
   28.49 +}
   28.50 +
   28.51 +bool ImageObj::load (const QString &fn)
   28.52 +{
   28.53 +	if (!image.load( fn) )
   28.54 +		//cout << "Fatal Error in ImageObj::load ("<<fn<<")\n";
   28.55 +		return false;
   28.56 +    setSize( image.width(), image.height() );
   28.57 +	type=qimage;
   28.58 +
   28.59 +#if !defined(Q_WS_QWS)
   28.60 +    pixmap.convertFromImage(image, OrderedAlphaDither);
   28.61 +#endif
   28.62 +	return true;
   28.63 +}
   28.64 +
   28.65 +bool ImageObj::load (QPixmap pm)
   28.66 +{
   28.67 +#if !defined(Q_WS_QWS)
   28.68 +    //pixmap.convertFromImage(image, OrderedAlphaDither);
   28.69 +	type=qpixmap;
   28.70 +	pixmap=pm;
   28.71 +    setSize( pm.width(), pm.height() );
   28.72 +#else
   28.73 +	type=qimage;
   28.74 +	image=pm;
   28.75 +    setSize( image.width(), image.height() );
   28.76 +#endif
   28.77 +	return true;
   28.78 +}
   28.79 +
   28.80 +void ImageObj::setImage(QImage img)
   28.81 +{
   28.82 +	type=qimage;
   28.83 +	image=img;
   28.84 +    pixmap.convertFromImage(image, OrderedAlphaDither);
   28.85 +}
   28.86 +
   28.87 +QPixmap ImageObj::getPixmap()
   28.88 +{
   28.89 +	return pixmap;
   28.90 +}
   28.91 +
   28.92 +void ImageObj::drawShape( QPainter &p )
   28.93 +{
   28.94 +// On Qt/Embedded, we can paint a QImage as fast as a QPixmap,
   28.95 +// but on other platforms, we need to use a QPixmap.
   28.96 +#if defined(Q_WS_QWS)
   28.97 +    p.drawImage( int(x()), int(y()), image, 0, 0, -1, -1, OrderedAlphaDither );
   28.98 +#else
   28.99 +    p.drawPixmap( int(x()), int(y()), pixmap );
  28.100 +#endif
  28.101 +}
  28.102 +
  28.103 +
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/imageobj.h	Sun Jan 30 12:58:47 2005 +0000
    29.3 @@ -0,0 +1,31 @@
    29.4 +#ifndef IMAGEOBJ_H
    29.5 +#define IMAGEOBJ_H
    29.6 +
    29.7 +#include <qimage.h>
    29.8 +#include <qcanvas.h>
    29.9 +#include <qpainter.h>
   29.10 +
   29.11 +#include "mapobj.h"
   29.12 +
   29.13 +enum ImageType {qimage,qpixmap,undef};
   29.14 +
   29.15 +class ImageObj: public QCanvasRectangle
   29.16 +{
   29.17 +public:
   29.18 +    ImageObj( QCanvas *canvas );
   29.19 +    ~ImageObj();
   29.20 +	virtual void copy (ImageObj*);
   29.21 +    virtual void setVisibility(bool);
   29.22 +	void save (const QString &, const char *);
   29.23 +	bool load (const QString &);
   29.24 +	bool load (QPixmap);
   29.25 +	void setImage(QImage img);
   29.26 +	QPixmap getPixmap();
   29.27 +protected:
   29.28 +    void drawShape( QPainter & );
   29.29 +private:
   29.30 +    QImage image;
   29.31 +    QPixmap pixmap;
   29.32 +	ImageType type;
   29.33 +};
   29.34 +#endif
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/linkablemapobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    30.3 @@ -0,0 +1,693 @@
    30.4 +//#include <math.h>
    30.5 +
    30.6 +#include "linkablemapobj.h"
    30.7 +#include "branchobj.h"
    30.8 +#include "mapeditor.h"
    30.9 +
   30.10 +#include "version.h"
   30.11 +
   30.12 +
   30.13 +/////////////////////////////////////////////////////////////////
   30.14 +// LinkableMapObj
   30.15 +/////////////////////////////////////////////////////////////////
   30.16 +
   30.17 +LinkableMapObj::LinkableMapObj():MapObj()
   30.18 +{
   30.19 +  //  cout << "Const LinkableMapObj ()\n";
   30.20 +    init ();
   30.21 +}
   30.22 +
   30.23 +LinkableMapObj::LinkableMapObj(QCanvas* c) :MapObj(c)
   30.24 +{
   30.25 +//    cout << "Const LinkableMapObj\n";
   30.26 +    init ();
   30.27 +}
   30.28 +
   30.29 +LinkableMapObj::LinkableMapObj (LinkableMapObj* lmo) : MapObj (lmo->canvas)
   30.30 +{
   30.31 +    copy (lmo);
   30.32 +}
   30.33 +
   30.34 +LinkableMapObj::~LinkableMapObj()
   30.35 +{
   30.36 +    delete (bottomline);
   30.37 +    delete (selbox);
   30.38 +	delete (frame);
   30.39 +	delLink();
   30.40 +}
   30.41 +
   30.42 +void LinkableMapObj::delLink()
   30.43 +{
   30.44 +	switch (style)
   30.45 +	{
   30.46 +		case StyleLine:
   30.47 +			delete (l);
   30.48 +			break;
   30.49 +		case StyleParabel:
   30.50 +			segment.clear();
   30.51 +			break;
   30.52 +		case StylePolyLine:
   30.53 +			delete (p);
   30.54 +			delete (l);
   30.55 +			break;
   30.56 +		case StylePolyParabel:
   30.57 +			delete (p);
   30.58 +			segment.clear();
   30.59 +			break;
   30.60 +		default:
   30.61 +			break;
   30.62 +	}		
   30.63 +}
   30.64 +
   30.65 +void LinkableMapObj::init ()
   30.66 +{
   30.67 +    depth=-1;	
   30.68 +    childObj=NULL;
   30.69 +    parObj=NULL;
   30.70 +    parObjTmpBuf=NULL;
   30.71 +    parPos=QPoint(0,0);
   30.72 +    childPos=QPoint(0,0);
   30.73 +	link2ParPos=false;
   30.74 +    l=NULL;
   30.75 +    orientation=OrientUndef;
   30.76 +    linkwidth=20;		
   30.77 +	thickness_start=8;
   30.78 +    style=StyleUndef;
   30.79 +	linkpos=LinkBottom;
   30.80 +    segment.setAutoDelete (TRUE);
   30.81 +    arcsegs=13;
   30.82 +	QPointArray pa(arcsegs*2+2);
   30.83 +    
   30.84 +    bottomline=new QCanvasLine(canvas);
   30.85 +    bottomline->setPen( QPen(linkcolor, 1) );
   30.86 +    bottomline->setZ(Z_LINK);
   30.87 +    bottomline->show();
   30.88 +
   30.89 +    // Prepare showing the selection of a MapObj
   30.90 +    selbox = new QCanvasRectangle (canvas);
   30.91 +    selbox->setZ(Z_SELBOX);
   30.92 +    selbox->setBrush( QColor(255,255,0) );
   30.93 +    selbox->setPen( QPen(QColor(255,255,0) ));
   30.94 +    selbox->hide();
   30.95 +    selected=false;
   30.96 +
   30.97 +	// initialize frame
   30.98 +	frame = new FrameObj (canvas);
   30.99 +	
  30.100 +	repositionRequest=false;
  30.101 +}
  30.102 +
  30.103 +void LinkableMapObj::copy (LinkableMapObj* other)
  30.104 +{
  30.105 +    MapObj::copy(other);
  30.106 +	bboxTotal=other->bboxTotal;
  30.107 +//    linkwidth=other->linkwidth;		
  30.108 +
  30.109 +    setLinkStyle(other->style);
  30.110 +    setLinkColor (other->linkcolor);
  30.111 +}
  30.112 +
  30.113 +void LinkableMapObj::setChildObj(LinkableMapObj* o)
  30.114 +{
  30.115 +    childObj=o;
  30.116 +}
  30.117 +
  30.118 +void LinkableMapObj::setParObj(LinkableMapObj* o)
  30.119 +{
  30.120 +    parObj=o;
  30.121 +	mapEditor=parObj->getMapEditor();
  30.122 +}
  30.123 +
  30.124 +void LinkableMapObj::setParObjTmp(LinkableMapObj*,QPoint,int)
  30.125 +{
  30.126 +}
  30.127 +
  30.128 +void LinkableMapObj::unsetParObjTmp()
  30.129 +{
  30.130 +}
  30.131 +
  30.132 +LinkStyle LinkableMapObj::getDefLinkStyle ()
  30.133 +{
  30.134 +	LinkStyle ls=mapEditor->getLinkStyle();
  30.135 +	switch (ls)
  30.136 +	{
  30.137 +		case StyleLine: 
  30.138 +			return ls;
  30.139 +			break;
  30.140 +		case StyleParabel:
  30.141 +			return ls;
  30.142 +			break;
  30.143 +		case StylePolyLine:	
  30.144 +			if (depth>1)
  30.145 +				return StyleLine;
  30.146 +			else	
  30.147 +				return ls;
  30.148 +			break;
  30.149 +		case StylePolyParabel:	
  30.150 +			if (depth>1)
  30.151 +				return StyleParabel;
  30.152 +			else	
  30.153 +				return ls;
  30.154 +			break;
  30.155 +		default: 
  30.156 +			break;	
  30.157 +	}	
  30.158 +	return StyleUndef;
  30.159 +}
  30.160 +
  30.161 +void LinkableMapObj::setLinkStyle(LinkStyle newstyle)
  30.162 +{
  30.163 +	delLink();
  30.164 +		
  30.165 +	style=newstyle;
  30.166 +
  30.167 +    if (childObj!=NULL && parObj != NULL)
  30.168 +    {
  30.169 +		int i;
  30.170 +		QCanvasLine* cl;
  30.171 +		switch (style)
  30.172 +		{
  30.173 +			case StyleUndef:
  30.174 +				bottomline->hide();
  30.175 +				break;
  30.176 +			case StyleLine: 
  30.177 +				l = new QCanvasLine(canvas);
  30.178 +				l->setPen( QPen(linkcolor, 1) );
  30.179 +				l->setZ(Z_LINK);
  30.180 +				if (visible)
  30.181 +					l->show();
  30.182 +				else
  30.183 +					l->hide();
  30.184 +				break;
  30.185 +			case StyleParabel:
  30.186 +				for (i=0;i<arcsegs;i++)
  30.187 +				{
  30.188 +					cl = new QCanvasLine(canvas);
  30.189 +					cl->setPen( QPen(linkcolor, 1) );
  30.190 +					cl->setPoints( 0,0,i*10,100);
  30.191 +					cl->setZ(Z_LINK);
  30.192 +					if (visible)
  30.193 +						cl->show();
  30.194 +					else
  30.195 +						cl->hide();
  30.196 +					segment.append(cl);
  30.197 +				}
  30.198 +				pa0.resize (arcsegs+1);
  30.199 +				break;
  30.200 +			case StylePolyLine:	
  30.201 +				p = new QCanvasPolygon(canvas);
  30.202 +				p->setBrush( linkcolor );
  30.203 +				p->setZ(Z_LINK);
  30.204 +				if (visible)
  30.205 +					p->show();
  30.206 +				else
  30.207 +					p->hide();
  30.208 +				pa0.resize (3);
  30.209 +				// TODO
  30.210 +				// a bit awkward: draw the lines additionally to polygon, to avoid
  30.211 +				// missing pixels, when polygon is extremly flat
  30.212 +				l = new QCanvasLine(canvas);
  30.213 +				l->setPen( QPen(linkcolor, 1) );
  30.214 +				l->setZ(Z_LINK);
  30.215 +				if (visible)
  30.216 +					l->show();
  30.217 +				else
  30.218 +					l->hide();
  30.219 +				break;
  30.220 +			case StylePolyParabel:	
  30.221 +				p = new QCanvasPolygon(canvas);
  30.222 +				p->setBrush( linkcolor );
  30.223 +				p->setZ(Z_LINK);
  30.224 +				if (visible)
  30.225 +					p->show();
  30.226 +				else
  30.227 +					p->hide();
  30.228 +				pa0.resize (arcsegs*2+2);
  30.229 +				pa1.resize (arcsegs+1);
  30.230 +				pa2.resize (arcsegs+1);
  30.231 +
  30.232 +				// TODO
  30.233 +				// a bit awkward: draw the lines additionally 
  30.234 +				// to polygon, to avoid missing pixels, 
  30.235 +				// if polygon is extremly flat
  30.236 +				for (i=0;i<arcsegs;i++)
  30.237 +				{
  30.238 +					cl = new QCanvasLine(canvas);
  30.239 +					cl->setPen( QPen(linkcolor, 1) );
  30.240 +					cl->setPoints( 0,0,i*10,100);
  30.241 +					cl->setZ(Z_LINK);
  30.242 +					if (visible)
  30.243 +						cl->show();
  30.244 +					else
  30.245 +						cl->hide();
  30.246 +					segment.append(cl);
  30.247 +				}
  30.248 +				break;
  30.249 +			default: 
  30.250 +				break;	
  30.251 +		}	
  30.252 +	} else
  30.253 +	{
  30.254 +		cout << "Error: ChildObj or parObj == NULL in LinkableMapObj::setLinkStyle\n";
  30.255 +	}
  30.256 +}
  30.257 +
  30.258 +LinkStyle LinkableMapObj::getLinkStyle()
  30.259 +{
  30.260 +	return style;
  30.261 +}
  30.262 +
  30.263 +void LinkableMapObj::setLinkPos(LinkPos lp)
  30.264 +{
  30.265 +	linkpos=lp;
  30.266 +}
  30.267 +
  30.268 +LinkPos LinkableMapObj::getLinkPos()
  30.269 +{
  30.270 +	return linkpos;
  30.271 +}
  30.272 +
  30.273 +
  30.274 +void LinkableMapObj::setLinkColor()
  30.275 +{
  30.276 +	// Overloaded in BranchObj and childs
  30.277 +	// here only set default color
  30.278 +	setLinkColor (mapEditor->getDefLinkColor());
  30.279 +}
  30.280 +
  30.281 +void LinkableMapObj::setLinkColor(QColor col)
  30.282 +{
  30.283 +	linkcolor=col;
  30.284 +    bottomline->setPen( QPen(linkcolor, 1) );
  30.285 +	QCanvasLine *cl;
  30.286 +	switch (style)
  30.287 +	{
  30.288 +		case StyleLine:
  30.289 +			l->setPen( QPen(col,1));
  30.290 +			break;	
  30.291 +		case StyleParabel:	
  30.292 +			for (cl=segment.first(); cl; cl=segment.next() )
  30.293 +				cl->setPen( QPen(col,1));
  30.294 +			break;
  30.295 +		case StylePolyLine:
  30.296 +			p->setBrush( QBrush(col));
  30.297 +			l->setPen( QPen(col,1));
  30.298 +			break;
  30.299 +		case StylePolyParabel:	
  30.300 +			p->setBrush( QBrush(col));
  30.301 +			for (cl=segment.first(); cl; cl=segment.next() )
  30.302 +				cl->setPen( QPen(col,1));
  30.303 +			break;
  30.304 +		default:
  30.305 +			break;
  30.306 +	} // switch (style)	
  30.307 +	updateLink();
  30.308 +}
  30.309 +
  30.310 +QColor LinkableMapObj::getLinkColor()
  30.311 +{
  30.312 +	return linkcolor;
  30.313 +}
  30.314 +
  30.315 +FrameType LinkableMapObj::getFrameType()
  30.316 +{
  30.317 +	return frame->getFrameType();
  30.318 +}
  30.319 +
  30.320 +void LinkableMapObj::setFrameType(const FrameType &t)
  30.321 +{
  30.322 +	frame->setFrameType(t);
  30.323 +	calcBBoxSize();
  30.324 +	positionBBox();
  30.325 +	requestReposition();
  30.326 +}
  30.327 +
  30.328 +void LinkableMapObj::setFrameType(const QString &t)
  30.329 +{
  30.330 +	frame->setFrameType(t);
  30.331 +	calcBBoxSize();
  30.332 +	positionBBox();
  30.333 +	requestReposition();
  30.334 +}
  30.335 +
  30.336 +void LinkableMapObj::setVisibility (bool v)
  30.337 +{
  30.338 +	MapObj::setVisibility (v);
  30.339 +	if (visible) 
  30.340 +	{
  30.341 +		bottomline->show();
  30.342 +		// FIXME lines and segments should be done in LMO?
  30.343 +		if (style==StyleLine && l) 
  30.344 +		{
  30.345 +			l->show();
  30.346 +		} else
  30.347 +		{
  30.348 +			QCanvasLine* cl;
  30.349 +			for (cl=segment.first(); cl; cl=segment.next() )
  30.350 +				cl->show();
  30.351 +		} 
  30.352 +	} else 
  30.353 +	{
  30.354 +		bottomline->hide();
  30.355 +		if (style==StyleLine && l) 
  30.356 +		{
  30.357 +			l->hide();
  30.358 +		} else
  30.359 +		{
  30.360 +			QCanvasLine* cl;
  30.361 +			for (cl=segment.first(); cl; cl=segment.next() )
  30.362 +				cl->hide();
  30.363 +		} 
  30.364 +	}	
  30.365 +}
  30.366 +
  30.367 +void LinkableMapObj::updateLink()
  30.368 +{
  30.369 +    // needs:
  30.370 +    //	childPos of parent
  30.371 +    //	orient   of parent
  30.372 +    //	style
  30.373 +    // 
  30.374 +    // sets:
  30.375 +    //	orientation
  30.376 +    //	childPos
  30.377 +    //	parPos
  30.378 +	//  offset
  30.379 +    //	drawing of the link itself
  30.380 +
  30.381 +
  30.382 +	// updateLink is called from move, but called from constructor we don't
  30.383 +	// have parents yet...
  30.384 +	if (style==StyleUndef) return;	
  30.385 +
  30.386 +	if (frame->getFrameType() == NoFrame)
  30.387 +		linkpos=LinkBottom;
  30.388 +	else	
  30.389 +		linkpos=LinkMiddle;
  30.390 +	switch (linkpos)
  30.391 +	{
  30.392 +		case LinkMiddle:
  30.393 +			offset=bbox.height() /2;
  30.394 +			break;
  30.395 +		default :
  30.396 +			offset=bbox.height()-1;			// draw link to bottom of bbox
  30.397 +			break;
  30.398 +	}
  30.399 +	
  30.400 +    double p2x,p2y;								// Set P2 Before setting
  30.401 +	if (!link2ParPos)
  30.402 +	{
  30.403 +		p2x=QPoint( parObj->getChildPos() ).x();	// P1, we have to look at
  30.404 +		p2y=QPoint( parObj->getChildPos() ).y();	// orientation
  30.405 +	} else	
  30.406 +	{
  30.407 +		p2x=QPoint( parObj->getParPos() ).x();	
  30.408 +		p2y=QPoint( parObj->getParPos() ).y();
  30.409 +	} 
  30.410 +
  30.411 +	LinkOrient orientOld=orientation;
  30.412 +
  30.413 +    // Set orientation, first look for orientation of parent
  30.414 +    if (parObj->getOrientation() != OrientUndef ) 
  30.415 +		// use the orientation of the parent:
  30.416 +		orientation=parObj->getOrientation();
  30.417 +    else
  30.418 +    {
  30.419 +		// calc orientation depending on position rel to mapCenter
  30.420 +		if (absPos.x() < QPoint(parObj->getChildPos() ).x() )
  30.421 +			orientation=OrientLeftOfCenter; 
  30.422 +		else
  30.423 +			orientation=OrientRightOfCenter;
  30.424 +    }
  30.425 +
  30.426 +	if ((orientation!=orientOld) && (orientOld!= OrientUndef))
  30.427 +	{
  30.428 +		// Orientation just changed. Reorient this subbranch, because move is called
  30.429 +		// before updateLink => Position is still the old one, which could lead to 
  30.430 +		// linking of subranch to itself => segfault
  30.431 +		//
  30.432 +		// Also possible: called in BranchObj::init(), then orientOld==OrientUndef,
  30.433 +		// no need to reposition now
  30.434 +		reposition();
  30.435 +	}
  30.436 +	
  30.437 +    if (orientation==OrientLeftOfCenter )
  30.438 +    {
  30.439 +		childPos=QPoint (absPos.x(),absPos.y()+offset);
  30.440 +		parPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset );
  30.441 +    } else
  30.442 +    {
  30.443 +		childPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset ); 
  30.444 +		parPos=QPoint (absPos.x(),absPos.y()+offset);
  30.445 +    }
  30.446 +	/* FIXME
  30.447 +		cout << "      LMO::updateLink   absPos="<<absPos<<endl;
  30.448 +		cout << "      LMO::updateLink childPos="<<childPos<<endl;
  30.449 +		cout << "      LMO::updateLink   parPos="<<parPos<<endl;
  30.450 +		cout << "      LMO::updateLink   offset="<<offset<<endl;
  30.451 +		cout << "      LMO::updateLink   bbox.w="<<bbox.width()<<endl;
  30.452 +		cout << "      LMO::updateLink   bbox.h="<<bbox.height()<<endl;
  30.453 +	*/	
  30.454 +
  30.455 +	double p1x=parPos.x();	// Link is drawn from P1 to P2
  30.456 +	double p1y=parPos.y();
  30.457 +
  30.458 +	double vx=p2x - p1x;	// V=P2-P1
  30.459 +	double vy=p2y - p1y;
  30.460 +
  30.461 +	// Draw the horizontal line below heading (from ChildPos to ParPos)
  30.462 +	bottomline->setPoints (lrint(childPos.x()),
  30.463 +		lrint(childPos.y()),
  30.464 +		lrint(p1x),
  30.465 +		lrint(p1y) );
  30.466 +
  30.467 +	double a;	// angle
  30.468 +	if (vx > -0.000001 && vx < 0.000001)
  30.469 +		a=M_PI_2;
  30.470 +	else
  30.471 +		a=atan( vy / vx );
  30.472 +	// "turning point" for drawing polygonal links
  30.473 +	QPoint tp (-lrint(sin (a)*thickness_start), lrint(cos (a)*thickness_start));	
  30.474 +	
  30.475 +	QCanvasLine *cl;
  30.476 +
  30.477 +	int i;
  30.478 +
  30.479 +    // Draw the link
  30.480 +	switch (style)
  30.481 +	{
  30.482 +		case StyleLine:
  30.483 +			l->setPoints( lrint (parPos.x()),
  30.484 +				lrint(parPos.y()),
  30.485 +				lrint(p2x),
  30.486 +				lrint(p2y) );
  30.487 +			break;	
  30.488 +		case StyleParabel:	
  30.489 +			parabel (pa0, p1x,p1y,p2x,p2y);
  30.490 +			i=0;
  30.491 +			for (cl=segment.first(); cl; cl=segment.next() )
  30.492 +			{	
  30.493 +				cl->setPoints( pa0.point(i).x(), pa0.point(i).y(),pa0.point(i+1).x(),pa0.point(i+1).y());
  30.494 +				i++;
  30.495 +			}
  30.496 +			break;
  30.497 +		case StylePolyLine:
  30.498 +			pa0[0]=QPoint (lrint(p2x+tp.x()), lrint(p2y+tp.y()));
  30.499 +			pa0[1]=QPoint (lrint(p2x-tp.x()), lrint(p2y-tp.y()));
  30.500 +			pa0[2]=QPoint (lrint (parPos.x()), lrint(parPos.y()) );
  30.501 +			p->setPoints (pa0);
  30.502 +			// here too, draw line to avoid missing pixels
  30.503 +			l->setPoints( lrint (parPos.x()),
  30.504 +				lrint(parPos.y()),
  30.505 +				lrint(p2x),
  30.506 +				lrint(p2y) );
  30.507 +			break;
  30.508 +		case StylePolyParabel:	
  30.509 +			parabel (pa1, p1x,p1y,p2x+tp.x(),p2y+tp.y());
  30.510 +			parabel (pa2, p1x,p1y,p2x-tp.x(),p2y-tp.y());
  30.511 +			for (i=0;i<=arcsegs;i++)
  30.512 +			{
  30.513 +				// Combine the arrays to a single one
  30.514 +				pa0[i]=pa1[i];
  30.515 +				pa0[i+arcsegs+1]=pa2[arcsegs-i];
  30.516 +			}	
  30.517 +			p->setPoints (pa0);
  30.518 +			i=0;
  30.519 +			for (cl=segment.first(); cl; cl=segment.next() )
  30.520 +			{	
  30.521 +				cl->setPoints( pa1.point(i).x(), pa1.point(i).y(),pa1.point(i+1).x(),pa1.point(i+1).y());
  30.522 +				i++;
  30.523 +			}
  30.524 +			break;
  30.525 +		default:
  30.526 +			break;
  30.527 +	} // switch (style)	
  30.528 +}
  30.529 +	
  30.530 +LinkableMapObj* LinkableMapObj::getChildObj()
  30.531 +{
  30.532 +    return childObj;
  30.533 +}
  30.534 +
  30.535 +LinkableMapObj* LinkableMapObj::getParObj()
  30.536 +{
  30.537 +    return parObj;
  30.538 +}
  30.539 +
  30.540 +QPoint LinkableMapObj::getChildPos()
  30.541 +{
  30.542 +    return childPos;
  30.543 +}
  30.544 +
  30.545 +QPoint LinkableMapObj::getParPos()
  30.546 +{
  30.547 +    return parPos;
  30.548 +}
  30.549 +
  30.550 +QPoint LinkableMapObj::getRelPos()
  30.551 +{
  30.552 +	if (!parObj) return QPoint (0,0);
  30.553 +    return QPoint(
  30.554 +		absPos.x() - parObj->x(),
  30.555 +		absPos.y() - parObj->y()
  30.556 +	);
  30.557 +}
  30.558 +
  30.559 +LinkOrient LinkableMapObj::getOrientation()
  30.560 +{
  30.561 +    return orientation;
  30.562 +}
  30.563 +
  30.564 +int LinkableMapObj::getDepth()
  30.565 +{
  30.566 +    return depth;
  30.567 +}
  30.568 +
  30.569 +void LinkableMapObj::setMapEditor (MapEditor *me)
  30.570 +{
  30.571 +	mapEditor=me;
  30.572 +}
  30.573 +
  30.574 +MapEditor* LinkableMapObj::getMapEditor ()
  30.575 +{
  30.576 +	return mapEditor;
  30.577 +}
  30.578 +
  30.579 +QPoint LinkableMapObj::getRandPos()
  30.580 +{
  30.581 +	// Choose a random position with given distance to parent:
  30.582 +	double a=rand()%360 * 2 * M_PI / 360;
  30.583 +    return QPoint ( (int)( + 150*cos (a)),
  30.584 +                    (int)( + 150*sin (a)));
  30.585 +}
  30.586 +
  30.587 +void LinkableMapObj::alignRelativeTo (QPoint ref)
  30.588 +{
  30.589 +}
  30.590 +
  30.591 +void LinkableMapObj::reposition()
  30.592 +{
  30.593 +cout << "LMO::reposition  ???"<<endl;
  30.594 +	if (depth==0)
  30.595 +	{
  30.596 +		// only calculate the sizes once. If the deepest LMO changes its height,
  30.597 +		// all upper LMOs have to change, too.
  30.598 +		calcBBoxSizeWithChilds();
  30.599 +
  30.600 +	    alignRelativeTo ( QPoint (absPos.x(),
  30.601 +							absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  30.602 +	} else
  30.603 +	{
  30.604 +		// This is only important for moving branches:
  30.605 +		// For editing a branch it isn't called...
  30.606 +	    alignRelativeTo ( QPoint (absPos.x(),
  30.607 +							absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  30.608 +	}
  30.609 +}
  30.610 +
  30.611 +void LinkableMapObj::requestReposition()
  30.612 +{
  30.613 +	if (!repositionRequest)
  30.614 +	{
  30.615 +		// Pass on the request to parental objects, if this hasn't
  30.616 +		// been done yet
  30.617 +		repositionRequest=true;
  30.618 +		if (parObj) parObj->requestReposition();
  30.619 +	}
  30.620 +}
  30.621 +
  30.622 +void LinkableMapObj::forceReposition()
  30.623 +{
  30.624 +	// Sometimes a reposition has to be done immediatly: For example
  30.625 +	// if the note editor flag changes, there is no user event in mapeditor
  30.626 +	// which could collect requests for a reposition.
  30.627 +	// Then we have to call forceReposition()
  30.628 +	// But no rule without exception: While loading a map or undoing it,
  30.629 +	// we want to block expensive repositioning, but just do it once at
  30.630 +	// the end, thus check first:
  30.631 +
  30.632 +	if (mapEditor->blockReposition()) return;
  30.633 +	
  30.634 +	// Pass on the request to parental objects, if this hasn't been done yet
  30.635 +	
  30.636 +	if (parObj) 
  30.637 +		parObj->forceReposition(); 
  30.638 +	else 
  30.639 +		reposition(); }
  30.640 +
  30.641 +bool LinkableMapObj::repositionRequested()
  30.642 +{
  30.643 +	return repositionRequest;
  30.644 +}
  30.645 +
  30.646 +
  30.647 +void LinkableMapObj::setSelBox()
  30.648 +{
  30.649 +    selbox->setX (bbox.x() );
  30.650 +    selbox->setY (bbox.y() );
  30.651 +    selbox->setSize (bbox.width(), bbox.height() );
  30.652 +}
  30.653 +
  30.654 +void LinkableMapObj::select()
  30.655 +{
  30.656 +	setSelBox();
  30.657 +    selected=true;
  30.658 +    selbox->show();
  30.659 +}
  30.660 +
  30.661 +
  30.662 +void LinkableMapObj::unselect()
  30.663 +{
  30.664 +    selected=false;
  30.665 +    selbox->hide();
  30.666 +}
  30.667 +
  30.668 +void LinkableMapObj::parabel (QPointArray &ya, double p1x, double p1y, double p2x, double p2y)
  30.669 +
  30.670 +{
  30.671 +	double vx=p2x - p1x;	// V=P2-P1
  30.672 +	double vy=p2y - p1y;
  30.673 +
  30.674 +	double dx;				// delta x during calculation of parabel
  30.675 +	
  30.676 +	double pnx;				// next point
  30.677 +	double pny;
  30.678 +	double m;
  30.679 +
  30.680 +	if (vx > -0.0001 && vx < 0.0001)
  30.681 +		m=0;
  30.682 +	else	
  30.683 +		m=(vy / (vx*vx));
  30.684 +	dx=vx/(arcsegs);
  30.685 +	int i;
  30.686 +	ya.setPoint (0,QPoint (lrint(p1x),lrint(p1y)));
  30.687 +	for (i=1;i<=arcsegs;i++)
  30.688 +	{	
  30.689 +		pnx=p1x+dx;
  30.690 +		pny=m*(pnx-parPos.x())*(pnx-parPos.x())+parPos.y();
  30.691 +		ya.setPoint (i,QPoint (lrint(pnx),lrint(pny)));
  30.692 +		p1x=pnx;
  30.693 +		p1y=pny;
  30.694 +	}	
  30.695 +}
  30.696 +
    31.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.2 +++ b/linkablemapobj.h	Sun Jan 30 12:58:47 2005 +0000
    31.3 @@ -0,0 +1,113 @@
    31.4 +#ifndef LINKABLEMAPOBJ_H
    31.5 +#define LINKABLEMAPOBJ_H
    31.6 +
    31.7 +#include "frameobj.h"
    31.8 +#include "noteobj.h"
    31.9 +#include "headingobj.h"
   31.10 +#include "flagrowobj.h"
   31.11 +
   31.12 +#define MAX_DEPTH 999
   31.13 +
   31.14 +enum LinkOrient {OrientUndef,OrientLeftOfCenter, OrientRightOfCenter};
   31.15 +enum LinkStyle {
   31.16 +	StyleUndef,
   31.17 +	StyleLine, 
   31.18 +	StyleParabel, 
   31.19 +	StylePolyLine,
   31.20 +	StylePolyParabel
   31.21 +};
   31.22 +enum LinkPos {LinkMiddle,LinkBottom};
   31.23 +enum LinkColorHint {DefaultColor,HeadingColor};
   31.24 +
   31.25 +class LinkableMapObj:public QObject, public MapObj {
   31.26 +	Q_OBJECT
   31.27 +public:
   31.28 +    LinkableMapObj ();
   31.29 +    LinkableMapObj (QCanvas*);
   31.30 +    LinkableMapObj (LinkableMapObj*);
   31.31 +    ~LinkableMapObj ();
   31.32 +	virtual void delLink();
   31.33 +    virtual void init ();
   31.34 +    virtual void copy (LinkableMapObj*);
   31.35 +    void setChildObj (LinkableMapObj*);
   31.36 +    virtual void setParObj (LinkableMapObj*);
   31.37 +    virtual void setParObjTmp (LinkableMapObj*,QPoint,int);	// Only for moving Obj around
   31.38 +	virtual void unsetParObjTmp();						// reuse original ParObj
   31.39 +	LinkStyle getDefLinkStyle();
   31.40 +    void setLinkStyle(LinkStyle);            
   31.41 +	LinkStyle getLinkStyle();
   31.42 +	void setLinkPos (LinkPos);
   31.43 +	LinkPos getLinkPos ();
   31.44 +
   31.45 +	virtual void setLinkColor();					// sets color according to colorhint, overloaded
   31.46 +	virtual void setLinkColor(QColor);
   31.47 +	QColor getLinkColor();
   31.48 +	virtual FrameType getFrameType ();
   31.49 +	virtual void setFrameType (const FrameType &);
   31.50 +	virtual void setFrameType (const QString &);
   31.51 +	virtual void setVisibility (bool);
   31.52 +    virtual void updateLink();				// update parPos and childPos
   31.53 +											// depending on pos
   31.54 +											// redraw link with given style
   31.55 +    LinkableMapObj* getChildObj();			// returns pointer to fromObj
   31.56 +    LinkableMapObj* getParObj();			// returns pointer to toObj
   31.57 +    QPoint getChildPos();					// returns pos where childs dock
   31.58 +    QPoint getParPos();						// returns pos where parents dock
   31.59 +    QPoint getRelPos();						// get position relative to parent (or (0,0))
   31.60 +    LinkOrient getOrientation();			// get orientation
   31.61 +    virtual int getDepth();					// return depth
   31.62 +	virtual void setMapEditor(MapEditor*);	// set MapEditor (needed in LMO::updateNoteFlag)
   31.63 +	virtual MapEditor* getMapEditor();		// get MapEditor (usually from parent);
   31.64 +	virtual QPoint getRandPos();			// make randomised position
   31.65 +
   31.66 +    virtual void alignRelativeTo(const QPoint );
   31.67 +	virtual void reposition();
   31.68 +	virtual void requestReposition();		// do reposition after next user event
   31.69 +	virtual void forceReposition();			// to force a reposition now (outside
   31.70 +											// of mapeditor e.g. in noteeditor
   31.71 +	virtual bool repositionRequested();
   31.72 +
   31.73 +	virtual QRect getTotalBBox()=0;			// return BBox including childs			
   31.74 +	virtual QRect getBBoxSizeWithChilds()=0;// return size of BBox including childs  
   31.75 +	virtual void calcBBoxSizeWithChilds()=0;// calc size of  BBox including childs recursivly
   31.76 +
   31.77 +	virtual void setSelBox();
   31.78 +    virtual void select();
   31.79 +    virtual void unselect();
   31.80 +	virtual	QString getSelectString()=0;
   31.81 +
   31.82 +protected:
   31.83 +	void parabel(QPointArray &,double,double,double,double);	// Create Parabel connecting two points
   31.84 +    QPoint childPos;
   31.85 +    QPoint parPos;
   31.86 +	bool link2ParPos;				// While moving around, sometimes link to parent
   31.87 +	MapEditor* mapEditor;			// for updateNoteFlag() and toggleScroll()
   31.88 +    LinkOrient orientation;     
   31.89 +    int linkwidth;					// width of a link
   31.90 +    int depth;						// depth: undef=-1 mapCenter=0 branch=1..n
   31.91 +	QRect bboxTotal;				// bounding box including childs
   31.92 +
   31.93 +    LinkableMapObj* childObj;
   31.94 +    LinkableMapObj* parObj;
   31.95 +    LinkableMapObj* parObjTmpBuf;	// temporary buffer the original parent
   31.96 +    int offset;                     // vertical offset of dockpos to pos
   31.97 +
   31.98 +	int thickness_start;			// for StylePoly*	
   31.99 +    LinkStyle style;
  31.100 +	LinkPos linkpos;
  31.101 +    QColor linkcolor;               // Link color
  31.102 +    QCanvasLine* l;                 // line style
  31.103 +	QCanvasPolygon* p;				// poly styles
  31.104 +    int arcsegs;                    // arc: number of segments
  31.105 +    QPtrList <QCanvasLine> segment; // a part of e.g. the parabel
  31.106 +	QPointArray pa0;				// For drawing of PolyParabel and PolyLine
  31.107 +	QPointArray pa1;				// For drawing of PolyParabel 
  31.108 +	QPointArray pa2;				// For drawing of PolyParabel	
  31.109 +    QCanvasLine* bottomline;        // on bottom of BBox
  31.110 +	bool repositionRequest;			// 
  31.111 +
  31.112 +	bool selected;					// Used for marking the selection
  31.113 +	QCanvasRectangle* selbox;
  31.114 +	FrameObj *frame;				// frame around object
  31.115 +};
  31.116 +#endif
    32.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    32.2 +++ b/main.cpp	Sun Jan 30 12:58:47 2005 +0000
    32.3 @@ -0,0 +1,177 @@
    32.4 +#include <qapplication.h>
    32.5 +#include <qpixmap.h>
    32.6 +#include <qtranslator.h>
    32.7 +
    32.8 +#include "settings.h"
    32.9 +#include "options.h"
   32.10 +#include "mainwindow.h"
   32.11 +
   32.12 +#include "icons/vym-48x48.xpm"
   32.13 +#include "icons/vym-editor.xpm"
   32.14 +
   32.15 +#include "flagrowobj.h"
   32.16 +
   32.17 +// Global variables
   32.18 +TextEditor *textEditor;			// used in Constr. of LinkableMapObj
   32.19 +								// initialized in mainwindow
   32.20 +
   32.21 +Main *mainWindow;				// used in BranchObj::select()								
   32.22 +MapEditor *clipboardME;			
   32.23 +FlagRowObj *systemFlagsDefault;	// used to copy from in LinkableMapObj
   32.24 +FlagRowObj *standardFlagsDefault;
   32.25 +
   32.26 +// Actions which change sometimes
   32.27 +QAction *actionFileSave;
   32.28 +QAction *actionFilePrint;
   32.29 +QAction *actionEditUndo;
   32.30 +QAction *actionEditCopy;
   32.31 +QAction *actionEditCut;
   32.32 +QAction *actionEditPaste;
   32.33 +QAction *actionEditMoveUp;
   32.34 +QAction *actionEditMoveDown;
   32.35 +QAction *actionEditToggleScroll;
   32.36 +QAction *actionEditOpenURL;
   32.37 +QAction *actionEditURL;
   32.38 +QAction *actionEditHeading2URL;
   32.39 +QAction *actionEditBugzilla2URL;
   32.40 +QAction *actionEditOpenVymLink;
   32.41 +QAction *actionEditVymLink;
   32.42 +QAction *actionEditDeleteVymLink;
   32.43 +QAction *actionEditMapInfo;
   32.44 +QAction *actionEditHeading;
   32.45 +QAction *actionEditDelete;
   32.46 +QAction *actionEditAddBranch;
   32.47 +QAction *actionEditAddBranchAbove;
   32.48 +QAction *actionEditAddBranchBelow;
   32.49 +QAction *actionEditImportAdd;
   32.50 +QAction *actionEditImportReplace;
   32.51 +QAction *actionEditSaveBranch;
   32.52 +QAction *actionEditSelectFirst;
   32.53 +QAction *actionEditSelectLast;
   32.54 +QAction *actionEditLoadImage;
   32.55 +QAction *actionEditToggleFloatExport;
   32.56 +
   32.57 +QAction *actionFormatColor;		
   32.58 +QAction *actionFormatPickColor;		
   32.59 +QAction *actionFormatColorBranch;
   32.60 +QAction *actionFormatColorSubtree;
   32.61 +QAction *actionFormatBackColor;
   32.62 +QAction *actionFormatLinkColorHint;
   32.63 +QAction *actionFormatLinkColor;		
   32.64 +
   32.65 +QActionGroup *actionGroupFormatFrameTypes;
   32.66 +QAction *actionFormatFrameNone;
   32.67 +QAction *actionFormatFrameRectangle;
   32.68 +
   32.69 +QActionGroup *actionGroupFormatLinkStyles;
   32.70 +QAction *actionFormatLinkStyleLine;
   32.71 +QAction *actionFormatLinkStyleParabel;
   32.72 +QAction *actionFormatLinkStylePolyLine;
   32.73 +QAction *actionFormatLinkStylePolyParabel;
   32.74 +
   32.75 +QAction *actionViewToggleNoteEditor;
   32.76 +
   32.77 +QAction *actionSettingsAutoselectHeading;
   32.78 +QAction *actionSettingsAutoselectText;
   32.79 +QAction *actionSettingsPasteNewHeading;
   32.80 +QAction *actionSettingsAutoedit;
   32.81 +QAction *actionSettingsUseDelKey;
   32.82 +
   32.83 +QPopupMenu *branchContextMenu;
   32.84 +QPopupMenu *floatimageContextMenu;
   32.85 +QPopupMenu *saveImageFormatMenu;
   32.86 +QPopupMenu *canvasContextMenu;
   32.87 +QPopupMenu *lastMapsMenu;
   32.88 +QPopupMenu *exportMenu;
   32.89 +QPopupMenu *exportImageFormatMenu;
   32.90 +
   32.91 +
   32.92 +Settings settings;
   32.93 +Options options;
   32.94 +
   32.95 +int statusbarTime=3500;
   32.96 +
   32.97 +int main(int argc, char** argv)
   32.98 +{
   32.99 +    QApplication app(argc,argv);
  32.100 +
  32.101 +
  32.102 +	// Initialize translations
  32.103 +	QTranslator translator (0);
  32.104 +	translator.load( "vym_de", "." );
  32.105 +    app.installTranslator( &translator );
  32.106 +
  32.107 +	// Initializing the row of system flags
  32.108 +	// is done in first call to MapEditor(),
  32.109 +	// because we need at least one canvas first
  32.110 +	systemFlagsDefault=NULL;
  32.111 +	standardFlagsDefault=NULL;
  32.112 +
  32.113 +	// Reading and initializing options commandline options
  32.114 +	options.add ("version", SwitchOption, "v","version");
  32.115 +	options.add ("help", SwitchOption, "h", "help");
  32.116 +	options.add ("quit", SwitchOption, "q", "quit");
  32.117 +	options.add ("test", StringOption, "t", "test");
  32.118 +	options.setHelpText (
  32.119 +		"VYM - View Your Mind\n"
  32.120 +		"--------------------\n\n"
  32.121 +		"Information about vym can be found in vym.pdf,\n"
  32.122 +		"which should be part of the vym package.\n"
  32.123 +		"It is also available at the project homepage:\n\n"
  32.124 +		"http://www.InSilmaril.de/vym\n");
  32.125 +	if (options.parse())
  32.126 +	{
  32.127 +		cout << endl << options.getHelpText()<<endl;
  32.128 +		return 1;
  32.129 +	}
  32.130 +
  32.131 +	if (options.isOn ("version"))
  32.132 +	{
  32.133 +		cout << "vym version "<<__VYM_VERSION__
  32.134 +			<<"  (c) 2004 Uwe Drechsel - "
  32.135 +			<<__BUILD_DATE__<<endl;
  32.136 +			
  32.137 +		return 0;	
  32.138 +	}		
  32.139 +	
  32.140 +	if (options.isOn ("help"))
  32.141 +	{
  32.142 +		cout << options.getHelpText()<<endl;
  32.143 +		return 0;	
  32.144 +	}	
  32.145 +
  32.146 +	if (options.isOn ("test"))
  32.147 +	{
  32.148 +		// FIXME testing string option only
  32.149 +		cout << "Testing: "<<options.getArg("test")<< endl;
  32.150 +	}	
  32.151 +
  32.152 +	// Initialize window of TextEditor
  32.153 +	textEditor = new TextEditor();
  32.154 +	textEditor->setIcon (QPixmap (vym_editor_xpm));
  32.155 +	if (textEditor->showWithMain()) textEditor->show();
  32.156 +
  32.157 +	clipboardME = new MapEditor();
  32.158 +	clipboardME->resize (800,600);
  32.159 +	clipboardME->setCaption("VYM - clipboard");
  32.160 +	clipboardME->hide();
  32.161 +
  32.162 +	// Initialize mainwindow after Mapeditors (because of Flags)
  32.163 +    Main m;
  32.164 +	//m.resize(m.sizeHint());
  32.165 +	m.setIcon (QPixmap (vym_logo_xpm));
  32.166 +	m.show();
  32.167 +	m.fileNew();
  32.168 +	m.loadCmdLine();
  32.169 +
  32.170 +	// For benchmarking we may want to quit immediatly after drawing
  32.171 +	if (options.isOn ("quit"))
  32.172 +	{
  32.173 +		return 0;
  32.174 +	}	
  32.175 +
  32.176 +    QObject::connect( &app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()) );
  32.177 +
  32.178 +    return app.exec();
  32.179 +}
  32.180 +
    33.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    33.2 +++ b/mainwindow.cpp	Sun Jan 30 12:58:47 2005 +0000
    33.3 @@ -0,0 +1,2213 @@
    33.4 +#include "mainwindow.h"
    33.5 +
    33.6 +#include <qstatusbar.h>
    33.7 +#include <qmessagebox.h>
    33.8 +#include <qmenubar.h>
    33.9 +#include <qapplication.h>
   33.10 +#include <qpainter.h>
   33.11 +#include <qprinter.h>
   33.12 +#include <qfile.h>
   33.13 +#include <qfiledialog.h>
   33.14 +#include <qcolor.h>
   33.15 +#include <qcolordialog.h>
   33.16 +#include <qbitmap.h>
   33.17 +#include <qinputdialog.h>
   33.18 +
   33.19 +
   33.20 +#include <iostream>
   33.21 +#include <stdlib.h>
   33.22 +#include <typeinfo>
   33.23 +
   33.24 +#include "version.h"
   33.25 +
   33.26 +#include "icons/filenew.xpm"
   33.27 +#include "icons/fileopen.xpm"
   33.28 +#include "icons/filesave.xpm"
   33.29 +#include "icons/fileprint.xpm"
   33.30 +#include "icons/editundo.xpm"
   33.31 +//#include "icons/editredo.xpm"	// TODO
   33.32 +#include "icons/editcopy.xpm"
   33.33 +#include "icons/editcut.xpm"
   33.34 +#include "icons/editpaste.xpm"
   33.35 +#include "icons/editmoveup.xpm"
   33.36 +#include "icons/editmovedown.xpm"
   33.37 +#include "icons/formatcoloritem.xpm"
   33.38 +#include "icons/formatcolorbranch.xpm"
   33.39 +#include "icons/formatcolorpicker.xpm"
   33.40 +#include "icons/viewzoomreset.xpm"
   33.41 +#include "icons/viewzoomin.xpm"
   33.42 +#include "icons/viewzoomout.xpm"
   33.43 +#include "icons/vym-48x48.xpm"
   33.44 +#include "icons/flag-note.xpm"
   33.45 +#include "icons/flag-url.xpm"
   33.46 +#include "icons/flag-vymlink.xpm"	
   33.47 +#include "icons/flag-scrolled-right.xpm"
   33.48 +
   33.49 +#include "flagrowobj.h"
   33.50 +#include "texteditor.h"
   33.51 +#include "mapeditor.h"
   33.52 +#include "exporthtmldialog.h"
   33.53 +#include "exportxhtmldialog.h"
   33.54 +#include "showtextdialog.h"
   33.55 +#include "process.h"
   33.56 +#include "settings.h"
   33.57 +#include "options.h"
   33.58 +
   33.59 +extern TextEditor *textEditor;
   33.60 +extern Main *mainWindow;
   33.61 +extern int statusbarTime;
   33.62 +extern MapEditor *clipboardME;
   33.63 +extern FlagRowObj* standardFlagsDefault;
   33.64 +
   33.65 +extern QAction* actionFileSave;
   33.66 +extern QAction* actionFilePrint;
   33.67 +extern QAction* actionEditUndo;
   33.68 +extern QAction *actionEditCopy;
   33.69 +extern QAction *actionEditCut;
   33.70 +extern QAction *actionEditPaste;
   33.71 +extern QAction *actionEditMoveUp;
   33.72 +extern QAction *actionEditMoveDown;
   33.73 +extern QAction *actionEditToggleScroll;
   33.74 +extern QAction* actionEditOpenURL;
   33.75 +extern QAction* actionEditURL;
   33.76 +extern QAction* actionEditHeading2URL;
   33.77 +extern QAction* actionEditBugzilla2URL;
   33.78 +extern QAction *actionEditOpenVymLink;
   33.79 +extern QAction *actionEditVymLink;
   33.80 +extern QAction *actionEditDeleteVymLink;
   33.81 +extern QAction *actionEditMapInfo;
   33.82 +extern QAction *actionEditHeading;
   33.83 +extern QAction *actionEditDelete;
   33.84 +extern QAction *actionEditAddBranch;
   33.85 +extern QAction *actionEditAddBranchAbove;
   33.86 +extern QAction *actionEditAddBranchBelow;
   33.87 +extern QAction *actionEditImportAdd;
   33.88 +extern QAction *actionEditImportReplace;
   33.89 +extern QAction *actionEditSaveBranch;
   33.90 +extern QAction *actionEditSelectFirst;
   33.91 +extern QAction *actionEditSelectLast;
   33.92 +extern QAction *actionEditLoadImage;
   33.93 +extern QAction *actionEditToggleFloatExport;
   33.94 +
   33.95 +extern QAction* actionFormatColor;
   33.96 +extern QAction* actionFormatPickColor;
   33.97 +extern QAction* actionFormatColorBranch;
   33.98 +extern QAction* actionFormatColorSubtree;
   33.99 +extern QAction* actionFormatLinkColorHint;
  33.100 +extern QAction* actionFormatBackColor;
  33.101 +extern QAction* actionFormatLinkColor;
  33.102 +
  33.103 +extern QActionGroup *actionGroupFormatFrameTypes;
  33.104 +extern QAction *actionFormatFrameNone;
  33.105 +extern QAction *actionFormatFrameRectangle;
  33.106 +
  33.107 +extern QActionGroup *actionGroupFormatLinkStyles;
  33.108 +extern QAction *actionFormatLinkStyleLine;
  33.109 +extern QAction *actionFormatLinkStyleParabel;
  33.110 +extern QAction *actionFormatLinkStylePolyLine;
  33.111 +extern QAction *actionFormatLinkStylePolyParabel;
  33.112 +
  33.113 +extern QAction *actionViewToggleNoteEditor;
  33.114 +
  33.115 +extern QAction* actionSettingsAutoedit;
  33.116 +extern QAction* actionSettingsAutoselectHeading;
  33.117 +extern QAction* actionSettingsAutoselectHeading;
  33.118 +extern QAction* actionSettingsAutoselectText;
  33.119 +extern QAction* actionSettingsPasteNewHeading;
  33.120 +extern QAction* actionSettingsUseDelKey;
  33.121 +
  33.122 +extern QPopupMenu* branchContextMenu;
  33.123 +extern QPopupMenu* floatimageContextMenu;
  33.124 +extern QPopupMenu* saveImageFormatMenu;
  33.125 +extern QPopupMenu* canvasContextMenu;
  33.126 +extern QPopupMenu* lastMapsMenu;
  33.127 +extern QPopupMenu* exportMenu;
  33.128 +extern QPopupMenu* exportImageFormatMenu;
  33.129 +
  33.130 +
  33.131 +extern Settings settings;
  33.132 +extern Options options;
  33.133 +
  33.134 +#if defined(Q_OS_LINUX)
  33.135 +extern void qt_wait_for_window_manager( QWidget* w );
  33.136 +#endif
  33.137 +
  33.138 +Main::Main(QWidget* parent, const char* name, WFlags f) :
  33.139 +    QMainWindow(parent,name,f)
  33.140 +{
  33.141 +	mainWindow=this;
  33.142 +
  33.143 +	setCaption ("VYM - View Your Mind");
  33.144 +
  33.145 +	// Load window settings
  33.146 +	resize (settings.readNumEntry( "/vym/mainwindow/geometry/width", 800),
  33.147 +	        settings.readNumEntry( "/vym/mainwindow/geometry/height",600));
  33.148 +	move   (settings.readNumEntry( "/vym/mainwindow/geometry/posX", 100),
  33.149 +	        settings.readNumEntry( "/vym/mainwindow/geometry/posY", 100));
  33.150 +
  33.151 +
  33.152 +	// Initialize some settings, which are platform dependant
  33.153 +	QString p,s;
  33.154 +
  33.155 +		// application to open URLs
  33.156 +		p="/vym/mainwindow/readerURL";
  33.157 +		#if defined(Q_OS_LINUX)
  33.158 +			s=settings.readEntry (p,"konqueror");
  33.159 +		#else
  33.160 +			#if defined(Q_OS_MACX)
  33.161 +				s=settings.readEntry (p,"/Applications/Safari.app/Contents/MacOS/Safari");
  33.162 +			#else
  33.163 +				s=settings.readEntry (p,"mozilla");
  33.164 +			#endif
  33.165 +		#endif
  33.166 +		settings.writeEntry( p,s);
  33.167 +
  33.168 +		// application to open PDFs
  33.169 +		p="/vym/mainwindow/readerPDF";
  33.170 +		#if defined(Q_OS_LINUX)
  33.171 +			s=settings.readEntry (p,"acroread");
  33.172 +		#else
  33.173 +			#if defined(Q_OS_MACX)
  33.174 +				s=settings.readEntry (p,"/Applications/Safari.app/Contents/MacOS/Safari");
  33.175 +			#else
  33.176 +				s=settings.readEntry (p,"acroread");
  33.177 +			#endif
  33.178 +		#endif
  33.179 +		settings.writeEntry( p,s);
  33.180 +
  33.181 +	
  33.182 +	maxLastMaps=9;
  33.183 +
  33.184 +	// Create tab widget which holds the maps
  33.185 +	tabWidget= new QTabWidget (this);
  33.186 +	connect( tabWidget, SIGNAL( currentChanged( QWidget * ) ), 
  33.187 +		this, SLOT( editorChanged( QWidget * ) ) );
  33.188 +
  33.189 +	setCentralWidget(tabWidget);	
  33.190 +
  33.191 +    setupFileActions();
  33.192 +    setupEditActions();
  33.193 +    setupFormatActions();
  33.194 +    setupViewActions();
  33.195 +	setupFlagActions();
  33.196 +    setupSettingsActions();
  33.197 +	setupContextMenus();
  33.198 +    if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) setupTestActions();
  33.199 +    setupHelpActions();
  33.200 +    
  33.201 +	// After menu is created, we can enable some actions
  33.202 +	actionFilePrint->setEnabled (true);
  33.203 +
  33.204 +    statusBar();
  33.205 +
  33.206 +	// Create the default map into first tab
  33.207 +//	fileNew();
  33.208 +//	tabWidget->addTab (new MapEditor(tabWidget,true), "unnamed");
  33.209 +//	currentMapEditor()->show();
  33.210 +
  33.211 +	// Initialize Find window
  33.212 +	findWindow=new FindWindow(NULL,"findwindow");
  33.213 +	connect (findWindow, SIGNAL( findButton(QString) ), 
  33.214 +		this, SLOT(editFind(QString) ) );	
  33.215 +	connect (findWindow, SIGNAL( somethingChanged() ), 
  33.216 +		this, SLOT(editFindChanged() ) );	
  33.217 +
  33.218 +	updateGeometry();
  33.219 +}
  33.220 +
  33.221 +Main::~Main()
  33.222 +{
  33.223 +	// Save Settings
  33.224 +	settings.writeEntry( "/vym/mainwindow/geometry/width", width() );
  33.225 +	settings.writeEntry( "/vym/mainwindow/geometry/height", height() );
  33.226 +	settings.writeEntry( "/vym/mainwindow/geometry/posX", pos().x() );
  33.227 +	settings.writeEntry( "/vym/mainwindow/geometry/posY", pos().y() );
  33.228 +
  33.229 +	settings.writeEntry( "/vym/version/version", __VYM_VERSION__ );
  33.230 +	settings.writeEntry( "/vym/version/builddate", __BUILD_DATE__ );
  33.231 +
  33.232 +	settings.writeEntry( "/vym/mapeditor/editmode/autoselectheading",actionSettingsAutoselectHeading->isOn() );
  33.233 +	settings.writeEntry( "/vym/mapeditor/editmode/autoselecttext",actionSettingsAutoselectText->isOn() );
  33.234 +	settings.writeEntry( "/vym/mapeditor/editmode/pastenewheading",actionSettingsPasteNewHeading->isOn() );
  33.235 +	settings.writeEntry( "/vym/mapeditor/editmode/autoedit",actionSettingsAutoedit->isOn() );
  33.236 +	settings.writeEntry( "/vym/mapeditor/editmode/useDelKey",actionSettingsUseDelKey->isOn() );
  33.237 +
  33.238 +	QString s;
  33.239 +	int maps=lastMaps.count();
  33.240 +	settings.writeEntry( "/vym/lastMaps/number",maps );
  33.241 +	for (int i=1;i<=maps;i++)
  33.242 +	{
  33.243 +		QStringList::Iterator it = lastMaps.at(i-1);
  33.244 +		s=QString("/vym/lastMaps/map-%1").arg(i);
  33.245 +		if (!s.isEmpty() && i<=maxLastMaps) 
  33.246 +			settings.writeEntry (s, *it);
  33.247 +	}
  33.248 +
  33.249 +
  33.250 +	// To make the texteditor save its settings, call the destructor
  33.251 +	delete (textEditor);
  33.252 +}
  33.253 +
  33.254 +void Main::loadCmdLine()
  33.255 +{
  33.256 +	/* TODO draw some kind of splashscreen while loading...
  33.257 +	if (qApp->argc()>1)
  33.258 +	{
  33.259 +	}
  33.260 +	*/
  33.261 +	
  33.262 +	QStringList flist=options.getFileList();
  33.263 +	QStringList::Iterator it=flist.begin();
  33.264 +
  33.265 +	while (it !=flist.end() )
  33.266 +	{
  33.267 +		fileLoad (*it, NewMap);
  33.268 +		*it++;
  33.269 +	}	
  33.270 +}
  33.271 +
  33.272 +
  33.273 +void Main::statusMessage(const QString &s)
  33.274 +{
  33.275 +	statusBar()->message (s);
  33.276 +}
  33.277 +
  33.278 +void Main::closeEvent (QCloseEvent* )
  33.279 +{
  33.280 +	fileExitVYM();
  33.281 +}
  33.282 +
  33.283 +// File Actions
  33.284 +void Main::setupFileActions()
  33.285 +{
  33.286 +    QToolBar *tb = new QToolBar( this );
  33.287 +    tb->setLabel( "File Actions" );
  33.288 +    QPopupMenu *menu = new QPopupMenu( this );
  33.289 +    menuBar()->insertItem( tr( "&File" ), menu );
  33.290 +
  33.291 +	// Keycodes:  /usr/lib64/qt3/include/qnamespace.h
  33.292 +
  33.293 +    QAction *a;
  33.294 +    a = new QAction( tr( "New map" ), QPixmap( filenew_xpm ), tr( "&New..." ), CTRL + Key_N, this, "fileNew" );
  33.295 +    connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
  33.296 +    a->addTo( tb );
  33.297 +    a->addTo( menu );
  33.298 +	
  33.299 +    a = new QAction( tr( "Open" ), QPixmap( fileopen_xpm), tr( "&Open..." ), CTRL + Key_O, this, "fileOpen" );
  33.300 +    connect( a, SIGNAL( activated() ), this, SLOT( fileLoad() ) );
  33.301 +    a->addTo( tb );
  33.302 +    a->addTo( menu );
  33.303 +	
  33.304 +	lastMapsMenu = new QPopupMenu (this);
  33.305 +
  33.306 +    menu->insertItem (tr("Open Recent"),lastMapsMenu );
  33.307 +    menu->insertSeparator();
  33.308 +	
  33.309 +    a = new QAction( tr( "Save" ), QPixmap( filesave_xpm ), tr( "&Save..." ), CTRL + Key_S, this, "fileSave" );
  33.310 +    connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) );
  33.311 +    a->addTo( tb );
  33.312 +    a->addTo( menu );
  33.313 +	actionFileSave=a;
  33.314 +	
  33.315 +    a = new QAction( tr( "Save &As" ), QPixmap(), tr( "Save &As..." ), 0, this, "fileSaveAs" );
  33.316 +    connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) );
  33.317 +    a->addTo( menu );
  33.318 +
  33.319 +    menu->insertSeparator();
  33.320 +
  33.321 +    a = new QAction( tr( "Import directory structure (experimental)" ), QPixmap(), tr( "Import Dir" ), 0, this, "export" );
  33.322 +    connect( a, SIGNAL( activated() ), this, SLOT( fileImportDir() ) );
  33.323 +    a->addTo( menu );
  33.324 +
  33.325 +	exportMenu = new QPopupMenu (this);
  33.326 +    menu->insertItem (tr("Export"),exportMenu );
  33.327 +
  33.328 +    menu->insertSeparator();
  33.329 +
  33.330 +
  33.331 +    a = new QAction( tr( "Print" ), QPixmap( fileprint_xpm ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" );
  33.332 +    connect( a, SIGNAL( activated() ), this, SLOT( filePrint() ) );
  33.333 +    a->addTo( tb );
  33.334 +    a->addTo( menu );
  33.335 +	actionFilePrint=a;
  33.336 +
  33.337 +    a = new QAction( tr( "Close Map" ), QPixmap(), tr( "&Close Map" ), ALT + Key_C, this, "fileCloseMap" );
  33.338 +    connect( a, SIGNAL( activated() ), this, SLOT( fileCloseMap() ) );
  33.339 +    a->addTo( menu );
  33.340 +
  33.341 +    a = new QAction( tr( "Exit VYM" ), QPixmap(), tr( "E&xit VYM" ), CTRL + Key_Q, this, "fileExitVYM" );
  33.342 +    connect( a, SIGNAL( activated() ), this, SLOT( fileExitVYM() ) );
  33.343 +    a->addTo( menu );
  33.344 +}
  33.345 +
  33.346 +
  33.347 +//Edit Actions
  33.348 +void Main::setupEditActions()
  33.349 +{
  33.350 +    QToolBar *tb = new QToolBar( this );
  33.351 +    tb->setLabel( "Edit Actions" );
  33.352 +    QPopupMenu *menu = new QPopupMenu( this );
  33.353 +    menuBar()->insertItem( tr( "&Edit" ), menu );
  33.354 +
  33.355 +    QAction *a;
  33.356 +    a = new QAction( tr( "Undo" ), QPixmap( editundo_xpm ), tr( "&Undo" ), CTRL + Key_Z, this, "editUndo" );
  33.357 +    connect( a, SIGNAL( activated() ), this, SLOT( editUndo() ) );
  33.358 +	a->setEnabled (false);
  33.359 +    a->addTo( tb );
  33.360 +    a->addTo( menu );
  33.361 +	actionEditUndo=a;
  33.362 +    /*
  33.363 +    a = new QAction( tr( "Redo" ), QPixmap( editredo_xpm ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" ); 
  33.364 +    connect( a, SIGNAL( activated() ), this, SLOT( editRedo() ) );
  33.365 +    a->addTo( tb );
  33.366 +    a->addTo( menu );
  33.367 +    */
  33.368 +    menu->insertSeparator();
  33.369 +    a = new QAction( tr( "Copy" ), QPixmap( editcopy_xpm ), tr( "&Copy" ), CTRL + Key_C, this, "editCopy" );
  33.370 +    connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) );
  33.371 +	a->setEnabled (false);
  33.372 +    a->addTo( tb );
  33.373 +    a->addTo( menu );
  33.374 +	actionEditCopy=a;
  33.375 +    a = new QAction( tr( "Cut" ), QPixmap( editcut_xpm ), tr( "Cu&t" ), CTRL + Key_X, this, "editCut" );
  33.376 +    connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) );
  33.377 +	a->setEnabled (false);
  33.378 +    a->addTo( tb );
  33.379 +    a->addTo( menu );
  33.380 +	actionEditCut=a;
  33.381 +    a = new QAction( tr( "Paste" ), QPixmap( editpaste_xpm ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" );
  33.382 +    connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) );
  33.383 +	a->setEnabled (false);
  33.384 +    a->addTo( tb );
  33.385 +    a->addTo( menu );
  33.386 +	actionEditPaste=a;
  33.387 +    a = new QAction( tr( "Move branch up" ), QPixmap( editmoveup_xpm ), tr( "Move up" ), Key_PageUp, this, "editMoveUp" );
  33.388 +    connect( a, SIGNAL( activated() ), this, SLOT( editMoveUp() ) );
  33.389 +	a->setEnabled (false);
  33.390 +    a->addTo( tb );
  33.391 +    a->addTo( menu );
  33.392 +	actionEditMoveUp=a;
  33.393 +    a = new QAction( tr( "Move branch down" ), QPixmap( editmovedown_xpm ), tr( "Move down" ), Key_PageDown, this, "editMoveDown" );
  33.394 +    connect( a, SIGNAL( activated() ), this, SLOT( editMoveDown() ) );
  33.395 +	a->setEnabled (false);
  33.396 +    a->addTo( tb );
  33.397 +    a->addTo( menu );
  33.398 +	actionEditMoveDown=a;
  33.399 +
  33.400 +    a = new QAction( tr( "Scroll branch" ), QPixmap(flag_scrolled_right_xpm), tr( "Scroll branch" ), Key_ScrollLock, this, "scroll" );
  33.401 +    connect( a, SIGNAL( activated() ), this, SLOT( editToggleScroll() ) );
  33.402 +	a->setEnabled (false);
  33.403 +    a->addTo( tb );
  33.404 +    a->addTo( menu );
  33.405 +	actionEditToggleScroll=a;
  33.406 +	
  33.407 +    a = new QAction( tr( "Unscroll all" ), QPixmap(), tr( "Unscroll all scrolled branches" ), 0, this, "scroll" );
  33.408 +    connect( a, SIGNAL( activated() ), this, SLOT( editUnScrollAll() ) );
  33.409 +    a->addTo( menu );
  33.410 +	
  33.411 +    menu->insertSeparator();
  33.412 +
  33.413 +	a = new QAction( tr( "Find" ), QPixmap(), tr( "Find" ), CTRL + Key_F, this, "find" );
  33.414 +    connect( a, SIGNAL( activated() ), this, SLOT( editOpenFindWindow() ) );
  33.415 +    a->addTo( menu );
  33.416 +    
  33.417 +	menu->insertSeparator();
  33.418 +
  33.419 +	a = new QAction( tr( "Open URL" ), QPixmap(flag_url_xpm), tr( "Open URL" ), CTRL + Key_U, this, "url" );
  33.420 +    connect( a, SIGNAL( activated() ), this, SLOT( editOpenURL() ) );
  33.421 +    a->addTo( menu );
  33.422 +    a->addTo( tb );
  33.423 +	a->setEnabled (false);
  33.424 +	actionEditOpenURL=a;
  33.425 +
  33.426 +	a = new QAction( tr( "Edit URL" ), QPixmap(), tr( "Edit URL" ), SHIFT + CTRL + Key_U, this, "url" );
  33.427 +    connect( a, SIGNAL( activated() ), this, SLOT( editURL() ) );
  33.428 +    a->addTo( menu );
  33.429 +	a->setEnabled (false);
  33.430 +	actionEditURL=a;
  33.431 +	
  33.432 +	a = new QAction( tr( "Use heading of selected branch as URL" ), QPixmap(), tr( "Use heading for URL" ), 0, this, "heading2url" );
  33.433 +    connect( a, SIGNAL( activated() ), this, SLOT( editHeading2URL() ) );
  33.434 +    a->addTo( menu );
  33.435 +	a->setEnabled (false);
  33.436 +	actionEditHeading2URL=a;
  33.437 +    
  33.438 +	a = new QAction( tr( "Create URL to Bugzilla" ), QPixmap(), tr( "Create URL to Bugzilla" ), 0, this, "bugzilla2url" );
  33.439 +    connect( a, SIGNAL( activated() ), this, SLOT( editBugzilla2URL() ) );
  33.440 +	a->setEnabled (false);
  33.441 +	actionEditBugzilla2URL=a;
  33.442 +    
  33.443 +	menu->insertSeparator();
  33.444 +	
  33.445 +    a = new QAction( tr( "Jump to another vym map, if needed load it first" ), QPixmap(flag_vymlink_xpm), tr( "Jump to map" ), 0, this, "jumpMap" );
  33.446 +    connect( a, SIGNAL( activated() ), this, SLOT( editOpenVymLink() ) );
  33.447 +    a->addTo( menu );
  33.448 +    a->addTo( tb );
  33.449 +	a->setEnabled (false);
  33.450 +	actionEditOpenVymLink=a;
  33.451 +	
  33.452 +    a = new QAction( tr( "Edit link to another vym map" ), QPixmap(), tr( "Edit vym link" ), 0, this, "editLinkMap" );
  33.453 +    connect( a, SIGNAL( activated() ), this, SLOT( editVymLink() ) );
  33.454 +    a->addTo( menu );
  33.455 +	a->setEnabled (false);
  33.456 +	actionEditVymLink=a;
  33.457 +
  33.458 +    a = new QAction( tr( "Delete link to another vym map" ), QPixmap(), tr( "Delete vym link" ), 0, this, "deleteLinkMap" );
  33.459 +    connect( a, SIGNAL( activated() ), this, SLOT( editDeleteVymLink() ) );
  33.460 +    a->addTo( menu );
  33.461 +	a->setEnabled (false);
  33.462 +	actionEditDeleteVymLink=a;
  33.463 +
  33.464 +	menu->insertSeparator();
  33.465 +
  33.466 +    a = new QAction( tr( "Edit Map Info" ), QPixmap(), tr( "Edit Map Info" ), 0, this, "editMapInfo" );
  33.467 +    connect( a, SIGNAL( activated() ), this, SLOT( editMapInfo() ) );
  33.468 +    a->addTo( menu );
  33.469 +	a->setEnabled (true);
  33.470 +	actionEditMapInfo=a;
  33.471 +
  33.472 +	menu->insertSeparator();
  33.473 +
  33.474 +    // Shortcuts to modify heading:
  33.475 +    a = new QAction( tr( "edit Heading" ),tr( "Edit heading" ), Key_Enter, this, "editHeading" );
  33.476 +    connect( a, SIGNAL( activated() ), this, SLOT( editHeading() ) );
  33.477 +	a->setEnabled (false);
  33.478 +    a->addTo ( menu );
  33.479 +	actionEditHeading=a;
  33.480 +    a = new QAction( tr( "edit Heading" ),tr( "Edit heading" ), Key_Return, this, "editHeading" );
  33.481 +    connect( a, SIGNAL( activated() ), this, SLOT( editHeading() ) );
  33.482 +    //a->addTo ( menu );
  33.483 +    
  33.484 +    // Shortcut to delete selection
  33.485 +    a = new QAction( tr( "Delete Selection" ),tr( "Delete Selection" ), Key_Delete, this, "deleteBranch" );
  33.486 +    connect( a, SIGNAL( activated() ), this, SLOT( editDeleteSelection() ) );
  33.487 +	a->setEnabled (false);
  33.488 +    a->addTo ( menu );
  33.489 +	actionEditDelete=a;
  33.490 +    
  33.491 +    // Shortcut to add branch
  33.492 +	#if defined (Q_OS_MACX)
  33.493 +		a = new QAction( tr( "Add a branch as child of selection" ),tr( "Add branch as child" ), CTRL + Key_I, this, "newBranch" );
  33.494 +	#else
  33.495 +		a = new QAction( tr( "Add a branch as child of selection" ),tr( "Add branch as child" ), Key_Insert, this, "newBranch" );
  33.496 +	#endif
  33.497 +    connect( a, SIGNAL( activated() ), this, SLOT( editNewBranch() ) );
  33.498 +	a->setEnabled (false);
  33.499 +    a->addTo ( menu );
  33.500 +	actionEditAddBranch=a;
  33.501 +
  33.502 +	// Add branch above
  33.503 +    a = new QAction( tr( "Add a branch above selection" ),tr( "Add branch above" ), SHIFT+Key_Insert, this, "newBranch" );
  33.504 +    connect( a, SIGNAL( activated() ), this, SLOT( editNewBranchAbove() ) );
  33.505 +	a->setEnabled (false);
  33.506 +    a->addTo ( menu );
  33.507 +	actionEditAddBranchAbove=a;
  33.508 +
  33.509 +	// Add branch below 
  33.510 +    a = new QAction( tr( "Add a branch below selection" ),tr( "Add branch below" ), CTRL +Key_Insert, this, "newBranch" );
  33.511 +    connect( a, SIGNAL( activated() ), this, SLOT( editNewBranchBelow() ) );
  33.512 +	a->setEnabled (false);
  33.513 +    a->addTo ( menu );
  33.514 +	actionEditAddBranchBelow=a;
  33.515 +
  33.516 +	// Import at selection (adding to selection)
  33.517 +    a = new QAction( tr( "Add map at selection" ),tr( "Import (add)" ), 0, this, "importAdd" );
  33.518 +    connect( a, SIGNAL( activated() ), this, SLOT( editImportAdd() ) );
  33.519 +	a->setEnabled (false);
  33.520 +    a->addTo ( menu );
  33.521 +	actionEditImportAdd=a;
  33.522 +
  33.523 +	// Import at selection (replacing selection)
  33.524 +    a = new QAction( tr( "Replace selection with map" ),tr( "Import (replace)" ), 0, this, "importReplace" );
  33.525 +    connect( a, SIGNAL( activated() ), this, SLOT( editImportReplace() ) );
  33.526 +	a->setEnabled (false);
  33.527 +    a->addTo ( menu );
  33.528 +	actionEditImportReplace=a;
  33.529 +
  33.530 +	// Save selection 
  33.531 +    a = new QAction( tr( "Save selction" ),tr( "Save selection" ), 0, this, "saveSelection" );
  33.532 +    connect( a, SIGNAL( activated() ), this, SLOT( editSaveBranch() ) );
  33.533 +	a->setEnabled (false);
  33.534 +    a->addTo ( menu );
  33.535 +	actionEditSaveBranch=a;
  33.536 +
  33.537 +    // Shortcuts for navigating with cursor:
  33.538 +    a = new QAction( tr( "Select upper branch" ),tr( "Select upper branch" ), Key_Up, this, "upperBranch" );
  33.539 +    connect( a, SIGNAL( activated() ), this, SLOT( editUpperBranch() ) );
  33.540 +    a = new QAction( tr( "Select lower branch" ),tr( "Select lower branch" ), Key_Down, this, "lowerBranch" );
  33.541 +    connect( a, SIGNAL( activated() ), this, SLOT( editLowerBranch() ) );
  33.542 +    a = new QAction( tr( "Select left branch" ),tr( "Select left branch" ), Key_Left, this, "upperBranch" );
  33.543 +    connect( a, SIGNAL( activated() ), this, SLOT( editLeftBranch() ) );
  33.544 +    a = new QAction( tr( "Select right branch" ),tr( "Select child branch" ), Key_Right, this, "rightBranch" );
  33.545 +    connect( a, SIGNAL( activated() ), this, SLOT( editRightBranch() ) );
  33.546 +    a = new QAction( tr( "Select first branch" ),tr( "Select first branch" ), Key_Home, this, "firstBranch" );
  33.547 +	a->setEnabled (false);
  33.548 +    a->addTo ( menu );
  33.549 +	actionEditSelectFirst=a;
  33.550 +    connect( a, SIGNAL( activated() ), this, SLOT( editFirstBranch() ) );
  33.551 +    a = new QAction( tr( "Select last branch" ),tr( "Select last branch" ), Key_End, this, "lastBranch" );
  33.552 +    connect( a, SIGNAL( activated() ), this, SLOT( editLastBranch() ) );
  33.553 +	a->setEnabled (false);
  33.554 +    a->addTo ( menu );
  33.555 +	actionEditSelectLast=a;
  33.556 +
  33.557 +    a = new QAction( tr( "Add Image" ),tr( "Add Image" ), 0, this, "loadImage" );
  33.558 +    connect( a, SIGNAL( activated() ), this, SLOT( editLoadImage() ) );
  33.559 +	actionEditLoadImage=a;
  33.560 +}
  33.561 +
  33.562 +// Format Actions
  33.563 +void Main::setupFormatActions()
  33.564 +{
  33.565 +    QPopupMenu *menu = new QPopupMenu( this );
  33.566 +    menuBar()->insertItem( tr( "&Format" ), menu );
  33.567 +
  33.568 +    QToolBar *tb = new QToolBar( this );
  33.569 +    QAction *a;
  33.570 +    QPixmap pix( 16,16);
  33.571 +    pix.fill (black);
  33.572 +    actionFormatColor= new QAction( tr( "Set Color" ), pix, tr( "Set &Color" ), 0, this, "formatColor" );
  33.573 +    connect( actionFormatColor, SIGNAL( activated() ), this, SLOT( formatSelectColor() ) );
  33.574 +    actionFormatColor->addTo( tb );
  33.575 +    actionFormatColor->addTo( menu );
  33.576 +    a= new QAction( tr( "Pick color\nHint: You can pick a color from another branch and color using CTRL+Left Button" ), QPixmap(formatcolorpicker_xpm), tr( "Pic&k color" ), CTRL + Key_K, this, "pickColor" );
  33.577 +    connect( a, SIGNAL( activated() ), this, SLOT( formatPickColor() ) );
  33.578 +	a->setEnabled (false);
  33.579 +    a->addTo( tb );
  33.580 +    a->addTo( menu );
  33.581 +	actionFormatPickColor=a;
  33.582 +    a= new QAction( tr( "Color branch" ), QPixmap(formatcoloritem_xpm), tr( "Color &branch" ), CTRL + Key_I, this, "colorItem" );
  33.583 +    connect( a, SIGNAL( activated() ), this, SLOT( formatColorItem() ) );
  33.584 +	a->setEnabled (false);
  33.585 +    a->addTo( tb );
  33.586 +    a->addTo( menu );
  33.587 +	actionFormatColorBranch=a;
  33.588 +    a= new QAction( tr( "Color Subtree" ), QPixmap(formatcolorbranch_xpm), tr( "Color sub&tree" ), CTRL + Key_T, this, "colorBranch" );
  33.589 +    connect( a, SIGNAL( activated() ), this, SLOT( formatColorBranch() ) );
  33.590 +	a->setEnabled (false);
  33.591 +    a->addTo( menu );
  33.592 +    a->addTo( tb );
  33.593 +	actionFormatColorSubtree=a;
  33.594 +
  33.595 +    menu->insertSeparator();
  33.596 +	actionGroupFormatLinkStyles=new QActionGroup ( this, "formatLinkStyles");
  33.597 +	actionGroupFormatLinkStyles->setExclusive (true);
  33.598 +    a= new QAction( tr( "Line" ), QPixmap(), tr( "Linkstyle Line" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" );
  33.599 +	a->setToggleAction(true);
  33.600 +    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStyleLine() ) );
  33.601 +	actionFormatLinkStyleLine=a;
  33.602 +    a= new QAction( tr( "Line" ), QPixmap(), tr( "Linkstyle Parabel" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" );
  33.603 +	a->setToggleAction(true);
  33.604 +    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStyleParabel() ) );
  33.605 +	actionFormatLinkStyleParabel=a;
  33.606 +    a= new QAction( tr( "PolyLine" ), QPixmap(), tr( "Linkstyle Thick Line" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" );
  33.607 +	a->setToggleAction(true);
  33.608 +    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStylePolyLine() ) );
  33.609 +	actionFormatLinkStylePolyLine=a;
  33.610 +    a= new QAction( tr( "PolyParabel" ), QPixmap(), tr( "Linkstyle Thick Parabel" ), 0, actionGroupFormatLinkStyles, "formatLinkStylePolyParabel" );
  33.611 +	a->setToggleAction(true);
  33.612 +    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStylePolyParabel() ) );
  33.613 +	actionFormatLinkStylePolyParabel=a;
  33.614 +	actionGroupFormatLinkStyles->addTo (menu);
  33.615 +	
  33.616 +	actionGroupFormatFrameTypes=new QActionGroup ( this, "formatFrameTypes");
  33.617 +	actionGroupFormatFrameTypes->setExclusive (true);
  33.618 +    a = new QAction( tr( "No Frame" ),tr( "No Frame" ), 0, actionGroupFormatFrameTypes, "frameNone" );
  33.619 +	a->setToggleAction(true);
  33.620 +    connect( a, SIGNAL( activated() ), this, SLOT( formatFrameNone() ) );
  33.621 +	actionFormatFrameNone=a;
  33.622 +    a = new QAction( tr( "Rectangle" ),tr( "Rectangle" ), 0, actionGroupFormatFrameTypes, "frameRectangle" );
  33.623 +	a->setToggleAction(true);
  33.624 +    connect( a, SIGNAL( activated() ), this, SLOT( formatFrameRectangle() ) );
  33.625 +	actionFormatFrameRectangle=a;
  33.626 +
  33.627 +    menu->insertSeparator();
  33.628 +    a= new QAction( tr( "Use same color for links and headings" ), QPixmap(), tr( "&Use color of heading for link" ), 0, this, "formatLinkColorHint" );
  33.629 +	a->setToggleAction(true);
  33.630 +    connect( a, SIGNAL( activated() ), this, SLOT( formatToggleLinkColorHint() ) );
  33.631 +	a->addTo( menu );
  33.632 +	actionFormatLinkColorHint=a;
  33.633 +    pix.fill (white);
  33.634 +    actionFormatLinkColor= new QAction( tr( "Set Link Color" ), pix, tr( "Set &Link Color" ), 0, this, "formatLinkColor" );
  33.635 +    connect( actionFormatLinkColor, SIGNAL( activated() ), this, SLOT( formatSelectLinkColor() ) );
  33.636 +    actionFormatLinkColor->addTo( menu );
  33.637 +    actionFormatBackColor= new QAction( tr( "Set Background Color" ), pix, tr( "Set &Background Color" ), 0, this, "formatBackColor" );
  33.638 +    connect( actionFormatBackColor, SIGNAL( activated() ), this, SLOT( formatSelectBackColor() ) );
  33.639 +    actionFormatBackColor->addTo( menu );
  33.640 +}
  33.641 +
  33.642 +// View Actions
  33.643 +void Main::setupViewActions()
  33.644 +{
  33.645 +    QToolBar *tb = new QToolBar( this );
  33.646 +    tb->setLabel( "View Actions" );
  33.647 +    QPopupMenu *menu = new QPopupMenu( this );
  33.648 +    menuBar()->insertItem( tr( "&View" ), menu );
  33.649 +
  33.650 +    QAction *a;
  33.651 +    a = new QAction( tr( "Zoom reset" ), QPixmap(viewzoomreset_xpm), tr( "reset Zoom" ), 0, this, "zoomReset" );
  33.652 +    connect( a, SIGNAL( activated() ), this, SLOT(viewZoomReset() ) );
  33.653 +    a->addTo( tb );
  33.654 +    a->addTo( menu );
  33.655 +    a = new QAction( tr( "Zoom in" ), QPixmap(viewzoomin_xpm), tr( "Zoom in" ), CTRL + Key_Plus, this, "zoomIn" );
  33.656 +    connect( a, SIGNAL( activated() ), this, SLOT(viewZoomIn() ) );
  33.657 +    a->addTo( tb );
  33.658 +    a->addTo( menu );
  33.659 +    a = new QAction( tr( "Zoom out" ), QPixmap(viewzoomout_xpm), tr( "Zoom out" ), CTRL + Key_Minus, this, "zoomOut" );
  33.660 +    connect( a, SIGNAL( activated() ), this, SLOT( viewZoomOut() ) );
  33.661 +    a->addTo( tb );
  33.662 +    a->addTo( menu );
  33.663 +    a = new QAction( tr( "Toggle Note Editor" ), QPixmap(flag_note_xpm), tr( "Toggle Note Editor" ), CTRL + Key_E , this, "noteEditor" );
  33.664 +    connect( a, SIGNAL( activated() ), this, SLOT(windowToggleNoteEditor() ) );
  33.665 +	a->setToggleAction(true);
  33.666 +	if (textEditor->showWithMain())
  33.667 +		a->setOn(true);
  33.668 +	else	
  33.669 +		a->setOn(false);
  33.670 +    a->addTo( tb );
  33.671 +    a->addTo( menu );
  33.672 +	actionViewToggleNoteEditor=a;
  33.673 +    a = new QAction( tr( "&Next Window" ), QPixmap(), tr( "Next Window" ), ALT + Key_N , this, "nextWindow" );
  33.674 +    connect( a, SIGNAL( activated() ), this, SLOT(windowNextEditor() ) );
  33.675 +    a->addTo( menu );
  33.676 +    a = new QAction( tr( "&Previous Window" ), QPixmap(), tr( "Previous Window" ), ALT + Key_P , this, "previousWindow" );
  33.677 +    connect( a, SIGNAL( activated() ), this, SLOT(windowPreviousEditor() ) );
  33.678 +    a->addTo( menu );
  33.679 +}
  33.680 +
  33.681 +// Flag Actions
  33.682 +void Main::setupFlagActions()
  33.683 +{
  33.684 +	standardFlagsDefault->makeToolbar(this, "Standard Flags");
  33.685 +}
  33.686 +
  33.687 +// Settings Actions
  33.688 +void Main::setupSettingsActions()
  33.689 +{
  33.690 +    QPopupMenu *menu = new QPopupMenu( this );
  33.691 +    menuBar()->insertItem( tr( "&Settings" ), menu );
  33.692 +
  33.693 +	QAction *a;
  33.694 +
  33.695 +
  33.696 +    a = new QAction( tr( "Set application to open pdf files" ), QPixmap(), tr( "Set application to open pdf files" ), 0, this, "setPDF" );
  33.697 +    connect( a, SIGNAL( activated() ), this, SLOT( settingsPDF() ) );
  33.698 +    a->addTo( menu );
  33.699 +
  33.700 +    a = new QAction( tr( "Set application to open an URL" ), QPixmap(), tr( "Set application to open an URL" ), 0, this, "setURL" );
  33.701 +    connect( a, SIGNAL( activated() ), this, SLOT( settingsURL() ) );
  33.702 +    a->addTo( menu );
  33.703 +
  33.704 +    menu->insertSeparator();
  33.705 +    a = new QAction( tr( "Edit branch after adding it" ), QPixmap(), tr( "Edit branch after adding it" ), 0, this, "autoedit" );
  33.706 +	a->setToggleAction(true);
  33.707 +	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoedit",true) );
  33.708 +    a->addTo( menu );
  33.709 +	actionSettingsAutoedit=a;
  33.710 +
  33.711 +    a= new QAction( tr( "Select branch after adding it" ), QPixmap(), tr( "Select branch after adding it" ), 0, this, "autoselectheading" );
  33.712 +	a->setToggleAction(true);
  33.713 +	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoselect",false) );
  33.714 +    a->addTo( menu );
  33.715 +	actionSettingsAutoselectHeading=a;
  33.716 +	
  33.717 +    a= new QAction( tr( "Select heading before editing" ), QPixmap(), tr( "Select existing heading" ), 0, this, "autoselectexistingtext" );
  33.718 +	a->setToggleAction(true);
  33.719 +	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoselectexistingtext",true) );
  33.720 +    a->addTo( menu );
  33.721 +	actionSettingsAutoselectText=a;
  33.722 +	
  33.723 +    a= new QAction( tr( "Enable pasting into new branch" ), QPixmap(), tr( "Enable pasting into new branch" ), 0, this, "pastenewheading" );
  33.724 +	a->setToggleAction(true);
  33.725 +	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/newheadingisempty",true) );
  33.726 +    a->addTo( menu );
  33.727 +	actionSettingsPasteNewHeading=a;
  33.728 +	
  33.729 +    a= new QAction( tr( "Enable Delete key for deleting branches" ), QPixmap(), tr( "Enable Delete key" ), 0, this, "delkey" );
  33.730 +	a->setToggleAction(true);
  33.731 +	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/useDelKey",false) );
  33.732 +    a->addTo( menu );
  33.733 +	actionSettingsUseDelKey=a;
  33.734 +}
  33.735 +
  33.736 +// Test Actions
  33.737 +void Main::setupTestActions()
  33.738 +{
  33.739 +    QPopupMenu *menu = new QPopupMenu( this );
  33.740 +    menuBar()->insertItem( tr( "&Test" ), menu );
  33.741 +
  33.742 +    QAction *a;
  33.743 +    a = new QAction( tr( "Test Flag" ), QPixmap(), tr( "test flag" ), 0, this, "flag" );
  33.744 +    connect( a, SIGNAL( activated() ), this, SLOT( testFunction() ) );
  33.745 +    a->addTo( menu );
  33.746 +
  33.747 +	a = new QAction( tr( "Show Clipboard" ), QPixmap(), tr( "Show clipboard" ), 0, this, "clipboard" );
  33.748 +    connect( a, SIGNAL( activated() ), this, SLOT( testShowClipboard() ) );
  33.749 +    a->addTo( menu );
  33.750 +}
  33.751 +
  33.752 +// Help Actions
  33.753 +void Main::setupHelpActions()
  33.754 +{
  33.755 +    QPopupMenu *menu = new QPopupMenu( this );
  33.756 +    menuBar()->insertItem( tr( "&Help" ), menu );
  33.757 +
  33.758 +    QAction *a;
  33.759 +    a = new QAction( tr( "Open VYM Documentation (pdf)" ), QPixmap(), tr( "Open VYM Documentation (pdf) " ), 0, this, "about" );
  33.760 +    connect( a, SIGNAL( activated() ), this, SLOT( helpDoc() ) );
  33.761 +    a->addTo( menu );
  33.762 +
  33.763 +    a = new QAction( tr( "Information about VYM" ), QPixmap(), tr( "About VYM" ), 0, this, "about" );
  33.764 +    connect( a, SIGNAL( activated() ), this, SLOT( helpAbout() ) );
  33.765 +    a->addTo( menu );
  33.766 +
  33.767 +    a = new QAction( tr( "Information about QT toolkit" ), QPixmap(), tr( "About QT" ), 0, this, "about" );
  33.768 +    connect( a, SIGNAL( activated() ), this, SLOT( helpAboutQT() ) );
  33.769 +    a->addTo( menu );
  33.770 +}
  33.771 +
  33.772 +// Context Menus
  33.773 +void Main::setupContextMenus()
  33.774 +{
  33.775 +	QAction*a;
  33.776 +
  33.777 +	// Context Menu for branch or mapcenter
  33.778 +	branchContextMenu =new QPopupMenu (this);
  33.779 +	actionEditAddBranch->addTo ( branchContextMenu );
  33.780 +	actionEditAddBranchAbove->addTo ( branchContextMenu );
  33.781 +	actionEditAddBranchBelow->addTo ( branchContextMenu );
  33.782 +	actionEditSaveBranch->addTo( branchContextMenu );
  33.783 +	branchContextMenu->insertSeparator();	
  33.784 +	actionEditImportAdd->addTo ( branchContextMenu );
  33.785 +	actionEditImportReplace->addTo ( branchContextMenu );
  33.786 +	branchContextMenu->insertSeparator();	
  33.787 +	actionEditOpenURL->addTo ( branchContextMenu );
  33.788 +	actionEditURL->addTo ( branchContextMenu );
  33.789 +	actionEditHeading2URL->addTo ( branchContextMenu );
  33.790 +    if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) 
  33.791 +		actionEditBugzilla2URL->addTo( branchContextMenu );
  33.792 +	branchContextMenu->insertSeparator();	
  33.793 +	actionEditOpenVymLink->addTo ( branchContextMenu );
  33.794 +	actionEditVymLink->addTo ( branchContextMenu );
  33.795 +	actionEditDeleteVymLink->addTo ( branchContextMenu );
  33.796 +	branchContextMenu->insertSeparator();	
  33.797 +	actionEditLoadImage->addTo( branchContextMenu );
  33.798 +	branchContextMenu->insertSeparator();	
  33.799 +	actionEditCopy->addTo( branchContextMenu );
  33.800 +	actionEditCut->addTo( branchContextMenu );
  33.801 +	actionEditPaste->addTo( branchContextMenu );
  33.802 +	branchContextMenu->insertSeparator();	
  33.803 +	actionGroupFormatFrameTypes->addTo( branchContextMenu );
  33.804 +
  33.805 +	// Context menu for floatimage
  33.806 +	floatimageContextMenu =new QPopupMenu (this);
  33.807 +	saveImageFormatMenu=new QPopupMenu (this);
  33.808 +	exportImageFormatMenu=new QPopupMenu (this);
  33.809 +
  33.810 +	QStrList fmt = QImage::outputFormats();
  33.811 +	for (const char* f = fmt.first(); f; f = fmt.next()) 
  33.812 +	{
  33.813 +		saveImageFormatMenu->insertItem( f );
  33.814 +		exportImageFormatMenu->insertItem( f );
  33.815 +	}	
  33.816 +	connect( saveImageFormatMenu, SIGNAL( activated(int) ), this, SLOT( editSaveImage(int ) ) );
  33.817 +	connect( exportImageFormatMenu, SIGNAL( activated(int) ), this, SLOT( fileExportImage(int ) ) );
  33.818 +	floatimageContextMenu->insertItem( tr("Save image"),saveImageFormatMenu );
  33.819 +	
  33.820 +	floatimageContextMenu->insertSeparator();	
  33.821 +	actionEditCopy->addTo( floatimageContextMenu );
  33.822 +	actionEditCut->addTo( floatimageContextMenu );
  33.823 +
  33.824 +	floatimageContextMenu->insertSeparator();	
  33.825 +    a = new QAction( tr( "Use for Export" ), QPixmap(), tr( "Use for Export"), 0, this, "useForExport" );
  33.826 +	a->setToggleAction(true);
  33.827 +    connect( a, SIGNAL( activated() ), this, SLOT( editToggleFloatExport() ) );
  33.828 +    a->addTo( floatimageContextMenu);
  33.829 +	actionEditToggleFloatExport=a;
  33.830 +
  33.831 +
  33.832 +
  33.833 +	// Context menu for exports
  33.834 +	exportMenu->insertItem ( tr("Export map as image"),exportImageFormatMenu);
  33.835 +
  33.836 +    a = new QAction( tr( "Export as ASCII (still experimental)" ), QPixmap(), tr( "Export (ASCII)" ), 0, this, "exportASCII" );
  33.837 +    connect( a, SIGNAL( activated() ), this, SLOT( fileExportASCII() ) );
  33.838 +    a->addTo( exportMenu );
  33.839 +
  33.840 +	a = new QAction( tr( "Export XML" ), QPixmap(), tr( "Export XML" ),  0, this, "exportXML" );
  33.841 +    connect( a, SIGNAL( activated() ), this, SLOT( fileExportXML() ) );
  33.842 +    a->addTo( exportMenu );
  33.843 +	
  33.844 +    if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) 
  33.845 +	{
  33.846 +		a = new QAction( tr( "Export HTML" ), QPixmap(), tr( "Export HTML" ), 0, this, "exportHTML" );
  33.847 +		connect( a, SIGNAL( activated() ), this, SLOT( fileExportHTML() ) );
  33.848 +		a->addTo( exportMenu );
  33.849 +	}
  33.850 +
  33.851 +	a = new QAction( tr( "Export XHTML" ), QPixmap(), tr( "Export XHTML" ), ALT + Key_X, this, "exportXHTML" );
  33.852 +    connect( a, SIGNAL( activated() ), this, SLOT( fileExportXHTML() ) );
  33.853 +    a->addTo( exportMenu );
  33.854 +
  33.855 +	
  33.856 +	// Context menu for canvas
  33.857 +	canvasContextMenu =new QPopupMenu (this);
  33.858 +	actionEditMapInfo->addTo( canvasContextMenu );
  33.859 +	canvasContextMenu->insertSeparator();	
  33.860 +	actionGroupFormatLinkStyles->addTo( canvasContextMenu );
  33.861 +	canvasContextMenu->insertSeparator();	
  33.862 +	actionFormatLinkColorHint->addTo( canvasContextMenu );
  33.863 +	actionFormatLinkColor->addTo( canvasContextMenu );
  33.864 +	actionFormatBackColor->addTo( canvasContextMenu );
  33.865 +
  33.866 +	// Menu for last opened files
  33.867 +	// Read settings initially
  33.868 +	QString s;
  33.869 +	int j=settings.readNumEntry( "/vym/lastMaps/number",0);
  33.870 +	for (int i=1;i<=j;i++)
  33.871 +	{
  33.872 +		s=settings.readEntry(QString("/vym/lastMaps/map-%1").arg(i),"");
  33.873 +		if (!s.isEmpty() && j<=maxLastMaps) 
  33.874 +			lastMaps.append(s);
  33.875 +	}
  33.876 +	setupLastMapsMenu();
  33.877 +	connect( lastMapsMenu, SIGNAL( activated(int) ), this, SLOT( fileLoadLast(int ) ) );
  33.878 +}
  33.879 +
  33.880 +void Main::setupLastMapsMenu()
  33.881 +{
  33.882 +	// Remove double entries
  33.883 +	QStringList::Iterator it=lastMaps.begin();
  33.884 +	QStringList::Iterator jt;
  33.885 +	while (it!=lastMaps.end() )
  33.886 +	{
  33.887 +		jt=it;
  33.888 +		++jt;
  33.889 +		while (jt!=lastMaps.end() )
  33.890 +		{
  33.891 +			if (*it == *jt)		
  33.892 +				jt=lastMaps.remove(jt);
  33.893 +			else	
  33.894 +				jt++;
  33.895 +		}
  33.896 +		it++;
  33.897 +	}	
  33.898 +
  33.899 +	// Limit length of list to maxLastMaps
  33.900 +	while ((int)(lastMaps.count()) > maxLastMaps) lastMaps.pop_back();
  33.901 +	
  33.902 +	// build Menu from lastMaps string list
  33.903 +	lastMapsMenu->clear();
  33.904 +	for (it = lastMaps.begin(); it != lastMaps.end(); ++it ) 
  33.905 +		lastMapsMenu->insertItem (*it );
  33.906 +		
  33.907 +}
  33.908 +
  33.909 +void Main::hideEvent (QHideEvent * )
  33.910 +{
  33.911 +	if (!textEditor->isMinimized() ) textEditor->hide();
  33.912 +}
  33.913 +
  33.914 +void Main::showEvent (QShowEvent * )
  33.915 +{
  33.916 +	if (textEditor->showWithMain()) textEditor->show();
  33.917 +}
  33.918 +
  33.919 +bool Main::reallyWriteDirectory(const QString &dir)
  33.920 +{
  33.921 +	QStringList eList = QDir(dir).entryList();
  33.922 +	if (eList.first() ==".")  eList.pop_front();	// remove "."
  33.923 +	if (eList.first() =="..") eList.pop_front();	// remove "."
  33.924 +	if (!eList.isEmpty())
  33.925 +	{
  33.926 +		QMessageBox mb( "VYM",
  33.927 +			tr("The directory ") + dir + 
  33.928 +			tr(" is not empty. Do you risk to overwrite its contents?"),
  33.929 +		QMessageBox::Warning,
  33.930 +		QMessageBox::Yes ,
  33.931 +		QMessageBox::Cancel | QMessageBox::Default,
  33.932 +		QMessageBox::QMessageBox::NoButton );
  33.933 +
  33.934 +		mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
  33.935 +		mb.setButtonText( QMessageBox::No, tr("Cancel"));
  33.936 +		switch( mb.exec() ) 
  33.937 +		{
  33.938 +			case QMessageBox::Yes:
  33.939 +				// save 
  33.940 +				return true;
  33.941 +			case QMessageBox::Cancel:
  33.942 +				// do nothing
  33.943 +				return false;
  33.944 +		}
  33.945 +	}
  33.946 +	return true;
  33.947 +}
  33.948 +
  33.949 +QString Main::browseDirectory (const QString &caption)
  33.950 +{
  33.951 +	QFileDialog fd(this,caption);
  33.952 +	fd.setMode (QFileDialog::DirectoryOnly);
  33.953 +	fd.setCaption("VYM - "+caption);
  33.954 +	fd.show();
  33.955 +	
  33.956 +	if ( fd.exec() == QDialog::Accepted )
  33.957 +		return fd.selectedFile();
  33.958 +	else
  33.959 +		return "";
  33.960 +}
  33.961 +
  33.962 +MapEditor* Main::currentMapEditor() const
  33.963 +{
  33.964 +    if ( tabWidget->currentPage() &&
  33.965 +	 tabWidget->currentPage()->inherits( "MapEditor" ) )
  33.966 +		return (MapEditor*)tabWidget->currentPage();
  33.967 +    return NULL;	
  33.968 +}
  33.969 +
  33.970 +//TODO not used now, maybe use this for overview window later
  33.971 +void Main::newView() 
  33.972 +{
  33.973 +    // Open a new view... have it delete when closed.
  33.974 +    Main *m = new Main(0, 0, WDestructiveClose);
  33.975 +    qApp->setMainWidget(m);
  33.976 +    m->show();
  33.977 +    qApp->setMainWidget(0);
  33.978 +}
  33.979 +
  33.980 +void Main::editorChanged(QWidget *)
  33.981 +{
  33.982 +	// Unselect all possibly selected objects
  33.983 +	// (Important to update note editor)
  33.984 +	int i;
  33.985 +	MapEditor *me;
  33.986 +	for (i=0;i<=tabWidget->count() -1;i++)
  33.987 +	{
  33.988 +		
  33.989 +		me=(MapEditor*)tabWidget->page(i);
  33.990 +		me->unselect();
  33.991 +	}	
  33.992 +	currentMapEditor()->reselect();
  33.993 +
  33.994 +	// Update actions to in menus and toolbars according to editor
  33.995 +	currentMapEditor()->updateActions();
  33.996 +}
  33.997 +
  33.998 +void Main::fileNew()
  33.999 +{
 33.1000 +	QString fn="unnamed";
 33.1001 +	MapEditor* medit = new MapEditor (tabWidget, true);
 33.1002 +	tabWidget->addTab (medit,fn);
 33.1003 +	tabWidget->showPage(medit);
 33.1004 +	medit->viewport()->setFocus();
 33.1005 +	medit->select("mc:");
 33.1006 +}
 33.1007 +
 33.1008 +void Main::fileLoad(QString fn, const LoadMode &lmode)
 33.1009 +{
 33.1010 +	// Error codes
 33.1011 +	enum errorCode {success,aborted};
 33.1012 +	errorCode err=success;
 33.1013 +	
 33.1014 +	// fn is usually the archive, mapfile the file after uncompressing
 33.1015 +	QString mapfile;
 33.1016 +
 33.1017 +	// Make fn absolute (needed for unzip)
 33.1018 +	fn=QDir (fn).absPath();
 33.1019 +
 33.1020 +	MapEditor *me;
 33.1021 +
 33.1022 +	if (lmode==NewMap)
 33.1023 +	{
 33.1024 +		// Check, if map is already loaded
 33.1025 +		int i=0;
 33.1026 +		while (i<=tabWidget->count() -1)
 33.1027 +		{
 33.1028 +			me=(MapEditor*)tabWidget->page(i);
 33.1029 +			if (me->getFilePath() == fn)
 33.1030 +			{
 33.1031 +				// Already there, ask for confirmation
 33.1032 +				QMessageBox mb( "VYM",
 33.1033 +					tr("The map ") + fn + tr ("\n is already opened."
 33.1034 +					"Opening the same map in multiple editors may lead \n"
 33.1035 +					"to confusion when finishing working with vym."
 33.1036 +					"Do you want to"),
 33.1037 +					QMessageBox::Warning,
 33.1038 +					QMessageBox::Yes | QMessageBox::Default,
 33.1039 +					QMessageBox::Cancel | QMessageBox::Escape,
 33.1040 +					QMessageBox::QMessageBox::NoButton);
 33.1041 +				mb.setButtonText( QMessageBox::Yes, tr("Open anyway") );
 33.1042 +				mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
 33.1043 +				switch( mb.exec() ) 
 33.1044 +				{
 33.1045 +					case QMessageBox::Yes:
 33.1046 +						// load anyway
 33.1047 +						i=tabWidget->count();
 33.1048 +						break;
 33.1049 +					case QMessageBox::Cancel:
 33.1050 +						// do nothing
 33.1051 +						return;
 33.1052 +						break;
 33.1053 +				}
 33.1054 +			}
 33.1055 +			i++;
 33.1056 +		}
 33.1057 +	}
 33.1058 +
 33.1059 +
 33.1060 +	// Try to load map
 33.1061 +    if ( !fn.isEmpty() )
 33.1062 +	{
 33.1063 +		me = currentMapEditor();
 33.1064 +		int tabIndex=tabWidget->currentPageIndex();
 33.1065 +		// Check first, if mapeditor exists
 33.1066 +		// If it is not default AND we want a new map, 
 33.1067 +		// create a new mapeditor in a new tab
 33.1068 +		if ( lmode==NewMap && (!me || !me->isDefault() ) )
 33.1069 +		{
 33.1070 +			me = new MapEditor (tabWidget,true);
 33.1071 +			tabWidget->addTab (me,fn);
 33.1072 +			tabIndex=tabWidget->indexOf (me);
 33.1073 +			tabWidget->setCurrentPage (tabIndex);
 33.1074 +		}
 33.1075 +		
 33.1076 +		// Check, if file exists (important for creating new files
 33.1077 +		// from command line
 33.1078 +		if (!QFile(fn).exists() )
 33.1079 +		{
 33.1080 +			QMessageBox mb( "VYM",
 33.1081 +				tr("The map") + fn + 
 33.1082 +				tr(" does not exist.\n Do you want to create a new one?"),
 33.1083 +				QMessageBox::Question,
 33.1084 +				QMessageBox::Yes ,
 33.1085 +				QMessageBox::Cancel | QMessageBox::Default,
 33.1086 +				QMessageBox::QMessageBox::NoButton );
 33.1087 +
 33.1088 +			mb.setButtonText( QMessageBox::Yes, tr("Create"));
 33.1089 +			mb.setButtonText( QMessageBox::No, tr("Cancel"));
 33.1090 +			switch( mb.exec() ) 
 33.1091 +			{
 33.1092 +				case QMessageBox::Yes:
 33.1093 +					// Create new map
 33.1094 +					currentMapEditor()->setFilePath(fn);
 33.1095 +					tabWidget->setTabLabel (currentMapEditor(),
 33.1096 +						currentMapEditor()->getFileName() );
 33.1097 +					statusBar()->message( "Created " + fn , statusbarTime );
 33.1098 +					return;
 33.1099 +						
 33.1100 +				case QMessageBox::Cancel:
 33.1101 +					// don't create new map
 33.1102 +					statusBar()->message( "Loading " + fn + " failed!", statusbarTime );
 33.1103 +					fileCloseMap();
 33.1104 +					return;
 33.1105 +			}
 33.1106 +		}	
 33.1107 +
 33.1108 +
 33.1109 +		//tabWidget->currentPage() won't be NULL here, because of above...
 33.1110 +		tabWidget->showPage(me);
 33.1111 +		me->viewport()->setFocus();
 33.1112 +
 33.1113 +		// Create temporary directory for packing
 33.1114 +		char tmpdir1[]="/tmp/vym-XXXXXX";	
 33.1115 +		QString tmpMapDir=mkdtemp(tmpdir1);
 33.1116 +
 33.1117 +		// Try to unzip file
 33.1118 +		Process *zipProc=new Process ();
 33.1119 +		zipProc->clearArguments();
 33.1120 +		zipProc->setWorkingDirectory (QDir(tmpMapDir));
 33.1121 +		zipProc->addArgument ("unzip");
 33.1122 +		zipProc->addArgument (fn );
 33.1123 +		zipProc->addArgument ("-d");
 33.1124 +		zipProc->addArgument (tmpMapDir);
 33.1125 +
 33.1126 +		if (!zipProc->start() )
 33.1127 +		{
 33.1128 +			QMessageBox::critical( 0, tr( "Critical Load Error" ),
 33.1129 +						   tr("Couldn't start unzip to decompress data."));
 33.1130 +			err=aborted;
 33.1131 +			
 33.1132 +		} else
 33.1133 +		{
 33.1134 +			zipProc->waitFinished();
 33.1135 +			if (!zipProc->normalExit() )
 33.1136 +			{
 33.1137 +				QMessageBox::critical( 0, tr( "Critical Load Error" ),
 33.1138 +							   tr("unzip didn't exit normally") +
 33.1139 +							   zipProc->getErrout() );
 33.1140 +				err=aborted;
 33.1141 +			} else
 33.1142 +			{
 33.1143 +				if (zipProc->exitStatus()>0)
 33.1144 +				{
 33.1145 +					if (zipProc->exitStatus()==9)
 33.1146 +					{
 33.1147 +						// no zipped file, but maybe .xml or old version? Try again.
 33.1148 +						mapfile=fn;
 33.1149 +						me->setZipped(false);
 33.1150 +					}	
 33.1151 +					else	
 33.1152 +					{
 33.1153 +						QMessageBox::critical( 0, tr( "Critical Load Error" ),
 33.1154 +									   QString("unzip exit code:  %1").arg(zipProc->exitStatus() ) +
 33.1155 +									   zipProc->getErrout() );
 33.1156 +						err=aborted;
 33.1157 +					}
 33.1158 +				} else
 33.1159 +				{	// Uncompressing was successfull,
 33.1160 +					// load from uncompressed temporary directory
 33.1161 +
 33.1162 +					me->setZipped(true);
 33.1163 +
 33.1164 +					
 33.1165 +					// Look for mapname.xml
 33.1166 +					mapfile= fn.left(fn.findRev(".",-1,true));
 33.1167 +					mapfile=mapfile.section( '/', -1 );
 33.1168 +					QFile file( tmpMapDir + "/" + mapfile + ".xml");
 33.1169 +					if (!file.exists() )
 33.1170 +					{
 33.1171 +						// mapname.xml does not exist, well, 
 33.1172 +						// maybe some renamed the mapname.vym file...
 33.1173 +						// Try to find any .xml in the toplevel 
 33.1174 +						// directory of the .vym file
 33.1175 +						QStringList flist=QDir (tmpMapDir).entryList("*.xml");
 33.1176 +						if (flist.count()==1) 
 33.1177 +						{
 33.1178 +							// Only one entry, take this one
 33.1179 +							mapfile=tmpMapDir + "/"+flist.first();
 33.1180 +						} else
 33.1181 +						{
 33.1182 +							for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it ) 
 33.1183 +								*it=tmpMapDir + "/" + *it;
 33.1184 +							// FIXME	
 33.1185 +							// Multiple entries, load all (but only the first one into this ME)
 33.1186 +							//mainWindow->fileLoadFromTmp (flist);
 33.1187 +							//returnCode=1;	// Silently forget this attempt to load
 33.1188 +							qWarning ("MainWindow::load (fn)  multimap found...");
 33.1189 +						}	
 33.1190 +							
 33.1191 +						if (flist.isEmpty() )
 33.1192 +						{
 33.1193 +							QMessageBox::critical( 0, tr( "Critical Load Error" ),
 33.1194 +									   tr("Couldn't find a map (*.xml) in .vym archive.\n"));
 33.1195 +							err=aborted;				   
 33.1196 +						}	
 33.1197 +					} //file doesn't exist	
 33.1198 +					else
 33.1199 +						mapfile=file.name();
 33.1200 +				} // Uncompressing successfull
 33.1201 +			}
 33.1202 +		}
 33.1203 +
 33.1204 +		// Finally load map into mapEditor
 33.1205 +		me->setFilePath (mapfile,fn);
 33.1206 +		if (me->load(mapfile,lmode))
 33.1207 +			err=aborted;
 33.1208 +
 33.1209 +		// Delete tmpDir
 33.1210 +		system ( "rm -rf "+tmpMapDir);
 33.1211 +
 33.1212 +		// Check for errors
 33.1213 +		if (err==success) 
 33.1214 +		{
 33.1215 +			if (lmode==NewMap)
 33.1216 +			{
 33.1217 +				me->setFilePath (fn);
 33.1218 +				tabWidget->changeTab(tabWidget->page(tabIndex), me->getFileName());
 33.1219 +				lastMaps.prepend(me->getFilePath() );
 33.1220 +				setupLastMapsMenu();
 33.1221 +				actionFilePrint->setEnabled (true);
 33.1222 +			}	
 33.1223 +			statusBar()->message( "Loaded " + fn, statusbarTime );
 33.1224 +			return;
 33.1225 +		} else 
 33.1226 +		{
 33.1227 +			if (lmode==NewMap)
 33.1228 +				fileCloseMap();
 33.1229 +		}	
 33.1230 +
 33.1231 +
 33.1232 +	}
 33.1233 +	statusBar()->message( "Could not load " + fn, statusbarTime );
 33.1234 +}
 33.1235 +
 33.1236 +
 33.1237 +void Main::fileLoad(const LoadMode &lmode)
 33.1238 +{
 33.1239 +	QFileDialog *fd=new QFileDialog( this);
 33.1240 +	if (!lastFileDir.isEmpty()) 
 33.1241 +		fd->setDir (lastFileDir);
 33.1242 +	fd->addFilter ("XML (*.xml)");
 33.1243 +	fd->addFilter ("VYM map (*.vym *.vyp)");
 33.1244 +	switch (lmode)
 33.1245 +	{
 33.1246 +		case NewMap:
 33.1247 +			fd->setCaption(tr("Load vym map"));
 33.1248 +			break;
 33.1249 +		case ImportAdd:
 33.1250 +			fd->setCaption(tr("Import: Add vym map to selection"));
 33.1251 +			break;
 33.1252 +		case ImportReplace:
 33.1253 +			fd->setCaption(tr("Import: Replace selection with vym map"));
 33.1254 +			break;
 33.1255 +	}
 33.1256 +	fd->show();
 33.1257 +
 33.1258 +	QString fn;
 33.1259 +	if ( fd->exec() == QDialog::Accepted )
 33.1260 +	{
 33.1261 +		lastFileDir=fd->dirPath();
 33.1262 +        fn = fd->selectedFile();
 33.1263 +		fileLoad(fn, lmode);				   
 33.1264 +	}
 33.1265 +}
 33.1266 +
 33.1267 +void Main::fileLoad()
 33.1268 +{
 33.1269 +	fileLoad (NewMap);
 33.1270 +}
 33.1271 +
 33.1272 +void Main::fileLoadLast(int i)
 33.1273 +{
 33.1274 +	fileLoad(*lastMaps.at(lastMapsMenu->indexOf (i) ),NewMap);			   
 33.1275 +}
 33.1276 +
 33.1277 +void Main::fileSave(const SaveMode &savemode)
 33.1278 +{
 33.1279 +	// tmp dir for zipping 
 33.1280 +	QString tmpMapDir;
 33.1281 +	
 33.1282 +	// Error codes
 33.1283 +	enum errorCode {success,aborted};
 33.1284 +	errorCode err=success;
 33.1285 +	
 33.1286 +	QString safeFilePath;
 33.1287 +
 33.1288 +	bool saveZipped=currentMapEditor()->saveZipped();
 33.1289 +
 33.1290 +	if (currentMapEditor())
 33.1291 +	{
 33.1292 +		QString fn=currentMapEditor()->getFilePath();
 33.1293 +		// filename=unnamed, filepath="" in constructor...
 33.1294 +		if ( !fn.isEmpty() ) 
 33.1295 +		{	
 33.1296 +			// We have a filepath, go on saving			
 33.1297 +			// First remove existing file, we 
 33.1298 +			// don't want to add to old zip archives
 33.1299 +			QFile f(fn);
 33.1300 +			if (f.exists() ) 
 33.1301 +				if (!f.remove())
 33.1302 +					QMessageBox::warning( 0, tr( "Save Error" ),
 33.1303 +						fn+   tr("\ncould not be removed before saving"));
 33.1304 +
 33.1305 +			// Look, if we should zip the data:
 33.1306 +			if (!saveZipped)
 33.1307 +			{
 33.1308 +				QMessageBox mb( "VYM",
 33.1309 +					tr("The map ") + fn + 
 33.1310 +					tr ("\ndid not use the compressed "
 33.1311 +					"vym file format.\nWriting it uncompressed will also write images \n"
 33.1312 +					"and flags and thus may overwrite files in the "
 33.1313 +					"given directory\n\nDo you want to write the map"),
 33.1314 +					QMessageBox::Warning,
 33.1315 +					QMessageBox::Yes | QMessageBox::Default,
 33.1316 +					QMessageBox::No ,
 33.1317 +					QMessageBox::Cancel | QMessageBox::Escape);
 33.1318 +				mb.setButtonText( QMessageBox::Yes, tr("compressed (vym default)") );
 33.1319 +				mb.setButtonText( QMessageBox::No, tr("uncompressed") );
 33.1320 +				mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
 33.1321 +				switch( mb.exec() ) 
 33.1322 +				{
 33.1323 +					case QMessageBox::Yes:
 33.1324 +						// save compressed (default file format)
 33.1325 +						saveZipped=true;
 33.1326 +						break;
 33.1327 +					case QMessageBox::No:
 33.1328 +						// save uncompressed
 33.1329 +						saveZipped=false;
 33.1330 +						break;
 33.1331 +					case QMessageBox::Cancel:
 33.1332 +						// do nothing
 33.1333 +						return;
 33.1334 +						break;
 33.1335 +				}
 33.1336 +			}
 33.1337 +
 33.1338 +			if (saveZipped)
 33.1339 +			{
 33.1340 +				char tmpdir1[]="/tmp/vym-XXXXXX";	
 33.1341 +				tmpMapDir=mkdtemp(tmpdir1);
 33.1342 +			
 33.1343 +				safeFilePath=currentMapEditor()->getFilePath();
 33.1344 +				currentMapEditor()->setFilePath (tmpMapDir+"/"+
 33.1345 +					currentMapEditor()->getMapName()+ ".xml",
 33.1346 +					safeFilePath);
 33.1347 +				currentMapEditor()->save (savemode);
 33.1348 +				currentMapEditor()->setFilePath (safeFilePath);
 33.1349 +				
 33.1350 +				// zip the temporary directory
 33.1351 +				Process *zipProc=new Process ();
 33.1352 +				zipProc->clearArguments();
 33.1353 +				zipProc->setWorkingDirectory (QDir(tmpMapDir));
 33.1354 +				zipProc->addArgument ("zip");
 33.1355 +				zipProc->addArgument ("-r");
 33.1356 +				zipProc->addArgument (fn);
 33.1357 +				zipProc->addArgument (".");
 33.1358 +
 33.1359 +				if (!zipProc->start() )
 33.1360 +				{	
 33.1361 +					// zip could not be started
 33.1362 +					QMessageBox::critical( 0, tr( "Critical Save Error" ),
 33.1363 +								   tr("Couldn't start zip to compress data."));
 33.1364 +					err=aborted;
 33.1365 +				} else
 33.1366 +				{
 33.1367 +					// zip could be started
 33.1368 +					zipProc->waitFinished();
 33.1369 +					if (!zipProc->normalExit() )
 33.1370 +					{
 33.1371 +						QMessageBox::critical( 0, tr( "Critical Save Error" ),
 33.1372 +									   tr("zip didn't exit normally")+
 33.1373 +									   "\n" + zipProc->getErrout());
 33.1374 +						err=aborted;
 33.1375 +					} else
 33.1376 +					{
 33.1377 +						if (zipProc->exitStatus()>0)
 33.1378 +						{
 33.1379 +							QMessageBox::critical( 0, tr( "Critical Save Error" ),
 33.1380 +									   QString("zip exit code:  %1").arg(zipProc->exitStatus() )+
 33.1381 +									   "\n" + zipProc->getErrout() );
 33.1382 +							err=aborted;
 33.1383 +						}
 33.1384 +					}
 33.1385 +				}	// zip could be started
 33.1386 +			} // save zipped
 33.1387 +			else
 33.1388 +			{
 33.1389 +				// Save unzipped. 
 33.1390 +				safeFilePath=currentMapEditor()->getFilePath();
 33.1391 +				currentMapEditor()->setFilePath (fn, safeFilePath);
 33.1392 +				currentMapEditor()->save (savemode);
 33.1393 +				currentMapEditor()->setFilePath (safeFilePath);
 33.1394 +			} // save zipped 	
 33.1395 +		} // filepath available
 33.1396 +		else
 33.1397 +		{
 33.1398 +			// We have  no filepath yet,
 33.1399 +			// call fileSaveAs() now, this will call fileSave() 
 33.1400 +			// again.
 33.1401 +			fileSaveAs(savemode);
 33.1402 +		}
 33.1403 +    }
 33.1404 +
 33.1405 +	if (currentMapEditor()->saveZipped())
 33.1406 +	{
 33.1407 +		// Delete tmpDir
 33.1408 +		system ( "rm -rf "+ tmpMapDir );
 33.1409 +	} 
 33.1410 +
 33.1411 +	if (err==success)
 33.1412 +		statusBar()->message( 
 33.1413 +			tr("Saved")+" " + currentMapEditor()->getFilePath(), 
 33.1414 +			statusbarTime );
 33.1415 +	else		
 33.1416 +		statusBar()->message( 
 33.1417 +			tr("Couldn't save")+" " + currentMapEditor()->getFilePath(), 
 33.1418 +			statusbarTime );
 33.1419 +}
 33.1420 +
 33.1421 +void Main::fileSave()
 33.1422 +{
 33.1423 +	fileSave (CompleteMap);
 33.1424 +}
 33.1425 +
 33.1426 +void Main::fileSaveAs(const SaveMode& savemode)
 33.1427 +{
 33.1428 +	QString tmpMapDir;
 33.1429 +	QString fn;
 33.1430 +
 33.1431 +	if (currentMapEditor())
 33.1432 +	{
 33.1433 +		if (savemode==CompleteMap)
 33.1434 +			fn = QFileDialog::getSaveFileName( QString::null, "VYM map (*.vym)", this );
 33.1435 +		else		
 33.1436 +			fn = QFileDialog::getSaveFileName( QString::null, "VYM part of map (*.vyp)", this );
 33.1437 +		if ( !fn.isEmpty() ) 
 33.1438 +		{
 33.1439 +			// Check for existing file
 33.1440 +			if (QFile (fn).exists())
 33.1441 +			{
 33.1442 +				QMessageBox mb( "VYM",
 33.1443 +					tr("The file ") + fn + tr ("\nexists already. Do you want to"),
 33.1444 +					QMessageBox::Warning,
 33.1445 +					QMessageBox::Yes | QMessageBox::Default,
 33.1446 +					QMessageBox::Cancel | QMessageBox::Escape,
 33.1447 +					QMessageBox::QMessageBox::NoButton);
 33.1448 +				mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
 33.1449 +				mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
 33.1450 +				switch( mb.exec() ) 
 33.1451 +				{
 33.1452 +					case QMessageBox::Yes:
 33.1453 +						// save 
 33.1454 +						break;
 33.1455 +					case QMessageBox::Cancel:
 33.1456 +						// do nothing
 33.1457 +						return;
 33.1458 +						break;
 33.1459 +				}
 33.1460 +			} else
 33.1461 +			{
 33.1462 +				// New file, add extension to filename, if missing
 33.1463 +				// This is always .vym or .vyp, depending on savemode
 33.1464 +				if (savemode==CompleteMap)
 33.1465 +				{
 33.1466 +					if (!fn.contains (".vym") && !fn.contains (".xml"))
 33.1467 +						fn +=".vym";
 33.1468 +				} else		
 33.1469 +				{
 33.1470 +					if (!fn.contains (".vyp") && !fn.contains (".xml"))
 33.1471 +						fn +=".vyp";
 33.1472 +				}
 33.1473 +			}
 33.1474 +	
 33.1475 +
 33.1476 +
 33.1477 +
 33.1478 +			// Save now
 33.1479 +			currentMapEditor()->setFilePath(fn);
 33.1480 +			fileSave(savemode);
 33.1481 +
 33.1482 +			// Set name of tab
 33.1483 +			tabWidget->setTabLabel (currentMapEditor(),
 33.1484 +				currentMapEditor()->getFileName() );
 33.1485 +			return;
 33.1486 +		} 
 33.1487 +	}
 33.1488 +}
 33.1489 +
 33.1490 +void Main::fileSaveAs()
 33.1491 +{
 33.1492 +	fileSaveAs (CompleteMap);
 33.1493 +}
 33.1494 +
 33.1495 +void Main::fileImportDir()
 33.1496 +{
 33.1497 +	if (currentMapEditor())
 33.1498 +		currentMapEditor()->importDir();	
 33.1499 +}
 33.1500 +
 33.1501 +void Main::fileExportXML()
 33.1502 +{
 33.1503 +	if (currentMapEditor())
 33.1504 +	{
 33.1505 +		QString dir=browseDirectory(tr("Export XML to directory"));
 33.1506 +		if (dir !="" && reallyWriteDirectory(dir) )
 33.1507 +			currentMapEditor()->exportXML(dir);
 33.1508 +	}	
 33.1509 +}
 33.1510 +
 33.1511 +void Main::fileExportHTML()
 33.1512 +{
 33.1513 +	if (currentMapEditor())
 33.1514 +	{
 33.1515 +		ExportHTMLDialog dia(this);
 33.1516 +		
 33.1517 +		if (dia.exec()==QDialog::Accepted)
 33.1518 +		{
 33.1519 +			QString dir=dia.getDir();
 33.1520 +			if (reallyWriteDirectory(dir) )
 33.1521 +			{
 33.1522 +				currentMapEditor()->exportXML (dia.getDir() );
 33.1523 +				dia.doExport(currentMapEditor()->getMapName() );
 33.1524 +			}	
 33.1525 +		}
 33.1526 +	}	
 33.1527 +}
 33.1528 +
 33.1529 +void Main::fileExportXHTML()
 33.1530 +{
 33.1531 +	QString dir;
 33.1532 +	if (currentMapEditor())
 33.1533 +	{
 33.1534 +		ExportXHTMLDialog dia(this);
 33.1535 +		dia.setFilePath (currentMapEditor()->getFilePath() );
 33.1536 +		dia.setMapName (currentMapEditor()->getMapName() );
 33.1537 +		dia.readSettings();
 33.1538 +		
 33.1539 +		if (dia.exec()==QDialog::Accepted)
 33.1540 +		{
 33.1541 +			QString dir=dia.getDir();
 33.1542 +			// Check, if warnings should be used before overwriting
 33.1543 +			// the output directory
 33.1544 +			bool ok;
 33.1545 +			if (dia.warnings()) 
 33.1546 +				ok=reallyWriteDirectory(dir);
 33.1547 +			else
 33.1548 +				ok=true;
 33.1549 +
 33.1550 +			if (ok)
 33.1551 +			{
 33.1552 +				currentMapEditor()->exportXML (dia.getDir() );
 33.1553 +				dia.doExport(currentMapEditor()->getMapName() );
 33.1554 +				if (dia.hasChanged())
 33.1555 +					currentMapEditor()->setChanged();
 33.1556 +			}	
 33.1557 +		}
 33.1558 +	}	
 33.1559 +}
 33.1560 +
 33.1561 +void Main::fileExportImage(int item)
 33.1562 +{
 33.1563 +	if (currentMapEditor())
 33.1564 +	{
 33.1565 +		QString fn = QFileDialog::getSaveFileName( QString::null, "Image  (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *xbm *.xpm)",
 33.1566 +							   this );
 33.1567 +		if ( !fn.isEmpty() ) 
 33.1568 +		{
 33.1569 +			currentMapEditor()->exportImage(fn,item);
 33.1570 +		} else {
 33.1571 +			statusBar()->message( tr("Couldn't save") + fn, statusbarTime );
 33.1572 +		}
 33.1573 +	}
 33.1574 +}
 33.1575 +
 33.1576 +void Main::fileExportASCII()
 33.1577 +{
 33.1578 +	if (currentMapEditor())
 33.1579 +		currentMapEditor()->exportASCII();	
 33.1580 +}
 33.1581 +
 33.1582 +void Main::fileCloseMap()
 33.1583 +{
 33.1584 +	if (currentMapEditor())
 33.1585 +	{
 33.1586 +		if (currentMapEditor()->hasChanged())
 33.1587 +		{
 33.1588 +			QMessageBox mb( "VYM",
 33.1589 +				tr("The map ") + currentMapEditor()->getFileName() +
 33.1590 +				tr(" has been modified but not saved yet. Do you want to"),
 33.1591 +				QMessageBox::Warning,
 33.1592 +				QMessageBox::Yes | QMessageBox::Default,
 33.1593 +				QMessageBox::No,
 33.1594 +				QMessageBox::Cancel | QMessageBox::Escape );
 33.1595 +			mb.setButtonText( QMessageBox::Yes, tr("Save modified map before closing it") );
 33.1596 +			mb.setButtonText( QMessageBox::No, tr("Discard changes"));
 33.1597 +			switch( mb.exec() ) 
 33.1598 +			{
 33.1599 +				case QMessageBox::Yes:
 33.1600 +					// save and close
 33.1601 +					fileSave(CompleteMap);
 33.1602 +					break;
 33.1603 +				case QMessageBox::No:
 33.1604 +				// close  without saving
 33.1605 +					break;
 33.1606 +				case QMessageBox::Cancel:
 33.1607 +					// do nothing
 33.1608 +				return;
 33.1609 +			}
 33.1610 +		} 
 33.1611 +		currentMapEditor()->closeMap();
 33.1612 +		tabWidget->removePage(currentMapEditor());
 33.1613 +		if (tabWidget->count()==0)
 33.1614 +			actionFilePrint->setEnabled (false);
 33.1615 +	}	
 33.1616 +}
 33.1617 +
 33.1618 +void Main::filePrint()
 33.1619 +{
 33.1620 +	if (currentMapEditor())
 33.1621 +		currentMapEditor()->print();
 33.1622 +}
 33.1623 +
 33.1624 +void Main::fileExitVYM()
 33.1625 +{
 33.1626 +	// Check if one or more editors have changed
 33.1627 +	MapEditor *me;
 33.1628 +	int i;
 33.1629 +	for (i=0;i<=tabWidget->count() -1;i++)
 33.1630 +	{
 33.1631 +		
 33.1632 +		me=(MapEditor*)tabWidget->page(i);
 33.1633 +
 33.1634 +		// If something changed, ask what to do
 33.1635 +		if (me->isUnsaved())
 33.1636 +		{
 33.1637 +			tabWidget->setCurrentPage(i);
 33.1638 +			QMessageBox mb( "VYM",
 33.1639 +				tr("This map is not saved yet. Do you want to"),
 33.1640 +				QMessageBox::Warning,
 33.1641 +				QMessageBox::Yes | QMessageBox::Default,
 33.1642 +				QMessageBox::No,
 33.1643 +				QMessageBox::Cancel | QMessageBox::Escape );
 33.1644 +			mb.setButtonText( QMessageBox::Yes, tr("Save map") );
 33.1645 +			mb.setButtonText( QMessageBox::No, tr("Discard changes") );
 33.1646 +			mb.show();
 33.1647 +			// Call undocumented function: setActiveWindow is only
 33.1648 +			// possible, if widget is visible. This depends on
 33.1649 +			// windowmanager...
 33.1650 +#if defined(Q_OS_LINUX)
 33.1651 +			qt_wait_for_window_manager( this);
 33.1652 +#endif			
 33.1653 +			mb.setActiveWindow();
 33.1654 +			switch( mb.exec() ) {
 33.1655 +				case QMessageBox::Yes:
 33.1656 +					// save (the changed editors) and exit
 33.1657 +					fileSave(CompleteMap);
 33.1658 +					break;
 33.1659 +				case QMessageBox::No:
 33.1660 +					// exit without saving
 33.1661 +					break;
 33.1662 +				case QMessageBox::Cancel:
 33.1663 +					// don't save and don't exit
 33.1664 +				return;
 33.1665 +			}
 33.1666 +		}
 33.1667 +	} // loop over all MEs	
 33.1668 +    qApp->quit();
 33.1669 +}
 33.1670 +
 33.1671 +void Main::editUndo()
 33.1672 +{
 33.1673 +	if (currentMapEditor())
 33.1674 +		currentMapEditor()->undo();
 33.1675 +}
 33.1676 +
 33.1677 +void Main::editRedo()	    // TODO
 33.1678 +{
 33.1679 +}
 33.1680 +
 33.1681 +void Main::editCopy()
 33.1682 +{
 33.1683 +	if (currentMapEditor())
 33.1684 +		currentMapEditor()->copy();
 33.1685 +}
 33.1686 +
 33.1687 +void Main::editPaste()
 33.1688 +{
 33.1689 +	if (currentMapEditor())
 33.1690 +		currentMapEditor()->paste();
 33.1691 +}
 33.1692 +
 33.1693 +void Main::editCut()
 33.1694 +{
 33.1695 +	if (currentMapEditor())
 33.1696 +		currentMapEditor()->cut();
 33.1697 +}
 33.1698 +
 33.1699 +void Main::editOpenFindWindow()
 33.1700 +{
 33.1701 +	findWindow->popup();
 33.1702 +	findWindow->raise();
 33.1703 +
 33.1704 +	// Call undocumented function: setActiveWindow is only
 33.1705 +	// possible, if widget is visible. This depends on
 33.1706 +	// windowmanager...
 33.1707 +#if defined(Q_OS_LINUX)
 33.1708 +	qt_wait_for_window_manager( this);
 33.1709 +#endif	
 33.1710 +	findWindow->setActiveWindow();
 33.1711 +}
 33.1712 +
 33.1713 +void Main::editFind(QString s)
 33.1714 +{
 33.1715 +	bool cs=false;
 33.1716 +	BranchObj *bo=currentMapEditor()->findText(s, cs);
 33.1717 +	if (bo)
 33.1718 +	{	
 33.1719 +		statusBar()->message( "Found: " + bo->getHeading(), statusbarTime );
 33.1720 +	} else
 33.1721 +	{
 33.1722 +		QMessageBox::information( findWindow, tr( "VYM -Information:" ),
 33.1723 +							   tr("No matches found for ")+
 33.1724 +							   "'<b>"+s+"</b>'");
 33.1725 +	}	
 33.1726 +}
 33.1727 +
 33.1728 +void Main::editFindChanged()
 33.1729 +{	// Notify editor, to abort the current find process
 33.1730 +	currentMapEditor()->findReset();
 33.1731 +}
 33.1732 +
 33.1733 +void Main::editOpenURL()
 33.1734 +{
 33.1735 +	if (currentMapEditor())
 33.1736 +	    currentMapEditor()->openURL();
 33.1737 +}
 33.1738 +
 33.1739 +void Main::editURL()
 33.1740 +{
 33.1741 +	if (currentMapEditor())
 33.1742 +	    currentMapEditor()->editURL();
 33.1743 +}
 33.1744 +
 33.1745 +void Main::editHeading2URL()
 33.1746 +{
 33.1747 +	if (currentMapEditor())
 33.1748 +	    currentMapEditor()->editHeading2URL();
 33.1749 +}
 33.1750 +
 33.1751 +void Main::editBugzilla2URL()
 33.1752 +{
 33.1753 +	if (currentMapEditor())
 33.1754 +	    currentMapEditor()->editBugzilla2URL();
 33.1755 +}
 33.1756 +
 33.1757 +void Main::editOpenVymLink()
 33.1758 +{
 33.1759 +	// Get current path to map
 33.1760 +	QString currentVymLink;
 33.1761 +	if (currentMapEditor())
 33.1762 +	{
 33.1763 +		currentVymLink=currentMapEditor()->getVymLink();	
 33.1764 +		// compare path with already loaded maps
 33.1765 +		int index=-1;
 33.1766 +		int i;
 33.1767 +		MapEditor *me;
 33.1768 +		for (i=0;i<=tabWidget->count() -1;i++)
 33.1769 +		{
 33.1770 +			me=(MapEditor*)tabWidget->page(i);
 33.1771 +			if (currentVymLink==me->getFilePath() )
 33.1772 +			{
 33.1773 +				index=i;
 33.1774 +				break;
 33.1775 +			}
 33.1776 +		}	
 33.1777 +		if (index<0)
 33.1778 +		// Load map
 33.1779 +		{
 33.1780 +			if (!QFile(currentVymLink).exists() )
 33.1781 +				QMessageBox::critical( 0, tr( "Critical Error" ),
 33.1782 +				   tr("Couldn't open map " +currentVymLink)+".");
 33.1783 +			else
 33.1784 +			{
 33.1785 +				fileLoad (currentVymLink, NewMap);
 33.1786 +				tabWidget->setCurrentPage (tabWidget->count()-1);	
 33.1787 +			}
 33.1788 +		} else
 33.1789 +			// Go to tab containing the map
 33.1790 +			tabWidget->setCurrentPage (index);	
 33.1791 +	}
 33.1792 +}
 33.1793 +
 33.1794 +void Main::editVymLink()
 33.1795 +{
 33.1796 +	if (currentMapEditor())
 33.1797 +		currentMapEditor()->editVymLink();	
 33.1798 +}
 33.1799 +
 33.1800 +void Main::editDeleteVymLink()
 33.1801 +{
 33.1802 +	if (currentMapEditor())
 33.1803 +		currentMapEditor()->deleteVymLink();	
 33.1804 +}
 33.1805 +
 33.1806 +void Main::editMapInfo()
 33.1807 +{
 33.1808 +	if (currentMapEditor())
 33.1809 +		currentMapEditor()->editMapInfo();	
 33.1810 +}
 33.1811 +
 33.1812 +void Main::editMoveUp()
 33.1813 +{
 33.1814 +	if (currentMapEditor())
 33.1815 +	    currentMapEditor()->moveBranchUp();
 33.1816 +}
 33.1817 +
 33.1818 +void Main::editMoveDown()
 33.1819 +{
 33.1820 +	if (currentMapEditor())
 33.1821 +		currentMapEditor()->moveBranchDown();
 33.1822 +}
 33.1823 +
 33.1824 +void Main::editToggleScroll()
 33.1825 +{
 33.1826 +	if (currentMapEditor())
 33.1827 +	{
 33.1828 +		currentMapEditor()->toggleScroll();	
 33.1829 +	}	
 33.1830 +}
 33.1831 +
 33.1832 +void Main::editUnScrollAll()
 33.1833 +{
 33.1834 +	if (currentMapEditor())
 33.1835 +	{
 33.1836 +		currentMapEditor()->unScrollAll();	
 33.1837 +	}	
 33.1838 +}
 33.1839 +
 33.1840 +void Main::editHeading()
 33.1841 +{
 33.1842 +	if (currentMapEditor())
 33.1843 +		currentMapEditor()->editHeading();
 33.1844 +}
 33.1845 +
 33.1846 +void Main::editNewBranch()
 33.1847 +{
 33.1848 +	if (currentMapEditor())
 33.1849 +		currentMapEditor()->addNewBranch(0);
 33.1850 +}
 33.1851 +
 33.1852 +void Main::editNewBranchAbove()
 33.1853 +{
 33.1854 +	if (currentMapEditor())
 33.1855 +		currentMapEditor()->addNewBranch(-1);
 33.1856 +}
 33.1857 +
 33.1858 +void Main::editNewBranchBelow()
 33.1859 +{
 33.1860 +	if (currentMapEditor())
 33.1861 +		currentMapEditor()->addNewBranch(1);
 33.1862 +}
 33.1863 +
 33.1864 +void Main::editImportAdd()
 33.1865 +{
 33.1866 +	fileLoad (ImportAdd);
 33.1867 +}
 33.1868 +
 33.1869 +void Main::editImportReplace()
 33.1870 +{
 33.1871 +	fileLoad (ImportReplace);
 33.1872 +}
 33.1873 +
 33.1874 +void Main::editSaveBranch()
 33.1875 +{
 33.1876 +	fileSaveAs (PartOfMap);
 33.1877 +}
 33.1878 +
 33.1879 +void Main::editDeleteSelection()
 33.1880 +{
 33.1881 +	if (currentMapEditor())
 33.1882 +		currentMapEditor()->deleteSelection();
 33.1883 +}
 33.1884 +
 33.1885 +void Main::editUpperBranch()
 33.1886 +{
 33.1887 +	if (currentMapEditor())
 33.1888 +		currentMapEditor()->selectUpperBranch();
 33.1889 +}
 33.1890 +
 33.1891 +void Main::editLowerBranch()
 33.1892 +{
 33.1893 +	if (currentMapEditor())
 33.1894 +		currentMapEditor()->selectLowerBranch();
 33.1895 +}
 33.1896 +
 33.1897 +void Main::editLeftBranch()
 33.1898 +{
 33.1899 +	if (currentMapEditor())
 33.1900 +		currentMapEditor()->selectLeftBranch();
 33.1901 +}
 33.1902 +
 33.1903 +void Main::editRightBranch()
 33.1904 +{
 33.1905 +	if (currentMapEditor())
 33.1906 +		currentMapEditor()->selectRightBranch();
 33.1907 +}
 33.1908 +
 33.1909 +void Main::editFirstBranch()
 33.1910 +{
 33.1911 +	if (currentMapEditor())
 33.1912 +		currentMapEditor()->selectFirstBranch();
 33.1913 +}
 33.1914 +
 33.1915 +void Main::editLastBranch()
 33.1916 +{
 33.1917 +	if (currentMapEditor())
 33.1918 +		currentMapEditor()->selectLastBranch();
 33.1919 +}
 33.1920 +
 33.1921 +void Main::editLoadImage()
 33.1922 +{
 33.1923 +	if (currentMapEditor())
 33.1924 +		currentMapEditor()->loadFloatImage();
 33.1925 +}
 33.1926 +
 33.1927 +void Main::editSaveImage(int item)
 33.1928 +{
 33.1929 +	if (currentMapEditor())
 33.1930 +		currentMapEditor()->saveFloatImage(item);
 33.1931 +}
 33.1932 +
 33.1933 +void Main::editToggleFloatExport()
 33.1934 +{
 33.1935 +	if (currentMapEditor())
 33.1936 +		currentMapEditor()->toggleFloatExport();
 33.1937 +}
 33.1938 +
 33.1939 +void Main::formatSelectColor()
 33.1940 +{
 33.1941 +	if (currentMapEditor())
 33.1942 +	{
 33.1943 +		QColor col = QColorDialog::getColor( currentMapEditor()->color(), this );
 33.1944 +		if ( !col.isValid() ) return;
 33.1945 +		currentMapEditor()->setColor( col );
 33.1946 +		colorChanged( col );
 33.1947 +	}	
 33.1948 +}
 33.1949 +
 33.1950 +void Main::formatPickColor()
 33.1951 +{
 33.1952 +	if (currentMapEditor())
 33.1953 +		colorChanged( currentMapEditor()->pickColor() );
 33.1954 +}
 33.1955 +
 33.1956 +void Main::colorChanged(QColor c)
 33.1957 +{
 33.1958 +    QPixmap pix( 16, 16 );
 33.1959 +    pix.fill( c );
 33.1960 +    actionFormatColor->setIconSet( pix );
 33.1961 +}
 33.1962 +
 33.1963 +void Main::formatColorItem()
 33.1964 +{
 33.1965 +	if (currentMapEditor())
 33.1966 +		currentMapEditor()->colorItem();
 33.1967 +}
 33.1968 +
 33.1969 +void Main::formatColorBranch()
 33.1970 +{
 33.1971 +	if (currentMapEditor())
 33.1972 +		currentMapEditor()->colorBranch();
 33.1973 +}
 33.1974 +
 33.1975 +void Main::formatLinkStyleLine()
 33.1976 +{
 33.1977 +	if (currentMapEditor())
 33.1978 +		currentMapEditor()->setLinkStyle(StyleLine);
 33.1979 +}
 33.1980 +
 33.1981 +void Main::formatLinkStyleParabel()
 33.1982 +{
 33.1983 +	if (currentMapEditor())
 33.1984 +		currentMapEditor()->setLinkStyle(StyleParabel);
 33.1985 +}
 33.1986 +
 33.1987 +void Main::formatLinkStylePolyLine()
 33.1988 +{
 33.1989 +	if (currentMapEditor())
 33.1990 +		currentMapEditor()->setLinkStyle(StylePolyLine);
 33.1991 +}
 33.1992 +
 33.1993 +void Main::formatLinkStylePolyParabel()
 33.1994 +{
 33.1995 +	if (currentMapEditor())
 33.1996 +		currentMapEditor()->setLinkStyle(StylePolyParabel);
 33.1997 +}
 33.1998 +
 33.1999 +void Main::formatSelectBackColor()
 33.2000 +{
 33.2001 +	if (currentMapEditor())
 33.2002 +		currentMapEditor()->selectBackgroundColor();
 33.2003 +}
 33.2004 +
 33.2005 +void Main::formatSelectLinkColor()
 33.2006 +{
 33.2007 +	if (currentMapEditor())
 33.2008 +		currentMapEditor()->selectLinkColor();
 33.2009 +}
 33.2010 +
 33.2011 +void Main::formatToggleLinkColorHint()
 33.2012 +{
 33.2013 +	currentMapEditor()->toggleLinkColorHint();
 33.2014 +}
 33.2015 +
 33.2016 +void Main::formatFrameNone()
 33.2017 +{
 33.2018 +	if (currentMapEditor())
 33.2019 +		currentMapEditor()->setFrame(NoFrame);
 33.2020 +}
 33.2021 +
 33.2022 +void Main::formatFrameRectangle()
 33.2023 +{
 33.2024 +	if (currentMapEditor())
 33.2025 +		currentMapEditor()->setFrame(Rectangle);
 33.2026 +}
 33.2027 +
 33.2028 +void Main::viewZoomReset()
 33.2029 +{
 33.2030 +	if (currentMapEditor())
 33.2031 +	{
 33.2032 +		QWMatrix m;
 33.2033 +		m.reset();
 33.2034 +		currentMapEditor()->setWorldMatrix( m );
 33.2035 +		currentMapEditor()->setViewCenter();
 33.2036 +		currentMapEditor()->adjustCanvasSize();
 33.2037 +	}	
 33.2038 +}
 33.2039 +
 33.2040 +void Main::viewZoomIn()
 33.2041 +{
 33.2042 +	if (currentMapEditor())
 33.2043 +	{
 33.2044 +		QWMatrix m = currentMapEditor()->worldMatrix();
 33.2045 +		m.scale( 1.25, 1.25 );
 33.2046 +		currentMapEditor()->setWorldMatrix( m );
 33.2047 +		currentMapEditor()->setViewCenter();
 33.2048 +		currentMapEditor()->adjustCanvasSize();
 33.2049 +	}	
 33.2050 +}
 33.2051 +
 33.2052 +void Main::viewZoomOut()
 33.2053 +{
 33.2054 +	if (currentMapEditor())
 33.2055 +	{
 33.2056 +		QWMatrix m = currentMapEditor()->worldMatrix();
 33.2057 +		m.scale( 0.8, 0.8 );
 33.2058 +		currentMapEditor()->setWorldMatrix( m );
 33.2059 +		currentMapEditor()->setViewCenter();
 33.2060 +		currentMapEditor()->adjustCanvasSize();
 33.2061 +	}	
 33.2062 +}
 33.2063 +bool Main::settingsPDF()
 33.2064 +{
 33.2065 +	// Default browser is set in constructor
 33.2066 +	bool ok;
 33.2067 +	QString text = QInputDialog::getText(
 33.2068 +		"VYM", tr("Enter path for pdf reader:"), QLineEdit::Normal,
 33.2069 +		settings.readEntry("/vym/mainwindow/readerPDF"), &ok, this );
 33.2070 +	if (ok)
 33.2071 +		settings.writeEntry ("/vym/mainwindow/readerPDF",text);
 33.2072 +	return ok;
 33.2073 +}
 33.2074 +
 33.2075 +
 33.2076 +bool Main::settingsURL()
 33.2077 +{
 33.2078 +	// Default browser is set in constructor
 33.2079 +	bool ok;
 33.2080 +	QString text = QInputDialog::getText(
 33.2081 +		"VYM", tr("Enter path for application to open an URL:"), QLineEdit::Normal,
 33.2082 +		settings.readEntry("/vym/mainwindow/readerURL")
 33.2083 +		, &ok, this );
 33.2084 +	if (ok)
 33.2085 +		settings.writeEntry ("/vym/mainwindow/readerURL",text);
 33.2086 +	return ok;
 33.2087 +}
 33.2088 +
 33.2089 +void Main::windowToggleNoteEditor()
 33.2090 +{
 33.2091 +	if (textEditor->showWithMain() )
 33.2092 +		windowHideNoteEditor();
 33.2093 +	else	
 33.2094 +		windowShowNoteEditor();
 33.2095 +}
 33.2096 +
 33.2097 +void Main::windowShowNoteEditor()
 33.2098 +{
 33.2099 +	textEditor->setShowWithMain(true);
 33.2100 +	textEditor->show();
 33.2101 +	actionViewToggleNoteEditor->setOn (true);
 33.2102 +}
 33.2103 +
 33.2104 +void Main::windowHideNoteEditor()
 33.2105 +{
 33.2106 +	textEditor->setShowWithMain(false);
 33.2107 +	textEditor->hide();
 33.2108 +	actionViewToggleNoteEditor->setOn (false);
 33.2109 +}
 33.2110 +
 33.2111 +void Main::windowNextEditor()
 33.2112 +{
 33.2113 +	if (tabWidget->currentPageIndex() < tabWidget->count())
 33.2114 +		tabWidget->setCurrentPage (tabWidget->currentPageIndex() +1);
 33.2115 +}
 33.2116 +
 33.2117 +void Main::windowPreviousEditor()
 33.2118 +{
 33.2119 +	if (tabWidget->currentPageIndex() >0)
 33.2120 +		tabWidget->setCurrentPage (tabWidget->currentPageIndex() -1);
 33.2121 +}
 33.2122 +
 33.2123 +void Main::standardFlagChanged()
 33.2124 +{
 33.2125 +	currentMapEditor()->toggleStandardFlag(sender()->name());
 33.2126 +}
 33.2127 +
 33.2128 +void Main::testFunction()
 33.2129 +{
 33.2130 +	//textEditor->stackUnder(this);
 33.2131 +	currentMapEditor()->testFunction();
 33.2132 +}
 33.2133 +
 33.2134 +void Main::testShowClipboard()
 33.2135 +{
 33.2136 +	clipboardME->show();
 33.2137 +}
 33.2138 +
 33.2139 +void Main::helpDoc()
 33.2140 +{
 33.2141 +	QString docpath;
 33.2142 +	// default path in SUSE LINUX
 33.2143 +	docpath="/usr/share/doc/packages/vym/doc/vym.pdf";
 33.2144 +
 33.2145 +	if (!QFile (docpath).exists() )
 33.2146 +	{
 33.2147 +		// relative path for easy testing in tarball
 33.2148 +		docpath="doc/vym.pdf";
 33.2149 +		if (!QFile (docpath).exists() )
 33.2150 +		{
 33.2151 +			// relative path for testing while still writing vym.tex
 33.2152 +			docpath="doc/tex/vym.pdf";
 33.2153 +			if (!QFile (docpath).exists() )
 33.2154 +			{
 33.2155 +				QMessageBox::critical(0, 
 33.2156 +				tr("Critcal error"),
 33.2157 +				tr("Couldn't find the documentation\n"
 33.2158 +				"vym.pdf in various places."));
 33.2159 +				return;
 33.2160 +			}	
 33.2161 +		}
 33.2162 +	}
 33.2163 +	
 33.2164 +	Process *pdfProc = new Process();
 33.2165 +	pdfProc->clearArguments();
 33.2166 +	pdfProc->addArgument( settings.readEntry("/vym/mainwindow/readerPDF"));
 33.2167 +	pdfProc->addArgument( docpath);
 33.2168 +
 33.2169 +	if ( !pdfProc->start() ) 
 33.2170 +	{
 33.2171 +		// error handling
 33.2172 +		QMessageBox::critical(0, 
 33.2173 +		tr("Critcal error"),
 33.2174 +		tr("Couldn't find a viewer to read vym.pdf.\n"
 33.2175 +		"Please use Settings->")+tr("Set application to open pdf files"));
 33.2176 +		return;
 33.2177 +	}
 33.2178 +}
 33.2179 +
 33.2180 +
 33.2181 +void Main::helpAbout()
 33.2182 +{
 33.2183 +    static QMessageBox* about = new QMessageBox( "VYM",
 33.2184 +			"<h3>VYM - View Your Mind </h3>"
 33.2185 +			"<p> A tool to put the things you have got in your mind into a map.</p>"
 33.2186 +			"<ul>"
 33.2187 +				"<li> (c) by Uwe Drechsel (vym@InSilmaril.de)</li>"
 33.2188 +				"<li> vym is released under the GPL (Gnu General Public License)"
 33.2189 +				", with one exception (see the file \"LICENSE\"which "
 33.2190 +				"comes with vym). This exception is needed to build vym with QT libraries for proprietary operating systems.</li>"
 33.2191 +				"<li> Project homepage <a href=\"http:/www.InSilmaril.de/vym\">"
 33.2192 +    					"http:/www.InSilmaril.de/vym</a></li>"
 33.2193 +			"<li> Credits " 
 33.2194 +				"<ul>"
 33.2195 +					"<li>Thomas Schraitle for the stylesheet  used for XHTML-export </li>"
 33.2196 +					"<li>Clemens Kraus for stylesheets and script used for HTML-export "
 33.2197 +					"<a href=\"http://www.clemens-kraus.de\">(www.clemens-kraus.de)</a></li>"
 33.2198 +					"<li>Alexander Johannesen for providing stylesheets from his xsiteable project " 
 33.2199 +					"<a href=\"http://www.shelter.nu/xsiteable/xsiteable.html\">(www.shelter.nu/xsiteable/xsiteable.html)</a>. </li>"
 33.2200 +					"<li>Ken Wimer and Olaf Hering for Mac support</li>"
 33.2201 +				"</ul>"
 33.2202 +			"</li>"
 33.2203 +			"<li> Version "  __VYM_VERSION__  "</li>"
 33.2204 +				"<li> Build date "  __BUILD_DATE__"</li>"
 33.2205 +			"</ul>", QMessageBox::Information, 1, 0, 0, this, 0, FALSE );
 33.2206 +    about->setButtonText( 1, "Dismiss" );
 33.2207 +    about->setMinimumSize(QSize(300,300));
 33.2208 +	about->setIconPixmap (QPixmap(vym_logo_xpm));
 33.2209 +    about->show();
 33.2210 +}
 33.2211 +
 33.2212 +void Main::helpAboutQT()
 33.2213 +{
 33.2214 +	QMessageBox::aboutQt( this, "Qt Application Example" );
 33.2215 +}
 33.2216 +
    34.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    34.2 +++ b/mainwindow.h	Sun Jan 30 12:58:47 2005 +0000
    34.3 @@ -0,0 +1,168 @@
    34.4 +#ifndef MAINWINDOW_H 
    34.5 +#define MAINWINDOW_H
    34.6 +
    34.7 +#include <qpopupmenu.h>
    34.8 +#include <qmainwindow.h>
    34.9 +#include <qtextedit.h>
   34.10 +#include <qintdict.h>
   34.11 +#include <qcanvas.h>
   34.12 +#include <qlineedit.h>
   34.13 +#include <qaction.h>
   34.14 +#include <qcursor.h>
   34.15 +#include <qtabwidget.h>
   34.16 +#include <qmap.h>
   34.17 +
   34.18 +#include "xml.h"
   34.19 +#include "texteditor.h"
   34.20 +#include "mapeditor.h"
   34.21 +#include "findwindow.h"
   34.22 +
   34.23 +class Main : public QMainWindow 
   34.24 +{
   34.25 +    Q_OBJECT
   34.26 +
   34.27 +public:
   34.28 +    Main(QWidget* parent=0, const char* name=0, WFlags f=0);
   34.29 +    ~Main();
   34.30 +	void loadCmdLine();
   34.31 +	void statusMessage (const QString &);
   34.32 +
   34.33 +public slots:
   34.34 +    void fileNew();
   34.35 +
   34.36 +protected:
   34.37 +	void closeEvent( QCloseEvent* );
   34.38 +
   34.39 +private:
   34.40 +    void setupFileActions();
   34.41 +    void setupEditActions();
   34.42 +    void setupFormatActions();
   34.43 +    void setupViewActions();
   34.44 +    void setupWindowActions();
   34.45 +    void setupFlagActions();
   34.46 +    void setupSettingsActions();
   34.47 +    void setupTestActions();
   34.48 +    void setupHelpActions();
   34.49 +    void setupContextMenus();
   34.50 +	void setupLastMapsMenu();
   34.51 +	void hideEvent (QHideEvent * );
   34.52 +	void showEvent (QShowEvent * );
   34.53 +	bool reallyWriteDirectory(const QString&);
   34.54 +	QString browseDirectory(const QString&);
   34.55 +	MapEditor* currentMapEditor() const;
   34.56 +    
   34.57 +private slots:
   34.58 +    void newView();
   34.59 +	void editorChanged(QWidget*);
   34.60 +
   34.61 +    void fileLoad(QString ,const LoadMode &);
   34.62 +    void fileLoad(const LoadMode &);
   34.63 +    void fileLoad();
   34.64 +	void fileLoadLast(int);
   34.65 +    void fileSave(const SaveMode & );
   34.66 +    void fileSave();
   34.67 +    void fileSaveAs(const SaveMode &);
   34.68 +    void fileSaveAs();
   34.69 +    void fileImportDir();
   34.70 +    void fileExportXML();
   34.71 +    void fileExportHTML();
   34.72 +    void fileExportXHTML();
   34.73 +    void fileExportImage(int);
   34.74 +    void fileExportASCII();
   34.75 +    void fileCloseMap();
   34.76 +    void filePrint();
   34.77 +    void fileExitVYM();
   34.78 +
   34.79 +    void editUndo();	
   34.80 +    void editRedo();	
   34.81 +    void editCopy();	
   34.82 +    void editPaste();	
   34.83 +    void editCut();	
   34.84 +    void editOpenFindWindow();
   34.85 +	void editFind(QString);
   34.86 +	void editFindChanged();
   34.87 +public slots:
   34.88 +	void editOpenURL();
   34.89 +private slots:
   34.90 +	void editURL();
   34.91 +	void editHeading2URL();
   34.92 +	void editBugzilla2URL();
   34.93 +	void editVymLink();
   34.94 +public slots:
   34.95 +	void editOpenVymLink();
   34.96 +private slots:
   34.97 +	void editDeleteVymLink();
   34.98 +	void editMapInfo();
   34.99 +    void editMoveUp();	
  34.100 +    void editMoveDown();	
  34.101 +    void editToggleScroll();
  34.102 +    void editUnScrollAll();
  34.103 +    void editHeading();
  34.104 +    void editNewBranch();
  34.105 +    void editNewBranchAbove();
  34.106 +    void editNewBranchBelow();
  34.107 +    void editImportAdd();
  34.108 +    void editImportReplace();
  34.109 +    void editSaveBranch();
  34.110 +    void editDeleteSelection();
  34.111 +    void editUpperBranch();
  34.112 +    void editLowerBranch();
  34.113 +    void editLeftBranch();
  34.114 +    void editRightBranch();
  34.115 +    void editFirstBranch();
  34.116 +    void editLastBranch();
  34.117 +    void editLoadImage();
  34.118 +    void editSaveImage(int);
  34.119 +    void editToggleFloatExport();
  34.120 +
  34.121 +    void formatSelectColor();
  34.122 +    void formatPickColor();
  34.123 +    void colorChanged(QColor);
  34.124 +    void formatColorItem();
  34.125 +    void formatColorBranch();
  34.126 +	void formatLinkStyleLine();
  34.127 +	void formatLinkStyleParabel();
  34.128 +	void formatLinkStylePolyLine();
  34.129 +	void formatLinkStylePolyParabel();
  34.130 +    void formatSelectBackColor();
  34.131 +    void formatSelectLinkColor();
  34.132 +    void formatToggleLinkColorHint();
  34.133 +	void formatFrameNone();
  34.134 +	void formatFrameRectangle();
  34.135 +
  34.136 +    void viewZoomReset();
  34.137 +    void viewZoomIn();
  34.138 +    void viewZoomOut();
  34.139 +
  34.140 +public slots:
  34.141 +	bool settingsPDF();
  34.142 +	bool settingsURL();
  34.143 +
  34.144 +	void windowToggleNoteEditor();
  34.145 +private slots:
  34.146 +	void windowNextEditor();
  34.147 +	void windowPreviousEditor();
  34.148 +	void windowShowNoteEditor();
  34.149 +	void windowHideNoteEditor();
  34.150 +
  34.151 +	void standardFlagChanged();
  34.152 +
  34.153 +    void testFunction();
  34.154 +    void testShowClipboard();
  34.155 +
  34.156 +    void helpDoc();
  34.157 +    void helpAbout();
  34.158 +    void helpAboutQT();
  34.159 +
  34.160 +private:
  34.161 +    QCanvas* canvas;
  34.162 +	QTabWidget *tabWidget;
  34.163 +	FindWindow *findWindow;
  34.164 +	QStringList lastMaps;
  34.165 +	int maxLastMaps;
  34.166 +	QString lastFileDir;
  34.167 +};
  34.168 +
  34.169 +
  34.170 +#endif
  34.171 +
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/mapcenterobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    35.3 @@ -0,0 +1,235 @@
    35.4 +#include <qdatetime.h>
    35.5 +
    35.6 +#include "mapcenterobj.h"
    35.7 +#include "floatimageobj.h"
    35.8 +#include "mapeditor.h"
    35.9 +
   35.10 +/////////////////////////////////////////////////////////////////
   35.11 +// MapCenterObj
   35.12 +/////////////////////////////////////////////////////////////////
   35.13 +MapCenterObj::MapCenterObj() : BranchObj ()
   35.14 +{
   35.15 +//    cout << "Const MapCenterObj\n";
   35.16 +    init();
   35.17 +}
   35.18 +
   35.19 +MapCenterObj::MapCenterObj(QCanvas* c) : BranchObj (c)
   35.20 +{
   35.21 +//    cout << "Const MapCenterObj   canvas="<<c<<"\n";
   35.22 +    init();
   35.23 +}
   35.24 +
   35.25 +MapCenterObj::~MapCenterObj() 
   35.26 +{
   35.27 +//    cout << "Destr MapCenterObj\n";
   35.28 +}	
   35.29 +
   35.30 +void MapCenterObj::clear() 
   35.31 +{
   35.32 +	BranchObj::clear();
   35.33 +    init();
   35.34 +}
   35.35 +
   35.36 +void MapCenterObj::init () 
   35.37 +{
   35.38 +    orientation=OrientUndef;
   35.39 +    absPos=QPoint (canvas->width()/2, canvas->height()/2);
   35.40 +
   35.41 +	// FIXME this should be done in TextObj later...
   35.42 +	QFont font ("Sans Serif,16,-1,5,50,0,0,0,0,0");		
   35.43 +	heading->setFont(font);
   35.44 +
   35.45 +	branch.setAutoDelete (TRUE);
   35.46 +	floatimage.setAutoDelete (TRUE);
   35.47 +
   35.48 +	move (absPos.x(), absPos.y() );
   35.49 +	depth=0;
   35.50 +
   35.51 +	scrolled=false;
   35.52 +	tmpUnscrolled=false;
   35.53 +
   35.54 +	frame->setFrameType (Rectangle);
   35.55 +}
   35.56 +
   35.57 +void MapCenterObj::move (double x, double y)
   35.58 +{
   35.59 +	BranchObj::move(x,y);
   35.60 +	positionBBox();
   35.61 +}
   35.62 +
   35.63 +void MapCenterObj::moveBy (double x, double y)
   35.64 +{
   35.65 +	BranchObj::moveBy(x,y);
   35.66 +	positionBBox();
   35.67 +}
   35.68 +
   35.69 +void MapCenterObj::moveAll (double x, double y)
   35.70 +{
   35.71 +	// Get rel. position
   35.72 +	double dx=x-absPos.x();
   35.73 +	double dy=y-absPos.y();
   35.74 +
   35.75 +	// Move myself and branches
   35.76 +	moveAllBy (dx,dy);
   35.77 +}
   35.78 +
   35.79 +void MapCenterObj::moveAllBy (double dx, double dy)
   35.80 +{
   35.81 +	// Move myself
   35.82 +	moveBy(dx,dy);
   35.83 +
   35.84 +	positionBBox();
   35.85 +}
   35.86 +
   35.87 +void MapCenterObj::updateLink()
   35.88 +{
   35.89 +	// set childPos to middle of MapCenterObj
   35.90 +	childPos=QPoint(
   35.91 +		absPos.x() + QSize(getSize() ).width()/2, 
   35.92 +		absPos.y() + QSize(getSize() ).height()/2);
   35.93 +	parPos=childPos;		
   35.94 +	BranchObj *b;
   35.95 +	for (b=branch.first(); b; b=branch.next() )
   35.96 +		b->updateLink();
   35.97 +}
   35.98 +
   35.99 +LinkableMapObj* MapCenterObj::findMapObj(QPoint p, LinkableMapObj *excludeLMO)
  35.100 +	{
  35.101 +	BranchObj *bo;
  35.102 +	LinkableMapObj *lmo;
  35.103 +
  35.104 +	// Search through child branches
  35.105 +	for (bo=branch.first(); bo; bo=branch.next() )
  35.106 +	{	
  35.107 +		lmo = bo->findMapObj(p, excludeLMO);
  35.108 +		
  35.109 +		if (lmo!= NULL) 
  35.110 +		{
  35.111 +			return lmo;
  35.112 +		}	
  35.113 +	}
  35.114 +	// is p in MapCenter?
  35.115 +	if (inBBox (p) && (this != excludeLMO) ) return this;
  35.116 +
  35.117 +	// Search float images
  35.118 +	FloatImageObj *foi;
  35.119 +	for (foi=floatimage.first(); foi; foi=floatimage.next() )
  35.120 +		if (foi->inBBox(p) && (foi != excludeLMO) && foi->getParObj()!= excludeLMO) return foi;
  35.121 +
  35.122 +	// nothing found
  35.123 +	return NULL;
  35.124 +}
  35.125 +
  35.126 +QString MapCenterObj::saveToDir (const QString &tmpdir,const QString &prefix, int verbose, const QPoint &offset)
  35.127 +{
  35.128 +    QString s,a;
  35.129 +
  35.130 +	// save area, if not scrolled
  35.131 +	QString areaAttr=
  35.132 +		attribut("x1",QString().setNum(absPos.x()-offset.x(),10)) +
  35.133 +		attribut("y1",QString().setNum(absPos.y()-offset.y(),10)) +
  35.134 +		attribut("x2",QString().setNum(absPos.x()+width()-offset.x(),10)) +
  35.135 +		attribut("y2",QString().setNum(absPos.y()+height()-offset.y(),10));
  35.136 +	
  35.137 +    s=beginElement ("mapcenter" 
  35.138 +		+attribut("absPosX",QString().setNum(absPos.x(),10))
  35.139 +		+attribut("absPosY",QString().setNum(absPos.y(),10))
  35.140 +		+attribut("frameType",frame->getFrameTypeName()) 
  35.141 +		+areaAttr 
  35.142 +		);
  35.143 +		
  35.144 +    incIndent();
  35.145 +    if (heading->getColor()!=QColor("black"))
  35.146 +		a=attribut ("textColor",QColor(heading->getColor()).name() );
  35.147 +    else	
  35.148 +		a="";
  35.149 +    
  35.150 +	// Save flags. If verbose is set (export to xml dir), also write
  35.151 +	// the flags as picture
  35.152 +	s+=standardFlags->saveToDir(tmpdir+"/flags", "/standardFlag-", verbose);
  35.153 +    s=s+valueElement("heading", getHeading(),a);
  35.154 +
  35.155 +	// Reset the counters before saving
  35.156 +	FloatImageObj (canvas).resetSaveCounter();
  35.157 +
  35.158 +	// add link to file in s
  35.159 +	if (!note.isEmpty() )
  35.160 +		s+=note.saveToDir();
  35.161 +	
  35.162 +	// Save FloatImages
  35.163 +	FloatImageObj *fio;
  35.164 +	for (fio=floatimage.first(); fio; fio=floatimage.next() )
  35.165 +		s+=fio->saveToDir (tmpdir,prefix);
  35.166 +
  35.167 +	// Save branches
  35.168 +    BranchObj *bo;
  35.169 +    for (bo=branch.first(); bo; bo=branch.next() )
  35.170 +		s+=bo->saveToDir(tmpdir,prefix, offset);
  35.171 +
  35.172 +    decIndent();
  35.173 +    s+=endElement   ("mapcenter");
  35.174 +    return s;
  35.175 +}
  35.176 +
  35.177 +void MapCenterObj::setVersion (const QString &s)
  35.178 +{
  35.179 +	version=s;
  35.180 +}
  35.181 +
  35.182 +bool MapCenterObj::checkVersion ()
  35.183 +{
  35.184 +	// returns true, if vym is able to read file regarding 
  35.185 +	// the version set with setVersion
  35.186 +	QString s1=version.section (".",0,0);
  35.187 +	QString s2=version.section (".",1,1);
  35.188 +	QString s3=version.section (".",2,2);
  35.189 +	bool ok;
  35.190 +	int vv1 =QString(__VYM_VERSION__).section (".",0,0).toInt(&ok,10);
  35.191 +	int vv2 =QString(__VYM_VERSION__).section (".",1,1).toInt(&ok,10);
  35.192 +	int vv3 =QString(__VYM_VERSION__).section (".",2,2).toInt(&ok,10);
  35.193 +	int mv1=0;
  35.194 +	int mv2=0;
  35.195 +	int mv3=0;
  35.196 +	if (!s1.isEmpty() ) mv1=s1.toInt(&ok,10);
  35.197 +	if (!s2.isEmpty() ) mv2=s2.toInt(&ok,10);
  35.198 +	if (!s3.isEmpty() ) mv3=s3.toInt(&ok,10);
  35.199 +	
  35.200 +	if (vv1 > mv1)
  35.201 +		return true;
  35.202 +	if (vv1 < mv1)
  35.203 +		return false;
  35.204 +	if (vv2 > mv2)
  35.205 +		return true;
  35.206 +	if (vv2 < mv2)
  35.207 +		return false;
  35.208 +	if (vv3 > mv3)
  35.209 +		return true;
  35.210 +	if (vv3 < mv3)
  35.211 +		return false;
  35.212 +	return true;	
  35.213 +}
  35.214 +
  35.215 +void MapCenterObj::setAuthor (const QString &s)
  35.216 +{
  35.217 +	author=s;
  35.218 +}
  35.219 +
  35.220 +QString MapCenterObj::getAuthor()
  35.221 +{
  35.222 +	return author;
  35.223 +}
  35.224 +
  35.225 +void MapCenterObj::setComment (const QString &s)
  35.226 +{
  35.227 +	comment=s;
  35.228 +}
  35.229 +
  35.230 +QString MapCenterObj::getComment ()
  35.231 +{
  35.232 +	return comment;
  35.233 +}
  35.234 +
  35.235 +QString MapCenterObj::getDate ()
  35.236 +{
  35.237 +	return QDate::currentDate().toString ("yyyy-MM-dd");
  35.238 +}
    36.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    36.2 +++ b/mapcenterobj.h	Sun Jan 30 12:58:47 2005 +0000
    36.3 @@ -0,0 +1,35 @@
    36.4 +#ifndef MAPCENTEROBJ_H
    36.5 +#define MAPCENTEROBJ_H
    36.6 +
    36.7 +#include "branchobj.h"
    36.8 +#include "version.h"
    36.9 +
   36.10 +/////////////////////////////////////////////////////////////////////////////
   36.11 +class MapCenterObj:public BranchObj {
   36.12 +public:
   36.13 +    MapCenterObj ();
   36.14 +    MapCenterObj (QCanvas*);
   36.15 +    ~MapCenterObj ();
   36.16 +    void clear();
   36.17 +    void init();
   36.18 +    virtual void move      (double,double);
   36.19 +    virtual void moveBy    (double,double);
   36.20 +    virtual void moveAll   (double,double);
   36.21 +    virtual void moveAllBy (double,double);
   36.22 +    virtual void updateLink();
   36.23 +    LinkableMapObj* findMapObj(QPoint,LinkableMapObj*);	// find MapObj 
   36.24 +	virtual QString saveToDir (const QString&,const QString&,int, const QPoint&);// Save data recursivly to tempdir
   36.25 +	void setVersion(const  QString &);
   36.26 +	bool checkVersion();				// check if program version is higher than saved version
   36.27 +	void setAuthor  (const QString &);
   36.28 +	QString getAuthor ();
   36.29 +	void setComment (const QString &);
   36.30 +	QString getComment ();
   36.31 +	QString getDate();
   36.32 +private:
   36.33 +	QString version;					// version string saved in vym file
   36.34 +	QString author;
   36.35 +	QString comment;
   36.36 +	QDate date;
   36.37 +};
   36.38 +#endif
    37.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    37.2 +++ b/mapeditor.cpp	Sun Jan 30 12:58:47 2005 +0000
    37.3 @@ -0,0 +1,3062 @@
    37.4 +#include "mapeditor.h"
    37.5 +
    37.6 +#include <qstatusbar.h>
    37.7 +#include <qmessagebox.h>
    37.8 +#include <qapplication.h>
    37.9 +#include <qpainter.h>
   37.10 +#include <qpopupmenu.h>
   37.11 +#include <qprinter.h>
   37.12 +#include <qpaintdevicemetrics.h>
   37.13 +#include <qfile.h>
   37.14 +#include <qfiledialog.h>
   37.15 +#include <qdir.h>
   37.16 +#include <qcolor.h>
   37.17 +#include <qcolordialog.h>
   37.18 +#include <qbitmap.h>
   37.19 +#include <qprocess.h>
   37.20 +#include <qinputdialog.h>
   37.21 +
   37.22 +#include <iostream>
   37.23 +#include <stdlib.h>
   37.24 +#include <typeinfo>
   37.25 +
   37.26 +#include "version.h"
   37.27 +
   37.28 +#include "xml.h"
   37.29 +#include "texteditor.h"
   37.30 +#include "linkablemapobj.h"
   37.31 +#include "exports.h"
   37.32 +#include "misc.h"
   37.33 +#include "mainwindow.h"
   37.34 +#include "extrainfodialog.h"
   37.35 +#include "settings.h"
   37.36 +
   37.37 +#include "icons/flag-note.xpm"
   37.38 +#include "icons/flag-url.xpm"
   37.39 +#include "icons/flag-vymlink.xpm"	
   37.40 +#include "icons/flag-scrolled-right.xpm"
   37.41 +#include "icons/flag-tmpUnscrolled-right.xpm"
   37.42 +#include "icons/flag-questionmark.xpm"
   37.43 +#include "icons/flag-exclamationmark.xpm"
   37.44 +#include "icons/flag-hook-green.xpm"
   37.45 +#include "icons/flag-cross-red.xpm"
   37.46 +#include "icons/flag-stopsign.xpm"
   37.47 +#include "icons/flag-smiley-good.xpm"
   37.48 +#include "icons/flag-smiley-sad.xpm"
   37.49 +#include "icons/flag-clock.xpm"
   37.50 +#include "icons/flag-lamp.xpm"
   37.51 +#include "icons/flag-arrow-up.xpm"
   37.52 +#include "icons/flag-arrow-down.xpm"
   37.53 +#include "icons/flag-thumb-up.xpm"
   37.54 +#include "icons/flag-thumb-down.xpm"
   37.55 +#include "icons/flag-heart.xpm"
   37.56 +#include "icons/flag-flash.xpm"
   37.57 +#include "icons/flag-lifebelt.xpm"
   37.58 +
   37.59 +extern TextEditor *textEditor;
   37.60 +extern int statusbarTime;
   37.61 +extern Main *mainWindow;
   37.62 +extern FlagRowObj *systemFlagsDefault;
   37.63 +extern FlagRowObj *standardFlagsDefault;
   37.64 +extern MapEditor *clipboardME;
   37.65 +
   37.66 +extern QAction *actionFileSave;
   37.67 +extern QAction *actionEditUndo;
   37.68 +extern QAction *actionEditCopy;
   37.69 +extern QAction *actionEditCut;
   37.70 +extern QAction *actionEditPaste;
   37.71 +extern QAction *actionEditMoveUp;
   37.72 +extern QAction *actionEditMoveDown;
   37.73 +extern QAction *actionEditToggleScroll;
   37.74 +extern QAction *actionEditOpenURL;
   37.75 +extern QAction *actionEditURL;
   37.76 +extern QAction *actionEditHeading2URL;
   37.77 +extern QAction *actionEditBugzilla2URL;
   37.78 +extern QAction *actionEditOpenVymLink;
   37.79 +extern QAction *actionEditVymLink;
   37.80 +extern QAction *actionEditDeleteVymLink;
   37.81 +extern QAction *actionEditHeading;
   37.82 +extern QAction *actionEditDelete;
   37.83 +extern QAction *actionEditAddBranch;
   37.84 +extern QAction *actionEditAddBranchAbove;
   37.85 +extern QAction *actionEditAddBranchBelow;
   37.86 +extern QAction *actionEditImportAdd;
   37.87 +extern QAction *actionEditImportReplace;
   37.88 +extern QAction *actionEditSaveBranch;
   37.89 +extern QAction *actionEditSelectFirst;
   37.90 +extern QAction *actionEditSelectLast;
   37.91 +extern QAction *actionEditLoadImage;
   37.92 +extern QAction *actionEditToggleFloatExport;
   37.93 +
   37.94 +extern QAction* actionFormatPickColor;
   37.95 +extern QAction* actionFormatColorBranch;
   37.96 +extern QAction* actionFormatColorSubtree;
   37.97 +extern QAction *actionFormatLinkColorHint;
   37.98 +extern QAction *actionFormatBackColor;
   37.99 +extern QAction *actionFormatLinkColor;
  37.100 +
  37.101 +extern QActionGroup *actionGroupFormatFrameTypes;
  37.102 +extern QAction *actionFormatFrameNone;
  37.103 +extern QAction *actionFormatFrameRectangle;
  37.104 +
  37.105 +extern QActionGroup *actionGroupFormatLinkStyles;
  37.106 +extern QAction *actionFormatLinkStyleLine;
  37.107 +extern QAction *actionFormatLinkStyleParabel;
  37.108 +extern QAction *actionFormatLinkStylePolyLine;
  37.109 +extern QAction *actionFormatLinkStylePolyParabel;
  37.110 +
  37.111 +extern QAction *actionViewToggleNoteEditor;
  37.112 +
  37.113 +extern QAction *actionSettingsAutoedit;
  37.114 +extern QAction *actionSettingsAutoselectHeading;
  37.115 +extern QAction *actionSettingsAutoselectText;
  37.116 +extern QAction *actionSettingsPasteNewHeading;
  37.117 +
  37.118 +extern QPopupMenu *branchContextMenu;
  37.119 +extern QPopupMenu *floatimageContextMenu;
  37.120 +extern QPopupMenu *saveImageFormatMenu;
  37.121 +extern QPopupMenu *exportImageFormatMenu;
  37.122 +extern QPopupMenu *canvasContextMenu;
  37.123 +
  37.124 +extern Settings settings;
  37.125 +
  37.126 +
  37.127 +///////////////////////////////////////////////////////////////////////
  37.128 +///////////////////////////////////////////////////////////////////////
  37.129 +MapEditor::MapEditor(
  37.130 +	QWidget* parent, bool interactive, const char* name, WFlags f) :
  37.131 +    QCanvasView(parent,name,f)
  37.132 +{
  37.133 +	//cout << "Constructor ME "<<this<<endl;
  37.134 +
  37.135 +    mapCanvas = new QCanvas(1000,800);
  37.136 +	mapCanvas->setAdvancePeriod(30);
  37.137 +
  37.138 +    setCanvas (mapCanvas);
  37.139 +	
  37.140 +	setVScrollBarMode ( QScrollView::AlwaysOn );
  37.141 +	setHScrollBarMode ( QScrollView::AlwaysOn );
  37.142 +
  37.143 +	// Now create the _global_ system flags _once_:
  37.144 +	// (Later all OrnamentedObj copy from this 
  37.145 +	// and set their own canvas)
  37.146 +	if (!systemFlagsDefault)
  37.147 +	{
  37.148 +		systemFlagsDefault = new FlagRowObj (mapCanvas);
  37.149 +		systemFlagsDefault->setVisibility (false);
  37.150 +		systemFlagsDefault->setName ("systemFlagsDef");
  37.151 +
  37.152 +		FlagObj *fo = new FlagObj (mapCanvas);
  37.153 +		fo->load(QPixmap(flag_note_xpm));
  37.154 +		fo->setName("note");
  37.155 +		fo->setToolTip(tr("Note"));
  37.156 +		systemFlagsDefault->addFlag (fo);	// makes deep copy
  37.157 +
  37.158 +		fo->load(QPixmap(flag_url_xpm));
  37.159 +		fo->setName("url");
  37.160 +		fo->setToolTip(tr("WWW Document (external)"));
  37.161 +		systemFlagsDefault->addFlag (fo);
  37.162 +		
  37.163 +		fo->load(QPixmap(flag_vymlink_xpm));
  37.164 +		fo->setName("vymLink");
  37.165 +		fo->setToolTip(tr("Link to another vym map"));
  37.166 +		systemFlagsDefault->addFlag (fo);	
  37.167 +
  37.168 +		fo->load(QPixmap(flag_scrolled_right_xpm));
  37.169 +		fo->setName("scrolledright");
  37.170 +		fo->setToolTip(tr("subtree is scrolled"));
  37.171 +		systemFlagsDefault->addFlag (fo);
  37.172 +		
  37.173 +		fo->load(QPixmap(flag_tmpUnscrolled_right_xpm));
  37.174 +		fo->setName("tmpUnscrolledright");
  37.175 +		fo->setToolTip(tr("subtree is temporary scrolled"));
  37.176 +		systemFlagsDefault->addFlag (fo);
  37.177 +		delete (fo);
  37.178 +	}
  37.179 +	if (!standardFlagsDefault)
  37.180 +	{
  37.181 +		standardFlagsDefault = new FlagRowObj (mapCanvas);
  37.182 +		standardFlagsDefault->setVisibility (false);
  37.183 +		standardFlagsDefault->setName ("standardFlagsDef");
  37.184 +
  37.185 +		FlagObj *fo = new FlagObj (mapCanvas);
  37.186 +		fo->load(QPixmap(flag_exclamationmark_xpm));
  37.187 +		fo->setName("exclamationmark");
  37.188 +		fo->setToolTip(tr("Take care!"));
  37.189 +		standardFlagsDefault->addFlag (fo);	// makes deep copy
  37.190 +		
  37.191 +		fo->load(QPixmap(flag_questionmark_xpm));
  37.192 +		fo->setName("questionmark");
  37.193 +		fo->setToolTip(tr("Really?"));
  37.194 +		standardFlagsDefault->addFlag (fo);	
  37.195 +
  37.196 +		fo->load(QPixmap(flag_hook_green_xpm));
  37.197 +		fo->setName("hook-green");
  37.198 +		fo->setToolTip(tr("ok!"));
  37.199 +		standardFlagsDefault->addFlag (fo);	
  37.200 +
  37.201 +		fo->load(QPixmap(flag_cross_red_xpm));
  37.202 +		fo->setName("cross-red");
  37.203 +		fo->setToolTip(tr("Not ok!"));
  37.204 +		standardFlagsDefault->addFlag (fo);	
  37.205 +
  37.206 +		fo->load(QPixmap(flag_stopsign_xpm));
  37.207 +		fo->setName("stopsign");
  37.208 +		fo->setToolTip(tr("This won't work!"));
  37.209 +		standardFlagsDefault->addFlag (fo);	
  37.210 +
  37.211 +		fo->load(QPixmap(flag_smiley_good_xpm));
  37.212 +		fo->setName("smiley-good");
  37.213 +		fo->setToolTip(tr("Good"));
  37.214 +		standardFlagsDefault->addFlag (fo);	
  37.215 +
  37.216 +		fo->load(QPixmap(flag_smiley_sad_xpm));
  37.217 +		fo->setName("smiley-sad");
  37.218 +		fo->setToolTip(tr("Bad"));
  37.219 +		standardFlagsDefault->addFlag (fo);	
  37.220 +
  37.221 +		fo->load(QPixmap(flag_clock_xpm));
  37.222 +		fo->setName("clock");
  37.223 +		fo->setToolTip(tr("Time critical"));
  37.224 +		standardFlagsDefault->addFlag (fo);	
  37.225 +
  37.226 +		fo->load(QPixmap(flag_lamp_xpm));
  37.227 +		fo->setName("lamp");
  37.228 +		fo->setToolTip(tr("Idea!"));
  37.229 +		standardFlagsDefault->addFlag (fo);	
  37.230 +
  37.231 +		fo->load(QPixmap(flag_arrow_up_xpm));
  37.232 +		fo->setName("arrow-up");
  37.233 +		fo->setToolTip(tr("Important"));
  37.234 +		standardFlagsDefault->addFlag (fo);	
  37.235 +
  37.236 +		fo->load(QPixmap(flag_arrow_down_xpm));
  37.237 +		fo->setName("arrow-down");
  37.238 +		fo->setToolTip(tr("Unimportant"));
  37.239 +		standardFlagsDefault->addFlag (fo);	
  37.240 +
  37.241 +		fo->load(QPixmap(flag_thumb_up_xpm));
  37.242 +		fo->setName("thumb-up");
  37.243 +		fo->setToolTip(tr("I like this"));
  37.244 +		standardFlagsDefault->addFlag (fo);	
  37.245 +
  37.246 +		fo->load(QPixmap(flag_thumb_down_xpm));
  37.247 +		fo->setName("thumb-down");
  37.248 +		fo->setToolTip(tr("I do not like this"));
  37.249 +		standardFlagsDefault->addFlag (fo);	
  37.250 +		
  37.251 +		fo->load(QPixmap(flag_heart_xpm));
  37.252 +		fo->setName("heart");
  37.253 +		fo->setToolTip(tr("I just love... "));
  37.254 +		standardFlagsDefault->addFlag (fo);	
  37.255 +
  37.256 +		fo->load(QPixmap(flag_flash_xpm));
  37.257 +		fo->setName("flash");
  37.258 +		fo->setToolTip(tr("Dangerous"));
  37.259 +		standardFlagsDefault->addFlag (fo);	
  37.260 +		
  37.261 +		fo->load(QPixmap(flag_lifebelt_xpm));
  37.262 +		fo->setName("lifebelt");
  37.263 +		fo->setToolTip(tr("This will help"));
  37.264 +		standardFlagsDefault->addFlag (fo);	
  37.265 +		delete (fo);
  37.266 +
  37.267 +	}
  37.268 +	
  37.269 +    mapCenter = new MapCenterObj(mapCanvas);
  37.270 +    mapCenter->setVisibility (true);
  37.271 +	mapCenter->setMapEditor (this);
  37.272 +	mapCenter->setHeading (tr("New Map"));
  37.273 +
  37.274 +    printer=NULL;
  37.275 +
  37.276 +    lineedit = new QLineEdit(this, "lineedit"  );
  37.277 +    connect( lineedit, SIGNAL( returnPressed() ), SLOT( finishedLineEditNoSave() ) );
  37.278 +    lineedit->hide();
  37.279 +
  37.280 +    actColor=black; setColor (actColor);
  37.281 +	deflinkcolor=QColor (0,0,255);
  37.282 +	linkcolorhint=DefaultColor;
  37.283 +	linkstyle=StylePolyParabel;
  37.284 +	mapCanvas->setBackgroundColor (white);
  37.285 +
  37.286 +	// Create bitmap cursors, patform dependant
  37.287 +	#if defined(Q_OS_MACX)
  37.288 +		#include "icons/cursorhandopen16.xpm"
  37.289 +		#include "icons/cursorcolorpicker16.xpm"
  37.290 +		QBitmap cb( 16, 16, chandopen, TRUE );
  37.291 +		QBitmap cm( 16, 16, chandopenmask, TRUE );
  37.292 +		handOpenCursor=QCursor ( cb, cm );		
  37.293 +		// set hot spot to tip of picker			
  37.294 +		pickColorCursor=QCursor ( cursorcolorpicker_xpm, 1,15 ); 
  37.295 +	#else
  37.296 +		#include "icons/cursorhandopen.xpm"
  37.297 +		#include "icons/cursorcolorpicker.xpm"
  37.298 +
  37.299 +		QBitmap cb( 32, 32, chandopen, TRUE );
  37.300 +		QBitmap cm( 32, 32, chandopenmask, TRUE );
  37.301 +		handOpenCursor=QCursor ( cb, cm );		
  37.302 +		// set hot spot to tip of picker			
  37.303 +		pickColorCursor=QCursor ( cursorcolorpicker_xpm, 5,27 ); 
  37.304 +	#endif
  37.305 +
  37.306 +
  37.307 +	pickingColor=false;
  37.308 +
  37.309 +    editingBO=NULL;
  37.310 +    selection=NULL;
  37.311 +    selectionLast=NULL;
  37.312 +    movingObj=NULL;
  37.313 +
  37.314 +    mapChanged=false;
  37.315 +	mapDefault=true;
  37.316 +	mapUnsaved=false;
  37.317 +	undoSelection=NULL;
  37.318 +	
  37.319 +	zipped=true;
  37.320 +	filePath="";
  37.321 +	fileName="unnamed";
  37.322 +	mapName="";
  37.323 +
  37.324 +	// Initialize find routine
  37.325 +	itFind=NULL;				
  37.326 +	EOFind=false;
  37.327 +
  37.328 +	printFrame=true;
  37.329 +	printFooter=true;
  37.330 +
  37.331 +	blockreposition=false;
  37.332 +	isInteractive=interactive;
  37.333 +	if (isInteractive)
  37.334 +		// Create temporary files
  37.335 +		makeTmpDirs();
  37.336 +
  37.337 +	// Initially set movingCentre
  37.338 +	updateViewCenter();
  37.339 +
  37.340 +	mapCenter->reposition();	//	for positioning heading
  37.341 +}
  37.342 +
  37.343 +MapEditor::~MapEditor()
  37.344 +{
  37.345 +	//cout <<"Destructor MapEditor\n";
  37.346 +	if (isInteractive) delTmpDirs();
  37.347 +
  37.348 +	// Save Settings
  37.349 +	//settings.writeEntry( "/vym/mapeditor/editmode/autoselect",  );
  37.350 +
  37.351 +}
  37.352 +
  37.353 +QColor MapEditor::color()
  37.354 +{
  37.355 +    return actColor;
  37.356 +}
  37.357 +
  37.358 +QColor MapEditor::backgroundColor()
  37.359 +{
  37.360 +    return mapCanvas->backgroundColor();
  37.361 +}
  37.362 +
  37.363 +MapCenterObj* MapEditor::getMapCenter()
  37.364 +{
  37.365 +    return mapCenter;
  37.366 +}
  37.367 +
  37.368 +QCanvas* MapEditor::getCanvas()
  37.369 +{
  37.370 +    return mapCanvas;
  37.371 +}
  37.372 +
  37.373 +void MapEditor::adjustCanvasSize()
  37.374 +{
  37.375 +	// To adjust the canvas to map, viewport size and position, we have to
  37.376 +	// do some coordinate magic...
  37.377 +	//
  37.378 +	// Get rectangle of (scroll-)view. 
  37.379 +	// We want to be in canvas coords, so
  37.380 +	// we map. Important if view is zoomed...
  37.381 +	QRect view = inverseWorldMatrix().mapRect( QRect( contentsX(), contentsY(),
  37.382 +												visibleWidth(), visibleHeight()) );	
  37.383 +												
  37.384 +	// Now we need the bounding box of view AND map to calc the correct canvas size.
  37.385 +	// Why? Because if the map itself is moved out of view, the view has to be enlarged
  37.386 +	// to avoid jumping aroung...
  37.387 +	QRect map=mapCenter->getTotalBBox();
  37.388 +
  37.389 +	// right edge - left edge
  37.390 +	int cw= max(map.x() + map.width(),  view.x() + view.width())  - min(map.x(), view.x());
  37.391 +	int ch= max(map.y() + map.height(), view.y() + view.height()) - min(map.y(), view.y());
  37.392 +
  37.393 +
  37.394 +	if ( (cw!=mapCanvas->width()) || (ch!=mapCanvas->height()) ||
  37.395 +		!mapCanvas->onCanvas (map.topLeft()) || !mapCanvas->onCanvas (map.bottomRight())
  37.396 +	)	
  37.397 +	{	
  37.398 +		// move the map on canvas (in order to not move it on screen) this is neccessary
  37.399 +		// a) if topleft corner of canvas is left or above topleft corner of view and also left of
  37.400 +		//    above topleft corner of map. E.g. if map is completly inside view, but it would be possible 
  37.401 +		//    to scroll to an empty area of canvas to the left.
  37.402 +		// b) if topleft corner of map left of or above topleft of canvas
  37.403 +		int dx=0;
  37.404 +		int dy=0;
  37.405 +
  37.406 +		if (cw > mapCanvas->width() )
  37.407 +		{
  37.408 +			if (map.x()<0) dx=-map.x();	
  37.409 +		}
  37.410 +		if (cw <  mapCanvas->width() )
  37.411 +			dx=-min (view.x(),map.x());
  37.412 +		if (ch > mapCanvas->height() )
  37.413 +		{
  37.414 +			if (map.y()<0) dy=-map.y();	
  37.415 +		}
  37.416 +		if (ch <  mapCanvas->height() )
  37.417 +		{
  37.418 +			dy=-min (view.y(),map.y());
  37.419 +		}
  37.420 +		// We really have to resize now. Let's go...
  37.421 +		mapCanvas->resize (cw,ch);
  37.422 +		if ( (dx!=0) || (dy!=0) ) 
  37.423 +		{
  37.424 +			mapCenter->moveAllBy(dx,dy);
  37.425 +			mapCenter->reposition();
  37.426 +
  37.427 +			// scroll the view (in order to not move map on screen)
  37.428 +			scrollBy (dx,dy);
  37.429 +		}	
  37.430 +	}
  37.431 +}
  37.432 +
  37.433 +bool MapEditor::blockReposition()
  37.434 +{
  37.435 +	return blockreposition;
  37.436 +}
  37.437 +
  37.438 +void MapEditor::makeTmpDirs()
  37.439 +{
  37.440 +	// Create unique temporary directories
  37.441 +	char tmpdir[]="/tmp/vym-XXXXXX";	
  37.442 +	bakMapDir=mkdtemp(tmpdir);
  37.443 +	makeSubDirs(bakMapDir);
  37.444 +	// FIXME set permissions
  37.445 +	// and maybe use QT method for portability
  37.446 +}
  37.447 +
  37.448 +void MapEditor::delTmpDirs()
  37.449 +{
  37.450 +	//FIXME delete tmp directory, better use QT methods here:
  37.451 +	system ( "rm -rf "+ bakMapDir );
  37.452 +}
  37.453 +
  37.454 +
  37.455 +void MapEditor::makeSubDirs(const QString &s)
  37.456 +{
  37.457 +	QDir d(s);
  37.458 +	d.mkdir ("images");	
  37.459 +	d.mkdir ("flags");	
  37.460 +}
  37.461 +
  37.462 +
  37.463 +QString MapEditor::saveToDir(const QString &tmpdir, const QString &prefix, bool writeflags, const QPoint &offset, SaveMode savemode)
  37.464 +{
  37.465 +	// tmpdir		temporary directory to which data will be writte
  37.466 +	// prefix		mapname, which will be appended to images etc.
  37.467 +	// writeflags	Only write flags for "real" save of map, not undo
  37.468 +	// offset		offset of bbox of whole map in canvas. 
  37.469 +	//				Needed for XML export
  37.470 +	// completeMap	if false, only vympart will be written, without
  37.471 +	//				mapcenter
  37.472 +	
  37.473 +	// Save Header
  37.474 +	QString ls;
  37.475 +	switch (linkstyle)
  37.476 +	{
  37.477 +		case StyleLine: 
  37.478 +			ls="StyleLine";
  37.479 +			break;
  37.480 +		case StyleParabel:
  37.481 +			ls="StyleParabel";
  37.482 +			break;
  37.483 +		case StylePolyLine:	
  37.484 +			ls="StylePolyLine";
  37.485 +			break;
  37.486 +		default:
  37.487 +			ls="StylePolyParabel";
  37.488 +			break;
  37.489 +	}	
  37.490 +
  37.491 +	QString s="<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE vymmap>\n";
  37.492 +	QString colhint="";
  37.493 +	if (linkcolorhint==HeadingColor) 
  37.494 +		colhint=attribut("linkColorHint","HeadingColor");
  37.495 +
  37.496 +	QString mapAttr=attribut("version",__VYM_VERSION__);
  37.497 +	if (savemode==CompleteMap)
  37.498 +		mapAttr+= attribut("author",mapCenter->getAuthor()) +
  37.499 +				  attribut("comment",mapCenter->getComment()) +
  37.500 +			      attribut("date",mapCenter->getDate()) +
  37.501 +		          attribut("backgroundColor", mapCanvas->backgroundColor().name() ) +
  37.502 +		          attribut("linkStyle", ls ) +
  37.503 +		          attribut("linkColor", deflinkcolor.name() ) +
  37.504 +		          colhint; 
  37.505 +	s+=beginElement("vymmap",mapAttr);
  37.506 +	incIndent();
  37.507 +
  37.508 +	// Find the used flags while traversing the tree
  37.509 +	standardFlagsDefault->resetUsedCounter();
  37.510 +	
  37.511 +	// Build xml recursivly
  37.512 +	if (savemode==CompleteMap)
  37.513 +		s+=mapCenter->saveToDir(tmpdir,prefix,writeflags,offset);
  37.514 +	else
  37.515 +	{
  37.516 +		if ( undoSelection &&
  37.517 +			typeid(*undoSelection) == typeid(BranchObj) )
  37.518 +			s+=((BranchObj*)(undoSelection))->saveToDir(tmpdir,prefix,offset);
  37.519 +	}
  37.520 +
  37.521 +	// Save local settings
  37.522 +	s+=settings.getXMLData (destPath);
  37.523 +
  37.524 +	// Save selection
  37.525 +	if (selection) 
  37.526 +		s+=valueElement("select",selection->getSelectString());
  37.527 +
  37.528 +	decIndent();
  37.529 +	s+=endElement("vymmap");
  37.530 +
  37.531 +	if (writeflags)
  37.532 +		standardFlagsDefault->saveToDir (tmpdir+"/flags/","",writeflags);
  37.533 +	
  37.534 +	return s;
  37.535 +}
  37.536 +
  37.537 +void MapEditor::saveState()
  37.538 +{
  37.539 +	saveState (CompleteMap,NULL);
  37.540 +}
  37.541 +
  37.542 +void MapEditor::saveState(const SaveMode &mode, LinkableMapObj *part)
  37.543 +{
  37.544 +	// all binary data is saved in bakMapDir (created in Constructor)
  37.545 +	// the xml data itself is kept in memory in backupXML
  37.546 +	// 
  37.547 +	// For faster write/read of data, a part of the map can be
  37.548 +	// written. Then the undoSelection will mark, which part of the
  37.549 +	// map should be replaced if an undo is wanted later.
  37.550 +
  37.551 +	if (mode==PartOfMap && part && (typeid(*part) == typeid (BranchObj) ) ) 
  37.552 +	{
  37.553 +		// Writing a vympart only is useful for BranchObj
  37.554 +		undoSelection=part;
  37.555 +		backupXML=saveToDir (bakMapDir,mapName+"-",false, QPoint (),PartOfMap);
  37.556 +	} else	
  37.557 +	{
  37.558 +		undoSelection=NULL;
  37.559 +		backupXML=saveToDir (bakMapDir,mapName+"-",false, QPoint (),CompleteMap);
  37.560 +	}	
  37.561 +}
  37.562 +
  37.563 +void MapEditor::finishedLineEditNoSave()
  37.564 +{
  37.565 +	// This is called by finishedLineEdit or any MapEditor method,
  37.566 +	// which wants to assure, that lineedits finish, before e.g. a branch is 
  37.567 +	// deleted
  37.568 +    
  37.569 +	// After calling LineEdit and using the clipboard, the 
  37.570 +    // focus is not any longer on the main widget, we
  37.571 +    // have to restore it using parentWidget()->setFocus()
  37.572 +
  37.573 +    if (editingBO!=NULL) 
  37.574 +	{
  37.575 +		editingBO->setHeading(lineedit->text() );
  37.576 +		editingBO=NULL;
  37.577 +		lineedit->releaseKeyboard();
  37.578 +		lineedit->hide();
  37.579 +		parentWidget()->setFocus();
  37.580 +		mapCenter->reposition();
  37.581 +		adjustCanvasSize();
  37.582 +		ensureSelectionVisible();
  37.583 +    }		
  37.584 +}
  37.585 +
  37.586 +
  37.587 +bool MapEditor::isDefault()
  37.588 +{
  37.589 +    return mapDefault;
  37.590 +}
  37.591 +
  37.592 +bool MapEditor::isUnsaved()
  37.593 +{
  37.594 +    return mapUnsaved;
  37.595 +}
  37.596 +
  37.597 +bool MapEditor::hasChanged()
  37.598 +{
  37.599 +    return mapChanged;
  37.600 +}
  37.601 +
  37.602 +void MapEditor::setChanged()
  37.603 +{
  37.604 +	mapChanged=true;
  37.605 +	mapDefault=false;
  37.606 +	mapUnsaved=true;
  37.607 +	actionEditUndo->setEnabled (true);
  37.608 +	actionFileSave->setEnabled (true);
  37.609 +	findReset();
  37.610 +}
  37.611 +
  37.612 +void MapEditor::closeMap()
  37.613 +{
  37.614 +	// Finish open lineEdits
  37.615 +	if (lineedit) finishedLineEditNoSave();
  37.616 +
  37.617 +	// Unselect before disabling the toolbar actions
  37.618 +	if (selection) selection->unselect();
  37.619 +	selection=NULL;
  37.620 +	updateActions();
  37.621 +
  37.622 +    clear();
  37.623 +	close();
  37.624 +}
  37.625 +
  37.626 +void MapEditor::setFilePath(QString fname)
  37.627 +{
  37.628 +	setFilePath (fname,fname);
  37.629 +}
  37.630 +
  37.631 +void MapEditor::setFilePath(QString fname, QString destname)
  37.632 +{
  37.633 +	filePath=fname;
  37.634 +	fileName=fname;
  37.635 +	destPath=destname;
  37.636 +
  37.637 +	// If fname is not an absolute path, complete it
  37.638 +	filePath=QDir(fname).absPath();
  37.639 +	fileDir=filePath.left (1+filePath.findRev ("/"));
  37.640 +
  37.641 +	// Set short name, too. Search from behind:
  37.642 +	int i=fileName.findRev("/");
  37.643 +	if (i>=0) fileName=fileName.remove (0,i+1);
  37.644 +
  37.645 +	// Forget the .vym (or .xml) for name of map
  37.646 +	mapName=fileName.left(fileName.findRev(".",-1,true) );
  37.647 +}
  37.648 +
  37.649 +QString MapEditor::getFilePath()
  37.650 +{
  37.651 +	return filePath;
  37.652 +}
  37.653 +
  37.654 +QString MapEditor::getFileName()
  37.655 +{
  37.656 +	return fileName;
  37.657 +}
  37.658 +
  37.659 +QString MapEditor::getMapName()
  37.660 +{
  37.661 +	return mapName;
  37.662 +}
  37.663 +
  37.664 +QString MapEditor::getDestPath()
  37.665 +{
  37.666 +	return destPath;
  37.667 +}
  37.668 +
  37.669 +int MapEditor::load (QString &fname, const LoadMode &lmode)
  37.670 +{
  37.671 +	// Finish open lineEdits
  37.672 +	if (lineedit) finishedLineEditNoSave();
  37.673 +
  37.674 +	int returnCode=0;
  37.675 +
  37.676 +	if (lmode==NewMap)
  37.677 +	{
  37.678 +		if (selection) selection->unselect();
  37.679 +		selection=NULL;
  37.680 +		mapCenter->clear();
  37.681 +		mapCenter->setMapEditor(this);
  37.682 +		// (map state is set later at end of load...)
  37.683 +	} else
  37.684 +	{
  37.685 +		setChanged();
  37.686 +		saveState(PartOfMap,selection);
  37.687 +	}	
  37.688 +	
  37.689 +    
  37.690 +    mapBuilderHandler handler;
  37.691 +	QFile file( fname );
  37.692 +
  37.693 +	// I am paranoid: file should exist anyway
  37.694 +	// according to check in mainwindow.
  37.695 +	if (!file.exists() )
  37.696 +	{
  37.697 +		QMessageBox::critical( 0, tr( "Critical Parse Error" ),
  37.698 +				   tr("Couldn't open map " +fname)+".");
  37.699 +		returnCode=1;	
  37.700 +	} else
  37.701 +	{
  37.702 +		blockreposition=true;
  37.703 +		QXmlInputSource source( file);
  37.704 +		QXmlSimpleReader reader;
  37.705 +		reader.setContentHandler( &handler );
  37.706 +		reader.setErrorHandler( &handler );
  37.707 +		handler.setMapEditor( this );
  37.708 +		handler.setTmpDir (filePath.left(filePath.findRev("/",-1)));	// needed to load files with rel. path
  37.709 +		handler.setLoadMode (lmode);
  37.710 +		bool ok = reader.parse( source );
  37.711 +		blockreposition=false;
  37.712 +		file.close();
  37.713 +		if ( ok ) 
  37.714 +		{
  37.715 +			mapCenter->reposition();
  37.716 +			adjustCanvasSize();
  37.717 +			if (lmode==NewMap)
  37.718 +			{
  37.719 +				mapDefault=false;
  37.720 +				mapChanged=false;
  37.721 +				mapUnsaved=false;
  37.722 +			}
  37.723 +		} else 
  37.724 +		{
  37.725 +			QMessageBox::critical( 0, tr( "Critical Parse Error" ),
  37.726 +					   tr( handler.errorProtocol() ) );
  37.727 +			// returnCode=1;	
  37.728 +			// Still return "success": the map maybe at least
  37.729 +			// partially read by the parser
  37.730 +		}	
  37.731 +	}	
  37.732 +	updateActions();
  37.733 +	return returnCode;
  37.734 +}
  37.735 +
  37.736 +int MapEditor::save (const SaveMode &savemode)
  37.737 +{
  37.738 +	// Finish open lineEdits
  37.739 +	if (lineedit) finishedLineEditNoSave();
  37.740 +
  37.741 +	int returnCode=0;
  37.742 +
  37.743 +	// Create mapName and fileDir
  37.744 +	makeSubDirs (fileDir);
  37.745 +	QString fname;
  37.746 +	if (saveZipped())
  37.747 +		// save as .xml
  37.748 +		fname=mapName+".xml";
  37.749 +	else
  37.750 +		// use name given by user, even if he chooses .doc
  37.751 +		fname=fileName;
  37.752 +
  37.753 +
  37.754 +	// Check if fname is writeable
  37.755 +	QFile file( fileDir+fname);
  37.756 +	if (!file.open( IO_WriteOnly ) ) 
  37.757 +	{
  37.758 +		QMessageBox::critical( 0, tr( "Critical Save Error" ),
  37.759 +					   tr("Couldn't write to ") +fileDir+fname);
  37.760 +		return 1;
  37.761 +	}	
  37.762 +	file.close();
  37.763 +
  37.764 +	QString saveFile;
  37.765 +	saveFile=saveToDir (fileDir,mapName+"-",true,QPoint(),savemode);
  37.766 +
  37.767 +	file.setName ( fileDir  + fname);
  37.768 +	if ( !file.open( IO_WriteOnly ) )
  37.769 +	{
  37.770 +		// This should neverever happen
  37.771 +		QMessageBox::critical(0, tr("Critcal save error"),"MapEditor::save() Couldn't open "+file.name());
  37.772 +		return 1;
  37.773 +	}	
  37.774 +
  37.775 +	// Write it finally, and write in UTF8, no matter what 
  37.776 +	QTextStream ts( &file );
  37.777 +	ts.setEncoding (QTextStream::UnicodeUTF8);
  37.778 +	ts << saveFile;
  37.779 +	file.close();
  37.780 +
  37.781 +	if (returnCode==0)
  37.782 +	{
  37.783 +		mapChanged=false;
  37.784 +		mapUnsaved=false;
  37.785 +		actionFileSave->setEnabled(false);
  37.786 +	}
  37.787 +
  37.788 +	return returnCode;
  37.789 +}
  37.790 +
  37.791 +void MapEditor::setZipped (bool z)
  37.792 +{
  37.793 +	zipped=z;
  37.794 +}
  37.795 +
  37.796 +bool MapEditor::saveZipped ()
  37.797 +{
  37.798 +	return zipped;
  37.799 +}
  37.800 +
  37.801 +void MapEditor::print()
  37.802 +{
  37.803 +	// Finish open lineEdits
  37.804 +	if (lineedit) finishedLineEditNoSave();
  37.805 +
  37.806 +	if ( !printer ) 
  37.807 +	{
  37.808 +		printer = new QPrinter;
  37.809 +		printer->setColorMode (QPrinter::Color);
  37.810 +	}
  37.811 +
  37.812 +	QRect totalBBox=mapCenter->getTotalBBox();
  37.813 +
  37.814 +	// Try to set orientation automagically
  37.815 +	// Note: Interpretation of generated postscript is amibiguous, if 
  37.816 +	// there are problems with landscape mode, see
  37.817 +	// http://sdb.suse.de/de/sdb/html/jsmeix_print-cups-landscape-81.html
  37.818 +
  37.819 +	if (totalBBox.width()>totalBBox.height())
  37.820 +		// recommend landscape
  37.821 +		printer->setOrientation (QPrinter::Landscape);
  37.822 +	else	
  37.823 +		// recommend portrait
  37.824 +		printer->setOrientation (QPrinter::Portrait);
  37.825 +
  37.826 +	if ( printer->setup(this) ) 
  37.827 +	// returns false, if printing is canceled
  37.828 +	{
  37.829 +		QPainter pp(printer);
  37.830 +
  37.831 +		// Don't print the visualisation of selection
  37.832 +		LinkableMapObj *oldselection=NULL;
  37.833 +		if (selection) 
  37.834 +		{
  37.835 +			oldselection=selection;
  37.836 +			selection->unselect();
  37.837 +		}
  37.838 +
  37.839 +		// Handle sizes of map and paper:
  37.840 +		//
  37.841 +		// setWindow defines which part of the canvas will be transformed 
  37.842 +		// setViewport defines area on paper in device coordinates (dpi)
  37.843 +		// e.g. (0,50,700,700) is upper part on A4
  37.844 +		// see also /usr/lib/qt3/doc/html/coordsys.html
  37.845 +
  37.846 +		QPaintDeviceMetrics metrics (printer);
  37.847 +
  37.848 +		double paperAspect = (double)metrics.width()   / (double)metrics.height();
  37.849 +		double   mapAspect = (double)totalBBox.width() / (double)totalBBox.height();
  37.850 +
  37.851 +		QRect mapRect=mapCenter->getTotalBBox();
  37.852 +		QCanvasRectangle *frame=NULL;
  37.853 +		QCanvasText *footerFN=NULL;
  37.854 +		QCanvasText *footerDate=NULL;
  37.855 +		if (printFrame || printFooter)
  37.856 +		{
  37.857 +			
  37.858 +			if (printFrame) 
  37.859 +			{
  37.860 +				// Print frame around map
  37.861 +				mapRect.setRect (mapRect.x()-10, mapRect.y()-10, 
  37.862 +					mapRect.width()+20, mapRect.height()+20);
  37.863 +				frame=new QCanvasRectangle (mapRect,mapCanvas);
  37.864 +				frame->setBrush (QColor(white));
  37.865 +				frame->setPen (QColor(black));
  37.866 +				frame->setZ(0);
  37.867 +				frame->show();    
  37.868 +			}		
  37.869 +			if (printFooter) 
  37.870 +			{
  37.871 +				// Print footer below map
  37.872 +				QFont font;		
  37.873 +				font.setPointSize(10);
  37.874 +				footerFN=new QCanvasText (mapCanvas);
  37.875 +				footerFN->setText ("VYM - " + fileName);
  37.876 +				footerFN->setFont(font);
  37.877 +				footerFN->move (mapRect.x(), mapRect.y() + mapRect.height() );
  37.878 +				footerFN->setZ(Z_TEXT);
  37.879 +				footerFN->show();    
  37.880 +				footerDate=new QCanvasText (mapCanvas);
  37.881 +				footerDate->setText (QDate::currentDate().toString(Qt::TextDate));
  37.882 +				footerDate->setFont(font);
  37.883 +				footerDate->move (mapRect.x()+mapRect.width()-footerDate->boundingRect().width(), mapRect.y() + mapRect.height() );
  37.884 +				footerDate->setZ(Z_TEXT);
  37.885 +				footerDate->show();    
  37.886 +				mapRect.setRect (mapRect.x(), mapRect.y(), 
  37.887 +					mapRect.width(), mapRect.height()+20);
  37.888 +			}
  37.889 +			pp.setWindow (mapRect.x(), mapRect.y(), mapRect.width(), mapRect.height());
  37.890 +		}	else	
  37.891 +		{
  37.892 +			pp.setWindow (mapRect);
  37.893 +		}	
  37.894 +
  37.895 +		if (mapAspect>=paperAspect)
  37.896 +		{
  37.897 +			// Fit horizontally to paper width
  37.898 +			pp.setViewport(0,0, metrics.width(),(int)(metrics.width()/mapAspect) );	
  37.899 +		}	else
  37.900 +		{
  37.901 +			// Fit vertically to paper height
  37.902 +			pp.setViewport(0,0,(int)(metrics.height()*mapAspect),metrics.height());	
  37.903 +		}	
  37.904 +
  37.905 +		mapCanvas->drawArea(mapRect, &pp);	// draw Canvas to printer
  37.906 +
  37.907 +		// Delete Frame and footer
  37.908 +		if (footerFN) 
  37.909 +		{
  37.910 +			delete (footerFN);
  37.911 +			delete (footerDate);
  37.912 +		}	
  37.913 +		if (frame)  delete (frame);
  37.914 +
  37.915 +		// Restore selection
  37.916 +		if (oldselection) 
  37.917 +		{
  37.918 +			selection=oldselection;
  37.919 +			selection->select();
  37.920 +		}	
  37.921 +	}
  37.922 +}
  37.923 +
  37.924 +QPixmap MapEditor::getPixmap()
  37.925 +{
  37.926 +	QRect mapRect=mapCenter->getTotalBBox();
  37.927 +	QPixmap pix (mapRect.size());
  37.928 +	QPainter pp (&pix);
  37.929 +
  37.930 +	// Don't print the visualisation of selection
  37.931 +	LinkableMapObj *oldselection=NULL;
  37.932 +	if (selection) 
  37.933 +	{
  37.934 +		oldselection=selection;
  37.935 +		selection->unselect();
  37.936 +	}
  37.937 +
  37.938 +	pp.setWindow (mapRect);
  37.939 +
  37.940 +	mapCanvas->drawArea(mapRect, &pp);	// draw Canvas to painter
  37.941 +
  37.942 +
  37.943 +	// Restore selection
  37.944 +	if (oldselection) 
  37.945 +	{
  37.946 +		selection=oldselection;
  37.947 +		selection->select();
  37.948 +	}	
  37.949 +	
  37.950 +	return pix;
  37.951 +}
  37.952 +
  37.953 +void MapEditor::exportImage(QString fn)
  37.954 +{
  37.955 +	// Finish open lineEdits
  37.956 +	if (lineedit) finishedLineEditNoSave();
  37.957 +
  37.958 +	QPixmap pix (getPixmap());
  37.959 +	pix.save(fn, "PNG");
  37.960 +}
  37.961 +
  37.962 +void MapEditor::exportImage(QString fn, int item)
  37.963 +{
  37.964 +	// Finish open lineEdits
  37.965 +	if (lineedit) finishedLineEditNoSave();
  37.966 +
  37.967 +	QPixmap pix (getPixmap());
  37.968 +	pix.save(fn, exportImageFormatMenu->text(item) );
  37.969 +}
  37.970 +
  37.971 +void MapEditor::exportASCII()
  37.972 +{
  37.973 +	// FIXME still experimental
  37.974 +	QFileDialog *fd=new QFileDialog( this, tr("VYM - Export (ASCII)"));
  37.975 +	fd->addFilter ("TXT (*.txt)");
  37.976 +	fd->setCaption("VYM - Export (ASCII) (still experimental)");
  37.977 +	fd->setMode( QFileDialog::AnyFile );
  37.978 +	fd->show();
  37.979 +
  37.980 +	if ( fd->exec() == QDialog::Accepted )
  37.981 +	{
  37.982 +		if (QFile (fd->selectedFile()).exists() )
  37.983 +		{
  37.984 +			QMessageBox mb( "VYM",
  37.985 +				tr("The file ") + fd->selectedFile() + 
  37.986 +				tr(" exists already. Do you want to overwrite it?"),
  37.987 +			QMessageBox::Warning,
  37.988 +			QMessageBox::Yes | QMessageBox::Default,
  37.989 +			QMessageBox::Cancel | QMessageBox::Escape,
  37.990 +			QMessageBox::NoButton );
  37.991 +
  37.992 +			mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
  37.993 +			mb.setButtonText( QMessageBox::No, tr("Cancel"));
  37.994 +			Export ex;
  37.995 +			switch( mb.exec() ) 
  37.996 +			{
  37.997 +				case QMessageBox::Yes:
  37.998 +					// save 
  37.999 +					if (!ex.setOutputDir ("out"))
 37.1000 +					{
 37.1001 +						QMessageBox::critical (0,tr("Critical Export Error "),tr("Couldn't create directory ") + "out");
 37.1002 +						return;
 37.1003 +					}
 37.1004 +					break;;
 37.1005 +				case QMessageBox::Cancel:
 37.1006 +					// do nothing
 37.1007 +					return;
 37.1008 +					break;
 37.1009 +			}
 37.1010 +		}
 37.1011 +		Export ex;
 37.1012 +		ex.setPath (fd->selectedFile() );
 37.1013 +		ex.setMapCenter(mapCenter);
 37.1014 +		ex.exportMap();
 37.1015 +	}
 37.1016 +}
 37.1017 +
 37.1018 +
 37.1019 +void MapEditor::exportXML(const QString &dir)
 37.1020 +{
 37.1021 +	// Create subdirectories
 37.1022 +	makeSubDirs (dir);
 37.1023 +
 37.1024 +	// write to directory
 37.1025 +	QString saveFile=saveToDir (dir,mapName+"-",true,mapCenter->getTotalBBox().topLeft() ,CompleteMap);
 37.1026 +	QFile file;
 37.1027 +
 37.1028 +	file.setName ( dir + "/"+mapName+".xml");
 37.1029 +	if ( !file.open( IO_WriteOnly ) )
 37.1030 +	{
 37.1031 +		// This should neverever happen
 37.1032 +		QMessageBox::critical (0,tr("Critical Export Error"),tr("MapEditor::exportXML couldn't open ")+file.name());
 37.1033 +		return;
 37.1034 +	}	
 37.1035 +
 37.1036 +	// Write it finally, and write in UTF8, no matter what 
 37.1037 +	QTextStream ts( &file );
 37.1038 +	ts.setEncoding (QTextStream::UnicodeUTF8);
 37.1039 +	ts << saveFile;
 37.1040 +	file.close();
 37.1041 +
 37.1042 +	// Now write image, too
 37.1043 +	exportImage (dir+"/images/"+mapName+".png");
 37.1044 +}
 37.1045 +
 37.1046 +void MapEditor::clear()
 37.1047 +{
 37.1048 +	if (selection)
 37.1049 +	{
 37.1050 +		selection->unselect();
 37.1051 +		selection=NULL;
 37.1052 +	}	
 37.1053 +
 37.1054 +	mapCenter->clear();
 37.1055 +}
 37.1056 +
 37.1057 +void MapEditor::undo()
 37.1058 +{
 37.1059 +	QDir d;
 37.1060 +	d.setPath(bakMapDir);
 37.1061 +	if (d.exists() )
 37.1062 +	{
 37.1063 +		// Finish open lineEdits
 37.1064 +		if (lineedit) finishedLineEditNoSave();
 37.1065 +
 37.1066 +		if (selection) 
 37.1067 +		{
 37.1068 +			selection->unselect();
 37.1069 +			selection=NULL;
 37.1070 +		}	
 37.1071 +		
 37.1072 +		mapBuilderHandler handler;
 37.1073 +		QXmlInputSource source;
 37.1074 +		source.setData(backupXML);
 37.1075 +		QXmlSimpleReader reader;
 37.1076 +		reader.setContentHandler( &handler );
 37.1077 +		reader.setErrorHandler( &handler );
 37.1078 +		handler.setMapEditor( this );
 37.1079 +		handler.setTmpDir ( bakMapDir );	// needed to load files with rel. path
 37.1080 +		if (undoSelection)
 37.1081 +		{
 37.1082 +			selection=undoSelection;
 37.1083 +			selection->select();
 37.1084 +			handler.setLoadMode (ImportReplace);
 37.1085 +
 37.1086 +		} else	
 37.1087 +		{
 37.1088 +			mapCenter->clear();
 37.1089 +			handler.setLoadMode (NewMap);
 37.1090 +		}	
 37.1091 +		blockreposition=true;
 37.1092 +		bool ok = reader.parse( source );
 37.1093 +		blockreposition=false;
 37.1094 +		if ( ok ) 
 37.1095 +			mapCenter->reposition();
 37.1096 +			
 37.1097 +		else 
 37.1098 +		{	
 37.1099 +			// This should never ever happen
 37.1100 +			QMessageBox::critical( 0, tr( "Critical Parse Error by reading backupFile" ),
 37.1101 +								   tr( handler.errorProtocol() )+" in "+backupXML );
 37.1102 +		}
 37.1103 +		// Undo not longer available now
 37.1104 +		actionEditUndo->setEnabled (false);
 37.1105 +		undoSelection=false;
 37.1106 +		mapChanged=false;
 37.1107 +		return;
 37.1108 +	} else	
 37.1109 +	{
 37.1110 +		QMessageBox::critical( 0, tr( "Critical Error" ),
 37.1111 +			"Temporary directory " +bakMapDir + 
 37.1112 +			tr (" used for undo is gone. \n"
 37.1113 +			"I will create a new one, but at the moment no undo is available.\n"
 37.1114 +			"Maybe you want to reload your original data.\n\n"
 37.1115 +			"Sorry for any inconveniences.") );
 37.1116 +		makeTmpDirs();	
 37.1117 +	}							
 37.1118 +}
 37.1119 +
 37.1120 +void MapEditor::copy()
 37.1121 +{
 37.1122 +	// Finish open lineEdits
 37.1123 +	if (lineedit) finishedLineEditNoSave();
 37.1124 +
 37.1125 +	if (selection) 
 37.1126 +	{
 37.1127 +		if (typeid(*selection) == typeid(BranchObj) ) 
 37.1128 +		{
 37.1129 +			BranchObj* to;
 37.1130 +			BranchObj* from;
 37.1131 +			clipboardME->clear();
 37.1132 +			clipboardME->getMapCenter()->addBranch();
 37.1133 +			to=clipboardME->getMapCenter()->getLastBranch();
 37.1134 +			if (to) 
 37.1135 +			{
 37.1136 +				from=(BranchObj*)(selection);
 37.1137 +				to->copy(from);
 37.1138 +
 37.1139 +				// keep position relative to parent
 37.1140 +				to->move2RelPos ( from->getRelPos());
 37.1141 +
 37.1142 +				// select data in clipboard
 37.1143 +				clipboardME->select ("bo:0");
 37.1144 +
 37.1145 +				// repositioning makes testing nicer,
 37.1146 +				// but is not needed usually:
 37.1147 +				if (clipboardME->isVisible())
 37.1148 +				{
 37.1149 +					clipboardME->getMapCenter()->reposition();  
 37.1150 +				}	
 37.1151 +				else
 37.1152 +					clipboardME->hide();
 37.1153 +			}
 37.1154 +		}    
 37.1155 +		if (typeid(*selection) == typeid(FloatImageObj) ) 
 37.1156 +		{
 37.1157 +			FloatImageObj* to;
 37.1158 +			FloatImageObj* from;
 37.1159 +			clipboardME->clear();
 37.1160 +			clipboardME->getMapCenter()->addFloatImage();
 37.1161 +			to=clipboardME->getMapCenter()->getLastFloatImage();
 37.1162 +			if (to) 
 37.1163 +			{
 37.1164 +				from=(FloatImageObj*)(selection);
 37.1165 +				to->copy(from);
 37.1166 +
 37.1167 +				// select data in clipboard
 37.1168 +				clipboardME->select ("fi:0");
 37.1169 +
 37.1170 +				// repositioning makes testing nicer,
 37.1171 +				// but is not needed usually:
 37.1172 +				if (clipboardME->isVisible())
 37.1173 +				{
 37.1174 +					clipboardME->getMapCenter()->reposition();  
 37.1175 +				}	
 37.1176 +				else
 37.1177 +					clipboardME->hide();
 37.1178 +			}
 37.1179 +		}    
 37.1180 +	}	    
 37.1181 +}
 37.1182 +
 37.1183 +LinkableMapObj* MapEditor::pasteNoSave()
 37.1184 +{
 37.1185 +	return pasteAtNoSave (-1);
 37.1186 +}
 37.1187 +
 37.1188 +LinkableMapObj* MapEditor::pasteAtNoSave(int pos)
 37.1189 +{
 37.1190 +	// Finish open lineEdits
 37.1191 +	if (lineedit) finishedLineEditNoSave();
 37.1192 +
 37.1193 +	LinkableMapObj *fromLMO=clipboardME->getSelection();
 37.1194 +	LinkableMapObj *returnLMO=NULL;
 37.1195 +
 37.1196 +	if (selection && fromLMO) 
 37.1197 +	{
 37.1198 +
 37.1199 +		if (typeid(*fromLMO) == typeid(BranchObj) ) 
 37.1200 +		{
 37.1201 +			if (typeid(*selection) == typeid(MapCenterObj)) 
 37.1202 +			{
 37.1203 +				returnLMO=mapCenter->addBranch( (BranchObj*)(fromLMO) );
 37.1204 +				((BranchObj*)(returnLMO))->move2RelPos(normalise(fromLMO->getRelPos() ) );
 37.1205 +			}     
 37.1206 +			if (typeid(*selection) == typeid(BranchObj)) 
 37.1207 +				if (pos<0)
 37.1208 +					returnLMO=((BranchObj*)(selection))->addBranch((BranchObj*)(fromLMO) );
 37.1209 +				else
 37.1210 +				{
 37.1211 +					BranchObj *par=(BranchObj*)(selection->getParObj());
 37.1212 +					if (par) returnLMO=par->insertBranch((BranchObj*)(fromLMO),pos );
 37.1213 +				}	
 37.1214 +		}
 37.1215 +		
 37.1216 +		if (typeid(*fromLMO) == typeid(FloatImageObj) &&
 37.1217 +			(typeid(*selection) == typeid (BranchObj) || 
 37.1218 +			 typeid(*selection)==typeid(MapCenterObj)) )
 37.1219 +			returnLMO=((BranchObj*) (selection))->addFloatImage ((FloatImageObj*)(fromLMO));
 37.1220 +		
 37.1221 +	}	    
 37.1222 +	return returnLMO;
 37.1223 +}
 37.1224 +
 37.1225 +void MapEditor::cutNoSave()
 37.1226 +{
 37.1227 +	// Finish open lineEdits
 37.1228 +	if (lineedit) finishedLineEditNoSave();
 37.1229 +
 37.1230 +	BranchObj* bo;
 37.1231 +	BranchObj* par; 
 37.1232 +	if (selection != NULL) {
 37.1233 +		if (typeid(*selection) == typeid(BranchObj) ) 
 37.1234 +		{
 37.1235 +			bo=(BranchObj*)(selection);
 37.1236 +			par=(BranchObj*)(bo->getParObj());
 37.1237 +			bo->unselect();
 37.1238 +			selection=NULL;
 37.1239 +			par->removeBranch(bo);
 37.1240 +			selection=par;
 37.1241 +			selection->select();
 37.1242 +		}
 37.1243 +		if (typeid(*selection) == typeid(FloatImageObj) ) 
 37.1244 +		{
 37.1245 +			FloatImageObj* fio=(FloatImageObj*)(selection);
 37.1246 +			par=(BranchObj*)(fio->getParObj());
 37.1247 +			fio->unselect();
 37.1248 +			selection=NULL;
 37.1249 +			par->removeFloatImage(fio);
 37.1250 +			selection=par;
 37.1251 +			selection->select();
 37.1252 +		}
 37.1253 +	}	    
 37.1254 +}
 37.1255 +
 37.1256 +void MapEditor::paste()
 37.1257 +{   
 37.1258 +	setChanged();
 37.1259 +	saveState(PartOfMap,selection);
 37.1260 +	pasteNoSave();
 37.1261 +	mapCenter->reposition();
 37.1262 +	adjustCanvasSize();
 37.1263 +}
 37.1264 +
 37.1265 +void MapEditor::cut()
 37.1266 +{
 37.1267 +	setChanged();
 37.1268 +	saveState(PartOfMap,selection->getParObj());
 37.1269 +	copy();
 37.1270 +	cutNoSave();
 37.1271 +	mapCenter->reposition();
 37.1272 +	adjustCanvasSize();
 37.1273 +}
 37.1274 +
 37.1275 +void MapEditor::moveBranchUp()
 37.1276 +{
 37.1277 +	// Finish open lineEdits
 37.1278 +	if (lineedit) finishedLineEditNoSave();
 37.1279 +
 37.1280 +	BranchObj* bo;
 37.1281 +	BranchObj* par;
 37.1282 +	if (typeid(*selection) == typeid(BranchObj)  ) 
 37.1283 +	{
 37.1284 +		setChanged();
 37.1285 +		saveState(PartOfMap,selection->getParObj());
 37.1286 +		bo=(BranchObj*)(selection);
 37.1287 +		par=(BranchObj*)(bo->getParObj());
 37.1288 +		selection->unselect();
 37.1289 +		selection=par->moveBranchUp (bo);
 37.1290 +		selection->select();
 37.1291 +		mapCenter->reposition();
 37.1292 +		ensureSelectionVisible();
 37.1293 +	}
 37.1294 +}
 37.1295 +
 37.1296 +void MapEditor::moveBranchDown()
 37.1297 +{
 37.1298 +	// Finish open lineEdits
 37.1299 +	if (lineedit) finishedLineEditNoSave();
 37.1300 +
 37.1301 +	BranchObj* bo;
 37.1302 +	BranchObj* par;
 37.1303 +	if (typeid(*selection) == typeid(BranchObj)  ) 
 37.1304 +	{
 37.1305 +		setChanged();
 37.1306 +		saveState(PartOfMap,selection->getParObj());
 37.1307 +		bo=(BranchObj*)(selection);
 37.1308 +		par=(BranchObj*)(bo->getParObj());
 37.1309 +		selection->unselect(); 
 37.1310 +		selection=par->moveBranchDown(bo);
 37.1311 +		selection->select();
 37.1312 +		mapCenter->reposition();
 37.1313 +		ensureSelectionVisible();
 37.1314 +	}	
 37.1315 +}
 37.1316 +
 37.1317 +void MapEditor::editHeading()
 37.1318 +{
 37.1319 +	// Finish open lineEdits
 37.1320 +	if (lineedit) finishedLineEditNoSave();
 37.1321 +
 37.1322 +	if (selection  &&  
 37.1323 +		 (typeid(*selection) == typeid(BranchObj) || 
 37.1324 +		  typeid(*selection) == typeid(MapCenterObj) ) ) 
 37.1325 +	{
 37.1326 +		setChanged();
 37.1327 +		saveState(PartOfMap,selection);
 37.1328 +
 37.1329 +		ensureSelectionVisible();
 37.1330 +		BranchObj *bo=(BranchObj*)(selection);
 37.1331 +		editingBO=(BranchObj*)(selection);
 37.1332 +		QPoint p = worldMatrix().map(QPoint (bo->x(),bo->y()));
 37.1333 +		lineedit->setGeometry(p.x()-contentsX(),p.y()-contentsY(),200,25);
 37.1334 +		QString s=bo->getHeading();
 37.1335 +		lineedit->setText(s);
 37.1336 +		lineedit->setCursorPosition(1);
 37.1337 +		if (actionSettingsAutoselectText->isOn() && !s.isEmpty() && actionSettingsPasteNewHeading->isOn() )
 37.1338 +			lineedit->selectAll();
 37.1339 +		lineedit->show();
 37.1340 +
 37.1341 +		lineedit->grabKeyboard();
 37.1342 +		lineedit->setFocus();
 37.1343 +	}				
 37.1344 +}
 37.1345 +
 37.1346 +
 37.1347 +void MapEditor::addNewBranch(int pos)
 37.1348 +{
 37.1349 +	// Finish open lineEdits
 37.1350 +	if (lineedit) finishedLineEditNoSave();
 37.1351 +
 37.1352 +	if (selection  &&  
 37.1353 +		 (typeid(*selection) == typeid(BranchObj) || 
 37.1354 +		  typeid(*selection) == typeid(MapCenterObj) ) ) 
 37.1355 +	{
 37.1356 +		setChanged();
 37.1357 +		saveState(PartOfMap,selection);
 37.1358 +
 37.1359 +		BranchObj* bo1 = (BranchObj*) (selection);
 37.1360 +		bool wasScrolled=false;
 37.1361 +		BranchObj *newbo=NULL;
 37.1362 +		if (pos==0)
 37.1363 +		{
 37.1364 +			// save scroll state. If scrolled, automatically select
 37.1365 +			// new branch in order to tmp unscroll parent...
 37.1366 +			wasScrolled=bo1->isScrolled();
 37.1367 +			newbo=bo1->addBranch();
 37.1368 +		}	else 
 37.1369 +		{
 37.1370 +			BranchObj *parbo=(BranchObj*)(selection->getParObj());
 37.1371 +			if (parbo)
 37.1372 +			{
 37.1373 +				if (pos<0)
 37.1374 +					// add above selection
 37.1375 +					newbo=parbo->insertBranch(bo1->getNum());
 37.1376 +				else
 37.1377 +					// add below selection
 37.1378 +					newbo=parbo->insertBranch(bo1->getNum()+1);
 37.1379 +			} else
 37.1380 +				// This should not happen...
 37.1381 +				return;
 37.1382 +			
 37.1383 +		}	
 37.1384 +
 37.1385 +		LinkableMapObj *oldselection=selection;
 37.1386 +
 37.1387 +		mapCenter->reposition();
 37.1388 +		adjustCanvasSize();
 37.1389 +		if (actionSettingsAutoedit->isOn() ||
 37.1390 +			actionSettingsAutoselectHeading->isOn() )
 37.1391 +		{
 37.1392 +			selection->unselect();
 37.1393 +			selection=newbo;
 37.1394 +			selection->select();
 37.1395 +			if (actionSettingsPasteNewHeading->isOn() )
 37.1396 +			{
 37.1397 +				BranchObj *bo2= (BranchObj*)(selection);
 37.1398 +				bo2->setHeading("");
 37.1399 +			}	
 37.1400 +			if (actionSettingsAutoedit->isOn() )
 37.1401 +				editHeading();
 37.1402 +			if (!actionSettingsAutoselectHeading->isOn()
 37.1403 +				&& !wasScrolled)
 37.1404 +			{
 37.1405 +				selection->unselect();
 37.1406 +				selection=oldselection;
 37.1407 +				selection->select();
 37.1408 +			}
 37.1409 +		}	
 37.1410 +	}	
 37.1411 +}
 37.1412 +
 37.1413 +void MapEditor::deleteSelection()
 37.1414 +{
 37.1415 +	// Finish open lineEdits
 37.1416 +	if (lineedit) finishedLineEditNoSave();
 37.1417 +
 37.1418 +	if (selection  && typeid(*selection) ==typeid(BranchObj) ) 
 37.1419 +	{
 37.1420 +		setChanged();
 37.1421 +		saveState(PartOfMap,selection->getParObj());
 37.1422 +		BranchObj* bo=dynamic_cast <BranchObj*> (selection);
 37.1423 +		BranchObj* par=(BranchObj*)(bo->getParObj());
 37.1424 +		bo->unselect();
 37.1425 +		selection=NULL;
 37.1426 +		par->removeBranch(bo);
 37.1427 +		selection=par;
 37.1428 +		selection->select();
 37.1429 +		ensureSelectionVisible();
 37.1430 +		mapCenter->reposition();
 37.1431 +		adjustCanvasSize();
 37.1432 +	}
 37.1433 +	if (selection  && typeid(*selection) ==typeid(FloatImageObj) ) 
 37.1434 +	{
 37.1435 +		setChanged();
 37.1436 +		saveState(PartOfMap,selection->getParObj());
 37.1437 +		FloatImageObj* fio=dynamic_cast <FloatImageObj*> (selection);
 37.1438 +		BranchObj* par=(BranchObj*)(fio->getParObj());
 37.1439 +		fio->unselect();
 37.1440 +		selection=NULL;
 37.1441 +		par->removeFloatImage(fio);
 37.1442 +		selection=par;
 37.1443 +		selection->select();
 37.1444 +		ensureSelectionVisible();
 37.1445 +		mapCenter->reposition();
 37.1446 +		adjustCanvasSize();
 37.1447 +	}
 37.1448 +}
 37.1449 +
 37.1450 +LinkableMapObj* MapEditor::getSelection()
 37.1451 +{
 37.1452 +	return selection;
 37.1453 +}
 37.1454 +
 37.1455 +bool MapEditor::select (QString s)
 37.1456 +{
 37.1457 +	LinkableMapObj *lmo=mapCenter;
 37.1458 +	QString part;
 37.1459 +	QString typ;
 37.1460 +	QString num;
 37.1461 +	while (!s.isEmpty() )
 37.1462 +	{
 37.1463 +		part=s.section(",",0,0);
 37.1464 +		typ=part.left (3);
 37.1465 +		num=part.right(part.length() - 3);
 37.1466 +		
 37.1467 +		if (typ=="mc:")
 37.1468 +		{
 37.1469 +			if (num=="")
 37.1470 +				break;
 37.1471 +			else
 37.1472 +				lmo=mapCenter->getBranchNum (num.toUInt());
 37.1473 +		} else
 37.1474 +			if (typ=="bo:")
 37.1475 +				lmo=((BranchObj*)(lmo))->getBranchNum (num.toUInt());
 37.1476 +			else
 37.1477 +				if (typ=="fi:")
 37.1478 +					lmo=((BranchObj*)(lmo))->getFloatImageNum (num.toUInt());
 37.1479 +				
 37.1480 +		
 37.1481 +		
 37.1482 +		if (!lmo) break;
 37.1483 +		
 37.1484 +		if (s.contains(","))
 37.1485 +			s=s.right(s.length() - part.length() -1 );
 37.1486 +		else	
 37.1487 +			break;
 37.1488 +	}
 37.1489 +
 37.1490 +	// Finally select the found object
 37.1491 +	if (lmo)
 37.1492 +	{
 37.1493 +		if (selection) selection->unselect();
 37.1494 +		selection=lmo;
 37.1495 +		selection->select();
 37.1496 +		adjustCanvasSize();
 37.1497 +		ensureSelectionVisible();
 37.1498 +		return true;
 37.1499 +	} else
 37.1500 +		return false;
 37.1501 +	
 37.1502 +	
 37.1503 +}
 37.1504 +
 37.1505 +void MapEditor::unselect()
 37.1506 +{
 37.1507 +	if (selection) 
 37.1508 +	{
 37.1509 +		selectionLast=selection;
 37.1510 +		selection->unselect();
 37.1511 +		selection=NULL;
 37.1512 +	}
 37.1513 +}	
 37.1514 +
 37.1515 +void MapEditor::reselect()
 37.1516 +{
 37.1517 +	if (selectionLast)
 37.1518 +	{
 37.1519 +		selection=selectionLast;
 37.1520 +		selection->select();
 37.1521 +		selectionLast=NULL;
 37.1522 +	}
 37.1523 +}	
 37.1524 +
 37.1525 +void MapEditor::selectNextBranch()
 37.1526 +{
 37.1527 +	// Increase number of branch
 37.1528 +	if (selection)
 37.1529 +	{
 37.1530 +		QString s=selection->getSelectString();
 37.1531 +		QString part;
 37.1532 +		QString typ;
 37.1533 +		QString num;
 37.1534 +
 37.1535 +		// Where am I? 
 37.1536 +		part=s.section(",",-1);
 37.1537 +		typ=part.left (3);
 37.1538 +		num=part.right(part.length() - 3);
 37.1539 +
 37.1540 +		s=s.left (s.length() -num.length());
 37.1541 +
 37.1542 +		// Go to next lmo
 37.1543 +		num=QString ("%1").arg(num.toUInt()+1);
 37.1544 +
 37.1545 +		s=s+num;
 37.1546 +		
 37.1547 +		// Try to select this one
 37.1548 +		if (select (s)) return;
 37.1549 +
 37.1550 +		// We have no direct successor, 
 37.1551 +		// try to increase the parental number in order to
 37.1552 +		// find a successor with same depth
 37.1553 +
 37.1554 +		int d=selection->getDepth();
 37.1555 +		int oldDepth=d;
 37.1556 +		int i;
 37.1557 +		bool found=false;
 37.1558 +		bool b;
 37.1559 +		while (!found && d>0)
 37.1560 +		{
 37.1561 +			s=s.section (",",0,d-1);
 37.1562 +			// replace substring of current depth in s with "1"
 37.1563 +			part=s.section(",",-1);
 37.1564 +			typ=part.left (3);
 37.1565 +			num=part.right(part.length() - 3);
 37.1566 +
 37.1567 +			if (d>1)
 37.1568 +			{	
 37.1569 +				// increase number of parent
 37.1570 +				num=QString ("%1").arg(num.toUInt()+1);
 37.1571 +				s=s.section (",",0,d-2) + ","+ typ+num;
 37.1572 +			} else
 37.1573 +			{
 37.1574 +				// Special case, look at orientation
 37.1575 +				if (selection->getOrientation()==OrientRightOfCenter)
 37.1576 +					num=QString ("%1").arg(num.toUInt()+1);
 37.1577 +				else	
 37.1578 +					num=QString ("%1").arg(num.toUInt()-1);
 37.1579 +				s=typ+num;
 37.1580 +			}	
 37.1581 +
 37.1582 +			if (select (s))
 37.1583 +				// pad to oldDepth, select the first branch for each depth
 37.1584 +				for (i=d;i<oldDepth;i++)
 37.1585 +				{
 37.1586 +					b=select (s);
 37.1587 +					if (b)
 37.1588 +					{	
 37.1589 +						if ( ((BranchObj*)(selection))->countBranches()>0)
 37.1590 +							s+=",bo:0";
 37.1591 +						else	
 37.1592 +							break;
 37.1593 +					} else
 37.1594 +						break;
 37.1595 +				}	
 37.1596 +
 37.1597 +			// try to select the freshly built string
 37.1598 +			found=select(s);
 37.1599 +			d--;
 37.1600 +		}
 37.1601 +		return;
 37.1602 +	}	
 37.1603 +}
 37.1604 +
 37.1605 +void MapEditor::selectPrevBranch()
 37.1606 +{
 37.1607 +	// Decrease number of branch
 37.1608 +	if (selection)
 37.1609 +	{
 37.1610 +		QString s=selection->getSelectString();
 37.1611 +		QString part;
 37.1612 +		QString typ;
 37.1613 +		QString num;
 37.1614 +
 37.1615 +		// Where am I? 
 37.1616 +		part=s.section(",",-1);
 37.1617 +		typ=part.left (3);
 37.1618 +		num=part.right(part.length() - 3);
 37.1619 +
 37.1620 +		s=s.left (s.length() -num.length());
 37.1621 +
 37.1622 +		// Go to next lmo
 37.1623 +		num=QString ("%1").arg(num.toUInt()-1);
 37.1624 +
 37.1625 +		s=s+num;
 37.1626 +		
 37.1627 +		// Try to select this one
 37.1628 +		if (select (s)) return;
 37.1629 +
 37.1630 +		// We have no direct precessor, 
 37.1631 +		// try to decrease the parental number in order to
 37.1632 +		// find a precessor with same depth
 37.1633 +
 37.1634 +		int d=selection->getDepth();
 37.1635 +		int oldDepth=d;
 37.1636 +		int i;
 37.1637 +		bool found=false;
 37.1638 +		bool b;
 37.1639 +		while (!found && d>0)
 37.1640 +		{
 37.1641 +			s=s.section (",",0,d-1);
 37.1642 +			// replace substring of current depth in s with "1"
 37.1643 +			part=s.section(",",-1);
 37.1644 +			typ=part.left (3);
 37.1645 +			num=part.right(part.length() - 3);
 37.1646 +
 37.1647 +			if (d>1)
 37.1648 +			{
 37.1649 +				// decrease number of parent
 37.1650 +				num=QString ("%1").arg(num.toUInt()-1);
 37.1651 +				s=s.section (",",0,d-2) + ","+ typ+num;
 37.1652 +			} else
 37.1653 +			{
 37.1654 +				// Special case, look at orientation
 37.1655 +				if (selection->getOrientation()==OrientRightOfCenter)
 37.1656 +					num=QString ("%1").arg(num.toUInt()-1);
 37.1657 +				else	
 37.1658 +					num=QString ("%1").arg(num.toUInt()+1);
 37.1659 +				s=typ+num;
 37.1660 +			}	
 37.1661 +
 37.1662 +			if (select(s))
 37.1663 +				// pad to oldDepth, select the last branch for each depth
 37.1664 +				for (i=d;i<oldDepth;i++)
 37.1665 +				{
 37.1666 +					b=select (s);
 37.1667 +					if (b)
 37.1668 +						if ( ((BranchObj*)(selection))->countBranches()>0)
 37.1669 +							s+=",bo:"+ QString ("%1").arg( ((BranchObj*)(selection))->countBranches()-1 );
 37.1670 +						else	
 37.1671 +							break;
 37.1672 +					else
 37.1673 +						break;
 37.1674 +				}	
 37.1675 +			
 37.1676 +			// try to select the freshly built string
 37.1677 +			found=select(s);
 37.1678 +			d--;
 37.1679 +		}
 37.1680 +		return;
 37.1681 +	}	
 37.1682 +}
 37.1683 +
 37.1684 +void MapEditor::selectUpperBranch()
 37.1685 +{
 37.1686 +	// Finish open lineEdits
 37.1687 +	if (lineedit) finishedLineEditNoSave();
 37.1688 +
 37.1689 +	if (selection) 
 37.1690 +	{
 37.1691 +		if (typeid(*selection) == typeid(BranchObj))
 37.1692 +		{
 37.1693 +			if (selection->getOrientation()==OrientRightOfCenter)
 37.1694 +				selectPrevBranch();
 37.1695 +			else
 37.1696 +				if (selection->getDepth()==1)
 37.1697 +					selectNextBranch();
 37.1698 +				else
 37.1699 +					selectPrevBranch();
 37.1700 +		}		
 37.1701 +	}
 37.1702 +}
 37.1703 +
 37.1704 +void MapEditor::selectLowerBranch()
 37.1705 +{
 37.1706 +	// Finish open lineEdits
 37.1707 +	if (lineedit) finishedLineEditNoSave();
 37.1708 +
 37.1709 +	if (selection) 
 37.1710 +	{
 37.1711 +		if (typeid(*selection) == typeid(BranchObj))
 37.1712 +		{
 37.1713 +			if (selection->getOrientation()==OrientRightOfCenter)
 37.1714 +				selectNextBranch();
 37.1715 +			else
 37.1716 +				if (selection->getDepth()==1)
 37.1717 +					selectPrevBranch();
 37.1718 +				else
 37.1719 +					selectNextBranch();
 37.1720 +		}		
 37.1721 +	}
 37.1722 +}
 37.1723 +
 37.1724 +
 37.1725 +void MapEditor::selectLeftBranch()
 37.1726 +{
 37.1727 +	// Finish open lineEdits
 37.1728 +	if (lineedit) finishedLineEditNoSave();
 37.1729 +
 37.1730 +	BranchObj* bo;
 37.1731 +	BranchObj* par;
 37.1732 +	if (selection) 
 37.1733 +	{
 37.1734 +		if (typeid(*selection) == typeid(MapCenterObj))
 37.1735 +		{
 37.1736 +			par=  (BranchObj*) (selection);
 37.1737 +			bo=par->getLastSelectedBranch();
 37.1738 +			if (bo)
 37.1739 +			{
 37.1740 +				// Workaround for reselecting on left and right side
 37.1741 +				if (bo->getOrientation()==OrientRightOfCenter)
 37.1742 +				{
 37.1743 +					bo=par->getLastBranch();
 37.1744 +				}	
 37.1745 +				if (bo)
 37.1746 +				{
 37.1747 +					par->unselect();
 37.1748 +					selection=bo;
 37.1749 +					selection->select();
 37.1750 +					adjustCanvasSize();
 37.1751 +					ensureSelectionVisible();
 37.1752 +				}
 37.1753 +			}	
 37.1754 +		} else
 37.1755 +		{
 37.1756 +			par=(BranchObj*)(selection->getParObj());
 37.1757 +			if (selection->getOrientation()==OrientRightOfCenter)
 37.1758 +			{
 37.1759 +				if (typeid(*selection) == typeid(BranchObj) ||
 37.1760 +					typeid(*selection) == typeid(FloatImageObj))
 37.1761 +				{
 37.1762 +					selection->unselect();
 37.1763 +					selection=par;
 37.1764 +					selection->select();
 37.1765 +					adjustCanvasSize();
 37.1766 +					ensureSelectionVisible();
 37.1767 +				}
 37.1768 +			} else
 37.1769 +			{
 37.1770 +				if (typeid(*selection) == typeid(BranchObj) )
 37.1771 +				{
 37.1772 +					bo=((BranchObj*)(selection))->getLastSelectedBranch();
 37.1773 +					if (bo) 
 37.1774 +					{
 37.1775 +						selection->unselect();
 37.1776 +						selection=bo;
 37.1777 +						selection->select();
 37.1778 +						adjustCanvasSize();
 37.1779 +						ensureSelectionVisible();
 37.1780 +					}
 37.1781 +				}
 37.1782 +			}
 37.1783 +		}	
 37.1784 +	}
 37.1785 +}
 37.1786 +
 37.1787 +void MapEditor::selectRightBranch()
 37.1788 +{
 37.1789 +	// Finish open lineEdits
 37.1790 +	if (lineedit) finishedLineEditNoSave();
 37.1791 +
 37.1792 +	BranchObj* bo;
 37.1793 +	BranchObj* par;
 37.1794 +
 37.1795 +	if (selection) 
 37.1796 +	{
 37.1797 +		if (typeid(*selection) == typeid(MapCenterObj))
 37.1798 +		{
 37.1799 +			par=  (BranchObj*) (selection);
 37.1800 +			bo=par->getLastSelectedBranch();
 37.1801 +			if (bo)
 37.1802 +			{
 37.1803 +				// Workaround for relecting on left and right side
 37.1804 +				if (bo->getOrientation()==OrientLeftOfCenter)
 37.1805 +					bo=par->getFirstBranch();
 37.1806 +				if (bo)
 37.1807 +				{
 37.1808 +					par->unselect();
 37.1809 +					selection=bo;
 37.1810 +					selection->select();
 37.1811 +					ensureSelectionVisible();
 37.1812 +				}
 37.1813 +			}
 37.1814 +		} else
 37.1815 +		{
 37.1816 +			par=(BranchObj*)(selection->getParObj());
 37.1817 +			if (selection->getOrientation()==OrientLeftOfCenter)
 37.1818 +			{
 37.1819 +				if (typeid(*selection) == typeid(BranchObj) ||
 37.1820 +					typeid(*selection) == typeid(FloatImageObj))
 37.1821 +				{
 37.1822 +					selection->unselect();
 37.1823 +					selection=par;
 37.1824 +					selection->select();
 37.1825 +					adjustCanvasSize();
 37.1826 +					ensureSelectionVisible();
 37.1827 +				}
 37.1828 +			} else
 37.1829 +			{
 37.1830 +				if (typeid(*selection) == typeid(BranchObj) )
 37.1831 +				{
 37.1832 +					bo=((BranchObj*)(selection))->getLastSelectedBranch();
 37.1833 +					if (bo) 
 37.1834 +					{
 37.1835 +						selection->unselect();
 37.1836 +						selection=bo;
 37.1837 +						selection->select();
 37.1838 +						adjustCanvasSize();
 37.1839 +						ensureSelectionVisible();
 37.1840 +					}
 37.1841 +				}
 37.1842 +			}
 37.1843 +		}
 37.1844 +	}
 37.1845 +}
 37.1846 +
 37.1847 +void MapEditor::selectFirstBranch()
 37.1848 +{
 37.1849 +	// Finish open lineEdits
 37.1850 +	if (lineedit) finishedLineEditNoSave();
 37.1851 +
 37.1852 +	BranchObj *bo1;
 37.1853 +	BranchObj *bo2;
 37.1854 +	BranchObj* par;
 37.1855 +	if (selection) {
 37.1856 +		if (typeid(*selection) == typeid(BranchObj))
 37.1857 +		{
 37.1858 +			bo1=  (BranchObj*) (selection);
 37.1859 +			par=(BranchObj*)(bo1->getParObj());
 37.1860 +			bo2=par->getFirstBranch();
 37.1861 +			if (bo2) {
 37.1862 +				bo1->unselect();
 37.1863 +				selection=bo2;
 37.1864 +				selection->select();
 37.1865 +				ensureSelectionVisible();
 37.1866 +			}
 37.1867 +		}		
 37.1868 +		adjustCanvasSize();
 37.1869 +	}
 37.1870 +}
 37.1871 +
 37.1872 +void MapEditor::selectLastBranch()
 37.1873 +{
 37.1874 +	// Finish open lineEdits
 37.1875 +	if (lineedit) finishedLineEditNoSave();
 37.1876 +
 37.1877 +	BranchObj *bo1;
 37.1878 +	BranchObj *bo2;
 37.1879 +	BranchObj* par;
 37.1880 +	if (selection) {
 37.1881 +		if (typeid(*selection) == typeid(BranchObj))
 37.1882 +		{
 37.1883 +			bo1=  (BranchObj*) (selection);
 37.1884 +			par=(BranchObj*)(bo1->getParObj());
 37.1885 +			bo2=par->getLastBranch();
 37.1886 +			if (bo2) {
 37.1887 +				bo1->unselect();
 37.1888 +				selection=bo2;
 37.1889 +				selection->select();
 37.1890 +				ensureSelectionVisible();
 37.1891 +			}
 37.1892 +		}		
 37.1893 +		adjustCanvasSize();
 37.1894 +	}
 37.1895 +}
 37.1896 +
 37.1897 +void MapEditor::setColor(QColor c)
 37.1898 +{
 37.1899 +	actColor=c;
 37.1900 +}
 37.1901 +
 37.1902 +void MapEditor::selectBackgroundColor()
 37.1903 +{
 37.1904 +	// Finish open lineEdits
 37.1905 +	if (lineedit) finishedLineEditNoSave();
 37.1906 +
 37.1907 +	QColor col = QColorDialog::getColor( mapCanvas->backgroundColor(), this );
 37.1908 +	if ( !col.isValid() ) return;
 37.1909 +	setBackgroundColor( col );
 37.1910 +	setChanged();
 37.1911 +}
 37.1912 +
 37.1913 +void MapEditor::setBackgroundColor(QColor c)
 37.1914 +{
 37.1915 +	mapCanvas->setBackgroundColor (c);
 37.1916 +}
 37.1917 +
 37.1918 +QColor MapEditor::pickColor()
 37.1919 +{
 37.1920 +	if (selection) 
 37.1921 +	{
 37.1922 +		if (typeid(*selection) == typeid(BranchObj) ||
 37.1923 +			typeid(*selection) == typeid(MapCenterObj))
 37.1924 +		{
 37.1925 +			BranchObj *bo=(BranchObj*)(selection);
 37.1926 +			actColor=bo->getColor(); 
 37.1927 +		}    
 37.1928 +	}
 37.1929 +	return actColor;
 37.1930 +}
 37.1931 +
 37.1932 +void MapEditor::colorItem()
 37.1933 +{
 37.1934 +	if (selection) 
 37.1935 +	{
 37.1936 +		if (typeid(*selection) == typeid(BranchObj) ||
 37.1937 +			typeid(*selection) == typeid(MapCenterObj))
 37.1938 +		{
 37.1939 +			setChanged();
 37.1940 +			saveState(PartOfMap,selection);
 37.1941 +			BranchObj *bo=(BranchObj*)(selection);
 37.1942 +			bo->setColor(actColor, false); // color links, color childs
 37.1943 +		}    
 37.1944 +	}
 37.1945 +}
 37.1946 +
 37.1947 +void MapEditor::colorBranch()
 37.1948 +{
 37.1949 +	if (selection) 
 37.1950 +	{
 37.1951 +		if (typeid(*selection) == typeid(BranchObj) ||
 37.1952 +			typeid(*selection) == typeid(MapCenterObj))
 37.1953 +		{
 37.1954 +			setChanged();
 37.1955 +			saveState(PartOfMap,selection);
 37.1956 +			BranchObj *bo=(BranchObj*)(selection);
 37.1957 +			bo->setColor(actColor, true); // color links, color childs
 37.1958 +		}    
 37.1959 +	}
 37.1960 +}
 37.1961 +
 37.1962 +
 37.1963 +void MapEditor::toggleStandardFlag(QString f)
 37.1964 +{
 37.1965 +	if (selection)
 37.1966 +	{
 37.1967 +		setChanged();
 37.1968 +		saveState(PartOfMap,selection);	
 37.1969 +		((BranchObj*)(selection))->toggleStandardFlag (f);
 37.1970 +	}	
 37.1971 +}
 37.1972 +
 37.1973 +void MapEditor::setViewCenter()
 37.1974 +{
 37.1975 +	// transform to CanvasView Coord:
 37.1976 +	QPoint p=worldMatrix().map(movingCenter);
 37.1977 +	center ( p.x(), p.y());
 37.1978 +}
 37.1979 +
 37.1980 +
 37.1981 +BranchObj* MapEditor::findText (QString s, bool cs)
 37.1982 +{
 37.1983 +	if (!itFind) 
 37.1984 +	{	// Nothing found or new find process
 37.1985 +		if (EOFind)
 37.1986 +			// nothing found, start again
 37.1987 +			EOFind=false;
 37.1988 +		itFind=mapCenter->first();
 37.1989 +	}	
 37.1990 +	bool searching=true;
 37.1991 +	bool foundNote=false;
 37.1992 +	while (searching && !EOFind)
 37.1993 +	{
 37.1994 +		if (itFind)
 37.1995 +		{
 37.1996 +			// Searching in Note
 37.1997 +			if (itFind->getNote().contains(s,cs))
 37.1998 +			{
 37.1999 +				if (selection!=itFind) 
 37.2000 +				{
 37.2001 +					if (selection) ((BranchObj*)(selection))->unselect();
 37.2002 +					selection=itFind;
 37.2003 +					selection->select();
 37.2004 +					adjustCanvasSize();
 37.2005 +					ensureSelectionVisible();
 37.2006 +				}
 37.2007 +				if (textEditor->findText(s,cs)) 
 37.2008 +				{
 37.2009 +					searching=false;
 37.2010 +					foundNote=true;
 37.2011 +				}	
 37.2012 +			}
 37.2013 +			// Searching in Heading
 37.2014 +			if (searching && itFind->getHeading().contains (s,cs) ) 
 37.2015 +			{
 37.2016 +				if (selection) ((BranchObj*)(selection))->unselect();
 37.2017 +				selection=itFind;
 37.2018 +				selection->select();
 37.2019 +				adjustCanvasSize();
 37.2020 +				ensureSelectionVisible();
 37.2021 +				searching=false;
 37.2022 +			}
 37.2023 +		}	
 37.2024 +		if (!foundNote)
 37.2025 +		{
 37.2026 +			itFind=itFind->next();
 37.2027 +			if (!itFind) EOFind=true;
 37.2028 +		}
 37.2029 +	}	
 37.2030 +	if (!searching)
 37.2031 +	{
 37.2032 +		adjustCanvasSize();
 37.2033 +		return (BranchObj*)(selection);
 37.2034 +	}	else
 37.2035 +		return NULL;
 37.2036 +}
 37.2037 +
 37.2038 +void MapEditor::findReset()
 37.2039 +{	// Necessary if text to find changes during a find process
 37.2040 +	itFind=NULL;
 37.2041 +	EOFind=false;
 37.2042 +}
 37.2043 +
 37.2044 +void MapEditor::openURL()
 37.2045 +{
 37.2046 +	if (selection )
 37.2047 +	{
 37.2048 +		if (typeid(*selection) == typeid(BranchObj) ||
 37.2049 +			typeid(*selection) == typeid(MapCenterObj))
 37.2050 +		{
 37.2051 +			QString url=((BranchObj*)(selection))->getURL();
 37.2052 +
 37.2053 +			QProcess *proc = new QProcess( this );
 37.2054 +
 37.2055 +#if !defined(Q_OS_MACX)
 37.2056 +			proc->addArgument( settings.readEntry("/vym/mainwindow/readerURL","konqueror" ));
 37.2057 +#else			
 37.2058 +			proc->addArgument( settings.readEntry("/vym/mainwindow/readerURL",
 37.2059 +				"/Applications/Safari.app/Contents/MacOS/Safari" ));
 37.2060 +#endif			
 37.2061 +
 37.2062 +			proc->addArgument( url);
 37.2063 +
 37.2064 +			if ( !proc->start() ) 
 37.2065 +				// error handling
 37.2066 +				if (mainWindow->settingsURL() ) 
 37.2067 +					openURL();
 37.2068 +		}	
 37.2069 +	}	
 37.2070 +}
 37.2071 +
 37.2072 +void MapEditor::editURL()
 37.2073 +{
 37.2074 +	if (selection && (typeid(*selection) == typeid(BranchObj) ||
 37.2075 +			typeid(*selection) == typeid(MapCenterObj)) )
 37.2076 +	{		
 37.2077 +		bool ok;
 37.2078 +		QString text = QInputDialog::getText(
 37.2079 +				"VYM", tr("Enter URL:"), QLineEdit::Normal,
 37.2080 +				((BranchObj*)(selection))->getURL(), &ok, this );
 37.2081 +		if ( ok) 
 37.2082 +		{
 37.2083 +			// user entered something and pressed OK
 37.2084 +			((BranchObj*)(selection))->setURL (text);
 37.2085 +			updateActions();
 37.2086 +			setChanged();
 37.2087 +		}	
 37.2088 +	}
 37.2089 +}
 37.2090 +
 37.2091 +void MapEditor::editHeading2URL()
 37.2092 +{
 37.2093 +	if (selection && (typeid(*selection) == typeid(BranchObj) ||
 37.2094 +			typeid(*selection) == typeid(MapCenterObj)) )
 37.2095 +	{		
 37.2096 +		BranchObj *b=(BranchObj*)(selection);
 37.2097 +		b->setURL (b->getHeading());
 37.2098 +		updateActions();
 37.2099 +		setChanged();
 37.2100 +	}
 37.2101 +}	
 37.2102 +
 37.2103 +void MapEditor::editBugzilla2URL()
 37.2104 +{
 37.2105 +	if (selection && (typeid(*selection) == typeid(BranchObj) ||
 37.2106 +			typeid(*selection) == typeid(MapCenterObj)) )
 37.2107 +	{		
 37.2108 +		BranchObj *b=(BranchObj*)(selection);
 37.2109 +		b->setURL ("http://bugzilla.suse.de/show_bug.cgi?id="+b->getHeading());
 37.2110 +		updateActions();
 37.2111 +		setChanged();
 37.2112 +	}
 37.2113 +}	
 37.2114 +
 37.2115 +void MapEditor::editVymLink()
 37.2116 +{
 37.2117 +	if (selection && (typeid(*selection) == typeid(BranchObj) ||
 37.2118 +			typeid(*selection) == typeid(MapCenterObj)) )
 37.2119 +	{		
 37.2120 +		QFileDialog *fd=new QFileDialog( this,tr("VYM - Link to another map"));
 37.2121 +		fd->addFilter (QString (tr("vym map") + " (*.vym)"));
 37.2122 +		fd->setCaption(tr("VYM - Link to another map"));
 37.2123 +		if (! ((BranchObj*)(selection))->getVymLink().isEmpty() )
 37.2124 +			fd->setSelection( ((BranchObj*)(selection))->getVymLink() );
 37.2125 +		fd->show();
 37.2126 +
 37.2127 +		QString fn;
 37.2128 +		if ( fd->exec() == QDialog::Accepted )
 37.2129 +			((BranchObj*)(selection))->setVymLink (fd->selectedFile() );
 37.2130 +		updateActions();
 37.2131 +		mapCenter->reposition();
 37.2132 +		adjustCanvasSize();
 37.2133 +		canvas()->update();
 37.2134 +		setChanged();
 37.2135 +	}
 37.2136 +}
 37.2137 +
 37.2138 +void MapEditor::deleteVymLink()
 37.2139 +{
 37.2140 +	if (selection && (typeid(*selection) == typeid(BranchObj) ||
 37.2141 +			typeid(*selection) == typeid(MapCenterObj)) )
 37.2142 +	{		
 37.2143 +		((BranchObj*)(selection))->setVymLink ("" );
 37.2144 +		updateActions();
 37.2145 +		mapCenter->reposition();
 37.2146 +		adjustCanvasSize();
 37.2147 +		canvas()->update();
 37.2148 +		setChanged();
 37.2149 +	}
 37.2150 +}
 37.2151 +
 37.2152 +QString MapEditor::getVymLink()
 37.2153 +{
 37.2154 +	if (selection && (typeid(*selection) == typeid(BranchObj) ||
 37.2155 +			typeid(*selection) == typeid(MapCenterObj)) )
 37.2156 +	{		
 37.2157 +		return ((BranchObj*)(selection))->getVymLink();
 37.2158 +	}
 37.2159 +	return "";
 37.2160 +	
 37.2161 +}
 37.2162 +
 37.2163 +void MapEditor::editMapInfo()
 37.2164 +{
 37.2165 +	ExtraInfoDialog dia;
 37.2166 +	dia.setMapName (getFileName() );
 37.2167 +	dia.setAuthor (mapCenter->getAuthor() );
 37.2168 +	dia.setComment(mapCenter->getComment() );
 37.2169 +
 37.2170 +	// Calc some stats
 37.2171 +	QString stats;
 37.2172 +    int i=0;
 37.2173 +    QCanvasItemList l=canvas()->allItems();
 37.2174 +    for (QCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) 
 37.2175 +        i++;
 37.2176 +    stats+=QString ("%1 items on canvas\n").arg (i,6);
 37.2177 +
 37.2178 +	uint b=0;
 37.2179 +	uint f=0;
 37.2180 +	uint n=0;
 37.2181 +	BranchObj *bo;
 37.2182 +	bo=mapCenter->first();
 37.2183 +	while (bo) 
 37.2184 +	{
 37.2185 +		if (!bo->getNote().isEmpty() ) n++;
 37.2186 +		f+= bo->countFloatImages();
 37.2187 +		b++;
 37.2188 +		bo=bo->next();
 37.2189 +	}
 37.2190 +    stats+=QString ("%1 branches\n").arg (b-1,6);
 37.2191 +    stats+=QString ("%1 notes\n").arg (n,6);
 37.2192 +    stats+=QString ("%1 images\n").arg (f,6);
 37.2193 +	dia.setStats (stats);
 37.2194 +
 37.2195 +	// Finally show dialog
 37.2196 +	if (dia.exec() == QDialog::Accepted)
 37.2197 +	{
 37.2198 +		mapCenter->setAuthor (dia.getAuthor() );
 37.2199 +		mapCenter->setComment (dia.getComment() );
 37.2200 +		setChanged();
 37.2201 +	}
 37.2202 +}
 37.2203 +
 37.2204 +void MapEditor::updateActions()
 37.2205 +{
 37.2206 +	if (getLinkColorHint()==HeadingColor) 
 37.2207 +		actionFormatLinkColorHint->setOn(true);
 37.2208 +	else	
 37.2209 +		actionFormatLinkColorHint->setOn(false);
 37.2210 +
 37.2211 +	switch (linkstyle)
 37.2212 +	{
 37.2213 +		case StyleLine: 
 37.2214 +			actionFormatLinkStyleLine->setOn(true);
 37.2215 +			break;
 37.2216 +		case StyleParabel:
 37.2217 +			actionFormatLinkStyleParabel->setOn(true);
 37.2218 +			break;
 37.2219 +		case StylePolyLine:	
 37.2220 +			actionFormatLinkStylePolyLine->setOn(true);
 37.2221 +			break;
 37.2222 +		case StylePolyParabel:	
 37.2223 +			actionFormatLinkStylePolyParabel->setOn(true);
 37.2224 +			break;
 37.2225 +		default:
 37.2226 +			break;
 37.2227 +	}	
 37.2228 +
 37.2229 +	QPixmap pix( 16, 16 );
 37.2230 +    pix.fill( mapCanvas->backgroundColor() );
 37.2231 +    actionFormatBackColor->setIconSet( pix );
 37.2232 +    pix.fill( deflinkcolor );
 37.2233 +    actionFormatLinkColor->setIconSet( pix );
 37.2234 +
 37.2235 +	actionEditUndo->setEnabled( mapChanged );
 37.2236 +	actionFileSave->setEnabled( mapUnsaved );
 37.2237 +
 37.2238 +	if (selection)
 37.2239 +	{
 37.2240 +		if ( (typeid(*selection) == typeid(BranchObj)) || 
 37.2241 +			(typeid(*selection) == typeid(MapCenterObj))  )
 37.2242 +		{
 37.2243 +			standardFlagsDefault->setEnabled (true);
 37.2244 +
 37.2245 +			if ( ((BranchObj*)(selection))->getURL().isEmpty() )
 37.2246 +				actionEditOpenURL->setEnabled (false);
 37.2247 +			else	
 37.2248 +				actionEditOpenURL->setEnabled (true);
 37.2249 +			actionEditURL->setEnabled (true);	
 37.2250 +			actionEditHeading2URL->setEnabled (true);	
 37.2251 +			actionEditBugzilla2URL->setEnabled (true);	
 37.2252 +
 37.2253 +			if ( ((BranchObj*)(selection))->getVymLink().isEmpty() )
 37.2254 +			{
 37.2255 +				actionEditOpenVymLink->setEnabled (false);
 37.2256 +				actionEditDeleteVymLink->setEnabled (false);
 37.2257 +			} else	
 37.2258 +			{
 37.2259 +				actionEditOpenVymLink->setEnabled (true);
 37.2260 +				actionEditDeleteVymLink->setEnabled (true);
 37.2261 +			}	
 37.2262 +			actionEditVymLink->setEnabled (true);	
 37.2263 +
 37.2264 +			actionEditCopy->setEnabled (true);	
 37.2265 +			actionEditCut->setEnabled (true);	
 37.2266 +			actionEditPaste->setEnabled (true);	
 37.2267 +			actionEditMoveUp->setEnabled (true);	
 37.2268 +			actionEditMoveDown->setEnabled (true);	
 37.2269 +			actionEditToggleScroll->setEnabled (true);	
 37.2270 +			actionEditHeading->setEnabled (true);
 37.2271 +			actionEditDelete->setEnabled (true);
 37.2272 +			actionEditAddBranch->setEnabled (true);
 37.2273 +			actionEditAddBranchAbove->setEnabled (true);
 37.2274 +			actionEditAddBranchBelow->setEnabled (true);
 37.2275 +			actionEditImportAdd->setEnabled (true);
 37.2276 +			actionEditImportReplace->setEnabled (true);
 37.2277 +			actionEditSaveBranch->setEnabled (true);
 37.2278 +			actionEditSelectFirst->setEnabled (true);
 37.2279 +			actionEditSelectLast->setEnabled (true);
 37.2280 +			actionEditToggleFloatExport->setEnabled (false);
 37.2281 +			actionFormatPickColor->setEnabled (true);
 37.2282 +			actionFormatColorBranch->setEnabled (true);
 37.2283 +			actionFormatColorSubtree->setEnabled (true);
 37.2284 +			switch (selection->getFrameType())
 37.2285 +			{
 37.2286 +				case NoFrame: 
 37.2287 +					actionFormatFrameNone->setOn(true);
 37.2288 +					break;
 37.2289 +				case Rectangle:
 37.2290 +					actionFormatFrameRectangle->setOn(true);
 37.2291 +					break;
 37.2292 +				default:
 37.2293 +					break;
 37.2294 +			}	
 37.2295 +		}
 37.2296 +		if ( (typeid(*selection) == typeid(FloatImageObj)) )
 37.2297 +		{
 37.2298 +			standardFlagsDefault->setEnabled (false);
 37.2299 +
 37.2300 +			actionEditOpenURL->setEnabled (false);
 37.2301 +			actionEditURL->setEnabled (false);	
 37.2302 +			actionEditHeading2URL->setEnabled (false);	
 37.2303 +			actionEditBugzilla2URL->setEnabled (false);	
 37.2304 +			actionEditOpenVymLink->setEnabled (false);
 37.2305 +			actionEditVymLink->setEnabled (false);	
 37.2306 +			actionEditDeleteVymLink->setEnabled (false);	
 37.2307 +
 37.2308 +			actionEditCopy->setEnabled (true);
 37.2309 +			actionEditCut->setEnabled (true);	
 37.2310 +			actionEditPaste->setEnabled (false);	//FIXME
 37.2311 +			actionEditMoveUp->setEnabled (false);	
 37.2312 +			actionEditMoveDown->setEnabled (false);	
 37.2313 +			actionEditToggleScroll->setEnabled (false);	
 37.2314 +			actionEditHeading->setEnabled (false);
 37.2315 +			actionEditDelete->setEnabled (true);
 37.2316 +			actionEditAddBranch->setEnabled (false);
 37.2317 +			actionEditAddBranchAbove->setEnabled (false);
 37.2318 +			actionEditAddBranchBelow->setEnabled (false);
 37.2319 +			actionEditImportAdd->setEnabled (false);
 37.2320 +			actionEditSaveBranch->setEnabled (false);
 37.2321 +			actionEditImportReplace->setEnabled (false);
 37.2322 +			actionEditSelectFirst->setEnabled (false);
 37.2323 +			actionEditSelectLast->setEnabled (false);
 37.2324 +			actionEditToggleFloatExport->setOn
 37.2325 +				( ((FloatImageObj*)(selection))->getFloatExport() );
 37.2326 +			actionFormatPickColor->setEnabled (false);
 37.2327 +			actionFormatColorBranch->setEnabled (false);
 37.2328 +			actionFormatColorSubtree->setEnabled (false);
 37.2329 +		}
 37.2330 +
 37.2331 +	} else
 37.2332 +	{
 37.2333 +		standardFlagsDefault->setEnabled (false);
 37.2334 +
 37.2335 +		actionEditCopy->setEnabled (false);	
 37.2336 +		actionEditCut->setEnabled (false);	
 37.2337 +		actionEditPaste->setEnabled (false);	
 37.2338 +		actionEditMoveUp->setEnabled (false);	
 37.2339 +		actionEditMoveDown->setEnabled (false);	
 37.2340 +		actionEditToggleScroll->setEnabled (false);	
 37.2341 +		actionEditOpenURL->setEnabled (false);
 37.2342 +		actionEditURL->setEnabled (false);	
 37.2343 +		actionEditOpenVymLink->setEnabled (false);
 37.2344 +		actionEditVymLink->setEnabled (false);	
 37.2345 +		actionEditDeleteVymLink->setEnabled (false);	
 37.2346 +		actionEditHeading2URL->setEnabled (false);	
 37.2347 +		actionEditBugzilla2URL->setEnabled (false);	
 37.2348 +		actionEditHeading->setEnabled (false);
 37.2349 +		actionEditDelete->setEnabled (false);
 37.2350 +		actionEditAddBranch->setEnabled (false);
 37.2351 +		actionEditAddBranchAbove->setEnabled (false);
 37.2352 +		actionEditAddBranchBelow->setEnabled (false);
 37.2353 +		actionEditSaveBranch->setEnabled (false);
 37.2354 +		actionEditImportReplace->setEnabled (false);
 37.2355 +		actionEditSelectFirst->setEnabled (false);
 37.2356 +		actionEditSelectLast->setEnabled (false);
 37.2357 +		actionEditToggleFloatExport->setEnabled (false);
 37.2358 +		actionFormatPickColor->setEnabled (false);
 37.2359 +		actionFormatColorBranch->setEnabled (false);
 37.2360 +		actionFormatColorSubtree->setEnabled (false);
 37.2361 +	}	
 37.2362 +}
 37.2363 +
 37.2364 +void MapEditor::setLinkStyle (LinkStyle ls)
 37.2365 +{
 37.2366 +	linkstyle=ls;
 37.2367 +
 37.2368 +	BranchObj *bo;
 37.2369 +	bo=mapCenter->first();
 37.2370 +	bo=bo->next();
 37.2371 +	while (bo) 
 37.2372 +	{
 37.2373 +		bo->setLinkStyle(bo->getDefLinkStyle());
 37.2374 +		bo=bo->next();
 37.2375 +	}
 37.2376 +	//setChanged();
 37.2377 +	//saveState();
 37.2378 +}
 37.2379 +
 37.2380 +LinkStyle MapEditor::getLinkStyle ()
 37.2381 +{
 37.2382 +	return linkstyle;
 37.2383 +}	
 37.2384 +
 37.2385 +void MapEditor::setLinkColor(QColor c)
 37.2386 +{
 37.2387 +	deflinkcolor=c;
 37.2388 +	updateActions();
 37.2389 +}
 37.2390 +
 37.2391 +void MapEditor::setLinkColorHint()
 37.2392 +{
 37.2393 +	// called from setLinkColorHint(lch) or at end of parse
 37.2394 +	BranchObj *bo;
 37.2395 +	bo=mapCenter->first();
 37.2396 +	while (bo) 
 37.2397 +	{
 37.2398 +		bo->setLinkColor();
 37.2399 +		bo=bo->next();
 37.2400 +	}
 37.2401 +}
 37.2402 +
 37.2403 +void MapEditor::setLinkColorHint(LinkColorHint lch)
 37.2404 +{
 37.2405 +	linkcolorhint=lch;
 37.2406 +	setLinkColorHint();
 37.2407 +}
 37.2408 +
 37.2409 +void MapEditor::toggleLinkColorHint()
 37.2410 +{
 37.2411 +	if (linkcolorhint==HeadingColor)
 37.2412 +		linkcolorhint=DefaultColor;
 37.2413 +	else	
 37.2414 +		linkcolorhint=HeadingColor;
 37.2415 +	BranchObj *bo;
 37.2416 +	bo=mapCenter->first();
 37.2417 +	while (bo) 
 37.2418 +	{
 37.2419 +		bo->setLinkColor();
 37.2420 +		bo=bo->next();
 37.2421 +	}
 37.2422 +}
 37.2423 +
 37.2424 +LinkColorHint MapEditor::getLinkColorHint()
 37.2425 +{
 37.2426 +	return linkcolorhint;
 37.2427 +}
 37.2428 +
 37.2429 +QColor MapEditor::getDefLinkColor()
 37.2430 +{
 37.2431 +	return deflinkcolor;
 37.2432 +}
 37.2433 +
 37.2434 +void MapEditor::selectLinkColor()
 37.2435 +{
 37.2436 +	// Finish open lineEdits
 37.2437 +	if (lineedit) finishedLineEditNoSave();
 37.2438 +
 37.2439 +	QColor col = QColorDialog::getColor( deflinkcolor, this );
 37.2440 +	if ( !col.isValid() ) return;
 37.2441 +	setLinkColor( col );
 37.2442 +	setChanged();
 37.2443 +}
 37.2444 +
 37.2445 +void MapEditor::toggleScroll()
 37.2446 +{
 37.2447 +	if (selection && (typeid(*selection) == typeid(BranchObj)) )
 37.2448 +	{
 37.2449 +		BranchObj *bo=((BranchObj*)(selection));
 37.2450 +		if (bo->countBranches()==0) return;
 37.2451 +		if (bo->getDepth()==0) return;
 37.2452 +		setChanged();
 37.2453 +		saveState(PartOfMap,selection);
 37.2454 +		bo->toggleScroll();
 37.2455 +		adjustCanvasSize();
 37.2456 +		canvas()->update();
 37.2457 +	}
 37.2458 +}
 37.2459 +
 37.2460 +void MapEditor::unScrollAll()
 37.2461 +{
 37.2462 +	BranchObj *bo;
 37.2463 +	bo=mapCenter->first();
 37.2464 +	while (bo) 
 37.2465 +	{
 37.2466 +		if (bo->isScrolled()) bo->toggleScroll();
 37.2467 +		bo=bo->next();
 37.2468 +	}
 37.2469 +}
 37.2470 +
 37.2471 +void MapEditor::loadFloatImage ()
 37.2472 +{
 37.2473 +	if (selection && 
 37.2474 +		(typeid(*selection) == typeid(BranchObj)) || 
 37.2475 +		(typeid(*selection) == typeid(MapCenterObj))  )
 37.2476 +	{
 37.2477 +		BranchObj *bo=((BranchObj*)(selection));
 37.2478 +
 37.2479 +		QFileDialog *fd=new QFileDialog( this,tr("vym - load image"));
 37.2480 +		fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)"));
 37.2481 +		ImagePreview *p =new ImagePreview (fd);
 37.2482 +		fd->setContentsPreviewEnabled( TRUE );
 37.2483 +		fd->setContentsPreview( p, p );
 37.2484 +		fd->setPreviewMode( QFileDialog::Contents );
 37.2485 +		fd->setCaption(tr("vym - Load image"));
 37.2486 +		fd->setDir (lastImageDir);
 37.2487 +		fd->show();
 37.2488 +
 37.2489 +		QString fn;
 37.2490 +		if ( fd->exec() == QDialog::Accepted )
 37.2491 +		{
 37.2492 +			setChanged();
 37.2493 +			saveState(PartOfMap,selection);
 37.2494 +			QString fn=fd->selectedFile();
 37.2495 +			lastImageDir=fn.left(fn.findRev ("/"));
 37.2496 +			bo->addFloatImage();
 37.2497 +			// FIXME check if load was successful
 37.2498 +			bo->getLastFloatImage()->load(fn);
 37.2499 +			bo->getLastFloatImage()->setOriginalFilename(fn);
 37.2500 +			mapCenter->reposition();
 37.2501 +			adjustCanvasSize();
 37.2502 +			canvas()->update();
 37.2503 +		}
 37.2504 +	}
 37.2505 +}
 37.2506 +
 37.2507 +void MapEditor::saveFloatImage (int item)
 37.2508 +{
 37.2509 +	if (selection && 
 37.2510 +		(typeid(*selection) == typeid(FloatImageObj)) )
 37.2511 +	{
 37.2512 +		FloatImageObj *fio=((FloatImageObj*)(selection));
 37.2513 +		const char* fmt = saveImageFormatMenu->text(item);
 37.2514 +
 37.2515 +		QFileDialog *fd=new QFileDialog( this, tr("vym - save image as") + fmt);
 37.2516 +		fd->addFilter ("PNG (*.png)");
 37.2517 +		fd->addFilter ("BMP (*.bmp)");
 37.2518 +		fd->addFilter ("XBM (*.xbm)");
 37.2519 +		fd->addFilter ("JPG (*.jpg)");
 37.2520 +		fd->addFilter ("XPM (*.xpm)");
 37.2521 +		fd->addFilter ("GIF (*.gif)");
 37.2522 +		fd->addFilter ("PNM (*.pnm)");
 37.2523 +		fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)"));
 37.2524 +		fd->setCaption(tr("vym - Save image as ") + fmt);
 37.2525 +		fd->setMode( QFileDialog::AnyFile );
 37.2526 +		fd->setSelection (fio->getOriginalFilename());
 37.2527 +		fd->show();
 37.2528 +
 37.2529 +		QString fn;
 37.2530 +		if ( fd->exec() == QDialog::Accepted )
 37.2531 +		{
 37.2532 +			if (QFile (fd->selectedFile()).exists() )
 37.2533 +			{
 37.2534 +				QMessageBox mb( "VYM",
 37.2535 +					tr("The file ") + fd->selectedFile() + 
 37.2536 +					tr(" exists already. "
 37.2537 +					"Do you want to overwrite it?"),
 37.2538 +				QMessageBox::Warning,
 37.2539 +				QMessageBox::Yes | QMessageBox::Default,
 37.2540 +				QMessageBox::Cancel | QMessageBox::Escape,
 37.2541 +				QMessageBox::QMessageBox::NoButton );
 37.2542 +
 37.2543 +				mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
 37.2544 +				mb.setButtonText( QMessageBox::No, tr("Cancel"));
 37.2545 +				switch( mb.exec() ) 
 37.2546 +				{
 37.2547 +					case QMessageBox::Yes:
 37.2548 +						// save 
 37.2549 +						break;;
 37.2550 +					case QMessageBox::Cancel:
 37.2551 +						// do nothing
 37.2552 +						return;
 37.2553 +						break;
 37.2554 +				}
 37.2555 +			}
 37.2556 +			fio->save (fd->selectedFile(),fmt);
 37.2557 +		}
 37.2558 +	}
 37.2559 +}
 37.2560 +
 37.2561 +void MapEditor::toggleFloatExport()
 37.2562 +{
 37.2563 +	if (selection && 
 37.2564 +		(typeid(*selection) == typeid(FloatImageObj))|| 
 37.2565 +		(typeid(*selection) == typeid(FloatObj)) )
 37.2566 +	{
 37.2567 +		FloatImageObj *fio=((FloatImageObj*)(selection));
 37.2568 +		fio->setFloatExport (actionEditToggleFloatExport->isOn() );
 37.2569 +	}
 37.2570 +}
 37.2571 +
 37.2572 +void MapEditor::setFrame(const FrameType &t)
 37.2573 +{
 37.2574 +	if (selection && 
 37.2575 +		(typeid(*selection) == typeid(BranchObj)) || 
 37.2576 +		(typeid(*selection) == typeid(MapCenterObj))  )
 37.2577 +	{
 37.2578 +		selection->setFrameType (t);
 37.2579 +		mapCenter->reposition();
 37.2580 +		selection->updateLink();
 37.2581 +	}
 37.2582 +}
 37.2583 +
 37.2584 +void MapEditor::importDir(BranchObj *dst, QDir d)
 37.2585 +{
 37.2586 +	if (selection && 
 37.2587 +		(typeid(*selection) == typeid(BranchObj)) || 
 37.2588 +		(typeid(*selection) == typeid(MapCenterObj))  )
 37.2589 +	{
 37.2590 +		BranchObj *bo;
 37.2591 +		
 37.2592 +		// Traverse directories
 37.2593 +		d.setFilter( QDir::Dirs| QDir::Hidden | QDir::NoSymLinks );
 37.2594 +		const QFileInfoList *dirlist = d.entryInfoList();
 37.2595 +		QFileInfoListIterator itdir( *dirlist );
 37.2596 +		QFileInfo *fi;
 37.2597 +
 37.2598 +		while ( (fi = itdir.current()) != 0 ) 
 37.2599 +		{
 37.2600 +			if (fi->fileName() != "." && fi->fileName() != ".." )
 37.2601 +			{
 37.2602 +				dst->addBranch();
 37.2603 +				bo=dst->getLastBranch();
 37.2604 +				bo->setHeading (fi->fileName() );
 37.2605 +				bo->setColor (QColor("blue"),false);
 37.2606 +				bo->toggleScroll();
 37.2607 +				if ( !d.cd(fi->fileName()) ) 
 37.2608 +					QMessageBox::critical (0,tr("Critical Import Error"),tr("Cannot find the directory"));
 37.2609 +				else 
 37.2610 +				{
 37.2611 +					importDir (bo,d);
 37.2612 +					d.cdUp();
 37.2613 +				}
 37.2614 +			}	
 37.2615 +			++itdir;
 37.2616 +		}		
 37.2617 +		// Traverse files
 37.2618 +		d.setFilter( QDir::Files| QDir::Hidden | QDir::NoSymLinks );
 37.2619 +		const QFileInfoList *filelist = d.entryInfoList();
 37.2620 +		QFileInfoListIterator itfile( *filelist );
 37.2621 +
 37.2622 +		while ( (fi = itfile.current()) != 0 ) 
 37.2623 +		{
 37.2624 +			dst->addBranch();
 37.2625 +			bo=dst->getLastBranch();
 37.2626 +			bo->setHeading (fi->fileName() );
 37.2627 +			bo->setColor (QColor("black"),false);
 37.2628 +			++itfile;
 37.2629 +		}	
 37.2630 +	}		
 37.2631 +}
 37.2632 +
 37.2633 +void MapEditor::importDir()
 37.2634 +{
 37.2635 +	if (selection && 
 37.2636 +		(typeid(*selection) == typeid(BranchObj)) || 
 37.2637 +		(typeid(*selection) == typeid(MapCenterObj))  )
 37.2638 +	{
 37.2639 +		QFileDialog *fd=new QFileDialog( this,tr("VYM - Choose directory structur to import"));
 37.2640 +		fd->setMode (QFileDialog::DirectoryOnly);
 37.2641 +		fd->addFilter (QString (tr("vym map") + " (*.vym)"));
 37.2642 +		fd->setCaption(tr("VYM - Choose directory structur to import"));
 37.2643 +		fd->show();
 37.2644 +
 37.2645 +		QString fn;
 37.2646 +		if ( fd->exec() == QDialog::Accepted )
 37.2647 +		{
 37.2648 +			BranchObj *bo=((BranchObj*)(selection));
 37.2649 +			importDir (bo,QDir(fd->selectedFile()) );
 37.2650 +			mapCenter->reposition();
 37.2651 +			adjustCanvasSize();
 37.2652 +			canvas()->update();
 37.2653 +		}
 37.2654 +	}	
 37.2655 +}
 37.2656 +
 37.2657 +void MapEditor::testFunction()
 37.2658 +{
 37.2659 +	cout << "MapEditor::testFunction() called\n";
 37.2660 +}
 37.2661 +
 37.2662 +void MapEditor::ensureSelectionVisible()
 37.2663 +{
 37.2664 +	LinkableMapObj* lmo= dynamic_cast <LinkableMapObj*> (selection);
 37.2665 +	QPoint p;
 37.2666 +	if (selection->getOrientation() == OrientLeftOfCenter)
 37.2667 +		p= worldMatrix().map(QPoint (lmo->x(),lmo->y()));
 37.2668 +	else	
 37.2669 +		p= worldMatrix().map(QPoint (lmo->x()+lmo->width(),lmo->y()+lmo->height()));
 37.2670 +	ensureVisible (p.x(), p.y() );
 37.2671 +
 37.2672 +}
 37.2673 +
 37.2674 +void MapEditor::updateViewCenter()
 37.2675 +{
 37.2676 +	// Update movingCenter, so that we can zoom comfortably later
 37.2677 +	QRect rc = QRect( contentsX(), contentsY(),
 37.2678 +				  visibleWidth(), visibleHeight() );
 37.2679 +	QRect canvasRect = inverseWorldMatrix().mapRect(rc);
 37.2680 +	movingCenter.setX((canvasRect.right() + canvasRect.left())/2);
 37.2681 +	movingCenter.setY((canvasRect.top() + canvasRect.bottom())/2);
 37.2682 +}
 37.2683 +
 37.2684 +void MapEditor::contentsContextMenuEvent ( QContextMenuEvent * e )
 37.2685 +{
 37.2686 +	// Lineedits are already closed by preceding
 37.2687 +	// mouseEvent, we don't need to close here.
 37.2688 +
 37.2689 +    QPoint p = inverseWorldMatrix().map(e->pos());
 37.2690 +    LinkableMapObj* lmo=mapCenter->findMapObj(p, NULL);
 37.2691 +	
 37.2692 +    if (lmo) 
 37.2693 +	{	// MapObj was found
 37.2694 +		if (selection != lmo)
 37.2695 +		{
 37.2696 +			// select the MapObj
 37.2697 +			if (selection) selection->unselect();
 37.2698 +			selection=lmo;
 37.2699 +			selection->select();
 37.2700 +			adjustCanvasSize();
 37.2701 +		}
 37.2702 +		// Context Menu 
 37.2703 +		if (selection) 
 37.2704 +		{
 37.2705 +			if (typeid(*selection)==typeid(BranchObj) ||
 37.2706 +				typeid(*selection)==typeid(MapCenterObj) )
 37.2707 +			{
 37.2708 +				// Context Menu on branch or mapcenter
 37.2709 +				updateActions();
 37.2710 +				branchContextMenu->popup(e->globalPos() );
 37.2711 +			}	
 37.2712 +			if (typeid(*selection)==typeid(FloatImageObj))
 37.2713 +			{
 37.2714 +				// Context Menu on floatimage
 37.2715 +				updateActions();
 37.2716 +				floatimageContextMenu->popup(e->globalPos() );
 37.2717 +			}	
 37.2718 +		}	
 37.2719 +	} else 
 37.2720 +	{ // No MapObj found, we are on the Canvas itself
 37.2721 +		// Context Menu on Canvas
 37.2722 +		updateActions();
 37.2723 +		canvasContextMenu->popup(e->globalPos() );
 37.2724 +    } 
 37.2725 +}
 37.2726 +
 37.2727 +void MapEditor::contentsMousePressEvent(QMouseEvent* e)
 37.2728 +{
 37.2729 +	// Finish open lineEdits
 37.2730 +	if (lineedit) finishedLineEditNoSave();
 37.2731 +	
 37.2732 +    QPoint p = inverseWorldMatrix().map(e->pos());
 37.2733 +    LinkableMapObj* lmo=mapCenter->findMapObj(p, NULL);
 37.2734 +	
 37.2735 +	// Special case: CTRL is pressed, don't select anything
 37.2736 +	if (e->state() & QMouseEvent::ControlButton)
 37.2737 +	{
 37.2738 +		pickingColor=true;
 37.2739 +		setCursor (pickColorCursor);
 37.2740 +		return;
 37.2741 +	}
 37.2742 +
 37.2743 +    if (lmo) 
 37.2744 +	{	// MapObj was found
 37.2745 +		if (selection != lmo)
 37.2746 +		{
 37.2747 +			// select the MapObj
 37.2748 +			if (selection) selection->unselect();
 37.2749 +			selection=lmo;
 37.2750 +			selection->select();
 37.2751 +				
 37.2752 +			adjustCanvasSize();
 37.2753 +		}
 37.2754 +
 37.2755 +		// Check, if systemFlag clicked
 37.2756 +		if (typeid(*selection)==typeid(BranchObj) ||
 37.2757 +			typeid(*selection)==typeid(MapCenterObj) )
 37.2758 +		{
 37.2759 +			QString foname=((BranchObj*)(selection))->getSystemFlagName(p);
 37.2760 +			if (!foname.isEmpty())
 37.2761 +			{
 37.2762 +				// Do not move, if systemFlag clicked
 37.2763 +				if (foname=="url") 
 37.2764 +					openURL();
 37.2765 +				else
 37.2766 +					if (foname=="vymLink")
 37.2767 +					{
 37.2768 +						mainWindow->editOpenVymLink();
 37.2769 +						// tabWidget may change, better return now
 37.2770 +						// before segfaulting...
 37.2771 +						return;
 37.2772 +					} else
 37.2773 +						if (foname=="note")
 37.2774 +							mainWindow->windowToggleNoteEditor();
 37.2775 +			}			
 37.2776 +		}	
 37.2777 +			
 37.2778 +		// Left Button	    Move Branches
 37.2779 +		if (e->button() == QMouseEvent::LeftButton )
 37.2780 +		{
 37.2781 +			movingObj=selection;	
 37.2782 +			movingObj_start.setX( p.x() - selection->x() );	
 37.2783 +			movingObj_start.setY( p.y() - selection->y() );	
 37.2784 +		} else
 37.2785 +			// Middle Button    Toggle Scroll
 37.2786 +			// (On Mac OS X this won't work, but we still have 
 37.2787 +			// a button in the toolbar)
 37.2788 +			if (e->button() == QMouseEvent::MidButton )
 37.2789 +			{
 37.2790 +				toggleScroll();
 37.2791 +			} 
 37.2792 +		updateActions();
 37.2793 +	} else 
 37.2794 +	{ // No MapObj found, we are on the Canvas itself
 37.2795 +		// Left Button	    move Pos of CanvasView
 37.2796 +		if (e->button() == QMouseEvent::LeftButton )
 37.2797 +		{
 37.2798 +			movingObj=NULL;	// move Content not Obj
 37.2799 +			movingObj_start=e->globalPos();
 37.2800 +			movingCont_start=QPoint (contentsX(), contentsY() );
 37.2801 +			movingVec=QPoint(0,0);
 37.2802 +			setCursor(handOpenCursor);
 37.2803 +		} 
 37.2804 +    } 
 37.2805 +}
 37.2806 +
 37.2807 +void MapEditor::contentsMouseMoveEvent(QMouseEvent* e)
 37.2808 +{
 37.2809 +    // Move the selected MapObj
 37.2810 +    if ( selection && movingObj) 
 37.2811 +    {	
 37.2812 +		QPoint p = inverseWorldMatrix().map(e->pos());
 37.2813 +		
 37.2814 +		// Now move the selection, but add relative position (movingObj_start) 
 37.2815 +		// where selection 
 37.2816 +		// was chosen with mousepointer. (This avoids flickering resp. jumping 
 37.2817 +		// of selection back to absPos)
 37.2818 +		
 37.2819 +		LinkableMapObj *lmosel;
 37.2820 +		lmosel =  dynamic_cast <LinkableMapObj*> (selection);
 37.2821 +
 37.2822 +		// Check if we could link 
 37.2823 +		LinkableMapObj* lmo=mapCenter->findMapObj(p, lmosel);
 37.2824 +		
 37.2825 +
 37.2826 +		if (typeid(*selection) == typeid(FloatImageObj))
 37.2827 +		{
 37.2828 +			setChanged();
 37.2829 +			saveState();
 37.2830 +			FloatObj *fo=(FloatObj*)(selection);
 37.2831 +			if (fo->getLinkStyle()==StyleUndef) 
 37.2832 +			{
 37.2833 +				fo->setLinkStyle(fo->getDefLinkStyle());
 37.2834 +				fo->setLinkColor(fo->getParObj()->getLinkColor());
 37.2835 +			}	
 37.2836 +			fo->move   (p.x() -movingObj_start.x(), p.y()-movingObj_start.y() );		
 37.2837 +			fo->setRelPos();
 37.2838 +			fo->reposition();
 37.2839 +
 37.2840 +			// Relink float to new mapcenter or branch, if shift is pressed	
 37.2841 +			// Only relink, if selection really has a new parent
 37.2842 +			if ( (e->state() & QMouseEvent::ShiftButton) && lmo &&
 37.2843 +				( (typeid(*lmo)==typeid(BranchObj)) ||
 37.2844 +				  (typeid(*lmo)==typeid(MapCenterObj)) ) &&
 37.2845 +				( lmo != fo->getParObj())  
 37.2846 +				)
 37.2847 +			{
 37.2848 +				if (typeid(*fo) == typeid(FloatImageObj)) 
 37.2849 +				{
 37.2850 +					FloatImageObj *fio=(FloatImageObj*)(fo);
 37.2851 +					((BranchObj*)(lmo))->addFloatImage (fio);
 37.2852 +					fio->unselect();
 37.2853 +					((BranchObj*)(fio->getParObj()))->removeFloatImage (fio);
 37.2854 +					fio=((BranchObj*)(lmo))->getLastFloatImage();
 37.2855 +					fio->setRelPos();
 37.2856 +					fio->reposition();
 37.2857 +					selection=(LinkableMapObj*)(fio);
 37.2858 +					selection->select();
 37.2859 +					movingObj=(MapObj*)(fio);
 37.2860 +					// setLinkStyle calls updateLink, only set it once
 37.2861 +					if (fio->getLinkStyle()!=fio->getDefLinkStyle() ) 
 37.2862 +						fio->setLinkStyle (fio->getDefLinkStyle());
 37.2863 +
 37.2864 +				}	
 37.2865 +				// TODO if (typeid(*selection) == typeid(FloatTextObj))
 37.2866 +			}
 37.2867 +		} else	// selection != a FloatObj
 37.2868 +		{
 37.2869 +			if (lmosel->getDepth()==0)
 37.2870 +			{
 37.2871 +				if (e->state() == (LeftButton | !ShiftButton)) 
 37.2872 +					// If mapCenter is moved, move all the rest by default, too.
 37.2873 +					mapCenter->moveAll(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() );		
 37.2874 +				else	
 37.2875 +					mapCenter->move   (p.x() -movingObj_start.x(), p.y()-movingObj_start.y() );		
 37.2876 +			} else
 37.2877 +			{	
 37.2878 +				if (lmosel->getDepth()==1)
 37.2879 +				{
 37.2880 +					// depth==1, mainbranch
 37.2881 +					setChanged();
 37.2882 +					saveState(PartOfMap,lmosel);
 37.2883 +					lmosel->move(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() );		
 37.2884 +				} else
 37.2885 +				{
 37.2886 +					// depth>1
 37.2887 +					if (lmosel->getOrientation() == OrientLeftOfCenter)
 37.2888 +						// Add width of bbox here, otherwise alignRelTo will cause jumping around
 37.2889 +						lmosel->move(p.x() -movingObj_start.x()+lmosel->getBBox().width(), 
 37.2890 +							p.y()-movingObj_start.y() );		
 37.2891 +					else	
 37.2892 +						lmosel->move(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() );
 37.2893 +				} 
 37.2894 +				// reposition subbranch
 37.2895 +				lmosel->reposition();	
 37.2896 +				ensureSelectionVisible();
 37.2897 +
 37.2898 +				if (lmo && (lmo!=selection) &&  
 37.2899 +					(typeid(*lmo) == typeid(BranchObj) ||
 37.2900 +					(typeid(*lmo) == typeid(MapCenterObj) )
 37.2901 +					) )
 37.2902 +				{
 37.2903 +					if (e->state() & QMouseEvent::ControlButton)
 37.2904 +					{
 37.2905 +						// Special case: CTRL to link below lmo
 37.2906 +						lmosel->setParObjTmp (lmo,p,+1);
 37.2907 +					}
 37.2908 +					else if (e->state() & QMouseEvent::ShiftButton)
 37.2909 +						lmosel->setParObjTmp (lmo,p,-1);
 37.2910 +					else
 37.2911 +						lmosel->setParObjTmp (lmo,p,0);
 37.2912 +				} else	
 37.2913 +				{
 37.2914 +					if (lmo &&(lmo==selection))   
 37.2915 +						// Could link to myself (happens sometimes...)
 37.2916 +						lmosel->unsetParObjTmp();
 37.2917 +					if (!lmo)  
 37.2918 +						// no Obj under selection, go back to original Parent
 37.2919 +						lmosel->unsetParObjTmp();
 37.2920 +				}		
 37.2921 +			} // depth>0
 37.2922 +
 37.2923 +		} // no FloatImageObj
 37.2924 +
 37.2925 +		canvas()->update();
 37.2926 +		return;
 37.2927 +	} // selection && moving_obj
 37.2928 +		
 37.2929 +    // Move CanvasView 
 37.2930 +    if (!movingObj && !pickingColor) 
 37.2931 +	{
 37.2932 +		QPoint p=e->globalPos();
 37.2933 +		movingVec.setX(-p.x() + movingObj_start.x() );
 37.2934 +		movingVec.setY(-p.y() + movingObj_start.y() );
 37.2935 +		setContentsPos( movingCont_start.x() + movingVec.x(),
 37.2936 +	    movingCont_start.y() + movingVec.y());
 37.2937 +
 37.2938 +		updateViewCenter();
 37.2939 +    }
 37.2940 +}
 37.2941 +
 37.2942 +
 37.2943 +void MapEditor::contentsMouseReleaseEvent(QMouseEvent* e)
 37.2944 +{
 37.2945 +	LinkableMapObj *dst;
 37.2946 +	// Have we been picking color?
 37.2947 +	if (pickingColor)
 37.2948 +	{
 37.2949 +		pickingColor=false;
 37.2950 +		setCursor (ArrowCursor);
 37.2951 +		// Check if we are over another branch
 37.2952 +		dst=mapCenter->findMapObj(inverseWorldMatrix().map(e->pos() ), NULL);
 37.2953 +		if (dst && selection) 
 37.2954 +		{	
 37.2955 +			if (e->state() & QMouseEvent::ShiftButton)
 37.2956 +			{
 37.2957 +				((BranchObj*)(selection))->setColor (((BranchObj*)(dst))->getColor(),false);
 37.2958 +				((BranchObj*)(selection))->setLinkColor ();
 37.2959 +			}	
 37.2960 +			else	
 37.2961 +			{
 37.2962 +				((BranchObj*)(selection))->setColor (((BranchObj*)(dst))->getColor(),true);
 37.2963 +				((BranchObj*)(selection))->setLinkColor ();
 37.2964 +			}	
 37.2965 +		} 
 37.2966 +		return;
 37.2967 +	}
 37.2968 +    // Have we been moving something?
 37.2969 +    if ( selection && movingObj ) 
 37.2970 +    {	
 37.2971 +		// Check if we are over another branch, but ignore 
 37.2972 +		// any found LMOs, which are FloatObjs
 37.2973 +		dst=mapCenter->findMapObj(inverseWorldMatrix().map(e->pos() ), 
 37.2974 +			((LinkableMapObj*)(selection)) );
 37.2975 +
 37.2976 +		if (dst &&
 37.2977 +		(typeid(*dst)!=typeid(BranchObj)&&typeid(*dst)!=typeid(MapCenterObj))) 
 37.2978 +		{
 37.2979 +			dst=NULL;
 37.2980 +		}	
 37.2981 +		
 37.2982 +		// Now check, if we have been moving a branch 
 37.2983 +		if (typeid(*selection) == typeid(BranchObj)  )
 37.2984 +		{
 37.2985 +			// save the position in case we link to mapcenter
 37.2986 +			QPoint savePos=QPoint (selection->x(),selection->y() );
 37.2987 +
 37.2988 +			// Reset the temporary drawn link to the original one
 37.2989 +			((LinkableMapObj*)(selection))->unsetParObjTmp();
 37.2990 +
 37.2991 +			if (dst ) 
 37.2992 +			{   
 37.2993 +				setChanged();
 37.2994 +				saveState();
 37.2995 +				// TODO we also could check, if dest and src are on same branch,
 37.2996 +				// then it would be sufficient to saveState of this branch
 37.2997 +
 37.2998 +				// FIXME better introduce BO::move  to speed up and keep IDs
 37.2999 +				copy();			// copy selection to clipboard
 37.3000 +				cutNoSave();	// remove selection here
 37.3001 +
 37.3002 +				selection->unselect();	
 37.3003 +				selection=dst;
 37.3004 +				// Modifiers allow to insert above/below dst
 37.3005 +				if (e->state() & QMouseEvent::ShiftButton)
 37.3006 +				{
 37.3007 +					selection=pasteAtNoSave (((BranchObj*)(dst))->getNum());
 37.3008 +					if (selection) selection->select();
 37.3009 +				}	
 37.3010 +				else if (e->state() & QMouseEvent::ControlButton)
 37.3011 +				{
 37.3012 +					selection=pasteAtNoSave (((BranchObj*)(dst))->getNum()+1);
 37.3013 +					if (selection) selection->select();
 37.3014 +				}	
 37.3015 +				else	
 37.3016 +				{
 37.3017 +					selection=pasteNoSave();
 37.3018 +					selection->select();
 37.3019 +					if (dst->getDepth()==0) 
 37.3020 +						((BranchObj*)(selection))->move (savePos);
 37.3021 +				}	
 37.3022 +			} 
 37.3023 +			// Draw the original link, before selection was moved around
 37.3024 +			mapCenter->reposition();
 37.3025 +		}
 37.3026 +		// Finally resize canvas, if needed
 37.3027 +		adjustCanvasSize();
 37.3028 +		canvas()->update();
 37.3029 +		movingObj=NULL;		
 37.3030 +	} else 
 37.3031 +	{	// maybe we moved View: set old cursor
 37.3032 +		setCursor (ArrowCursor);
 37.3033 +    }
 37.3034 +}
 37.3035 +
 37.3036 +void MapEditor::contentsMouseDoubleClickEvent(QMouseEvent* e)
 37.3037 +{
 37.3038 +	// Finish open lineEdits
 37.3039 +	if (lineedit) finishedLineEditNoSave();
 37.3040 +	
 37.3041 +	if (e->button() == QMouseEvent::LeftButton )
 37.3042 +	{
 37.3043 +		QPoint p = inverseWorldMatrix().map(e->pos());
 37.3044 +		LinkableMapObj *lmo=mapCenter->findMapObj(p, NULL);
 37.3045 +		if (lmo) {	// MapObj was found
 37.3046 +			// First select the MapObj than edit heading
 37.3047 +			if (selection) selection->unselect();
 37.3048 +			selection=lmo;
 37.3049 +			selection->select();
 37.3050 +			setChanged();
 37.3051 +			saveState(PartOfMap,selection);
 37.3052 +			editHeading();
 37.3053 +		}
 37.3054 +	}
 37.3055 +}
 37.3056 +
 37.3057 +void MapEditor::resizeEvent (QResizeEvent* e)
 37.3058 +{
 37.3059 +	QCanvasView::resizeEvent( e );
 37.3060 +	
 37.3061 +	QString s="";
 37.3062 +	if (!fileName.isEmpty()) s=fileName;
 37.3063 +	adjustCanvasSize();
 37.3064 +}
 37.3065 +
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/mapeditor.h	Sun Jan 30 12:58:47 2005 +0000
    38.3 @@ -0,0 +1,197 @@
    38.4 +#ifndef MAPEDITOR_H
    38.5 +#define MAPEDITOR_H
    38.6 +
    38.7 +#include <qcanvas.h>
    38.8 +#include <qlineedit.h>
    38.9 +#include <qcursor.h>
   38.10 +#include <qfiledialog.h>
   38.11 +#include <qevent.h>
   38.12 +#include <qprocess.h>
   38.13 +
   38.14 +#include "mapcenterobj.h"
   38.15 +#include "misc.h"
   38.16 +
   38.17 +class MapEditor : public QCanvasView , public xmlObj {
   38.18 +    Q_OBJECT
   38.19 +
   38.20 +public:
   38.21 +    MapEditor(QWidget* parent=0, bool interactive=false, const char* name=0, WFlags f=0);
   38.22 +	~MapEditor();
   38.23 +    QColor color();
   38.24 +    QColor backgroundColor();
   38.25 +    MapCenterObj* getMapCenter();
   38.26 +	QCanvas* getCanvas();
   38.27 +	void adjustCanvasSize();// adjust canvas size to map and scrollview
   38.28 +	bool blockReposition(); // block while load or undo
   38.29 +	
   38.30 +private:
   38.31 +	void makeTmpDirs();		// create temporary directories
   38.32 +	void delTmpDirs();		// delete temporary directories
   38.33 +	void makeSubDirs(const QString&);		
   38.34 +							// create subdirs in dir
   38.35 +    QString saveToDir(const QString&,const QString &,bool, const QPoint
   38.36 +	&,SaveMode);
   38.37 +    void saveState();		// save actual state to backup
   38.38 +    void saveState(const SaveMode&, LinkableMapObj *);
   38.39 +
   38.40 +private slots:
   38.41 +    void finishedLineEditNoSave();
   38.42 +
   38.43 +public:
   38.44 +	bool isDefault();		// false, if map was changed once
   38.45 +    bool isUnsaved();		// save necessary
   38.46 +    bool hasChanged();		// undo possible
   38.47 +	void setChanged();		// called from NoteEditor via LMO
   38.48 +	void closeMap();
   38.49 +	void setFilePath (QString);	
   38.50 +	void setFilePath (QString,QString);	
   38.51 +	QString getFilePath ();	// Full path e.g. "/home/tux/map.xml"
   38.52 +	QString getFileName ();	// e.g. "map.xml"
   38.53 +	QString getMapName ();	// e.g. "map"
   38.54 +	QString getDestPath (); // e.g. "/home/tux/map.vym"
   38.55 +    int load (QString&, const LoadMode &);	// newmap, import/replace selection
   38.56 +    int save(const SaveMode &);	// Save map 
   38.57 +	void setZipped(bool);		// save map zipped
   38.58 +	bool saveZipped();			// 1 if file will be saved zipped
   38.59 +    void print();				// print canvas
   38.60 +private:
   38.61 +    QPixmap getPixmap();
   38.62 +public:
   38.63 +    void exportImage (QString fn);		// export as PNG	
   38.64 +    void exportImage (QString fn, int);	// export in given format
   38.65 +    void exportASCII();
   38.66 +    void exportXML(const QString&);		// export to directory
   38.67 +    void clear();		// clear map
   38.68 +    void undo();		// undo last action
   38.69 +    void copy();		// copy branch to clipboard
   38.70 +private:	
   38.71 +    LinkableMapObj* pasteNoSave();		// paste clipboard to branch
   38.72 +    LinkableMapObj* pasteAtNoSave(int);	// paste clipboard to branch at position i
   38.73 +    void cutNoSave();	// cut to clipboard
   38.74 +public:	
   38.75 +    void paste();		// paste clipboard to branch and backup
   38.76 +    void cut();			// cut to clipboard and backup
   38.77 +    void moveBranchUp();
   38.78 +    void moveBranchDown();
   38.79 +    void editHeading();
   38.80 +    void addNewBranch(int);			// pos allows to add above/below selection
   38.81 +    void deleteSelection();
   38.82 +	LinkableMapObj* getSelection();	// returns selection
   38.83 +	bool select(QString );			// Select 
   38.84 +	void unselect();				// before changing current noteedit
   38.85 +	void reselect();				// after  changing current noteedit
   38.86 +private:	
   38.87 +	void selectNextBranch();		// Increment number of branch
   38.88 +	void selectPrevBranch();		// Decrement number of branch
   38.89 +public:	
   38.90 +    void selectUpperBranch();
   38.91 +    void selectLowerBranch();
   38.92 +    void selectLeftBranch();
   38.93 +    void selectRightBranch();
   38.94 +    void selectFirstBranch();
   38.95 +    void selectLastBranch();
   38.96 +    void setColor(QColor);
   38.97 +    void selectBackgroundColor();
   38.98 +    void setBackgroundColor(QColor);
   38.99 +    QColor pickColor();
  38.100 +    void colorItem();
  38.101 +    void colorBranch();
  38.102 +	void toggleStandardFlag(QString);
  38.103 +	virtual void setViewCenter();			// needed for zooming
  38.104 +    BranchObj* findText(QString,bool);		// Find object
  38.105 +    void findReset();						// Reset Find 
  38.106 +	void openURL();							// open URL in external browser
  38.107 +	void editURL();							// edit the URL
  38.108 +	void editHeading2URL();					// copy heading to URL
  38.109 +	void editBugzilla2URL();				// create URL to Bugzilla
  38.110 +	void editVymLink();						// edit link to another map
  38.111 +	void deleteVymLink();					// delete link to another map
  38.112 +	QString getVymLink();					// return path to map
  38.113 +	void editMapInfo();						// dialog to enter author, ...
  38.114 +	void updateActions();					// update e.g. format buttons
  38.115 +	void setLinkStyle (LinkStyle);			// Set style of link
  38.116 +	LinkStyle getLinkStyle ();				// requested in LMO
  38.117 +	void setLinkColor(QColor);				// default color of links
  38.118 +	void setLinkColorHint();				// color of links
  38.119 +	void setLinkColorHint(LinkColorHint);	// color of links
  38.120 +	LinkColorHint getLinkColorHint();
  38.121 +	QColor getDefLinkColor();
  38.122 +	void toggleLinkColorHint();				// after changing linkStyles
  38.123 +    void selectLinkColor();
  38.124 +    void toggleScroll();
  38.125 +    void unScrollAll();
  38.126 +	void loadFloatImage ();
  38.127 +	void saveFloatImage (int);
  38.128 +	void toggleFloatExport();
  38.129 +	void setFrame(const FrameType &);
  38.130 +private:	
  38.131 +    void importDir(BranchObj *,QDir);
  38.132 +public:	
  38.133 +    void importDir();
  38.134 +    void testFunction();				// FIXME just testing
  38.135 +
  38.136 +protected:
  38.137 +	void ensureSelectionVisible();		
  38.138 +	virtual void updateViewCenter();	// needed for zooming
  38.139 +	virtual void contentsContextMenuEvent ( QContextMenuEvent *e );
  38.140 +    virtual void contentsMousePressEvent(QMouseEvent*);
  38.141 +    virtual void contentsMouseReleaseEvent(QMouseEvent*);
  38.142 +    virtual void contentsMouseDoubleClickEvent(QMouseEvent*);
  38.143 +    virtual void contentsMouseMoveEvent(QMouseEvent*);
  38.144 +
  38.145 +private:
  38.146 +    QCanvas* mapCanvas;
  38.147 +    MapCenterObj* mapCenter;
  38.148 +
  38.149 +	bool adjustCanvasRequested;	// collect requests until end of user event
  38.150 +	BranchObj *editingBO;		// entering Text into BO
  38.151 +    QLineEdit* lineedit;
  38.152 +
  38.153 +    QColor actColor;			// actual color
  38.154 +	QColor deflinkcolor;		// default color for links
  38.155 +	LinkColorHint linkcolorhint;// use heading color or own color
  38.156 +	LinkStyle linkstyle;		// default style for links
  38.157 +
  38.158 +    QCursor handOpenCursor;		// cursor while moving canvas view
  38.159 +	QCursor pickColorCursor;	// cursor while picking color 
  38.160 +	bool pickingColor;			// true while picking Color CTRL-LeftButton
  38.161 +	
  38.162 +    LinkableMapObj* selection;		// select a LinkableMapObj
  38.163 +    LinkableMapObj* selectionLast;	// last selection 
  38.164 +    MapObj* movingObj;				// moving a MapObj
  38.165 +    QPoint movingObj_start;			// rel. pos of mouse to absPos 
  38.166 +    QPoint movingCont_start;		// inital pos of moving Content or
  38.167 +    QPoint movingVec;				// how far has Content moved
  38.168 +	QPoint movingCenter;			// used when zooming
  38.169 +    QPrinter* printer;				// Printing
  38.170 +
  38.171 +    bool mapDefault;				// Flag if map is untouched
  38.172 +    bool mapChanged;				// Flag if undo is possible
  38.173 +	bool mapUnsaved;				// Flag if map should be saved
  38.174 +    QString backupXML;				// backup (XML) for undo
  38.175 +	LinkableMapObj* undoSelection;	// replace this LMO with vympart from backup
  38.176 +									// if != NULL
  38.177 +
  38.178 +	bool printFrame;			// Print frame around map
  38.179 +	bool printFooter;			// Print footer below map
  38.180 +
  38.181 +	bool zipped;				// should map be zipped
  38.182 +	QString fileName;			// short name of file (for tab)
  38.183 +	QString filePath;			// path to file which will be saved
  38.184 +	QString fileDir;			// dir where file is saved
  38.185 +	QString destPath;			// path to .vym file (needed for vymlinks)
  38.186 +	QString mapName;			// fileName without ".vym"
  38.187 +	QString lastImageDir;		// save dir for adding images
  38.188 +
  38.189 +	bool isInteractive;			// non interactive don't need tmpdirs
  38.190 +	QString bakMapDir;			// tmp directory with data for undo
  38.191 +	bool blockreposition;		// block while load or undo
  38.192 +
  38.193 +	BranchObj* itFind;			// next object in find process
  38.194 +	bool EOFind;				// true, if search failed
  38.195 +
  38.196 +	QPoint exportOffset;		// set before export, used in save
  38.197 +    void resizeEvent( QResizeEvent * );
  38.198 +};
  38.199 +#endif
  38.200 +
    39.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    39.2 +++ b/mapobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    39.3 @@ -0,0 +1,143 @@
    39.4 +#include "mapobj.h"
    39.5 +
    39.6 +/////////////////////////////////////////////////////////////////
    39.7 +// MapObj
    39.8 +/////////////////////////////////////////////////////////////////
    39.9 +MapObj::MapObj ()
   39.10 +{
   39.11 +	// TODO not used any longer...
   39.12 +	cout << "Const MapObj (): Please set canvas somehow!!!\n";
   39.13 +    // canvas=actMapEditor->getCanvas();
   39.14 +    init ();
   39.15 +}
   39.16 +
   39.17 +MapObj::MapObj (QCanvas* c)
   39.18 +{
   39.19 +//  cout << "Const MapObj\n";
   39.20 +    canvas=c;
   39.21 +    init ();
   39.22 +}
   39.23 +
   39.24 +
   39.25 +MapObj::MapObj (MapObj* mo)
   39.26 +{
   39.27 +//    cout << "CopyConst MapObj\n";
   39.28 +    copy (mo);
   39.29 +}
   39.30 +
   39.31 +MapObj::~MapObj ()
   39.32 +{
   39.33 +//    cout << "Destr MapObj\n";
   39.34 +}
   39.35 +
   39.36 +void MapObj::init ()
   39.37 +{
   39.38 +    absPos=QPoint(0,0);
   39.39 +    visible=true;
   39.40 +}
   39.41 +
   39.42 +void MapObj::copy(MapObj* other)
   39.43 +{
   39.44 +//    canvas=other->canvas;	// already set in constr. of child, use that one...
   39.45 +    absPos=other->absPos;
   39.46 +	bbox.setX (other->bbox.x() );
   39.47 +	bbox.setY (other->bbox.y() );
   39.48 +	bbox.setSize (QSize(other->bbox.width(), other->bbox.height() ) );
   39.49 +}
   39.50 +
   39.51 +QCanvas* MapObj::getCanvas()
   39.52 +{
   39.53 +	return canvas;
   39.54 +}
   39.55 +
   39.56 +int MapObj::x() 
   39.57 +{
   39.58 +    return absPos.x();
   39.59 +}
   39.60 +
   39.61 +int MapObj::y() 
   39.62 +{
   39.63 +    return absPos.y();
   39.64 +}
   39.65 +
   39.66 +int MapObj::width() 
   39.67 +{
   39.68 +    return bbox.width();
   39.69 +}
   39.70 +
   39.71 +int MapObj::height() 
   39.72 +{
   39.73 +    return bbox.height();
   39.74 +}
   39.75 +
   39.76 +void MapObj::move (double x, double y) 
   39.77 +{
   39.78 +    int xi=static_cast <int> (x);
   39.79 +    int yi=static_cast <int> (y);
   39.80 +    absPos.setX( xi);
   39.81 +    absPos.setY( yi);
   39.82 +    bbox.moveTopLeft(QPoint(xi,yi));
   39.83 +}
   39.84 +
   39.85 +void MapObj::moveBy (double x, double y) 
   39.86 +{
   39.87 +    move (x+absPos.x(),y+absPos.y() );
   39.88 +}
   39.89 +
   39.90 +bool MapObj::inBBox(QPoint p)
   39.91 +{
   39.92 +    if (p.x() >= bbox.left() && p.x() <= bbox.right()  
   39.93 +	&& p.y() <= bbox.bottom() && p.y() >= bbox.top() )
   39.94 +	return true;
   39.95 +    return false;	
   39.96 +}
   39.97 +
   39.98 +QRect MapObj::getBBox()
   39.99 +{
  39.100 +    return bbox;
  39.101 +}
  39.102 +
  39.103 +QRect MapObj::addBBox(QRect r1, QRect r2)
  39.104 +{
  39.105 +	QRect n;
  39.106 +	// Set left border
  39.107 +	if (r1.left() <= r2.left() )
  39.108 +		n.setLeft(r1.left() );
  39.109 +	else
  39.110 +		n.setLeft(r2.left() );
  39.111 +		
  39.112 +	// Set top border		
  39.113 +	if (r1.top() <= r2.top() )
  39.114 +		n.setTop(r1.top() );
  39.115 +	else
  39.116 +		n.setTop(r2.top() );
  39.117 +		
  39.118 +	// Set right border
  39.119 +	if (r1.right() <= r2.right() )
  39.120 +		n.setRight(r2.right() );
  39.121 +	else
  39.122 +		n.setRight(r1.right() );
  39.123 +		
  39.124 +	// Set bottom 
  39.125 +	if (r1.bottom() <= r2.bottom() )
  39.126 +		n.setBottom(r2.bottom() );
  39.127 +	else
  39.128 +		n.setBottom(r1.bottom() );
  39.129 +	return n;
  39.130 +}
  39.131 +
  39.132 +QSize MapObj::getSize()
  39.133 +{
  39.134 +    return bbox.size();
  39.135 +}
  39.136 +
  39.137 +
  39.138 +bool MapObj::isVisibleObj()
  39.139 +{
  39.140 +    return visible;
  39.141 +}
  39.142 +
  39.143 +void MapObj::setVisibility(bool v)
  39.144 +{
  39.145 +    visible=v;
  39.146 +}
    40.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.2 +++ b/mapobj.h	Sun Jan 30 12:58:47 2005 +0000
    40.3 @@ -0,0 +1,48 @@
    40.4 +#ifndef MAPOBJ_H
    40.5 +#define MAPOBJ_H
    40.6 +
    40.7 +#include <qcanvas.h>
    40.8 +#include <iostream>
    40.9 +
   40.10 +#include "misc.h"
   40.11 +
   40.12 +using namespace std;
   40.13 +
   40.14 +#define Z_BBOX     0
   40.15 +#define Z_LINK    20
   40.16 +#define Z_FRAME   50
   40.17 +#define Z_SELBOX  60
   40.18 +#define Z_ICON    80
   40.19 +#define Z_TEXT   100
   40.20 +
   40.21 +class MapObj:public xmlObj {
   40.22 +public:
   40.23 +    MapObj ();
   40.24 +    MapObj (QCanvas*);
   40.25 +    MapObj (MapObj*);
   40.26 +    virtual ~MapObj ();
   40.27 +    virtual void init ();
   40.28 +    virtual void copy (MapObj*);
   40.29 +	virtual QCanvas* getCanvas();
   40.30 +    virtual int x();
   40.31 +    virtual int y();
   40.32 +	virtual int width();
   40.33 +	virtual int height();
   40.34 +    virtual void move (double x,double y);      // move to absolute Position
   40.35 +    virtual void moveBy (double x,double y);    // move to relative Position
   40.36 +    virtual bool inBBox(QPoint);				// Check if Point is in bbox
   40.37 +    virtual QRect getBBox();					// returns bounding box
   40.38 +    virtual QRect addBBox(QRect,QRect);			// returns bbox which includes both boxes
   40.39 +    virtual QSize getSize();					// returns size of bounding box
   40.40 +    virtual bool isVisibleObj();
   40.41 +    virtual void setVisibility(bool);
   40.42 +protected:  
   40.43 +    QCanvas* canvas;
   40.44 +    QRect bbox;									// bounding box of MO itself
   40.45 +    virtual void positionBBox()=0;       
   40.46 +	virtual void calcBBoxSize()=0;
   40.47 +    QPoint absPos;							    // Position on canvas
   40.48 +    bool visible;
   40.49 +};
   40.50 +
   40.51 +#endif
    41.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    41.2 +++ b/misc.cpp	Sun Jan 30 12:58:47 2005 +0000
    41.3 @@ -0,0 +1,238 @@
    41.4 +#include <qregexp.h>
    41.5 +#include <qpoint.h>
    41.6 +
    41.7 +#include <math.h>
    41.8 +
    41.9 +#include "misc.h"
   41.10 +
   41.11 +
   41.12 +ostream &operator<< (ostream &stream, QPoint const &p)
   41.13 +{ 
   41.14 +    return (stream << "(" << p.x() << "," << p.y() << ")");
   41.15 +}
   41.16 +
   41.17 +float getAngle(const QPoint &p)
   41.18 +{	
   41.19 +	// Calculate angle of vector to y-axis
   41.20 +	if (p.y()==0)
   41.21 +	{
   41.22 +		if (p.x()>=0)
   41.23 +			return M_PI_2;
   41.24 +		else
   41.25 +			return 3* M_PI_2;
   41.26 +	} else
   41.27 +	{
   41.28 +		if (p.y()>0) 
   41.29 +			return (float)(M_PI  - atan ( (double)(p.x()) / (double)(p.y()) ) );
   41.30 +		else	
   41.31 +			if (p.x()<0)
   41.32 +				return (float)( 2*M_PI - atan ( (double)(p.x()) / (double)(p.y()) ) );
   41.33 +			else	
   41.34 +				return (float)( - atan ( (double)(p.x()) / (double)(p.y()) ) );
   41.35 +	}	
   41.36 +}
   41.37 +
   41.38 +QPoint normalise(const QPoint &p)
   41.39 +{	
   41.40 +	// Calculate normalised position (fixed length) 
   41.41 +
   41.42 +	double px=p.x();
   41.43 +	double py=p.y();
   41.44 +	double x;
   41.45 +	double y;
   41.46 +	double r=150;
   41.47 +
   41.48 +	if (px==0)
   41.49 +	{
   41.50 +		x=0;
   41.51 +		if (py>=0)
   41.52 +			y=r;
   41.53 +		else
   41.54 +			y=-r;
   41.55 +	} else
   41.56 +	{
   41.57 +		double sign;
   41.58 +		double a;
   41.59 +		if (px>0) 
   41.60 +			sign=1; 
   41.61 +		else 
   41.62 +			sign=-1;
   41.63 +		
   41.64 +		a=atan (py / px);
   41.65 +		x=cos (a) * r *sign;
   41.66 +		y=sin (a) * r *sign;
   41.67 +	}	
   41.68 +	return QPoint ((int) (x),(int) (y));
   41.69 +}
   41.70 +
   41.71 +QString maskPath(QString p)
   41.72 +{
   41.73 +	// Change " " to "\ " to enable blanks in filenames
   41.74 +	p=p.replace(QChar('&'),"\\&");
   41.75 +	return p.replace(QChar(' '),"\\ ");
   41.76 +}
   41.77 +
   41.78 +QString convertToRel (const QString &src, const QString &dst)
   41.79 +{
   41.80 +	QString s=src;
   41.81 +	QString d=dst;
   41.82 +	int i;
   41.83 +	// Find relative path from src to dst
   41.84 +
   41.85 +	// Remove the first "/"
   41.86 +	if (s.section ("/",0,0).isEmpty()) 
   41.87 +	{
   41.88 +		s=s.right (s.length()-1);
   41.89 +		d=d.right (d.length()-1);
   41.90 +	}
   41.91 +	
   41.92 +	// remove identical left parts
   41.93 +	while (s.section("/",0,0) == d.section("/",0,0) ) 
   41.94 +	{
   41.95 +		i=s.find ("/");
   41.96 +		s=s.right (s.length()-i-1);
   41.97 +		d=d.right (d.length()-i-1);
   41.98 +	}
   41.99 +
  41.100 +	int srcsep=s.contains("/");
  41.101 +	int dstsep=d.contains("/");
  41.102 +	if (srcsep >=  dstsep )
  41.103 +	{
  41.104 +		// find path to go up first and then back to dst
  41.105 +		i=1;
  41.106 +		while (i<=srcsep) 
  41.107 +		{
  41.108 +			d="../"+d;
  41.109 +			i++;
  41.110 +		}	
  41.111 +	}
  41.112 +	return d;
  41.113 +}
  41.114 +
  41.115 +// returns masked "<" ">" "&"
  41.116 +QString quotemeta(const QString &s)
  41.117 +{
  41.118 +	QString r=s;
  41.119 +    QRegExp  rx("&(?!amp;)");
  41.120 +    r.replace ( rx,"&");
  41.121 +    rx.setPattern( ">");
  41.122 +    r.replace ( rx,">");
  41.123 +    rx.setPattern( "<");
  41.124 +    r.replace ( rx,"<");
  41.125 +    rx.setPattern( "\"");
  41.126 +    r.replace ( rx,""");
  41.127 +    return r;
  41.128 +}
  41.129 +
  41.130 +int max(int a, int b)
  41.131 +{
  41.132 +	if (a>b)
  41.133 +		return a;
  41.134 +	return b;
  41.135 +}
  41.136 +
  41.137 +int xmlObj::actindent=0;		// make instance of actindent
  41.138 +
  41.139 +xmlObj::xmlObj()
  41.140 +{
  41.141 +    indentwidth=4;
  41.142 +}
  41.143 +
  41.144 +
  41.145 +// returns <s at />
  41.146 +QString xmlObj::singleElement(QString s, QString at)
  41.147 +{
  41.148 +    return indent() + "<" + s +" " + at +" " + "/>\n";
  41.149 +}
  41.150 +
  41.151 +// returns <s>
  41.152 +QString xmlObj::beginElement(QString s)
  41.153 +{
  41.154 +    return indent() + "<" + s + ">\n";
  41.155 +}
  41.156 +
  41.157 +// returns <s at>
  41.158 +QString xmlObj::beginElement(QString s, QString at)
  41.159 +{
  41.160 +    return indent() + "<" + s + " " + at + ">\n";
  41.161 +}
  41.162 +
  41.163 +// returns </s>
  41.164 +QString xmlObj::endElement(QString s)
  41.165 +{
  41.166 +    return indent() + "</" + s + ">\n";
  41.167 +}
  41.168 +
  41.169 +// returns  at="val"
  41.170 +QString xmlObj::attribut(QString at, QString val)
  41.171 +{
  41.172 +    return " " + at + "=\"" + quotemeta (val) + "\""; 
  41.173 +}
  41.174 +
  41.175 +// returns <s> val </s>
  41.176 +QString xmlObj::valueElement(QString el, QString val)
  41.177 +{
  41.178 +    return indent() + "<" + el + ">" + quotemeta(val) + "</" +el + ">\n";
  41.179 +}
  41.180 +
  41.181 +// returns <s at> val </s>
  41.182 +QString xmlObj::valueElement(QString el, QString val, QString at)
  41.183 +{
  41.184 +    return indent() + "<" + el + " " + at + ">" + quotemeta(val) + "</" +el + ">\n";
  41.185 +}
  41.186 +
  41.187 +void xmlObj::incIndent()
  41.188 +{
  41.189 +    actindent++;
  41.190 +}	
  41.191 +
  41.192 +void xmlObj::decIndent()
  41.193 +{
  41.194 +    actindent--;
  41.195 +    if (actindent<0) actindent=0;
  41.196 +}	
  41.197 +
  41.198 +QString xmlObj::indent()
  41.199 +{
  41.200 +    QString s;
  41.201 +    int i;
  41.202 +    for (i=0; i<actindent*indentwidth; i++)
  41.203 +    {
  41.204 +		s= s + " ";
  41.205 +    }
  41.206 +    return s;
  41.207 +}	
  41.208 +
  41.209 +
  41.210 +
  41.211 +ImagePreview::ImagePreview (QWidget *parent=0): QLabel (parent)
  41.212 +{
  41.213 +}
  41.214 +
  41.215 +void ImagePreview::previewUrl( const QUrl &u )
  41.216 +{
  41.217 +    QString path = u.path();
  41.218 +    QPixmap pix( path );
  41.219 +    if ( pix.isNull() )
  41.220 +        setText( QObject::tr("This is not an image.") );
  41.221 +    else
  41.222 +	{
  41.223 +		float max_w=300;
  41.224 +		float max_h=300;
  41.225 +		float r;
  41.226 +		if (pix.width()>max_w)
  41.227 +		{
  41.228 +			r=max_w / pix.width();
  41.229 +			pix.resize(lrint(pix.width()*r), lrint(pix.height()*r));
  41.230 +			// TODO not a resize, but a shrink/enlarge is needed here...
  41.231 +		}
  41.232 +		if (pix.height()>max_h)
  41.233 +		{
  41.234 +			r=max_h / pix.height();
  41.235 +			pix.resize(lrint(pix.width()*r), lrint(pix.height()*r));
  41.236 +			// TODO not a resize, but a shrink/enlarge is needed here...
  41.237 +		}
  41.238 +        setPixmap( pix );
  41.239 +	}	
  41.240 +}
  41.241 +
    42.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    42.2 +++ b/misc.h	Sun Jan 30 12:58:47 2005 +0000
    42.3 @@ -0,0 +1,64 @@
    42.4 +#ifndef MISC_H
    42.5 +#define MISC_H
    42.6 +
    42.7 +#include <qpoint.h>
    42.8 +#include <iostream>
    42.9 +
   42.10 +using namespace std;
   42.11 +
   42.12 +#define Z_BBOX     0
   42.13 +#define Z_LINK    20
   42.14 +#define Z_FRAME   50
   42.15 +#define Z_SELBOX  60
   42.16 +#define Z_ICON    80
   42.17 +#define Z_TEXT   100
   42.18 +
   42.19 +enum LoadMode {NewMap,ImportAdd,ImportReplace};
   42.20 +enum SaveMode {PartOfMap,CompleteMap};
   42.21 +
   42.22 +/////////////////////////////////////////////////////////////////////////////
   42.23 +extern ostream &operator<< (ostream &stream, QPoint const &p);
   42.24 +float getAngle(const QPoint &);
   42.25 +QPoint normalise (const QPoint &);
   42.26 +QString maskPath (QString );
   42.27 +QString convertToRel (const QString &,const QString &);
   42.28 +QString quotemeta(const QString&);	
   42.29 +int max (int,int);
   42.30 +class BranchObj;
   42.31 +class MapEditor;
   42.32 +
   42.33 +/////////////////////////////////////////////////////////////////////////////
   42.34 +class xmlObj
   42.35 +{
   42.36 +public:
   42.37 +    xmlObj();
   42.38 +    QString singleElement(QString,QString);
   42.39 +    QString beginElement(QString,QString);
   42.40 +    QString beginElement(QString);
   42.41 +    QString endElement  (QString);
   42.42 +    QString attribut    (QString,QString);
   42.43 +    QString valueElement(QString,QString);
   42.44 +    QString valueElement(QString,QString,QString);
   42.45 +    void incIndent();
   42.46 +    void decIndent();
   42.47 +    static int actindent;
   42.48 +
   42.49 +protected:  
   42.50 +    QString indent();
   42.51 +    int indentwidth;
   42.52 +};
   42.53 +
   42.54 +/////////////////////////////////////////////////////////////////////////////
   42.55 +
   42.56 +#include <qlabel.h>
   42.57 +#include <qfiledialog.h>
   42.58 +#include <qpixmap.h>
   42.59 +
   42.60 +class ImagePreview : public QLabel, public QFilePreview
   42.61 +{
   42.62 +public:
   42.63 +    ImagePreview( QWidget * );
   42.64 +    void previewUrl( const QUrl & );
   42.65 +};
   42.66 +
   42.67 +#endif
    43.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    43.2 +++ b/noteobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    43.3 @@ -0,0 +1,105 @@
    43.4 +#include <qfile.h>
    43.5 +#include <qtextstream.h>
    43.6 +#include <qmessagebox.h>
    43.7 +#include <qregexp.h>
    43.8 +
    43.9 +#include "noteobj.h"
   43.10 +
   43.11 +/////////////////////////////////////////////////////////////////
   43.12 +// NoteObj
   43.13 +/////////////////////////////////////////////////////////////////
   43.14 +
   43.15 +NoteObj::NoteObj()
   43.16 +{
   43.17 +	clear();
   43.18 +}
   43.19 +
   43.20 +void NoteObj::copy (NoteObj other)
   43.21 +{
   43.22 +	note=other.note;
   43.23 +	fonthint=other.fonthint;
   43.24 +	filenamehint="";
   43.25 +}
   43.26 +
   43.27 +void NoteObj::clear()
   43.28 +{
   43.29 +	note="";
   43.30 +	fonthint="undef";
   43.31 +	filenamehint="";
   43.32 +}
   43.33 +
   43.34 +void NoteObj::setNote (const QString &s)
   43.35 +{
   43.36 +	note=s;
   43.37 +}
   43.38 +
   43.39 +QString NoteObj::getNote()
   43.40 +{
   43.41 +	return note;
   43.42 +}
   43.43 +
   43.44 +void NoteObj::setFontHint (const QString &s)
   43.45 +{
   43.46 +	// only for backward compatibility (pre 1.5 )
   43.47 +	fonthint=s;
   43.48 +}
   43.49 +
   43.50 +QString NoteObj::getFontHint()
   43.51 +{
   43.52 +	// only for backward compatibility (pre 1.5 )
   43.53 +	return fonthint;
   43.54 +}
   43.55 +
   43.56 +void NoteObj::setFilenameHint (const QString &s)
   43.57 +{
   43.58 +	filenamehint=s;
   43.59 +}
   43.60 +
   43.61 +QString NoteObj::getFilenameHint()
   43.62 +{
   43.63 +	return filenamehint;
   43.64 +}
   43.65 +
   43.66 +bool NoteObj::isEmpty ()
   43.67 +{
   43.68 +	return note.isEmpty();
   43.69 +}
   43.70 +
   43.71 +QString NoteObj::saveToDir ()
   43.72 +{
   43.73 +	// QTextEdit may generate fontnames with unquoted &, like
   43.74 +	// in "Lucida B&H". This is invalid in XML and thus would crash
   43.75 +	// the XML parser
   43.76 +	uint pos=0;
   43.77 +	uint pos2;
   43.78 +	bool inbracket=false;
   43.79 +	bool inquot=false;
   43.80 +	while (pos<note.length())
   43.81 +	{
   43.82 +		if (note.mid(pos,1)=="<") inbracket=true;
   43.83 +		if (note.mid(pos,1)==">") inbracket=false;
   43.84 +		if (note.mid(pos,1)=="\"" && inbracket)
   43.85 +		{
   43.86 +			if (!inquot)
   43.87 +				inquot=true;
   43.88 +			else
   43.89 +				inquot=false;
   43.90 +		}
   43.91 +		if (note.mid(pos,1)=="&" && inquot)
   43.92 +		{
   43.93 +			// Now we are inside  <  "  "  >
   43.94 +			// look for ending "
   43.95 +			pos2=pos+1;
   43.96 +			while (note.mid(pos2,1)!=";" && note.mid(pos2,1)!="\"")
   43.97 +				pos2++;
   43.98 +			if (note.mid(pos2,1)=="\"")
   43.99 +			{
  43.100 +				note.replace(pos,1,"&");
  43.101 +				pos=pos2;
  43.102 +			}
  43.103 +		}
  43.104 +		pos++;
  43.105 +	}
  43.106 +	return beginElement ("htmlnote",attribut("fonthint",fonthint)) + "\n"+ note+ "\n" +endElement ("htmlnote");
  43.107 +}
  43.108 +
    44.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    44.2 +++ b/noteobj.h	Sun Jan 30 12:58:47 2005 +0000
    44.3 @@ -0,0 +1,30 @@
    44.4 +#ifndef NOTEOBJ_H
    44.5 +#define NOTEOBJ_H
    44.6 +
    44.7 +#include <qstring.h>
    44.8 +
    44.9 +class NoteObj;
   44.10 +
   44.11 +#include "misc.h"
   44.12 +
   44.13 +class NoteObj:public xmlObj
   44.14 +{
   44.15 +public:
   44.16 +	NoteObj();
   44.17 +	void copy (NoteObj);
   44.18 +	void clear();
   44.19 +	void setNote (const QString&);
   44.20 +	QString getNote();
   44.21 +	void setFontHint (const QString&);
   44.22 +	QString getFontHint ();
   44.23 +	void setFilenameHint (const QString&);
   44.24 +	QString getFilenameHint ();
   44.25 +	bool isEmpty();
   44.26 +	QString	saveToDir();
   44.27 +
   44.28 +private:
   44.29 +	QString note;
   44.30 +	QString fonthint;
   44.31 +	QString filenamehint;
   44.32 +};
   44.33 +#endif
    45.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    45.2 +++ b/options.cpp	Sun Jan 30 12:58:47 2005 +0000
    45.3 @@ -0,0 +1,144 @@
    45.4 +#include "options.h"
    45.5 +#include <iostream>
    45.6 +
    45.7 +#include <qapplication.h>
    45.8 +
    45.9 +using namespace std;
   45.10 +
   45.11 +
   45.12 +Option::Option()
   45.13 +{
   45.14 +	name="";
   45.15 +	sName="";
   45.16 +	lName="";
   45.17 +	type=SwitchOption;
   45.18 +	sarg="";
   45.19 +	active=false;
   45.20 +}
   45.21 +
   45.22 +void Option::set(const QString &n, const OptionType &t, const QString &s, const QString &l)
   45.23 +{
   45.24 +	sName="-"+s;
   45.25 +	lName="--"+l;
   45.26 +	type=t;
   45.27 +	name=n;
   45.28 +}
   45.29 +
   45.30 +QString Option::getName () { return name; }
   45.31 +QString Option::getShort () { return sName; }
   45.32 +QString Option::getLong() { return lName; }
   45.33 +OptionType Option::getType() { return type; }
   45.34 +void Option::setArg(const QString& s) { sarg=s; }
   45.35 +QString Option::getArg() { return sarg; }	
   45.36 +void Option::setActive() { active=true; }	
   45.37 +bool Option::isActive() { return active; }
   45.38 +
   45.39 +///////////////////////////////////////////////////////////////
   45.40 +Options::Options() {}	
   45.41 +
   45.42 +int Options::parse()
   45.43 +{
   45.44 +	QStringList arglist;
   45.45 +	int i=0;
   45.46 +	while (i<qApp->argc())
   45.47 +	{	
   45.48 +		arglist.append (qApp->argv()[i]);
   45.49 +		i++;
   45.50 +	}
   45.51 +
   45.52 +	// Get program name
   45.53 +	progname=arglist.first();
   45.54 +	arglist.pop_front();
   45.55 +
   45.56 +	// Work through rest of options
   45.57 +	bool isFile;
   45.58 +	OptionList::iterator itopt;
   45.59 +	QStringList::iterator itarg;
   45.60 +	itarg=arglist.begin();
   45.61 +	while (itarg!=arglist.end())
   45.62 +	{
   45.63 +		isFile=true;
   45.64 +		if ((*itarg).left(1)=="-")
   45.65 +		{
   45.66 +			// Compare given option to all defined options
   45.67 +			itopt=optlist.begin();
   45.68 +			while (itopt!=optlist.end())
   45.69 +			{
   45.70 +				if ((*itarg)==(*itopt).getShort() || 
   45.71 +					(*itarg)==(*itopt).getLong())
   45.72 +				{	
   45.73 +					(*itopt).setActive();
   45.74 +					isFile=false;
   45.75 +					if ((*itopt).getType()==StringOption)
   45.76 +					{
   45.77 +						itarg++;
   45.78 +						if (itarg==arglist.end())
   45.79 +						{
   45.80 +							cout << "Error: argument to option missing\n";
   45.81 +							return 1;
   45.82 +						}
   45.83 +						(*itopt).setArg (*itarg);
   45.84 +						isFile=false;
   45.85 +					}
   45.86 +					break;
   45.87 +				} 
   45.88 +				itopt++;
   45.89 +			}
   45.90 +			if (isFile)
   45.91 +			{
   45.92 +				cout << "Error: Unknown argument "<<*itarg<<endl;
   45.93 +				return 1;
   45.94 +			}
   45.95 +		} else
   45.96 +			filelist.append (*itarg);
   45.97 +		itarg++;
   45.98 +	}
   45.99 +	return 0;
  45.100 +}
  45.101 +
  45.102 +void Options::add (const QString &n, const OptionType &t=SwitchOption, const QString &s="", const QString &l="")
  45.103 +{
  45.104 +	Option o;
  45.105 +	o.set (n,t,s,l);
  45.106 +	optlist.append (o);
  45.107 +}
  45.108 +
  45.109 +void Options::setHelpText (const QString &s)
  45.110 +{
  45.111 +	helptext=s;
  45.112 +}
  45.113 +	
  45.114 +QString Options::getHelpText ()
  45.115 +{
  45.116 +	return helptext;
  45.117 +}
  45.118 +
  45.119 +QString Options::getProgramName()
  45.120 +{
  45.121 +	return progname;
  45.122 +}
  45.123 +
  45.124 +QStringList Options::getFileList ()
  45.125 +{
  45.126 +	return filelist;
  45.127 +}
  45.128 +
  45.129 +bool Options::isOn(const QString &s)
  45.130 +{
  45.131 +	OptionList::iterator it;
  45.132 +	for ( it = optlist.begin(); it != optlist.end(); ++it )
  45.133 +		if ((*it).getName()==s && (*it).isActive() )
  45.134 +			return true;
  45.135 +	return false;
  45.136 +}
  45.137 +
  45.138 +QString Options::getArg(const QString &s)
  45.139 +{
  45.140 +	OptionList::iterator it;
  45.141 +	for ( it = optlist.begin(); it != optlist.end(); ++it )
  45.142 +	{
  45.143 +		if ((*it).getName()==s)
  45.144 +			return (*it).getArg();
  45.145 +	}	
  45.146 +	return "";
  45.147 +}
    46.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    46.2 +++ b/options.h	Sun Jan 30 12:58:47 2005 +0000
    46.3 @@ -0,0 +1,55 @@
    46.4 +#ifndef OPTIONS_H
    46.5 +#define OPTIONS_H
    46.6 +
    46.7 +#include <qstring.h>
    46.8 +#include <qstringlist.h>
    46.9 +
   46.10 +enum OptionType  {SwitchOption,StringOption};
   46.11 +
   46.12 +class Option
   46.13 +{
   46.14 +public:
   46.15 +	Option();
   46.16 +	void set (const QString &, const OptionType &, const QString &, const QString &);
   46.17 +	QString getName();
   46.18 +	QString getShort();
   46.19 +	QString getLong();
   46.20 +	OptionType getType();
   46.21 +	void setArg(const QString &);
   46.22 +	QString getArg();
   46.23 +	void setActive();
   46.24 +	bool isActive();
   46.25 +private:
   46.26 +	QString name;
   46.27 +	OptionType type;
   46.28 +	QString sName;
   46.29 +	QString lName;
   46.30 +	QString sarg;
   46.31 +	bool active;
   46.32 +};
   46.33 +
   46.34 +
   46.35 +
   46.36 +typedef QValueList <Option> OptionList;
   46.37 +
   46.38 +class Options
   46.39 +{
   46.40 +public:
   46.41 +	Options();
   46.42 +	int parse();
   46.43 +	void add (const QString &,const OptionType &, const QString &, const QString&);
   46.44 +	void setHelpText(const QString&);
   46.45 +	QString getHelpText();
   46.46 +	QString getProgramName();
   46.47 +	QStringList getFileList();
   46.48 +	bool isOn (const QString &);
   46.49 +	QString getArg (const QString &);
   46.50 +
   46.51 +private:
   46.52 +	QString progname;
   46.53 +	QString helptext;
   46.54 +	QStringList filelist;
   46.55 +    OptionList optlist;
   46.56 +};
   46.57 +
   46.58 +#endif
    47.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    47.2 +++ b/ornamentedobj.cpp	Sun Jan 30 12:58:47 2005 +0000
    47.3 @@ -0,0 +1,211 @@
    47.4 +#include "ornamentedobj.h"
    47.5 +#include "texteditor.h"
    47.6 +#include "mapeditor.h"
    47.7 +#include "linkablemapobj.h"
    47.8 +
    47.9 +extern TextEditor *textEditor;
   47.10 +extern FlagRowObj *systemFlagsDefault;
   47.11 +extern FlagRowObj *standardFlagsDefault;
   47.12 +
   47.13 +
   47.14 +/////////////////////////////////////////////////////////////////
   47.15 +// OrnamentedObj
   47.16 +/////////////////////////////////////////////////////////////////
   47.17 +
   47.18 +OrnamentedObj::OrnamentedObj():LinkableMapObj()
   47.19 +{
   47.20 +  //  cout << "Const OrnamentedObj ()\n";
   47.21 +    init ();
   47.22 +}
   47.23 +
   47.24 +OrnamentedObj::OrnamentedObj(QCanvas* c) :LinkableMapObj(c)
   47.25 +{
   47.26 +//    cout << "Const OrnamentedObj\n";
   47.27 +    init ();
   47.28 +}
   47.29 +
   47.30 +OrnamentedObj::OrnamentedObj (OrnamentedObj* lmo) : LinkableMapObj (lmo->canvas)
   47.31 +{
   47.32 +    copy (lmo);
   47.33 +}
   47.34 +
   47.35 +OrnamentedObj::~OrnamentedObj()
   47.36 +{
   47.37 +    delete (heading);
   47.38 +	delete (systemFlags);
   47.39 +	delete (standardFlags);
   47.40 +
   47.41 +}
   47.42 +
   47.43 +
   47.44 +void OrnamentedObj::init ()
   47.45 +{
   47.46 +	heading = new HeadingObj(canvas);
   47.47 +	heading->move (absPos.x(), absPos.y());
   47.48 +
   47.49 +	note.setNote("");
   47.50 +	note.setFontHint (textEditor->getFontHintDefault() );
   47.51 +
   47.52 +	systemFlags=new FlagRowObj(canvas);
   47.53 +	systemFlags->clone(systemFlagsDefault);
   47.54 +	systemFlags->setName ("systemFlags");
   47.55 +	
   47.56 +	standardFlags=new FlagRowObj(canvas);
   47.57 +	standardFlags->clone(standardFlagsDefault);
   47.58 +	standardFlags->setName ("standardFlags");
   47.59 +
   47.60 +
   47.61 +
   47.62 +}
   47.63 +
   47.64 +void OrnamentedObj::copy (OrnamentedObj* other)
   47.65 +{
   47.66 +    LinkableMapObj::copy(other);
   47.67 +	heading->copy(other->heading);
   47.68 +    setColor   (other->heading->getColor(),false);	
   47.69 +
   47.70 +	note.copy (other->note);
   47.71 +	systemFlags->copy (other->systemFlags);
   47.72 +	standardFlags->copy (other->standardFlags);
   47.73 +
   47.74 +}
   47.75 +
   47.76 +QString OrnamentedObj::getHeading()
   47.77 +{
   47.78 +    return heading->text();
   47.79 +}
   47.80 +
   47.81 +void OrnamentedObj::setLinkColor()
   47.82 +{
   47.83 +	if (mapEditor->getLinkColorHint()==HeadingColor)
   47.84 +		LinkableMapObj::setLinkColor (heading->getColor());
   47.85 +	else	
   47.86 +		LinkableMapObj::setLinkColor (mapEditor->getDefLinkColor());
   47.87 +}
   47.88 +
   47.89 +QColor OrnamentedObj::getColor ()
   47.90 +{
   47.91 +    return heading->getColor();
   47.92 +}
   47.93 +
   47.94 +
   47.95 +void OrnamentedObj::move (double x, double y)
   47.96 +{
   47.97 +	MapObj::move (x,y);
   47.98 +	double dx=frame->getBorder()/2;  // care for border around object
   47.99 +	double dy=frame->getBorder()/2;
  47.100 +	systemFlags-> move (x + dx, y + dy);
  47.101 +
  47.102 +	// vertical align heading to bottom
  47.103 +	int h=max (systemFlags->getBBox().height(), standardFlags->getBBox().height());
  47.104 +	h=max (h,heading->getHeight());
  47.105 +    heading->move (x + dx + systemFlags->getBBox().width(),
  47.106 +					y + dy  + h - heading->getHeight() 
  47.107 +					);
  47.108 +	standardFlags->move (x + heading->getWidth() + systemFlags->getBBox().width(), y + dy );				
  47.109 +
  47.110 +	updateLink();
  47.111 +	requestReposition();
  47.112 +}
  47.113 +
  47.114 +void OrnamentedObj::move (QPoint p)
  47.115 +{
  47.116 +	move (p.x(), p.y());
  47.117 +}	
  47.118 +
  47.119 +void OrnamentedObj::moveBy (double x, double y)
  47.120 +{
  47.121 +
  47.122 +	MapObj::moveBy (x,y);
  47.123 +    frame->moveBy (x,y);
  47.124 +    systemFlags->moveBy (x,y);
  47.125 +    standardFlags->moveBy (x,y);
  47.126 +    heading->moveBy (x,y);
  47.127 +	updateLink();
  47.128 +	requestReposition();
  47.129 +}
  47.130 +
  47.131 +void OrnamentedObj::moveBy (QPoint p)
  47.132 +{
  47.133 +	moveBy (p.x(), p.y());
  47.134 +}	
  47.135 +
  47.136 +void OrnamentedObj::move2RelPos(double x, double y)
  47.137 +{
  47.138 +	if (!parObj) return;
  47.139 +	move (parObj->getChildPos().x()+x, parObj->getChildPos().y()+y);
  47.140 +}
  47.141 +
  47.142 +void OrnamentedObj::move2RelPos(QPoint p)
  47.143 +{
  47.144 +	if (!parObj) return;
  47.145 +	move (parObj->getChildPos().x() + p.x(), parObj->getChildPos().y() + p.y() );
  47.146 +}
  47.147 +
  47.148 +void OrnamentedObj::setNote(QString s)
  47.149 +{
  47.150 +	note.setNote(s);
  47.151 +	if (!note.isEmpty())
  47.152 +		systemFlags->activate("note");
  47.153 +	else		
  47.154 +		systemFlags->deactivate("note");
  47.155 +	calcBBoxSize();
  47.156 +	positionBBox();	
  47.157 +	move (absPos.x(), absPos.y() );
  47.158 +	forceReposition();
  47.159 +}
  47.160 +
  47.161 +void OrnamentedObj::setNote(NoteObj n)
  47.162 +{
  47.163 +	note=n;
  47.164 +	if (!note.isEmpty())
  47.165 +		systemFlags->activate("note");
  47.166 +	else		
  47.167 +		systemFlags->deactivate("note");
  47.168 +	calcBBoxSize();
  47.169 +	positionBBox();	
  47.170 +	move (absPos.x(), absPos.y() );
  47.171 +	forceReposition();
  47.172 +	
  47.173 +}
  47.174 +
  47.175 +QString OrnamentedObj::getNote()
  47.176 +{
  47.177 +    return note.getNote();
  47.178 +}
  47.179 +
  47.180 +void OrnamentedObj::toggleStandardFlag(QString f)
  47.181 +{
  47.182 +	standardFlags->toggle(f);
  47.183 +	calcBBoxSize();
  47.184 +	positionBBox();
  47.185 +	move (absPos.x(), absPos.y() );
  47.186 +	forceReposition();
  47.187 +}
  47.188 +
  47.189 +void OrnamentedObj::activateStandardFlag(QString f)
  47.190 +{
  47.191 +	standardFlags->activate(f);
  47.192 +	calcBBoxSize();
  47.193 +	positionBBox();
  47.194 +	move (absPos.x(), absPos.y() );
  47.195 +	forceReposition();
  47.196 +}
  47.197 +
  47.198 +QString OrnamentedObj::getSystemFlagName(const QPoint &p)
  47.199 +{
  47.200 +	return systemFlags->getFlagName(p);	
  47.201 +}
  47.202 +
  47.203 +void OrnamentedObj::updateNoteFlag()
  47.204 +{
  47.205 +	// text in NoteEditor has changed, notify MapEditor 
  47.206 +	mapEditor->setChanged();
  47.207 +
  47.208 +	// save text
  47.209 +	setNote( textEditor->getText() );
  47.210 +	
  47.211 +	// save font   
  47.212 +	note.setFontHint (textEditor->getFontHint() );
  47.213 +}
  47.214 +
    48.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    48.2 +++ b/ornamentedobj.h	Sun Jan 30 12:58:47 2005 +0000
    48.3 @@ -0,0 +1,47 @@
    48.4 +#ifndef ORNAMENTEDOBJ_H
    48.5 +#define ORNAMENTEDOBJ_H
    48.6 +
    48.7 +#include "linkablemapobj.h"
    48.8 +
    48.9 +class OrnamentedObj:public LinkableMapObj {
   48.10 +	Q_OBJECT
   48.11 +public:	
   48.12 +    OrnamentedObj ();
   48.13 +    OrnamentedObj (QCanvas*);
   48.14 +    OrnamentedObj (OrnamentedObj*);
   48.15 +    ~OrnamentedObj ();
   48.16 +    virtual void init ();
   48.17 +    virtual void copy (OrnamentedObj*);
   48.18 +
   48.19 +    virtual void setHeading (QString s)=0;  // set the heading, pure virtual 
   48.20 +											// to take care of fontsize
   48.21 +    virtual QString getHeading();			// returns the heading	
   48.22 +	virtual void setLinkColor();			// sets color according to colorhint, overloaded
   48.23 +    virtual void setVisibility(bool,int)=0;	// set visibility
   48.24 +    virtual void setVisibility(bool)=0;	    // set vis. for w
   48.25 +	virtual void setColor(QColor,bool)=0;		// set the color of text and link
   48.26 +	QColor getColor ();						// get color of heading
   48.27 +    virtual void move   (double,double);
   48.28 +    virtual void move   (QPoint);
   48.29 +    virtual void moveBy (double,double);
   48.30 +    virtual void moveBy (QPoint);
   48.31 +    virtual void move2RelPos (QPoint);		// move relativly to parent^
   48.32 +    virtual void move2RelPos (double,double);
   48.33 +    virtual void setNote(QString);			// set note
   48.34 +    virtual void setNote(NoteObj);			// set note
   48.35 +    virtual QString getNote();				// returns note	
   48.36 +	virtual void toggleStandardFlag(QString);
   48.37 +	virtual void activateStandardFlag(QString);
   48.38 +	virtual QString getSystemFlagName (const QPoint &p);
   48.39 +
   48.40 +public slots:
   48.41 +	void updateNoteFlag();
   48.42 +
   48.43 +protected:
   48.44 +    HeadingObj *heading;			// Heading
   48.45 +	NoteObj note;					// Notes
   48.46 +	FlagRowObj *systemFlags;		// System Flags
   48.47 +	FlagRowObj *standardFlags;		// Standard Flags
   48.48 +};
   48.49 +
   48.50 +#endif
    49.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    49.2 +++ b/process.cpp	Sun Jan 30 12:58:47 2005 +0000
    49.3 @@ -0,0 +1,51 @@
    49.4 +#include "process.h"
    49.5 +
    49.6 +/////////////////////////////////////////////////////////////////
    49.7 +// Process
    49.8 +/////////////////////////////////////////////////////////////////
    49.9 +Process::Process()
   49.10 +{
   49.11 +	connect( this, SIGNAL(readyReadStderr()),
   49.12 +			 this, SLOT(readProcErrout()) );
   49.13 +	connect( this, SIGNAL(readyReadStdout()),
   49.14 +			 this, SLOT(readProcStdout()) );
   49.15 +	clear();		 
   49.16 +}
   49.17 +
   49.18 +Process::~Process()
   49.19 +{
   49.20 +}
   49.21 +
   49.22 +void Process::clear()
   49.23 +{
   49.24 +	errOut="";
   49.25 +	stdOut="";
   49.26 +}
   49.27 +
   49.28 +void Process::waitFinished()
   49.29 +{
   49.30 +	while (isRunning())
   49.31 +	{
   49.32 +	// FIXME use some kind of sleep here...
   49.33 +	}
   49.34 +}
   49.35 +
   49.36 +void Process::readProcErrout()
   49.37 +{
   49.38 +	errOut+=readStderr();
   49.39 +}
   49.40 +
   49.41 +void Process::readProcStdout()
   49.42 +{
   49.43 +	stdOut+=readStdout();
   49.44 +}
   49.45 +
   49.46 +QString Process::getErrout()
   49.47 +{
   49.48 +	return errOut;
   49.49 +}
   49.50 +
   49.51 +QString Process::getStdout()
   49.52 +{
   49.53 +	return stdOut;
   49.54 +}
    50.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    50.2 +++ b/process.h	Sun Jan 30 12:58:47 2005 +0000
    50.3 @@ -0,0 +1,31 @@
    50.4 +#ifndef PROCESS_H
    50.5 +#define PROCESS_H
    50.6 +
    50.7 +#include <qprocess.h>
    50.8 +#include <qstring.h>
    50.9 +
   50.10 +
   50.11 +using namespace std;
   50.12 +
   50.13 +class Process:public QProcess
   50.14 +{
   50.15 +	Q_OBJECT
   50.16 +public:
   50.17 +    Process ();
   50.18 +	~Process ();
   50.19 +	void clear();
   50.20 +	void waitFinished();
   50.21 +	QString getErrout();
   50.22 +	QString getStdout();
   50.23 +	
   50.24 +
   50.25 +public slots:
   50.26 +	virtual void readProcErrout();
   50.27 +	virtual void readProcStdout();
   50.28 +
   50.29 +private:
   50.30 +	QString errOut;
   50.31 +	QString stdOut;
   50.32 +};
   50.33 +
   50.34 +#endif
    51.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    51.2 +++ b/selection.cpp	Sun Jan 30 12:58:47 2005 +0000
    51.3 @@ -0,0 +1,47 @@
    51.4 +#include "selection.h"
    51.5 +
    51.6 +
    51.7 +Selection::Selection()
    51.8 +{
    51.9 +}
   51.10 +
   51.11 +Selection::Selection(const Selection &other)
   51.12 +{
   51.13 +}
   51.14 +
   51.15 +Selection::~Selection()
   51.16 +{
   51.17 +}
   51.18 +
   51.19 +void Selection::init()
   51.20 +{
   51.21 +	selectList.setAutoDelete(true);
   51.22 +}
   51.23 +
   51.24 +void Selection::copy(const Selection &other)
   51.25 +{
   51.26 +}
   51.27 +
   51.28 +void Selection::clear()
   51.29 +{
   51.30 +	selectList.clear();
   51.31 +}
   51.32 +
   51.33 +bool Selection::select(LinkableMapObj *lmo)
   51.34 +{
   51.35 +	return false;
   51.36 +}
   51.37 +
   51.38 +void Selection::unselect(LinkableMapObj *lmo)
   51.39 +{
   51.40 +}
   51.41 +
   51.42 +bool Selection::isEmpty()
   51.43 +{
   51.44 +	return selectList.isEmpty();
   51.45 +}
   51.46 +
   51.47 +uint Selection::count()
   51.48 +{
   51.49 +	return selectList.count();
   51.50 +}
    52.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    52.2 +++ b/selection.h	Sun Jan 30 12:58:47 2005 +0000
    52.3 @@ -0,0 +1,26 @@
    52.4 +#ifndef SELECTIONOBJ_H
    52.5 +#define SELECTIONOBJ_H
    52.6 +
    52.7 +#include "linkablemapobj.h"
    52.8 +#include <qptrlist.h>
    52.9 +
   52.10 +class Selection 
   52.11 +{
   52.12 +public:
   52.13 +	Selection ();
   52.14 +	Selection (const Selection&);
   52.15 +	~Selection();
   52.16 +	void init();
   52.17 +	void copy(const Selection&);
   52.18 +	void clear();
   52.19 +	
   52.20 +	bool select (LinkableMapObj*);
   52.21 +	void unselect (LinkableMapObj*);
   52.22 +	bool isEmpty();
   52.23 +	uint count();
   52.24 +
   52.25 +private:
   52.26 +	QPtrList <LinkableMapObj> selectList;
   52.27 +};
   52.28 +#endif
   52.29 +
    53.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    53.2 +++ b/settings.cpp	Sun Jan 30 12:58:47 2005 +0000
    53.3 @@ -0,0 +1,132 @@
    53.4 +#include <iostream>
    53.5 +#include "settings.h"
    53.6 +#include "misc.h"
    53.7 +
    53.8 +using namespace std;
    53.9 +/////////////////////////////////////////////////////////////////
   53.10 +// Settings
   53.11 +/////////////////////////////////////////////////////////////////
   53.12 +Settings::Settings()
   53.13 +{
   53.14 +	clear();		 
   53.15 +}
   53.16 +
   53.17 +Settings::~Settings()
   53.18 +{
   53.19 +}
   53.20 +
   53.21 +void Settings::clear()
   53.22 +{
   53.23 +	pathlist.clear();
   53.24 +	keylist.clear();
   53.25 +	valuelist.clear();
   53.26 +}
   53.27 +
   53.28 +void Settings::clearLocal(const QString &s)
   53.29 +{
   53.30 +	QStringList::Iterator itp=pathlist.begin();
   53.31 +	QStringList::Iterator itk=keylist.begin();
   53.32 +	QStringList::Iterator itv=valuelist.begin();
   53.33 +
   53.34 +	while (itp !=pathlist.end() )
   53.35 +	{
   53.36 +		if ((*itk).startsWith (s))
   53.37 +		{
   53.38 +			itp=pathlist.remove (itp);
   53.39 +			itk=keylist.remove (itk);
   53.40 +			itv=valuelist.remove (itv);
   53.41 +		}	else
   53.42 +		{
   53.43 +			itp++;
   53.44 +			itk++;
   53.45 +			itv++;
   53.46 +		}
   53.47 +	}
   53.48 +}
   53.49 +
   53.50 +QString Settings::readLocalEntry ( const QString &fpath, const QString & key, const QString & def = QString::null ) 
   53.51 +{
   53.52 +	QStringList::Iterator itp=pathlist.begin();
   53.53 +	QStringList::Iterator itk=keylist.begin();
   53.54 +	QStringList::Iterator itv=valuelist.begin();
   53.55 +
   53.56 +	// First search for value in settings saved in map
   53.57 +	while (itp !=pathlist.end() )
   53.58 +	{
   53.59 +		if (*itp == fpath && *itk == key)
   53.60 +			return *itv;
   53.61 +		itp++;
   53.62 +		itk++;
   53.63 +		itv++;
   53.64 +	}
   53.65 +
   53.66 +	// Fall back to global vym settings
   53.67 +	bool ok;
   53.68 +	return readEntry (key,def, &ok);
   53.69 +}	
   53.70 +
   53.71 +void Settings::setLocalEntry (const QString &fpath, const QString &key, const QString &value)
   53.72 +{
   53.73 +	QStringList::Iterator itp=pathlist.begin();
   53.74 +	QStringList::Iterator itk=keylist.begin();
   53.75 +	QStringList::Iterator itv=valuelist.begin();
   53.76 +
   53.77 +	if (!fpath.isEmpty() && !key.isEmpty() && !value.isEmpty() )
   53.78 +	{
   53.79 +		// Search for existing entry first
   53.80 +		while (itp !=pathlist.end() )
   53.81 +		{
   53.82 +			if (*itp == fpath && *itk == key)
   53.83 +			{
   53.84 +				*itv=value;
   53.85 +				return;
   53.86 +			}
   53.87 +			itp++;
   53.88 +			itk++;
   53.89 +			itv++;
   53.90 +		}
   53.91 +		
   53.92 +		// If no entry exists, append a new one
   53.93 +		pathlist.append (fpath);
   53.94 +		keylist.append (key);
   53.95 +		valuelist.append (value);
   53.96 +	}
   53.97 +}
   53.98 +
   53.99 +QString Settings::getXMLData (const QString &fpath)
  53.100 +{
  53.101 +	QString s;
  53.102 +	QStringList::Iterator itp=pathlist.begin();
  53.103 +	QStringList::Iterator itk=keylist.begin();
  53.104 +	QStringList::Iterator itv=valuelist.begin();
  53.105 +
  53.106 +	while (itp !=pathlist.end() )
  53.107 +	{
  53.108 +		if (*itp == fpath )
  53.109 +			if (!(*itv).isEmpty())
  53.110 +				s+=singleElement (
  53.111 +					"setting",
  53.112 +					attribut ("key",*itk) 
  53.113 +					+attribut ("value",*itv)
  53.114 +				)+"\n";
  53.115 +		itp++;
  53.116 +		itk++;
  53.117 +		itv++;
  53.118 +	}
  53.119 +	return s;
  53.120 +}
  53.121 +
  53.122 +void Settings::write()
  53.123 +{
  53.124 +	QStringList::Iterator itp=pathlist.begin();
  53.125 +	QStringList::Iterator itk=keylist.begin();
  53.126 +	QStringList::Iterator itv=valuelist.begin();
  53.127 +
  53.128 +	while (itp !=pathlist.end() )
  53.129 +	{
  53.130 +		itp++;
  53.131 +		itk++;
  53.132 +		itv++;
  53.133 +	}
  53.134 +}
  53.135 +
    54.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    54.2 +++ b/settings.h	Sun Jan 30 12:58:47 2005 +0000
    54.3 @@ -0,0 +1,29 @@
    54.4 +#ifndef SETTINGS_H
    54.5 +#define SETTINGS_H
    54.6 +
    54.7 +#include <qsettings.h>
    54.8 +#include <qstring.h>
    54.9 +#include <qstringlist.h>
   54.10 +
   54.11 +#include "misc.h"
   54.12 +
   54.13 +
   54.14 +class Settings:public QSettings,public xmlObj
   54.15 +{
   54.16 +public:
   54.17 +    Settings ();
   54.18 +	~Settings ();
   54.19 +	void clear();
   54.20 +	void clearLocal (const QString &);
   54.21 +	QString readLocalEntry ( const QString &, const QString &, const QString &);
   54.22 +	void setLocalEntry (const QString &, const QString &, const QString &);
   54.23 +	QString getXMLData (const QString &);
   54.24 +	void write ();
   54.25 +
   54.26 +protected:
   54.27 +	QStringList pathlist;
   54.28 +	QStringList keylist;
   54.29 +	QStringList valuelist;
   54.30 +};
   54.31 +
   54.32 +#endif
    55.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    55.2 +++ b/showtextdialog.ui	Sun Jan 30 12:58:47 2005 +0000
    55.3 @@ -0,0 +1,135 @@
    55.4 +<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
    55.5 +<class>ShowTextDialog</class>
    55.6 +<author>Uwe Drechsel</author>
    55.7 +<widget class="QDialog">
    55.8 +    <property name="name">
    55.9 +        <cstring>ShowTextDialog</cstring>
   55.10 +    </property>
   55.11 +    <property name="enabled">
   55.12 +        <bool>true</bool>
   55.13 +    </property>
   55.14 +    <property name="geometry">
   55.15 +        <rect>
   55.16 +            <x>0</x>
   55.17 +            <y>0</y>
   55.18 +            <width>560</width>
   55.19 +            <height>383</height>
   55.20 +        </rect>
   55.21 +    </property>
   55.22 +    <property name="sizePolicy">
   55.23 +        <sizepolicy>
   55.24 +            <hsizetype>5</hsizetype>
   55.25 +            <vsizetype>5</vsizetype>
   55.26 +            <horstretch>0</horstretch>
   55.27 +            <verstretch>0</verstretch>
   55.28 +        </sizepolicy>
   55.29 +    </property>
   55.30 +    <property name="backgroundOrigin">
   55.31 +        <enum>WidgetOrigin</enum>
   55.32 +    </property>
   55.33 +    <property name="caption">
   55.34 +        <string>VYM - Info</string>
   55.35 +    </property>
   55.36 +    <property name="sizeGripEnabled">
   55.37 +        <bool>false</bool>
   55.38 +    </property>
   55.39 +    <vbox>
   55.40 +        <property name="name">
   55.41 +            <cstring>unnamed</cstring>
   55.42 +        </property>
   55.43 +        <widget class="QLayoutWidget">
   55.44 +            <property name="name">
   55.45 +                <cstring>layout9</cstring>
   55.46 +            </property>
   55.47 +            <vbox>
   55.48 +                <property name="name">
   55.49 +                    <cstring>unnamed</cstring>
   55.50 +                </property>
   55.51 +                <widget class="QTextEdit">
   55.52 +                    <property name="name">
   55.53 +                        <cstring>textEdit1</cstring>
   55.54 +                    </property>
   55.55 +                    <property name="sizePolicy">
   55.56 +                        <sizepolicy>
   55.57 +                            <hsizetype>7</hsizetype>
   55.58 +                            <vsizetype>7</vsizetype>
   55.59 +                            <horstretch>0</horstretch>
   55.60 +                            <verstretch>0</verstretch>
   55.61 +                        </sizepolicy>
   55.62 +                    </property>
   55.63 +                </widget>
   55.64 +                <widget class="QLayoutWidget">
   55.65 +                    <property name="name">
   55.66 +                        <cstring>layout8</cstring>
   55.67 +                    </property>
   55.68 +                    <hbox>
   55.69 +                        <property name="name">
   55.70 +                            <cstring>unnamed</cstring>
   55.71 +                        </property>
   55.72 +                        <spacer>
   55.73 +                            <property name="name">
   55.74 +                                <cstring>spacer4</cstring>
   55.75 +                            </property>
   55.76 +                            <property name="orientation">
   55.77 +                                <enum>Horizontal</enum>
   55.78 +                            </property>
   55.79 +                            <property name="sizeType">
   55.80 +                                <enum>Expanding</enum>
   55.81 +                            </property>
   55.82 +                            <property name="sizeHint">
   55.83 +                                <size>
   55.84 +                                    <width>141</width>
   55.85 +                                    <height>21</height>
   55.86 +                                </size>
   55.87 +                            </property>
   55.88 +                        </spacer>
   55.89 +                        <widget class="QPushButton">
   55.90 +                            <property name="name">
   55.91 +                                <cstring>pushButton4</cstring>
   55.92 +                            </property>
   55.93 +                            <property name="sizePolicy">
   55.94 +                                <sizepolicy>
   55.95 +                                    <hsizetype>7</hsizetype>
   55.96 +                                    <vsizetype>0</vsizetype>
   55.97 +                                    <horstretch>0</horstretch>
   55.98 +                                    <verstretch>0</verstretch>
   55.99 +                                </sizepolicy>
  55.100 +                            </property>
  55.101 +                            <property name="maximumSize">
  55.102 +                                <size>
  55.103 +                                    <width>150</width>
  55.104 +                                    <height>32767</height>
  55.105 +                                </size>
  55.106 +                            </property>
  55.107 +                            <property name="text">
  55.108 +                                <string>Close</string>
  55.109 +                            </property>
  55.110 +                            <property name="default">
  55.111 +                                <bool>true</bool>
  55.112 +                            </property>
  55.113 +                        </widget>
  55.114 +                    </hbox>
  55.115 +                </widget>
  55.116 +            </vbox>
  55.117 +        </widget>
  55.118 +    </vbox>
  55.119 +</widget>
  55.120 +<connections>
  55.121 +    <connection>
  55.122 +        <sender>pushButton4</sender>
  55.123 +        <signal>clicked()</signal>
  55.124 +        <receiver>ShowTextDialog</receiver>
  55.125 +        <slot>accept()</slot>
  55.126 +    </connection>
  55.127 +</connections>
  55.128 +<includes>
  55.129 +    <include location="local" impldecl="in implementation">showtextdialog.ui.h</include>
  55.130 +</includes>
  55.131 +<slots>
  55.132 +    <slot access="private">init()</slot>
  55.133 +    <slot>setText( const QString & t )</slot>
  55.134 +    <slot>append( const QString & t )</slot>
  55.135 +</slots>
  55.136 +<pixmapinproject/>
  55.137 +<layoutdefaults spacing="6" margin="11"/>
  55.138 +</UI>
    56.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    56.2 +++ b/showtextdialog.ui.h	Sun Jan 30 12:58:47 2005 +0000
    56.3 @@ -0,0 +1,18 @@
    56.4 +void ShowTextDialog::init()
    56.5 +{
    56.6 +	textEdit1->setReadOnly (true);
    56.7 +}
    56.8 +
    56.9 +
   56.10 +void ShowTextDialog::setText(const QString &t)
   56.11 +{
   56.12 +	textEdit1->setText (t);
   56.13 +}
   56.14 +
   56.15 +
   56.16 +
   56.17 +
   56.18 +void ShowTextDialog::append( const QString &t )
   56.19 +{
   56.20 +	textEdit1->append (t);
   56.21 +}
    57.1 Binary file tex/color-buttons.png has changed
    58.1 Binary file tex/default-flags.png has changed
    59.1 Binary file tex/example1.png has changed
    60.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    60.2 +++ b/texteditor.cpp	Sun Jan 30 12:58:47 2005 +0000
    60.3 @@ -0,0 +1,921 @@
    60.4 +#include "texteditor.h"
    60.5 +
    60.6 +#include <qcanvas.h>
    60.7 +#include <qstatusbar.h>
    60.8 +#include <qmessagebox.h>
    60.9 +#include <qaction.h>
   60.10 +#include <qapplication.h>
   60.11 +#include <qpainter.h>
   60.12 +#include <qprinter.h>
   60.13 +#include <qfile.h>
   60.14 +#include <qfiledialog.h>
   60.15 +#include <qtoolbar.h>
   60.16 +#include <qpopupmenu.h>
   60.17 +#include <qmenubar.h>
   60.18 +#include <qtextedit.h>
   60.19 +#include <qaccel.h>
   60.20 +#include <qtextstream.h>
   60.21 +#include <qpaintdevicemetrics.h>
   60.22 +#include <qsettings.h>
   60.23 +#include <qfontdialog.h>
   60.24 +#include <qmessagebox.h>
   60.25 +#include <qcolordialog.h>
   60.26 +#include <qregexp.h>
   60.27 +#include <qlineedit.h>
   60.28 +#include <qsimplerichtext.h>
   60.29 +
   60.30 +#include <iostream>
   60.31 +#include <stdlib.h>
   60.32 +#include <typeinfo>
   60.33 +
   60.34 +#include "icons/fileopen.xpm"
   60.35 +#include "icons/filesave.xpm"
   60.36 +#include "icons/fileprint.xpm"
   60.37 +#include "icons/editundo.xpm"	
   60.38 +#include "icons/editredo.xpm"	
   60.39 +#include "icons/editcopy.xpm"
   60.40 +#include "icons/editcut.xpm"
   60.41 +#include "icons/editpaste.xpm"
   60.42 +#include "icons/edittrash.xpm"
   60.43 +#include "icons/formatfixedfont.xpm"
   60.44 +#include "icons/formattextbold.xpm"
   60.45 +#include "icons/formattextitalic.xpm"
   60.46 +#include "icons/formattextunder.xpm"
   60.47 +#include "icons/formattextleft.xpm"
   60.48 +#include "icons/formattextcenter.xpm"
   60.49 +#include "icons/formattextright.xpm"
   60.50 +#include "icons/formattextjustify.xpm"
   60.51 +
   60.52 +extern QCanvas* actCanvas;
   60.53 +extern int statusbarTime;
   60.54 +extern QSettings settings;
   60.55 +
   60.56 +using namespace std;
   60.57 +
   60.58 +
   60.59 +///////////////////////////////////////////////////////////////////////
   60.60 +///////////////////////////////////////////////////////////////////////
   60.61 +
   60.62 +TextEditor::TextEditor()
   60.63 +{
   60.64 +    printer = new QPrinter( QPrinter::HighResolution );
   60.65 +
   60.66 +	// Editor
   60.67 +    e = new QTextEdit( this, "editor" );
   60.68 +    e->setFocus();
   60.69 +	e->setTextFormat(RichText);		// default
   60.70 +	e->setTabStopWidth (20);		// unit is pixel
   60.71 +	e->setColor (black);
   60.72 +	connect (e, SIGNAL( textChanged() ), this, SLOT( editorChanged() ) );
   60.73 +    setCentralWidget( e );
   60.74 +    statusBar()->message( "Ready", statusbarTime);
   60.75 +	setCaption("VYM - Note Editor");
   60.76 +
   60.77 +	// Toolbars
   60.78 +	setupFileActions();
   60.79 +	setupEditActions();
   60.80 +	setupFormatActions();
   60.81 +	setupSettingsActions();
   60.82 +	
   60.83 +	// Various states
   60.84 +	emptyPaper   = QBrush(gray);
   60.85 +	filledPaper  = QBrush(white);
   60.86 +	inactivePaper= QBrush(black);
   60.87 +	setInactive();
   60.88 +
   60.89 +	// Load Settings
   60.90 +	resize (settings.readNumEntry( "/vym/noteeditor/geometry/width", 450),
   60.91 +	        settings.readNumEntry( "/vym/noteeditor/geometry/height",600));
   60.92 +	move   (settings.readNumEntry( "/vym/noteeditor/geometry/posX", 150),
   60.93 +	        settings.readNumEntry( "/vym/noteeditor/geometry/posY",  50));
   60.94 +	
   60.95 +	if (settings.readEntry( "/vym/noteeditor/showWithMain","yes") =="yes")
   60.96 +		setShowWithMain(true);
   60.97 +	else	
   60.98 +		setShowWithMain(false);
   60.99 +
  60.100 +	varFont.fromString( settings.readEntry 
  60.101 +		("/vym/noteeditor/fonts/varFont",
  60.102 +		"Nimbus Sans l,14,-1,5,48,0,0,0,0,0") 
  60.103 +	);
  60.104 +	fixedFont.fromString (settings.readEntry (
  60.105 +		"/vym/noteeditor/fonts/fixedFont",
  60.106 +		"Courier,14,-1,5,48,0,0,0,1,0") 
  60.107 +	);
  60.108 +	QString s=settings.readEntry ("/vym/noteeditor/fonts/fonthintDefault","variable");
  60.109 +	if (s == "fixed")
  60.110 +	{	
  60.111 +		actionSettingsFonthintDefault->setOn (true);
  60.112 +		e->setCurrentFont (fixedFont);
  60.113 +	} else	
  60.114 +	{
  60.115 +		actionSettingsFonthintDefault->setOn (false);
  60.116 +		e->setCurrentFont (varFont);
  60.117 +	}	
  60.118 +}
  60.119 +
  60.120 +
  60.121 +TextEditor::~TextEditor()
  60.122 +{
  60.123 +    if (printer) delete printer;
  60.124 +	// Save Settings
  60.125 +	settings.writeEntry( "/vym/noteeditor/geometry/width", width() );
  60.126 +	settings.writeEntry( "/vym/noteeditor/geometry/height", height() );
  60.127 +	settings.writeEntry( "/vym/noteeditor/geometry/posX", pos().x() );
  60.128 +	settings.writeEntry( "/vym/noteeditor/geometry/posY", pos().y() );
  60.129 +	
  60.130 +	if (showWithMain())
  60.131 +		settings.writeEntry( "/vym/noteeditor/showWithMain","yes");
  60.132 +	else	
  60.133 +		settings.writeEntry( "/vym/noteeditor/showWithMain","no");
  60.134 +
  60.135 +	QString s;
  60.136 +	if (actionSettingsFonthintDefault->isOn() )
  60.137 +		s="fixed";
  60.138 +	else	
  60.139 +		s="variable";
  60.140 +	settings.writeEntry( "/vym/noteeditor/fonts/fonthintDefault",s );
  60.141 +	settings.writeEntry ("/vym/noteeditor/fonts/varFont",
  60.142 +		varFont.toString() );
  60.143 +	settings.writeEntry ("/vym/noteeditor/fonts/fixedFont",
  60.144 +		fixedFont.toString() );
  60.145 +}
  60.146 +
  60.147 +bool TextEditor::isEmpty()
  60.148 +{
  60.149 +	if (e->text().length())
  60.150 +		return false;
  60.151 +	else
  60.152 +		return true;
  60.153 +}
  60.154 +
  60.155 +void TextEditor::setShowWithMain(bool v)
  60.156 +{
  60.157 +	showwithmain=v;
  60.158 +}
  60.159 +
  60.160 +bool TextEditor::showWithMain()
  60.161 +{
  60.162 +	return showwithmain;
  60.163 +}
  60.164 +
  60.165 +void TextEditor::setFontHint (const QString &fh)
  60.166 +{
  60.167 +	if (fh=="fixed")
  60.168 +		actionFormatUseFixedFont->setOn (true);
  60.169 +	else
  60.170 +		actionFormatUseFixedFont->setOn (false);
  60.171 +}
  60.172 +
  60.173 +
  60.174 +QString TextEditor::getFontHint()
  60.175 +{
  60.176 +	if (actionFormatUseFixedFont->isOn())
  60.177 +		return "fixed";
  60.178 +	else	
  60.179 +		return "var";
  60.180 +}
  60.181 +
  60.182 +QString TextEditor::getFontHintDefault()
  60.183 +{
  60.184 +	if (actionSettingsFonthintDefault->isOn())
  60.185 +		return "fixed";
  60.186 +	else	
  60.187 +		return "var";
  60.188 +}
  60.189 +
  60.190 +void TextEditor::setFilename(const QString &fn)
  60.191 +{
  60.192 +	if (state==filledEditor)
  60.193 +		if (fn.isEmpty() )
  60.194 +		{
  60.195 +			filename="";
  60.196 +			statusBar()->message( "No filename available for this note.", statusbarTime );
  60.197 +		}	
  60.198 +		else
  60.199 +		{
  60.200 +			filename=fn;
  60.201 +			statusBar()->message( QString( "Current filename is %1" ).arg( filename ), statusbarTime );
  60.202 +		}	
  60.203 +}
  60.204 +
  60.205 +QString TextEditor::getFilename()
  60.206 +{
  60.207 +	return filename;
  60.208 +}
  60.209 +
  60.210 +bool TextEditor::findText(const QString &t, const bool &cs)
  60.211 +{
  60.212 +	bool wo=false;	// word matches
  60.213 +	if (e->find (t, cs, wo, true, 0, 0 ))
  60.214 +		return true;
  60.215 +	else	
  60.216 +		return false;
  60.217 +}
  60.218 +
  60.219 +void TextEditor::setupFileActions()
  60.220 +{
  60.221 +    QToolBar *tb = new QToolBar( this );
  60.222 +    tb->setLabel( "File Actions" );
  60.223 +    QPopupMenu *menu = new QPopupMenu( this );
  60.224 +    menuBar()->insertItem( tr( "&File" ), menu );
  60.225 +
  60.226 +    QAction *a;
  60.227 +    a = new QAction( tr( "Import" ), QPixmap( fileopen_xpm), tr( "&Import..." ), CTRL + Key_O, this, "fileImport" );
  60.228 +    connect( a, SIGNAL( activated() ), this, SLOT( textLoad() ) );
  60.229 +	a->setEnabled(false);
  60.230 +    a->addTo( tb );
  60.231 +    a->addTo( menu );
  60.232 +	actionFileLoad=a;
  60.233 +
  60.234 +    menu->insertSeparator();
  60.235 +    a = new QAction( tr( "Export Note (HTML)" ), QPixmap( filesave_xpm ), tr( "&Export..." ), CTRL + Key_S, this, "fileSave" );
  60.236 +    connect( a, SIGNAL( activated() ), this, SLOT( textSave() ) );
  60.237 +    a->addTo( tb );
  60.238 +    a->addTo( menu );
  60.239 +	actionFileSave=a;
  60.240 +	
  60.241 +    a = new QAction( tr( "Export Note As (HTML) " ), QPixmap(), tr( "Export &As... (HTML)" ), 0, this, "exportHTML" );
  60.242 +    connect( a, SIGNAL( activated() ), this, SLOT( textSaveAs() ) );
  60.243 +    a->addTo( menu );
  60.244 +	actionFileSaveAs=a;
  60.245 +
  60.246 +    a = new QAction( tr( "Export Note As (ASCII) " ), QPixmap(), tr( "Export &As...(ASCII)" ), ALT + Key_X, this, "exportASCII" );
  60.247 +    connect( a, SIGNAL( activated() ), this, SLOT( textExportAsASCII() ) );
  60.248 +    a->addTo( menu );
  60.249 +	actionFileSaveAs=a;
  60.250 +
  60.251 +    menu->insertSeparator();
  60.252 +    a = new QAction( tr( "Print Note" ), QPixmap( fileprint_xpm ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" );
  60.253 +    connect( a, SIGNAL( activated() ), this, SLOT( textPrint() ) );
  60.254 +    a->addTo( tb );
  60.255 +    a->addTo( menu );
  60.256 +	actionFilePrint=a;
  60.257 +}
  60.258 +
  60.259 +void TextEditor::setupEditActions()
  60.260 +{
  60.261 +    QToolBar *tb = new QToolBar( this );
  60.262 +    tb->setLabel( "Edit Actions" );
  60.263 +    QPopupMenu *menu = new QPopupMenu( this );
  60.264 +    menuBar()->insertItem( tr( "&Edit" ), menu );
  60.265 +
  60.266 +    QAction *a;
  60.267 +    a = new QAction( tr( "Undo" ), QPixmap(editundo_xpm), tr( "&Undo" ), CTRL + Key_Z, this, "undoEvent" );
  60.268 +    connect( a, SIGNAL( activated() ), e, SLOT( undo() ) );
  60.269 +    a->addTo( menu );
  60.270 +    a->addTo( tb);
  60.271 +	actionEditUndo=a;
  60.272 +	
  60.273 +    a = new QAction( tr( "Redo" ), QPixmap( editredo_xpm ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" ); 
  60.274 +    connect( a, SIGNAL( activated() ), e, SLOT( redo() ) );
  60.275 +    a->addTo( tb );
  60.276 +    a->addTo( menu );
  60.277 +	actionEditRedo=a;
  60.278 +
  60.279 +    menu->insertSeparator();
  60.280 +    a = new QAction( tr( "Select and copy all" ), QPixmap(), tr( "Select and copy &all" ), CTRL + Key_A, this, "editcopyall" ); 
  60.281 +    connect( a, SIGNAL( activated() ), this, SLOT( editCopyAll() ) );
  60.282 +    a->addTo( menu );
  60.283 +
  60.284 +    menu->insertSeparator();
  60.285 +    a = new QAction( tr( "Copy" ), QPixmap( editcopy_xpm ), tr( "&Copy" ), CTRL + Key_C, this, "editCopy" );
  60.286 +    connect( a, SIGNAL( activated() ), e, SLOT( copy() ) );
  60.287 +    a->addTo( tb );
  60.288 +    a->addTo( menu );
  60.289 +	actionEditCopy=a;
  60.290 +	
  60.291 +    a = new QAction( tr( "Cut" ), QPixmap( editcut_xpm ), tr( "Cu&t" ), CTRL + Key_X, this, "editCut" );
  60.292 +    connect( a, SIGNAL( activated() ), e, SLOT( cut() ) );
  60.293 +    a->addTo( tb );
  60.294 +    a->addTo( menu );
  60.295 +	actionEditCut=a;
  60.296 +
  60.297 +    a = new QAction( tr( "Paste" ), QPixmap( editpaste_xpm ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" );
  60.298 +    connect( a, SIGNAL( activated() ), e, SLOT( paste() ) );
  60.299 +    a->addTo( tb );
  60.300 +    a->addTo( menu );
  60.301 +	actionEditPaste=a;
  60.302 +	
  60.303 +    a = new QAction( tr( "Delete all" ), QPixmap( edittrash_xpm ), tr( "&Delete All" ), 0, this, "editDeleteAll" );
  60.304 +    connect( a, SIGNAL( activated() ), e, SLOT( clear() ) );
  60.305 +    a->addTo( tb );
  60.306 +    a->addTo( menu );
  60.307 +	actionEditDeleteAll=a;
  60.308 +
  60.309 +	a = new QAction( tr( "Convert paragraphs to linebreaks" ), QPixmap(), tr( "&Convert Paragraphs" ), ALT + Key_P, this, "editConvertPar" );
  60.310 +    connect( a, SIGNAL( activated() ), this, SLOT( textConvertPar() ) );
  60.311 +    a->addTo( menu );
  60.312 +	actionEditConvertPar=a;
  60.313 +
  60.314 +	a = new QAction( tr( "Join all lines of a paragraph" ), QPixmap(), tr( "&Join lines" ), ALT + Key_J, this, "editJoinLines" );
  60.315 +    connect( a, SIGNAL( activated() ), this, SLOT( textJoinLines() ) );
  60.316 +    a->addTo( menu );
  60.317 +	actionEditJoinLines=a;
  60.318 +}
  60.319 +
  60.320 +void TextEditor::setupFormatActions()
  60.321 +{
  60.322 +    QToolBar *tb = new QToolBar( this );
  60.323 +    tb->setLabel( "Format Actions" );
  60.324 +    QPopupMenu *menu = new QPopupMenu( this );
  60.325 +    menuBar()->insertItem( tr( "&Format" ), menu );
  60.326 +
  60.327 +    QAction *a;
  60.328 +
  60.329 +    a = new QAction( tr( "Toggle font hint for the whole text" ), QPixmap(formatfixedfont_xpm), tr( "&Font hint" ), ALT + Key_I, this, "fontHint" );
  60.330 +	a->setToggleAction (true);
  60.331 +	a->setOn (settings.readBoolEntry ("/vym/noteeditor/fonts/useFixedByDefault",false) );
  60.332 +    connect( a, SIGNAL( activated() ), this, SLOT( toggleFonthint() ) );
  60.333 +    a->addTo( menu );
  60.334 +    a->addTo( tb );
  60.335 +	actionFormatUseFixedFont=a;
  60.336 +
  60.337 +	menu->insertSeparator();
  60.338 +
  60.339 +    comboFont = new QComboBox( true, tb );
  60.340 +    QFontDatabase db;
  60.341 +    comboFont->insertStringList( db.families() );
  60.342 +    connect( comboFont, SIGNAL( activated( const QString & ) ),
  60.343 +	     this, SLOT( textFamily( const QString & ) ) );
  60.344 +    comboFont->lineEdit()->setText( QApplication::font().family() );
  60.345 +
  60.346 +    comboSize = new QComboBox( true, tb );
  60.347 +    QValueList<int> sizes = db.standardSizes();
  60.348 +    QValueList<int>::Iterator it = sizes.begin();
  60.349 +    for ( ; it != sizes.end(); ++it )
  60.350 +	comboSize->insertItem( QString::number( *it ) );
  60.351 +    connect( comboSize, SIGNAL( activated( const QString & ) ),
  60.352 +	     this, SLOT( textSize( const QString & ) ) );
  60.353 +    comboSize->lineEdit()->setText( QString::number( QApplication::font().pointSize() ) );
  60.354 +
  60.355 +    menu->insertSeparator();
  60.356 +
  60.357 +    QPixmap pix( 16, 16 );
  60.358 +    pix.fill( e->color());
  60.359 +    actionTextColor = new QAction( pix, tr( "&Color..." ), 0, this, "textColor" );
  60.360 +    connect( actionTextColor, SIGNAL( activated() ), this, SLOT( textColor() ) );
  60.361 +    actionTextColor->addTo( tb );
  60.362 +    actionTextColor->addTo( menu );
  60.363 +
  60.364 +    actionTextBold = new QAction( QPixmap (formattextbold_xpm), tr( "&Bold" ), CTRL + Key_B, this, "textBold" );
  60.365 +    connect( actionTextBold, SIGNAL( activated() ), this, SLOT( textBold() ) );
  60.366 +    actionTextBold->addTo( tb );
  60.367 +    actionTextBold->addTo( menu );
  60.368 +    actionTextBold->setToggleAction( true );
  60.369 +    actionTextItalic = new QAction( QPixmap(formattextitalic_xpm ), tr( "&Italic" ), CTRL + Key_I, this, "textItalic" );
  60.370 +    connect( actionTextItalic, SIGNAL( activated() ), this, SLOT( textItalic() ) );
  60.371 +    actionTextItalic->addTo( tb );
  60.372 +    actionTextItalic->addTo( menu );
  60.373 +    actionTextItalic->setToggleAction( true );
  60.374 +    actionTextUnderline = new QAction( QPixmap (formattextunder_xpm ), tr( "&Underline" ), CTRL + Key_U, this, "textUnderline" );
  60.375 +    connect( actionTextUnderline, SIGNAL( activated() ), this, SLOT( textUnderline() ) );
  60.376 +    actionTextUnderline->addTo( tb );
  60.377 +    actionTextUnderline->addTo( menu );
  60.378 +    actionTextUnderline->setToggleAction( true );
  60.379 +    menu->insertSeparator();
  60.380 +
  60.381 +    QActionGroup *grp = new QActionGroup( this );
  60.382 +    connect( grp, SIGNAL( selected( QAction* ) ), this, SLOT( textAlign( QAction* ) ) );
  60.383 +
  60.384 +    actionAlignLeft = new QAction( QPixmap (formattextleft_xpm ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" );
  60.385 +    actionAlignLeft->setToggleAction( true );
  60.386 +    actionAlignCenter = new QAction( QPixmap (formattextcenter_xpm ), tr( "C&enter" ), CTRL + Key_E, grp, "textCenter" );
  60.387 +    actionAlignCenter->setToggleAction( true );
  60.388 +    actionAlignRight = new QAction( QPixmap (formattextright_xpm ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" );
  60.389 +    actionAlignRight->setToggleAction( true );
  60.390 +    actionAlignJustify = new QAction( QPixmap ( formattextjustify_xpm ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" );
  60.391 +    actionAlignJustify->setToggleAction( true );
  60.392 +
  60.393 +    grp->addTo( tb );
  60.394 +    grp->addTo( menu );
  60.395 +
  60.396 +    connect( e, SIGNAL( currentFontChanged( const QFont & ) ),
  60.397 +	     this, SLOT( fontChanged( const QFont & ) ) );
  60.398 +    connect( e, SIGNAL( currentColorChanged( const QColor & ) ),
  60.399 +	     this, SLOT( colorChanged( const QColor & ) ) );
  60.400 +    connect( e, SIGNAL( currentAlignmentChanged( int ) ),
  60.401 +	     this, SLOT( alignmentChanged( int ) ) );
  60.402 +
  60.403 +}
  60.404 +
  60.405 +void TextEditor::setupSettingsActions()
  60.406 +{
  60.407 +    QPopupMenu *menu = new QPopupMenu( this );
  60.408 +    menuBar()->insertItem( tr( "&Settings" ), menu );
  60.409 +
  60.410 +    QAction *a;
  60.411 +    a = new QAction( tr( "Set fixed font" ), QPixmap(), tr( "Set &fixed font" ), 0, this, "setFixedFont" );
  60.412 +    connect( a, SIGNAL( activated() ), this, SLOT( setFixedFont() ) );
  60.413 +    a->addTo( menu );
  60.414 +	actionSettingsFixedFont=a;
  60.415 +
  60.416 +    a = new QAction( tr( "Set variable font" ), QPixmap(), tr( "Set &variable font" ), 0, this, "setvariableFont" );
  60.417 +    connect( a, SIGNAL( activated() ), this, SLOT( setVarFont() ) );
  60.418 +    a->addTo( menu );
  60.419 +	actionSettingsVarFont=a;
  60.420 +
  60.421 +    a = new QAction( tr( "Used fixed font by default" ), QPixmap(), tr( "&fixed font is default" ), 0, this, "fonthintDefault" );
  60.422 +	a->setToggleAction (true);
  60.423 +	// set state later in constructor...
  60.424 +    a->addTo( menu );
  60.425 +	actionSettingsFonthintDefault=a;
  60.426 +}
  60.427 +
  60.428 +void TextEditor::textLoad()
  60.429 +{
  60.430 +	if (state!=inactiveEditor)
  60.431 +	{
  60.432 +		if (e->length()) 
  60.433 +		{
  60.434 +			QMessageBox mb( "VYM - Note Editor",
  60.435 +				"Loading will overwrite the existing note",
  60.436 +				QMessageBox::Warning,
  60.437 +				QMessageBox::Yes | QMessageBox::Default,
  60.438 +				QMessageBox::Cancel,
  60.439 +				0 );
  60.440 +			mb.setButtonText( QMessageBox::Yes, "Load note" );
  60.441 +			switch( mb.exec() ) {
  60.442 +				case QMessageBox::Cancel:
  60.443 +					return;
  60.444 +					break;
  60.445 +			}
  60.446 +		} 
  60.447 +		// Load note
  60.448 +		QFileDialog *fd=new QFileDialog( this);
  60.449 +		fd->addFilter ("ASCII texts (*.txt)");
  60.450 +		fd->addFilter ("VYM notes (*.html)");
  60.451 +		fd->show();
  60.452 +		QString fn;
  60.453 +		if ( fd->exec() == QDialog::Accepted )
  60.454 +			fn = fd->selectedFile();
  60.455 +
  60.456 +		if ( !fn.isEmpty() )
  60.457 +		{
  60.458 +			QFile f( fn );
  60.459 +			if ( !f.open( IO_ReadOnly ) )
  60.460 +			return;
  60.461 +
  60.462 +			QTextStream ts( &f );
  60.463 +			setText( ts.read() );
  60.464 +			editorChanged();
  60.465 +		}
  60.466 +	}
  60.467 +}
  60.468 +
  60.469 +void TextEditor::closeEvent( QCloseEvent* ce )
  60.470 +{
  60.471 +    if ( !e->isModified() ) 
  60.472 +	{
  60.473 +		ce->accept();	// TextEditor can be reopened with show()
  60.474 +		return;
  60.475 +    }
  60.476 +}
  60.477 +
  60.478 +QString TextEditor::getText()
  60.479 +{
  60.480 +	return e->text();
  60.481 +}
  60.482 +
  60.483 +void TextEditor::editorChanged()
  60.484 +{
  60.485 +	// received, when QTextEdit::text() has changed
  60.486 +	EditorState	oldstate=state;
  60.487 +
  60.488 +	if (isEmpty())
  60.489 +		state=emptyEditor;
  60.490 +	else
  60.491 +		state=filledEditor;
  60.492 +
  60.493 +	if (state != oldstate)
  60.494 +	{
  60.495 +		if (state==emptyEditor)
  60.496 +			e->setPaper (emptyPaper);
  60.497 +		else
  60.498 +			e->setPaper (filledPaper);
  60.499 +	}
  60.500 +	// SLOT is LinkableMapObj, which will update systemFlag
  60.501 +	emit (textHasChanged() );
  60.502 +}
  60.503 +
  60.504 +
  60.505 +void TextEditor::setText(QString t)
  60.506 +{
  60.507 +	if ( !QStyleSheet::mightBeRichText( t ) )
  60.508 +		t = QStyleSheet::convertFromPlainText( t, QStyleSheetItem::WhiteSpaceNormal );
  60.509 +	e->setReadOnly(false);
  60.510 +	e->setText(t);
  60.511 +	editorChanged();	//not called automagically
  60.512 +
  60.513 +	enableActions();
  60.514 +}
  60.515 +
  60.516 +void TextEditor::setInactive()
  60.517 +{
  60.518 +	setText("");
  60.519 +	state=inactiveEditor;
  60.520 +	e->setPaper (inactivePaper);
  60.521 +	e->setReadOnly (true);
  60.522 +
  60.523 +	disableActions();
  60.524 +}
  60.525 +
  60.526 +void TextEditor::editCopyAll()
  60.527 +{
  60.528 +	e->selectAll();
  60.529 +	e->copy();
  60.530 +}
  60.531 +
  60.532 +void TextEditor::textSaveAs()
  60.533 +{
  60.534 +    QString fn = QFileDialog::getSaveFileName( QString::null, "VYM Note (HTML) (*.html);;All files (*)",
  60.535 +					       this,"export note dialog",tr("Export Note to single file") );
  60.536 +
  60.537 +    if ( !fn.isEmpty() ) 
  60.538 +	{
  60.539 +		QFile file (fn);
  60.540 +		if (file.exists())
  60.541 +		{
  60.542 +			QMessageBox mb( "VYM",
  60.543 +				tr("The file ") + fn + 
  60.544 +				tr(" exists already. "
  60.545 +				"Do you want to overwrite it?"),
  60.546 +			QMessageBox::Warning,
  60.547 +			QMessageBox::Yes | QMessageBox::Default,
  60.548 +			QMessageBox::Cancel | QMessageBox::Escape,
  60.549 +			QMessageBox::NoButton );
  60.550 +			mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
  60.551 +			mb.setButtonText( QMessageBox::No, tr("Cancel"));
  60.552 +			switch( mb.exec() ) {
  60.553 +				case QMessageBox::Yes:
  60.554 +					// save 
  60.555 +					filename = fn;
  60.556 +					textSave();
  60.557 +					return;
  60.558 +				case QMessageBox::Cancel:
  60.559 +					// do nothing
  60.560 +					break;
  60.561 +			}
  60.562 +		} else
  60.563 +		{
  60.564 +			filename = fn;
  60.565 +			textSave();
  60.566 +			return;
  60.567 +		}			
  60.568 +    }
  60.569 +	statusBar()->message(tr( "Couldn't export note ") + fn, statusbarTime );
  60.570 +}
  60.571 +
  60.572 +
  60.573 +void TextEditor::textSave()
  60.574 +{
  60.575 +    if ( filename.isEmpty() ) 
  60.576 +	{
  60.577 +		textSaveAs();
  60.578 +		return;
  60.579 +    }
  60.580 +
  60.581 +    QString text = e->text();
  60.582 +    QFile f( filename );
  60.583 +    if ( !f.open( IO_WriteOnly ) ) 
  60.584 +	{
  60.585 +		statusBar()->message( QString("Could not write to %1").arg(filename),
  60.586 +					  statusbarTime );
  60.587 +		return;
  60.588 +    }
  60.589 +
  60.590 +    QTextStream t( &f );
  60.591 +    t << text;
  60.592 +    f.close();
  60.593 +
  60.594 +    e->setModified( FALSE );
  60.595 +
  60.596 +    statusBar()->message( QString( "Note exported as %1" ).arg( filename ), statusbarTime );
  60.597 +}
  60.598 +
  60.599 +void TextEditor::textConvertPar()
  60.600 +{
  60.601 +	// In X11 a copy&paste generates paragraphs, 
  60.602 +	// which is not always wanted
  60.603 +	// This function replaces paragraphs by linebreaks.
  60.604 +	int parFrom, parTo, indFrom, indTo;
  60.605 +	e->getSelection (&parFrom,&indFrom,&parTo,&indTo);
  60.606 +	QString t;
  60.607 +	if (parFrom>-1)
  60.608 +		t=e->selectedText();
  60.609 +	else
  60.610 +		t=e->text();
  60.611 +
  60.612 +	QRegExp re("<p.*>");
  60.613 +	re.setMinimal(true);
  60.614 +	t.replace (re,"");
  60.615 +	t.replace ("</p>","<br />");
  60.616 +	if (parFrom>-1)
  60.617 +	{
  60.618 +		e->setCursorPosition (parFrom,indFrom);
  60.619 +		e->cut();
  60.620 +		// Tried to simply insert the changed text with
  60.621 +		// e->insert (t,(uint)(QTextEdit::RemoveSelected));
  60.622 +		// but then the html would be quoted. So I use the ugly
  60.623 +		// way: insert a marker, replace it in whole text of QTextEdit
  60.624 +		QString marker="R3PlAcEMeL4teR!";
  60.625 +		e->insert (marker);
  60.626 +		e->setText (e->text().replace(marker,t));
  60.627 +	} else
  60.628 +		e->setText(t);
  60.629 +}
  60.630 +
  60.631 +void TextEditor::textJoinLines()
  60.632 +{
  60.633 +	int parFrom, parTo, indFrom, indTo;
  60.634 +	e->getSelection (&parFrom,&indFrom,&parTo,&indTo);
  60.635 +	QString t;
  60.636 +	if (parFrom>-1)
  60.637 +		t=e->selectedText();
  60.638 +	else
  60.639 +		t=e->text();
  60.640 +	// In addition to textConvertPar it is sometimes
  60.641 +	// useful to join all lines of a paragraph
  60.642 +	QRegExp re("</p>\n+<p>(?!</p>)");
  60.643 +	re.setMinimal(true);
  60.644 +	t.replace (re," ");
  60.645 +
  60.646 +	// Above we may have introduced new " " at beginning of a
  60.647 +	// paragraph - remove it.
  60.648 +	re.setPattern("<p> ");
  60.649 +	t.replace (re,"<p>");
  60.650 +	if (parFrom>-1)
  60.651 +	{
  60.652 +		e->setCursorPosition (parFrom,indFrom);
  60.653 +		e->cut();
  60.654 +		// Tried to simply insert the changed text with
  60.655 +		// e->insert (t,(uint)(QTextEdit::RemoveSelected));
  60.656 +		// but then the html would be quoted. So I use the ugly
  60.657 +		// way: insert a marker, replace it in whole text of QTextEdit
  60.658 +		QString marker="R3PlAcEMeL4teR!";
  60.659 +		e->insert (marker);
  60.660 +		e->setText (e->text().replace(marker,t));
  60.661 +	} else
  60.662 +		e->setText(t);
  60.663 +}
  60.664 +
  60.665 +QString TextEditor::textConvertToASCII(const QString &t)
  60.666 +{
  60.667 +	QString r=t;
  60.668 +
  60.669 +	// convert all "<br*>" to "\n"
  60.670 +	QRegExp re("<br.*>");
  60.671 +	re.setMinimal(true);
  60.672 +	r.replace (re,"\n");
  60.673 +
  60.674 +	// convert all "</p>" to "\n"
  60.675 +	re.setPattern ("/p");
  60.676 +	r.replace (re,"\n");
  60.677 +	
  60.678 +	// remove all remaining tags 
  60.679 +	re.setPattern ("<.*>");
  60.680 +	r.replace (re,"");
  60.681 +
  60.682 +	// convert "&", "<" and ">"
  60.683 +	re.setPattern (">");
  60.684 +	r.replace (re,">");
  60.685 +	re.setPattern ("<");
  60.686 +	r.replace (re,"<");
  60.687 +	re.setPattern ("&");
  60.688 +	r.replace (re,"&");
  60.689 +	return r;
  60.690 +}
  60.691 +
  60.692 +void TextEditor::textExportAsASCII()
  60.693 +{
  60.694 +	QString text = textConvertToASCII( e->text());
  60.695 +    QString fn = QFileDialog::getSaveFileName( QString::null, "VYM Note (ASCII) (*.txt);;All files (*)",
  60.696 +					       this,"export note dialog",tr("Export Note to single file (ASCII)") );
  60.697 +	int ret=-1;
  60.698 +
  60.699 +    if ( !fn.isEmpty() ) 
  60.700 +	{
  60.701 +		QFile file (fn);
  60.702 +		if (file.exists())
  60.703 +		{
  60.704 +			QMessageBox mb( "VYM",
  60.705 +				tr("The file ") + fn + 
  60.706 +				tr(" exists already. "
  60.707 +				"Do you want to overwrite it?"),
  60.708 +			QMessageBox::Warning,
  60.709 +			QMessageBox::Yes | QMessageBox::Default,
  60.710 +			QMessageBox::Cancel | QMessageBox::Escape,
  60.711 +			QMessageBox::NoButton );
  60.712 +			mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
  60.713 +			mb.setButtonText( QMessageBox::No, tr("Cancel"));
  60.714 +			ret=mb.exec();
  60.715 +		}	
  60.716 +		if (ret==QMessageBox::Cancel)
  60.717 +			return;
  60.718 +			
  60.719 +		// save 
  60.720 +		if ( !file.open( IO_WriteOnly ) ) 
  60.721 +			statusBar()->message( QString("Could not write to %1").arg(filename),
  60.722 +						  statusbarTime );
  60.723 +		else
  60.724 +		{
  60.725 +			QTextStream t( &file );
  60.726 +			t << text;
  60.727 +			file.close();
  60.728 +
  60.729 +			statusBar()->message( QString( "Note exported as %1" ).arg( fn ), statusbarTime );
  60.730 +		}
  60.731 +    }
  60.732 +}
  60.733 +
  60.734 +
  60.735 +void TextEditor::textPrint()
  60.736 +{
  60.737 +    printer->setFullPage(TRUE);
  60.738 +    if ( printer->setup( this ) ) 
  60.739 +	{
  60.740 +		QPainter p( printer );
  60.741 +		// Check that there is a valid device to print to.
  60.742 +		if ( !p.device() ) return;
  60.743 +		QPaintDeviceMetrics metrics( p.device() );
  60.744 +		int dpiy = metrics.logicalDpiY();
  60.745 +		int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins
  60.746 +		QRect body( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin );
  60.747 +		QFont font( e->currentFont() );
  60.748 +		font.setPointSize( 10 ); // we define 10pt to be a nice base size for printing
  60.749 +
  60.750 +		QSimpleRichText richText( e->text(), font,
  60.751 +					  e->context(),
  60.752 +					  e->styleSheet(),
  60.753 +					  e->mimeSourceFactory(),
  60.754 +					  body.height() );
  60.755 +		richText.setWidth( &p, body.width() );
  60.756 +		QRect view( body );
  60.757 +		int page = 1;
  60.758 +		do 
  60.759 +		{
  60.760 +			richText.draw( &p, body.left(), body.top(), view, colorGroup() );
  60.761 +			view.moveBy( 0, body.height() );
  60.762 +			p.translate( 0 , -body.height() );
  60.763 +			p.setFont( font );
  60.764 +			p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ),
  60.765 +				view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) );
  60.766 +			if ( view.top()  >= richText.height() )
  60.767 +			break;
  60.768 +			printer->newPage();
  60.769 +			page++;
  60.770 +		} while (TRUE);
  60.771 +    }
  60.772 +}
  60.773 +
  60.774 +void TextEditor::textEditUndo()
  60.775 +{
  60.776 +}
  60.777 +
  60.778 +void TextEditor::toggleFonthint()
  60.779 +{
  60.780 +	setUpdatesEnabled (false);
  60.781 +	e->selectAll (true);
  60.782 +	if (!actionFormatUseFixedFont->isOn() ) 
  60.783 +		e->setCurrentFont (varFont);
  60.784 +	else	
  60.785 +		e->setCurrentFont (fixedFont);
  60.786 +	e->selectAll (false);
  60.787 +	setUpdatesEnabled (true);
  60.788 +	repaint();
  60.789 +}
  60.790 +
  60.791 +void TextEditor::setFixedFont()
  60.792 +{
  60.793 +	bool ok;
  60.794 +	QFont font =QFontDialog::getFont(
  60.795 +                    &ok, fixedFont, this );
  60.796 +    if ( ok ) 
  60.797 +        // font is set to the font the user selected
  60.798 +		fixedFont=font;
  60.799 +}
  60.800 +
  60.801 +void TextEditor::setVarFont()
  60.802 +{
  60.803 +	bool ok;
  60.804 +	QFont font =QFontDialog::getFont(
  60.805 +                    &ok, varFont, this );
  60.806 +    if ( ok ) 
  60.807 +        // font is set to the font the user selected
  60.808 +		varFont=font;
  60.809 +}
  60.810 +
  60.811 +void TextEditor::textBold()
  60.812 +{
  60.813 +    e->setBold( actionTextBold->isOn() );
  60.814 +}
  60.815 +
  60.816 +void TextEditor::textUnderline()
  60.817 +{
  60.818 +    e->setUnderline( actionTextUnderline->isOn() );
  60.819 +}
  60.820 +
  60.821 +void TextEditor::textItalic()
  60.822 +{
  60.823 +    e->setItalic( actionTextItalic->isOn() );
  60.824 +}
  60.825 +
  60.826 +void TextEditor::textFamily( const QString &f )
  60.827 +{
  60.828 +    e->setFamily( f );
  60.829 +}
  60.830 +
  60.831 +void TextEditor::textSize( const QString &p )
  60.832 +{
  60.833 +    e->setPointSize( p.toInt() );
  60.834 +}
  60.835 +
  60.836 +
  60.837 +void TextEditor::textColor()
  60.838 +{
  60.839 +    QColor col = QColorDialog::getColor( e->color(), this );
  60.840 +    if ( !col.isValid() )
  60.841 +	return;
  60.842 +    e->setColor( col );
  60.843 +    QPixmap pix( 16, 16 );
  60.844 +    pix.fill( black );
  60.845 +    actionTextColor->setIconSet( pix );
  60.846 +}
  60.847 +
  60.848 +void TextEditor::textAlign( QAction *a )
  60.849 +{
  60.850 +    if ( a == actionAlignLeft )
  60.851 +	e->setAlignment( AlignLeft );
  60.852 +    else if ( a == actionAlignCenter )
  60.853 +	e->setAlignment( AlignHCenter );
  60.854 +    else if ( a == actionAlignRight )
  60.855 +	e->setAlignment( AlignRight );
  60.856 +    else if ( a == actionAlignJustify )
  60.857 +	e->setAlignment( AlignJustify );
  60.858 +}
  60.859 +
  60.860 +void TextEditor::fontChanged( const QFont &f )
  60.861 +{
  60.862 +    comboFont->lineEdit()->setText( f.family() );
  60.863 +    comboSize->lineEdit()->setText( QString::number( f.pointSize() ) );
  60.864 +    actionTextBold->setOn( f.bold() );
  60.865 +    actionTextItalic->setOn( f.italic() );
  60.866 +    actionTextUnderline->setOn( f.underline() );
  60.867 +}
  60.868 +
  60.869 +void TextEditor::colorChanged( const QColor &c )
  60.870 +{
  60.871 +    QPixmap pix( 16, 16 );
  60.872 +    pix.fill( c );
  60.873 +    actionTextColor->setIconSet( pix );
  60.874 +}
  60.875 +
  60.876 +void TextEditor::alignmentChanged( int a )
  60.877 +{
  60.878 +    if ( ( a == AlignAuto ) || ( a & AlignLeft ))
  60.879 +	actionAlignLeft->setOn( true );
  60.880 +    else if ( ( a & AlignHCenter ) )
  60.881 +	actionAlignCenter->setOn( true );
  60.882 +    else if ( ( a & AlignRight ) )
  60.883 +	actionAlignRight->setOn( true );
  60.884 +    else if ( ( a & AlignJustify ) )
  60.885 +	actionAlignJustify->setOn( true );
  60.886 +}
  60.887 +
  60.888 +
  60.889 +
  60.890 +void TextEditor::enableActions()
  60.891 +{
  60.892 +	actionFileLoad->setEnabled(true);
  60.893 +	actionFileSave->setEnabled(true);
  60.894 +	actionFileSaveAs->setEnabled(true);
  60.895 +	actionFilePrint->setEnabled(true);
  60.896 +	actionEditUndo->setEnabled(true);
  60.897 +	actionEditRedo->setEnabled(true);
  60.898 +	actionEditCopy->setEnabled(true);
  60.899 +	actionEditCut->setEnabled(true);
  60.900 +	actionEditPaste->setEnabled(true);
  60.901 +	actionEditDeleteAll->setEnabled(true);
  60.902 +	actionEditConvertPar->setEnabled(true);
  60.903 +	actionEditJoinLines->setEnabled(true);
  60.904 +	actionFormatUseFixedFont->setEnabled(true);
  60.905 +}
  60.906 +
  60.907 +void TextEditor::disableActions()
  60.908 +{
  60.909 +	actionFileLoad->setEnabled(false);
  60.910 +	actionFileSave->setEnabled(false);
  60.911 +	actionFileSaveAs->setEnabled(false);
  60.912 +	actionFilePrint->setEnabled(false);
  60.913 +	actionEditUndo->setEnabled(false);
  60.914 +	actionEditRedo->setEnabled(false);
  60.915 +	actionEditCopy->setEnabled(false);
  60.916 +	actionEditCut->setEnabled(false);
  60.917 +	actionEditPaste->setEnabled(false);
  60.918 +	actionEditDeleteAll->setEnabled(false);
  60.919 +	actionEditConvertPar->setEnabled(false);
  60.920 +	actionEditJoinLines->setEnabled(false);
  60.921 +	actionFormatUseFixedFont->setEnabled(false);
  60.922 +}
  60.923 +
  60.924 +
    61.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    61.2 +++ b/texteditor.h	Sun Jan 30 12:58:47 2005 +0000
    61.3 @@ -0,0 +1,123 @@
    61.4 +#ifndef TEXTEDITOR_H 
    61.5 +#define TEXTEDITOR_H
    61.6 +
    61.7 +#include <qmainwindow.h>
    61.8 +#include <qtextedit.h>
    61.9 +#include <qaction.h>
   61.10 +#include <qfontdatabase.h>
   61.11 +#include <qcombobox.h>
   61.12 +
   61.13 +
   61.14 +enum EditorState {inactiveEditor,emptyEditor,filledEditor};
   61.15 +
   61.16 +class TextEditor : public QMainWindow {
   61.17 +    Q_OBJECT
   61.18 +public:
   61.19 +    TextEditor();
   61.20 +    ~TextEditor();
   61.21 +
   61.22 +	bool isEmpty();
   61.23 +	void setShowWithMain (bool);
   61.24 +	bool showWithMain ();
   61.25 +	void setFontHint(const QString&);
   61.26 +	QString getFontHint();
   61.27 +	QString getFontHintDefault();
   61.28 +	void setFilename (const QString&);
   61.29 +	QString getFilename ();
   61.30 +	bool findText(const QString &, const bool &); // find Text 
   61.31 +
   61.32 +protected:
   61.33 +	void setupFileActions();
   61.34 +	void setupEditActions();
   61.35 +	void setupFormatActions();
   61.36 +	void setupSettingsActions();
   61.37 +    void closeEvent( QCloseEvent* );
   61.38 +	
   61.39 +
   61.40 +public:
   61.41 +	QString getText();
   61.42 +
   61.43 +public slots:
   61.44 +	void editorChanged();	// received when text() changed
   61.45 +	void setText(QString);	// set Text (by MapEditor)
   61.46 +	void setInactive();		// Nothing can be entered
   61.47 +	void editCopyAll();
   61.48 +
   61.49 +signals:
   61.50 +	void textHasChanged();
   61.51 +	void fontFamilyHasChanged();
   61.52 +	void fontSizeHasChanged();
   61.53 +	
   61.54 +private slots:
   61.55 +    void textLoad();
   61.56 +    void textSaveAs();
   61.57 +    void textSave();
   61.58 +	void textConvertPar();
   61.59 +	void textJoinLines();
   61.60 +	QString textConvertToASCII(const QString &);
   61.61 +	void textExportAsASCII();
   61.62 +    void textPrint();
   61.63 +	void textEditUndo();
   61.64 +    void toggleFonthint();
   61.65 +    void setFixedFont();
   61.66 +    void setVarFont();
   61.67 +    void textBold();
   61.68 +    void textUnderline();
   61.69 +    void textItalic();
   61.70 +    void textFamily( const QString &f );
   61.71 +    void textSize( const QString &p );
   61.72 +	void textColor();
   61.73 +	void textAlign(QAction*);
   61.74 +    void fontChanged( const QFont &f );
   61.75 +    void colorChanged( const QColor &c );
   61.76 +    void alignmentChanged( int a );
   61.77 +	void enableActions();
   61.78 +	void disableActions();
   61.79 +
   61.80 +private:
   61.81 +    QPrinter *printer;
   61.82 +    QTextEdit *e;
   61.83 +	QPoint lastPos;			// save last position of window
   61.84 +    QString filename;
   61.85 +
   61.86 +	QBrush emptyPaper;		// setting the background color
   61.87 +	QBrush filledPaper;		// depending on the state
   61.88 +	QBrush inactivePaper;	// depending on the state
   61.89 +	EditorState state;
   61.90 +	bool showwithmain;		// same visibility as mainwindow?
   61.91 +
   61.92 +	QFont varFont;
   61.93 +	QFont fixedFont;
   61.94 +    QComboBox
   61.95 +	*comboFont,
   61.96 +	*comboSize;
   61.97 +	
   61.98 +	QAction *actionFileLoad,
   61.99 +	*actionFileSave,
  61.100 +	*actionFileSaveAs,
  61.101 +	*actionFilePrint,
  61.102 +	*actionEditUndo,
  61.103 +	*actionEditRedo,
  61.104 +	*actionEditCopy,
  61.105 +	*actionEditCut,
  61.106 +	*actionEditPaste,
  61.107 +	*actionEditDeleteAll,
  61.108 +	*actionEditConvertPar,
  61.109 +	*actionEditJoinLines,
  61.110 +	*actionFormatUseFixedFont,
  61.111 +	*actionSettingsVarFont,
  61.112 +	*actionSettingsFixedFont,
  61.113 +	*actionSettingsFonthintDefault,
  61.114 +    *actionTextBold,
  61.115 +	*actionTextUnderline,
  61.116 +	*actionTextItalic,
  61.117 +	*actionTextColor,
  61.118 +	*actionAlignLeft,
  61.119 +	*actionAlignCenter,
  61.120 +	*actionAlignRight,
  61.121 +	*actionAlignJustify;
  61.122 +
  61.123 +
  61.124 +};
  61.125 +
  61.126 +#endif
    62.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    62.2 +++ b/version.h	Sun Jan 30 12:58:47 2005 +0000
    62.3 @@ -0,0 +1,7 @@
    62.4 +#ifndef VERSION_H 
    62.5 +#define VERSION_H
    62.6 +
    62.7 +#define __VYM_VERSION__ "1.6.0"
    62.8 +#define __BUILD_DATE__ "January 4, 2005"
    62.9 +
   62.10 +#endif
    63.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    63.2 +++ b/vym.pro	Sun Jan 30 12:58:47 2005 +0000
    63.3 @@ -0,0 +1,81 @@
    63.4 +TARGET  = vym
    63.5 +TRANSLATIONS += vym_de.ts
    63.6 +
    63.7 +TEMPLATE	= app
    63.8 +LANGUAGE	= C++
    63.9 +
   63.10 +CONFIG	+= qt warn_on release
   63.11 +
   63.12 +DESTROOT = /usr
   63.13 +
   63.14 +target.path = $${DESTROOT}/bin
   63.15 +INSTALLS += target
   63.16 +
   63.17 +support.files = styles/ scripts/ icons/
   63.18 +support.path = $${DESTROOT}/share/vym
   63.19 +INSTALLS += support 
   63.20 +
   63.21 +doc.files = doc/*
   63.22 +doc.path = $${DESTROOT}/share/doc/packages/vym
   63.23 +INSTALLS += doc
   63.24 +
   63.25 +demo.files = demos/
   63.26 +demo.path = $${DESTROOT}/share/vym
   63.27 +INSTALLS += demo
   63.28 +
   63.29 +
   63.30 +HEADERS	+= branchobj.h \
   63.31 +	exports.h \
   63.32 +	findwindow.h \
   63.33 +	flagobj.h \
   63.34 +	flagrowobj.h \
   63.35 +	floatimageobj.h \
   63.36 +	floatobj.h \
   63.37 +	frameobj.h \
   63.38 +	headingobj.h \
   63.39 +	imageobj.h \
   63.40 +	linkablemapobj.h \
   63.41 +	mainwindow.h \
   63.42 +	mapcenterobj.h \
   63.43 +	mapeditor.h \
   63.44 +	mapobj.h \
   63.45 +	misc.h \
   63.46 +	noteobj.h \
   63.47 +	ornamentedobj.h \
   63.48 +	process.h \
   63.49 +	selection.h \
   63.50 +	texteditor.h \
   63.51 +	version.h \
   63.52 +	xml.h \
   63.53 +	settings.h \
   63.54 +	options.h
   63.55 +SOURCES	+= branchobj.cpp \
   63.56 +	exports.cpp \
   63.57 +	findwindow.cpp \
   63.58 +	flagobj.cpp \
   63.59 +	flagrowobj.cpp \
   63.60 +	floatimageobj.cpp \
   63.61 +	floatobj.cpp \
   63.62 +	frameobj.cpp \
   63.63 +	headingobj.cpp \
   63.64 +	imageobj.cpp \
   63.65 +	linkablemapobj.cpp \
   63.66 +	main.cpp \
   63.67 +	mainwindow.cpp \
   63.68 +	mapcenterobj.cpp \
   63.69 +	mapeditor.cpp \
   63.70 +	mapobj.cpp \
   63.71 +	misc.cpp \
   63.72 +	noteobj.cpp \
   63.73 +	ornamentedobj.cpp \
   63.74 +	process.cpp \
   63.75 +	selection.cpp \
   63.76 +	texteditor.cpp \
   63.77 +	xml.cpp \
   63.78 +	settings.cpp \
   63.79 +	options.cpp
   63.80 +FORMS	= exporthtmldialog.ui \
   63.81 +	exportxhtmldialog.ui \
   63.82 +	showtextdialog.ui \
   63.83 +	extrainfodialog.ui
   63.84 +
    64.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    64.2 +++ b/vym_de.ts	Sun Jan 30 12:58:47 2005 +0000
    64.3 @@ -0,0 +1,1574 @@
    64.4 +<!DOCTYPE TS><TS>
    64.5 +<context>
    64.6 +    <name>ExportHTMLDialog</name>
    64.7 +    <message>
    64.8 +        <source>Export HTML</source>
    64.9 +        <translation>Exportiere HTML</translation>
   64.10 +    </message>
   64.11 +    <message>
   64.12 +        <source>Directory:</source>
   64.13 +        <translation>Verzeichnis:</translation>
   64.14 +    </message>
   64.15 +    <message>
   64.16 +        <source>Browse</source>
   64.17 +        <translation>Durchsuchen</translation>
   64.18 +    </message>
   64.19 +    <message>
   64.20 +        <source>Options</source>
   64.21 +        <translation>Optionen</translation>
   64.22 +    </message>
   64.23 +    <message>
   64.24 +        <source>Include image of map</source>
   64.25 +        <translation>Bild der Map erzeugen</translation>
   64.26 +    </message>
   64.27 +    <message>
   64.28 +        <source>use WIKI style</source>
   64.29 +        <translation>WIKI Stil verwenden</translation>
   64.30 +    </message>
   64.31 +    <message>
   64.32 +        <source>show output</source>
   64.33 +        <translation type="obsolete">Ausgabe der Scripte anzeigen</translation>
   64.34 +    </message>
   64.35 +    <message>
   64.36 +        <source>Export</source>
   64.37 +        <translation>Exportieren</translation>
   64.38 +    </message>
   64.39 +    <message>
   64.40 +        <source>Cancel</source>
   64.41 +        <translation>Abbrechen</translation>
   64.42 +    </message>
   64.43 +    <message>
   64.44 +        <source>VYM - Export HTML to directory</source>
   64.45 +        <translation>VYM - Exportiere HTML in Verzeichnis</translation>
   64.46 +    </message>
   64.47 +    <message>
   64.48 +        <source>Critcal export error</source>
   64.49 +        <translation>Kritischer Fehler beim Exportieren</translation>
   64.50 +    </message>
   64.51 +    <message>
   64.52 +        <source>create image only</source>
   64.53 +        <translation>Nur Bild erzeugen</translation>
   64.54 +    </message>
   64.55 +    <message>
   64.56 +        <source>use heading for URLs (instead of link target)</source>
   64.57 +        <translation>Verwende Zweigbeschriftung für URL</translation>
   64.58 +    </message>
   64.59 +    <message>
   64.60 +        <source>use image of earth to mark URLs in text</source>
   64.61 +        <translation>Verwende Globus Symbol für URLs</translation>
   64.62 +    </message>
   64.63 +    <message>
   64.64 +        <source>show output of external scripts</source>
   64.65 +        <translation>Zeige Ausgabe der externen Skripte</translation>
   64.66 +    </message>
   64.67 +    <message>
   64.68 +        <source>use default CSS file</source>
   64.69 +        <translation>Default CSS Datei verwenden</translation>
   64.70 +    </message>
   64.71 +</context>
   64.72 +<context>
   64.73 +    <name>ExportXHTMLDialog</name>
   64.74 +    <message>
   64.75 +        <source>Export XHTML</source>
   64.76 +        <translation>Exportiere XHTML</translation>
   64.77 +    </message>
   64.78 +    <message>
   64.79 +        <source>Directory:</source>
   64.80 +        <translation type="obsolete">Verzeichnis:</translation>
   64.81 +    </message>
   64.82 +    <message>
   64.83 +        <source>Browse</source>
   64.84 +        <translation>Durchsuchen</translation>
   64.85 +    </message>
   64.86 +    <message>
   64.87 +        <source>Options</source>
   64.88 +        <translation>Optionen</translation>
   64.89 +    </message>
   64.90 +    <message>
   64.91 +        <source>Include image</source>
   64.92 +        <translation>Bild erzeugen</translation>
   64.93 +    </message>
   64.94 +    <message>
   64.95 +        <source>Include text</source>
   64.96 +        <translation type="obsolete">Text erzeugen</translation>
   64.97 +    </message>
   64.98 +    <message>
   64.99 +        <source>show output of external scripts</source>
  64.100 +        <translation>Zeige Ausgabe der externen Skripte</translation>
  64.101 +    </message>
  64.102 +    <message>
  64.103 +        <source>Export</source>
  64.104 +        <translation>Exportieren</translation>
  64.105 +    </message>
  64.106 +    <message>
  64.107 +        <source>Cancel</source>
  64.108 +        <translation>Abbrechen</translation>
  64.109 +    </message>
  64.110 +    <message>
  64.111 +        <source>VYM - Export HTML to directory</source>
  64.112 +        <translation>VYM - Exportiere HTML in Verzeichnis</translation>
  64.113 +    </message>
  64.114 +    <message>
  64.115 +        <source>Critical Error</source>
  64.116 +        <translation>Kritischer Fehler</translation>
  64.117 +    </message>
  64.118 +    <message>
  64.119 +        <source>Couldn't start </source>
  64.120 +        <translation>Konnte nicht starten</translation>
  64.121 +    </message>
  64.122 +    <message>
  64.123 +        <source>didn't exit normally</source>
  64.124 +        <translation>Exportiere XHTML</translation>
  64.125 +    </message>
  64.126 +    <message>
  64.127 +        <source>Export to directory:</source>
  64.128 +        <translation>Export Verzeichnis:</translation>
  64.129 +    </message>
  64.130 +    <message>
  64.131 +        <source>Colored headings in text</source>
  64.132 +        <translation>Farbige Headings im Text</translation>
  64.133 +    </message>
  64.134 +    <message>
  64.135 +        <source>showWarnings e.g. if directory is not empty</source>
  64.136 +        <translation>Warnung, falls Verzeichnis nicht leer ist</translation>
  64.137 +    </message>
  64.138 +    <message>
  64.139 +        <source>Stylesheets</source>
  64.140 +        <translation>Stylesheets</translation>
  64.141 +    </message>
  64.142 +    <message>
  64.143 +        <source>CSS:</source>
  64.144 +        <translation>CSS:</translation>
  64.145 +    </message>
  64.146 +    <message>
  64.147 +        <source>XSL:</source>
  64.148 +        <translation>XSL:</translation>
  64.149 +    </message>
  64.150 +    <message>
  64.151 +        <source>VYM - Path to CSS file</source>
  64.152 +        <translation>VYM - Pfad zu CSS Datei</translation>
  64.153 +    </message>
  64.154 +    <message>
  64.155 +        <source>VYM - Path to XSL file</source>
  64.156 +        <translation>VYM - Pfad zu XSL Datei</translation>
  64.157 +    </message>
  64.158 +    <message>
  64.159 +        <source>Warning</source>
  64.160 +        <translation>Warnung</translation>
  64.161 +    </message>
  64.162 +    <message>
  64.163 +        <source> could not be opened!</source>
  64.164 +        <translation>konnte nicht geöffnet werden!</translation>
  64.165 +    </message>
  64.166 +    <message>
  64.167 +        <source>Save settings in map</source>
  64.168 +        <translation>Einstellungen in map speichern</translation>
  64.169 +    </message>
  64.170 +    <message>
  64.171 +        <source>Scripts</source>
  64.172 +        <translation>Skripte</translation>
  64.173 +    </message>
  64.174 +    <message>
  64.175 +        <source>Before export:</source>
  64.176 +        <translation>Vor Export:</translation>
  64.177 +    </message>
  64.178 +    <message>
  64.179 +        <source>After Export:</source>
  64.180 +        <translation>Nach Export:</translation>
  64.181 +    </message>
  64.182 +    <message>
  64.183 +        <source>The settings saved in the map would like to run scripts:
  64.184 +
  64.185 +</source>
  64.186 +        <translation>Die in der Map gespeicherten Einstellungen wollen Skripte starten:
  64.187 +
  64.188 +</translation>
  64.189 +    </message>
  64.190 +    <message>
  64.191 +        <source>Please check, if you really
  64.192 +want to allow this in your system!</source>
  64.193 +        <translation>Bitte prüfen Sie, ob Sie das in Ihrem
  64.194 +System wirklich zulassen wollen!</translation>
  64.195 +    </message>
  64.196 +    <message>
  64.197 +        <source>VYM - Path to pre export script</source>
  64.198 +        <translation>VYM - Pfad für Prä-Export Skript</translation>
  64.199 +    </message>
  64.200 +    <message>
  64.201 +        <source>VYM - Path to post export script</source>
  64.202 +        <translation>VYM -Pfad für Post-Export Skript</translation>
  64.203 +    </message>
  64.204 +</context>
  64.205 +<context>
  64.206 +    <name>ExtraInfoDialog</name>
  64.207 +    <message>
  64.208 +        <source>VYM - Info</source>
  64.209 +        <translation>VYM - Info</translation>
  64.210 +    </message>
  64.211 +    <message>
  64.212 +        <source>Map:</source>
  64.213 +        <translation>Map:</translation>
  64.214 +    </message>
  64.215 +    <message>
  64.216 +        <source>Author:</source>
  64.217 +        <translation>Author:</translation>
  64.218 +    </message>
  64.219 +    <message>
  64.220 +        <source>Comment:</source>
  64.221 +        <translation>Kommentar:</translation>
  64.222 +    </message>
  64.223 +    <message>
  64.224 +        <source>Statistics:</source>
  64.225 +        <translation>Statistik:</translation>
  64.226 +    </message>
  64.227 +    <message>
  64.228 +        <source>Cancel</source>
  64.229 +        <translation>Abbrechen</translation>
  64.230 +    </message>
  64.231 +    <message>
  64.232 +        <source>Close</source>
  64.233 +        <translation>Schliessen</translation>
  64.234 +    </message>
  64.235 +</context>
  64.236 +<context>
  64.237 +    <name>FindWindow</name>
  64.238 +    <message>
  64.239 +        <source>Clear</source>
  64.240 +        <translation>Neuer Suchbegriff</translation>
  64.241 +    </message>
  64.242 +    <message>
  64.243 +        <source>Cancel</source>
  64.244 +        <translation>Abbrechen</translation>
  64.245 +    </message>
  64.246 +    <message>
  64.247 +        <source>Find</source>
  64.248 +        <translation>Suchen</translation>
  64.249 +    </message>
  64.250 +</context>
  64.251 +<context>
  64.252 +    <name>Main</name>
  64.253 +    <message>
  64.254 +        <source>&File</source>
  64.255 +        <translation>&Datei</translation>
  64.256 +    </message>
  64.257 +    <message>
  64.258 +        <source>New map</source>
  64.259 +        <translation>Neu</translation>
  64.260 +    </message>
  64.261 +    <message>
  64.262 +        <source>&New...</source>
  64.263 +        <translation>&Neu...</translation>
  64.264 +    </message>
  64.265 +    <message>
  64.266 +        <source>Open</source>
  64.267 +        <translation>Öffnen</translation>
  64.268 +    </message>
  64.269 +    <message>
  64.270 +        <source>&Open...</source>
  64.271 +        <translation>&Öffnen...</translation>
  64.272 +    </message>
  64.273 +    <message>
  64.274 +        <source>Save</source>
  64.275 +        <translation>Speichern</translation>
  64.276 +    </message>
  64.277 +    <message>
  64.278 +        <source>&Save...</source>
  64.279 +        <translation>Speichern &unter...</translation>
  64.280 +    </message>
  64.281 +    <message>
  64.282 +        <source>Save &As...</source>
  64.283 +        <translation>Speichern &unter...</translation>
  64.284 +    </message>
  64.285 +    <message>
  64.286 +        <source>Import directory structure (experimental)</source>
  64.287 +        <translation>Importiere Verzeichnisstruktur (experimentelle Funktion)</translation>
  64.288 +    </message>
  64.289 +    <message>
  64.290 +        <source>Import Dir</source>
  64.291 +        <translation>Importiere Verzeichnis</translation>
  64.292 +    </message>
  64.293 +    <message>
  64.294 +        <source>Export (png)</source>
  64.295 +        <translation type="obsolete">Exportiere als png-Grafik</translation>
  64.296 +    </message>
  64.297 +    <message>
  64.298 +        <source>&Export (png)</source>
  64.299 +        <translation type="obsolete">&Export (png)</translation>
  64.300 +    </message>
  64.301 +    <message>
  64.302 +        <source>Print</source>
  64.303 +        <translation>Drucken</translation>
  64.304 +    </message>
  64.305 +    <message>
  64.306 +        <source>&Print...</source>
  64.307 +        <translation>&Drucken...</translation>
  64.308 +    </message>
  64.309 +    <message>
  64.310 +        <source>Close Map</source>
  64.311 +        <translation>Schließen</translation>
  64.312 +    </message>
  64.313 +    <message>
  64.314 +        <source>&Close Map</source>
  64.315 +        <translation>Schlie&ßen</translation>
  64.316 +    </message>
  64.317 +    <message>
  64.318 +        <source>Exit VYM</source>
  64.319 +        <translation>Beenden</translation>
  64.320 +    </message>
  64.321 +    <message>
  64.322 +        <source>E&xit VYM</source>
  64.323 +        <translation>B&eenden</translation>
  64.324 +    </message>
  64.325 +    <message>
  64.326 +        <source>&Edit</source>
  64.327 +        <translation>&Bearbeiten</translation>
  64.328 +    </message>
  64.329 +    <message>
  64.330 +        <source>Undo</source>
  64.331 +        <translation>Rückgängig</translation>
  64.332 +    </message>
  64.333 +    <message>
  64.334 +        <source>&Undo</source>
  64.335 +        <translation>&Rückgängig</translation>
  64.336 +    </message>
  64.337 +    <message>
  64.338 +        <source>Copy</source>
  64.339 +        <translation>Kopieren</translation>
  64.340 +    </message>
  64.341 +    <message>
  64.342 +        <source>&Copy</source>
  64.343 +        <translation>&Kopieren</translation>
  64.344 +    </message>
  64.345 +    <message>
  64.346 +        <source>Cut</source>
  64.347 +        <translation>Ausschneiden</translation>
  64.348 +    </message>
  64.349 +    <message>
  64.350 +        <source>Cu&t</source>
  64.351 +        <translation>&Ausschneiden</translation>
  64.352 +    </message>
  64.353 +    <message>
  64.354 +        <source>Paste</source>
  64.355 +        <translation>Einfügen</translation>
  64.356 +    </message>
  64.357 +    <message>
  64.358 +        <source>&Paste</source>
  64.359 +        <translation>Ein&fügen</translation>
  64.360 +    </message>
  64.361 +    <message>
  64.362 +        <source>Move branch up</source>
  64.363 +        <translation>Zweig nach oben bewegen</translation>
  64.364 +    </message>
  64.365 +    <message>
  64.366 +        <source>Move up</source>
  64.367 +        <translation>Zweig nach oben</translation>
  64.368 +    </message>
  64.369 +    <message>
  64.370 +        <source>Move branch down</source>
  64.371 +        <translation>Zweig nach unten bewegen</translation>
  64.372 +    </message>
  64.373 +    <message>
  64.374 +        <source>Move down</source>
  64.375 +        <translation>Zweig nach unten</translation>
  64.376 +    </message>
  64.377 +    <message>
  64.378 +        <source>Scroll branch</source>
  64.379 +        <translation>Zweig einrollen</translation>
  64.380 +    </message>
  64.381 +    <message>
  64.382 +        <source>Unscroll all</source>
  64.383 +        <translation>Alles aufrollen</translation>
  64.384 +    </message>
  64.385 +    <message>
  64.386 +        <source>Unscroll all scrolled branches</source>
  64.387 +        <translation>Alle eingerollten Zweige aufrollen</translation>
  64.388 +    </message>
  64.389 +    <message>
  64.390 +        <source>Find</source>
  64.391 +        <translation>Finde</translation>
  64.392 +    </message>
  64.393 +    <message>
  64.394 +        <source>Open URL</source>
  64.395 +        <translation>URL öffnen</translation>
  64.396 +    </message>
  64.397 +    <message>
  64.398 +        <source>Edit URL</source>
  64.399 +        <translation>URL ändern</translation>
  64.400 +    </message>
  64.401 +    <message>
  64.402 +        <source>Use heading of selected branch as URL</source>
  64.403 +        <translation>Beschriftung dieses Zweiges auch als URL verwenden</translation>
  64.404 +    </message>
  64.405 +    <message>
  64.406 +        <source>Use heading for URL</source>
  64.407 +        <translation>Beschriftung als URL übernehmen</translation>
  64.408 +    </message>
  64.409 +    <message>
  64.410 +        <source>Jump to another vym map, if needed load it first</source>
  64.411 +        <translation>Gehe zu einer weiteren Map. (Falls nötig wird die Map vorher geöffnet.)</translation>
  64.412 +    </message>
  64.413 +    <message>
  64.414 +        <source>Jump to map</source>
  64.415 +        <translation>Gehe zu einer weiteren Map.</translation>
  64.416 +    </message>
  64.417 +    <message>
  64.418 +        <source>Edit link to another vym map</source>
  64.419 +        <translation>Bearbeite Verbindung zu einer Map</translation>
  64.420 +    </message>
  64.421 +    <message>
  64.422 +        <source>Edit map link</source>
  64.423 +        <translation type="obsolete">Bearbeite Verbindung zu einer Map</translation>
  64.424 +    </message>
  64.425 +    <message>
  64.426 +        <source>edit Heading</source>
  64.427 +        <translation>Bearbeite Zweig-Überschrift</translation>
  64.428 +    </message>
  64.429 +    <message>
  64.430 +        <source>Edit heading</source>
  64.431 +        <translation>Bearbeite Zweig-Überschrift</translation>
  64.432 +    </message>
  64.433 +    <message>
  64.434 +        <source>Delete Selection</source>
  64.435 +        <translation>Entfernen</translation>
  64.436 +    </message>
  64.437 +    <message>
  64.438 +        <source>Add a branch as child of selection</source>
  64.439 +        <translation>Neuer Zweig </translation>
  64.440 +    </message>
  64.441 +    <message>
  64.442 +        <source>Add branch as child</source>
  64.443 +        <translation>Neuer Zweig </translation>
  64.444 +    </message>
  64.445 +    <message>
  64.446 +        <source>Add a branch above selection</source>
  64.447 +        <translation>Neuer Zweig - oben</translation>
  64.448 +    </message>
  64.449 +    <message>
  64.450 +        <source>Add branch above</source>
  64.451 +        <translation>Neuer Zweig - oben</translation>
  64.452 +    </message>
  64.453 +    <message>
  64.454 +        <source>Add a branch below selection</source>
  64.455 +        <translation>Neuer Zweig - unten</translation>
  64.456 +    </message>
  64.457 +    <message>
  64.458 +        <source>Add branch below</source>
  64.459 +        <translation>Neuer Zweig - unten</translation>
  64.460 +    </message>
  64.461 +    <message>
  64.462 +        <source>Select upper branch</source>
  64.463 +        <translation>Zweig oben</translation>
  64.464 +    </message>
  64.465 +    <message>
  64.466 +        <source>Select lower branch</source>
  64.467 +        <translation>Zweig unten</translation>
  64.468 +    </message>
  64.469 +    <message>
  64.470 +        <source>Select left branch</source>
  64.471 +        <translation>Zweig links</translation>
  64.472 +    </message>
  64.473 +    <message>
  64.474 +        <source>Select right branch</source>
  64.475 +        <translation>Zweig rechts</translation>
  64.476 +    </message>
  64.477 +    <message>
  64.478 +        <source>Select child branch</source>
  64.479 +        <translation>Kind-Zweig</translation>
  64.480 +    </message>
  64.481 +    <message>
  64.482 +        <source>Select first branch</source>
  64.483 +        <translation>Oberster Zweig</translation>
  64.484 +    </message>
  64.485 +    <message>
  64.486 +        <source>Select last branch</source>
  64.487 +        <translation>Unterster Zweig</translation>
  64.488 +    </message>
  64.489 +    <message>
  64.490 +        <source>Add Image</source>
  64.491 +        <translation>Lade Bild</translation>
  64.492 +    </message>
  64.493 +    <message>
  64.494 +        <source>&Format</source>
  64.495 +        <translation>&Format</translation>
  64.496 +    </message>
  64.497 +    <message>
  64.498 +        <source>Set Color</source>
  64.499 +        <translation>Wähle Farbe</translation>
  64.500 +    </message>
  64.501 +    <message>
  64.502 +        <source>Set &Color</source>
  64.503 +        <translation>Wähle &Farbe</translation>
  64.504 +    </message>
  64.505 +    <message>
  64.506 +        <source>Pick color
  64.507 +Hint: You can pick a color from another branch and color using CTRL+Left Button</source>
  64.508 +        <translation>Farb übernehmen
  64.509 +Tipp: Zum Kopieren einer Farbe kann man auch CTRL+linke Maustaste nehmen.</translation>
  64.510 +    </message>
  64.511 +    <message>
  64.512 +        <source>Pic&k color</source>
  64.513 +        <translation>Farbe &übernehmen</translation>
  64.514 +    </message>
  64.515 +    <message>
  64.516 +        <source>Color branch</source>
  64.517 +        <translation>Zweig färben</translation>
  64.518 +    </message>
  64.519 +    <message>
  64.520 +        <source>Color &branch</source>
  64.521 +        <translation>Zweig &färben</translation>
  64.522 +    </message>
  64.523 +    <message>
  64.524 +        <source>Color Subtree</source>
  64.525 +        <translation>Unterbaum färben</translation>
  64.526 +    </message>
  64.527 +    <message>
  64.528 +        <source>Color sub&tree</source>
  64.529 +        <translation>&Unterbaum färben</translation>
  64.530 +    </message>
  64.531 +    <message>
  64.532 +        <source>Line</source>
  64.533 +        <translation>Linie</translation>
  64.534 +    </message>
  64.535 +    <message>
  64.536 +        <source>Linkstyle Line</source>
  64.537 +        <translation>Linie</translation>
  64.538 +    </message>
  64.539 +    <message>
  64.540 +        <source>Linkstyle Parabel</source>
  64.541 +        <translation>Parabel</translation>
  64.542 +    </message>
  64.543 +    <message>
  64.544 +        <source>PolyLine</source>
  64.545 +        <translation>Dicke Linie</translation>
  64.546 +    </message>
  64.547 +    <message>
  64.548 +        <source>Linkstyle Thick Line</source>
  64.549 +        <translation>Dicke Linie</translation>
  64.550 +    </message>
  64.551 +    <message>
  64.552 +        <source>PolyParabel</source>
  64.553 +        <translation>Dicke Parabel</translation>
  64.554 +    </message>
  64.555 +    <message>
  64.556 +        <source>Linkstyle Thick Parabel</source>
  64.557 +        <translation>Dicke Parabel</translation>
  64.558 +    </message>
  64.559 +    <message>
  64.560 +        <source>No Frame</source>
  64.561 +        <translation>Kein Rahmen</translation>
  64.562 +    </message>
  64.563 +    <message>
  64.564 +        <source>Rectangle</source>
  64.565 +        <translation>Rechteck</translation>
  64.566 +    </message>
  64.567 +    <message>
  64.568 +        <source>Use same color for links and headings</source>
  64.569 +        <translation>Verbindungen haben Farbe der Beschriftungen</translation>
  64.570 +    </message>
  64.571 +    <message>
  64.572 +        <source>&Use color of heading for link</source>
  64.573 +        <translation>&Verbindungen haben Farbe der Beschriftungen</translation>
  64.574 +    </message>
  64.575 +    <message>
  64.576 +        <source>Set Link Color</source>
  64.577 +        <translation>Farbe der Verbindungen</translation>
  64.578 +    </message>
  64.579 +    <message>
  64.580 +        <source>Set &Link Color</source>
  64.581 +        <translation>&Farbe der Verbindungen</translation>
  64.582 +    </message>
  64.583 +    <message>
  64.584 +        <source>Set Background Color</source>
  64.585 +        <translation>Hintergrundfarbe</translation>
  64.586 +    </message>
  64.587 +    <message>
  64.588 +        <source>Set &Background Color</source>
  64.589 +        <translation>&Hintergrundfarbe</translation>
  64.590 +    </message>
  64.591 +    <message>
  64.592 +        <source>&View</source>
  64.593 +        <translation>&Ansicht</translation>
  64.594 +    </message>
  64.595 +    <message>
  64.596 +        <source>Zoom reset</source>
  64.597 +        <translation>Keine Vergrösserung</translation>
  64.598 +    </message>
  64.599 +    <message>
  64.600 +        <source>reset Zoom</source>
  64.601 +        <translation>Keine Vergrösserung</translation>
  64.602 +    </message>
  64.603 +    <message>
  64.604 +        <source>Zoom in</source>
  64.605 +        <translation>Vergrössern</translation>
  64.606 +    </message>
  64.607 +    <message>
  64.608 +        <source>Zoom out</source>
  64.609 +        <translation>Verkleinern</translation>
  64.610 +    </message>
  64.611 +    <message>
  64.612 +        <source>Toggle Note Editor</source>
  64.613 +        <translation>Zeige Notiz Editor</translation>
  64.614 +    </message>
  64.615 +    <message>
  64.616 +        <source>&Next Window</source>
  64.617 +        <translation>&Nächstes Fenster</translation>
  64.618 +    </message>
  64.619 +    <message>
  64.620 +        <source>Next Window</source>
  64.621 +        <translation>Nächstes Fenster</translation>
  64.622 +    </message>
  64.623 +    <message>
  64.624 +        <source>&Previous Window</source>
  64.625 +        <translation>&Vorheriges Fenster</translation>
  64.626 +    </message>
  64.627 +    <message>
  64.628 +        <source>Previous Window</source>
  64.629 +        <translation>Vorheriges Fenster</translation>
  64.630 +    </message>
  64.631 +    <message>
  64.632 +        <source>&Settings</source>
  64.633 +        <translation>&Einstellungen</translation>
  64.634 +    </message>
  64.635 +    <message>
  64.636 +        <source>Set application to open pdf files</source>
  64.637 +        <translation>pdf-Dateien öffnen mit...</translation>
  64.638 +    </message>
  64.639 +    <message>
  64.640 +        <source>Set application to open an URL</source>
  64.641 +        <translation>URLs öffnen mit...</translation>
  64.642 +    </message>
  64.643 +    <message>
  64.644 +        <source>Edit branch after adding it</source>
  64.645 +        <translation>Zweig nach dem Einfügen neu beschriften</translation>
  64.646 +    </message>
  64.647 +    <message>
  64.648 +        <source>Select branch after adding it</source>
  64.649 +        <translation>Zweig nach dem Einfügen auswählen</translation>
  64.650 +    </message>
  64.651 +    <message>
  64.652 +        <source>Select heading before editing</source>
  64.653 +        <translation>Beschriftung vor dem editieren auswählen</translation>
  64.654 +    </message>
  64.655 +    <message>
  64.656 +        <source>Select existing heading</source>
  64.657 +        <translation>Beschriftung vor dem editieren auswählen</translation>
  64.658 +    </message>
  64.659 +    <message>
  64.660 +        <source>Enable pasting into new branch</source>
  64.661 +        <translation>Einfügen in neuen Zweig</translation>
  64.662 +    </message>
  64.663 +    <message>
  64.664 +        <source>Enable Delete key for deleting branches</source>
  64.665 +        <translation>Delete Taste zum Löschen von Zweigen verwenden</translation>
  64.666 +    </message>
  64.667 +    <message>
  64.668 +        <source>Enable Delete key</source>
  64.669 +        <translation>Delete Taste zum Löschen von Zweigen verwenden</translation>
  64.670 +    </message>
  64.671 +    <message>
  64.672 +        <source>&Test</source>
  64.673 +        <translation>&Test</translation>
  64.674 +    </message>
  64.675 +    <message>
  64.676 +        <source>Test Flag</source>
  64.677 +        <translation>Test Flag</translation>
  64.678 +    </message>
  64.679 +    <message>
  64.680 +        <source>test flag</source>
  64.681 +        <translation>test Flag</translation>
  64.682 +    </message>
  64.683 +    <message>
  64.684 +        <source>Count Canvas Items</source>
  64.685 +        <translation type="obsolete">Zähle Canvas Items</translation>
  64.686 +    </message>
  64.687 +    <message>
  64.688 +        <source>Count Items</source>
  64.689 +        <translation type="obsolete">Zähle Items</translation>
  64.690 +    </message>
  64.691 +    <message>
  64.692 +        <source>Show Clipboard</source>
  64.693 +        <translation>Zeige Zwischenablage</translation>
  64.694 +    </message>
  64.695 +    <message>
  64.696 +        <source>Show clipboard</source>
  64.697 +        <translation>Zeige Zwischenablage</translation>
  64.698 +    </message>
  64.699 +    <message>
  64.700 +        <source>Export to dir</source>
  64.701 +        <translation type="obsolete">Exportiere in Verzeichnis</translation>
  64.702 +    </message>
  64.703 +    <message>
  64.704 +        <source>Export to directory</source>
  64.705 +        <translation type="obsolete">Exportiere in Verzeichnis</translation>
  64.706 +    </message>
  64.707 +    <message>
  64.708 +        <source>&Help</source>
  64.709 +        <translation>&Hilfe</translation>
  64.710 +    </message>
  64.711 +    <message>
  64.712 +        <source>Open VYM Documentation (pdf)</source>
  64.713 +        <translation>VYM Handbuch (pdf)</translation>
  64.714 +    </message>
  64.715 +    <message>
  64.716 +        <source>Open VYM Documentation (pdf) </source>
  64.717 +        <translation>VYM Handbuch (pdf)</translation>
  64.718 +    </message>
  64.719 +    <message>
  64.720 +        <source>Information about VYM</source>
  64.721 +        <translation>Information über VYM</translation>
  64.722 +    </message>
  64.723 +    <message>
  64.724 +        <source>About VYM</source>
  64.725 +        <translation>Über VYM</translation>
  64.726 +    </message>
  64.727 +    <message>
  64.728 +        <source>Information about QT toolkit</source>
  64.729 +        <translation>Informationen zum QT Toolkit</translation>
  64.730 +    </message>
  64.731 +    <message>
  64.732 +        <source>About QT</source>
  64.733 +        <translation>Über QT</translation>
  64.734 +    </message>
  64.735 +    <message>
  64.736 +        <source>Save image</source>
  64.737 +        <translation>Speichere Bild</translation>
  64.738 +    </message>
  64.739 +    <message>
  64.740 +        <source>The file </source>
  64.741 +        <translation>Die Datei</translation>
  64.742 +    </message>
  64.743 +    <message>
  64.744 +        <source>
  64.745 +exists already. Do you want to</source>
  64.746 +        <translation>gibt es bereits. Wollen Sie sie</translation>
  64.747 +    </message>
  64.748 +    <message>
  64.749 +        <source>Overwrite</source>
  64.750 +        <translation>Überschreiben</translation>
  64.751 +    </message>
  64.752 +    <message>
  64.753 +        <source>Cancel</source>
  64.754 +        <translation>Abbrechen</translation>
  64.755 +    </message>
  64.756 +    <message>
  64.757 +        <source>Couldn't save</source>
  64.758 +        <translation>Diese Datei konnte nicht gespeichert werden:</translation>
  64.759 +    </message>
  64.760 +    <message>
  64.761 +        <source>Saved </source>
  64.762 +        <translation type="obsolete">Datei gespeichert: </translation>
  64.763 +    </message>
  64.764 +    <message>
  64.765 +        <source>Couldn't save </source>
  64.766 +        <translation type="obsolete">Diese Datei konnte nicht gespeichert werden: </translation>
  64.767 +    </message>
  64.768 +    <message>
  64.769 +        <source>The map </source>
  64.770 +        <translation>Die Map </translation>
  64.771 +    </message>
  64.772 +    <message>
  64.773 +        <source> has been modified but not saved yet. Do you want to</source>
  64.774 +        <translation>wurde verändert aber noch nicht gespeichert. Wollen Sie</translation>
  64.775 +    </message>
  64.776 +    <message>
  64.777 +        <source>Save modified map before closing it</source>
  64.778 +        <translation>Speichern und Map schliessen</translation>
  64.779 +    </message>
  64.780 +    <message>
  64.781 +        <source>Discard changes</source>
  64.782 +        <translation>Änderungen verwerfen</translation>
  64.783 +    </message>
  64.784 +    <message>
  64.785 +        <source>This map is not saved yet. Do you want to</source>
  64.786 +        <translation>Diese Map wurde noch nicht gespeichert. Wollen Sie </translation>
  64.787 +    </message>
  64.788 +    <message>
  64.789 +        <source>Save map</source>
  64.790 +        <translation>Speichern</translation>
  64.791 +    </message>
  64.792 +    <message>
  64.793 +        <source>Critical Error</source>
  64.794 +        <translation>Kritischer Fehler</translation>
  64.795 +    </message>
  64.796 +    <message>
  64.797 +        <source>Enter path for pdf reader:</source>
  64.798 +        <translation>Pfad für pdf-Anwendung:</translation>
  64.799 +    </message>
  64.800 +    <message>
  64.801 +        <source>Enter path for application to open an URL:</source>
  64.802 +        <translation>Pfad zum Öffnen von URLs:</translation>
  64.803 +    </message>
  64.804 +    <message>
  64.805 +        <source>Save &As</source>
  64.806 +        <translation>Speichern &unter...</translation>
  64.807 +    </message>
  64.808 +    <message>
  64.809 +        <source>Open Recent</source>
  64.810 +        <translation>Zuletzt geöffnete Dateien</translation>
  64.811 +    </message>
  64.812 +    <message>
  64.813 +        <source>Export</source>
  64.814 +        <translation>Exportieren</translation>
  64.815 +    </message>
  64.816 +    <message>
  64.817 +        <source>Export map as image</source>
  64.818 +        <translation>als Bild</translation>
  64.819 +    </message>
  64.820 +    <message>
  64.821 +        <source>Export as ASCII (still experimental)</source>
  64.822 +        <translation>als ASCII Text (noch experimentell)</translation>
  64.823 +    </message>
  64.824 +    <message>
  64.825 +        <source>Export (ASCII)</source>
  64.826 +        <translation>als ASCII</translation>
  64.827 +    </message>
  64.828 +    <message>
  64.829 +        <source>Edit Map Info</source>
  64.830 +        <translation>Bearbeite Map Info</translation>
  64.831 +    </message>
  64.832 +    <message>
  64.833 +        <source>Export XML</source>
  64.834 +        <translation>Exportiere als XML</translation>
  64.835 +    </message>
  64.836 +    <message>
  64.837 +        <source>Export HTML</source>
  64.838 +        <translation>Exportiere als HTML</translation>
  64.839 +    </message>
  64.840 +    <message>
  64.841 +        <source>The directory </source>
  64.842 +        <translation>Das Verzeichnis</translation>
  64.843 +    </message>
  64.844 +    <message>
  64.845 +        <source> is not empty. Do you risk to overwrite its contents?</source>
  64.846 +        <translation>ist nicht leer.Riskieren sie es, das Verzeichnis zu überschreiben?</translation>
  64.847 +    </message>
  64.848 +    <message>
  64.849 +        <source>
  64.850 + is already opened.Opening the same map in multiple editors may lead 
  64.851 +to confusion when finishing working with vym.Do you want to</source>
  64.852 +        <translation>
  64.853 +ist bereits geöffnet. Die gleiche Map mehrfach in verschiedenen Ansichten zu öffnen 
  64.854 +kann beim Beenden von vym zu Problemen führen. Wollen Sie</translation>
  64.855 +    </message>
  64.856 +    <message>
  64.857 +        <source>Open anyway</source>
  64.858 +        <translation>Trotzdem öffnen</translation>
  64.859 +    </message>
  64.860 +    <message>
  64.861 +        <source>Export XML to directory</source>
  64.862 +        <translation>Exportiere XML in Verzeichnis</translation>
  64.863 +    </message>
  64.864 +    <message>
  64.865 +        <source>Critcal error</source>
  64.866 +        <translation>Kritischer Fehler</translation>
  64.867 +    </message>
  64.868 +    <message>
  64.869 +        <source>Couldn't find the documentation
  64.870 +vym.pdf in various places.</source>
  64.871 +        <translation>Konnte die Dokumentation vym.pdf
  64.872 +nirgends finden.</translation>
  64.873 +    </message>
  64.874 +    <message>
  64.875 +        <source>Couldn't find a viewer to read vym.pdf.
  64.876 +Please use Settings-></source>
  64.877 +        <translation>Konnte kein Programm zum Anzeigen von vym.pdf
  64.878 +finden. Bitte benutzen Sie Einstellungen-></translation>
  64.879 +    </message>
  64.880 +    <message>
  64.881 +        <source>The map</source>
  64.882 +        <translation>Die Map</translation>
  64.883 +    </message>
  64.884 +    <message>
  64.885 +        <source> does not exist.
  64.886 + Do you want to create a new one?</source>
  64.887 +        <translation>gibt es nicht
  64.888 +Wollen Sie eine neue anlegen?</translation>
  64.889 +    </message>
  64.890 +    <message>
  64.891 +        <source>Create</source>
  64.892 +        <translation>Anlegen</translation>
  64.893 +    </message>
  64.894 +    <message>
  64.895 +        <source>Create URL to Bugzilla</source>
  64.896 +        <translation>URL für Bugzilla anlegen</translation>
  64.897 +    </message>
  64.898 +    <message>
  64.899 +        <source>Edit vym link</source>
  64.900 +        <translation>vym Verknüpfung ändern</translation>
  64.901 +    </message>
  64.902 +    <message>
  64.903 +        <source>Delete link to another vym map</source>
  64.904 +        <translation>vym Verknüfung löschen</translation>
  64.905 +    </message>
  64.906 +    <message>
  64.907 +        <source>Delete vym link</source>
  64.908 +        <translation>vym Verknüpfung löschen</translation>
  64.909 +    </message>
  64.910 +    <message>
  64.911 +        <source>Critical Load Error</source>
  64.912 +        <translation>Kritischer Fehler beim Laden</translation>
  64.913 +    </message>
  64.914 +    <message>
  64.915 +        <source>Couldn't start unzip to decompress data.</source>
  64.916 +        <translation>Konnte unzip nicht starten, um Daten zu dekomprimieren.</translation>
  64.917 +    </message>
  64.918 +    <message>
  64.919 +        <source>unzip didn't exit normally</source>
  64.920 +        <translation>unzip wurde nicht richtig beendet</translation>
  64.921 +    </message>
  64.922 +    <message>
  64.923 +        <source>Couldn't find a map (*.xml) in .vym archive.
  64.924 +</source>
  64.925 +        <translation>Konnte keine map (*.xml) in .vym Datei finden.
  64.926 +</translation>
  64.927 +    </message>
  64.928 +    <message>
  64.929 +        <source>Critical Save Error</source>
  64.930 +        <translation>Kritischer Fehler beim Speichern</translation>
  64.931 +    </message>
  64.932 +    <message>
  64.933 +        <source>Couldn't start zip to compress data.</source>
  64.934 +        <translation>Konnte zip nicht starten, um Daten zu komprimieren.</translation>
  64.935 +    </message>
  64.936 +    <message>
  64.937 +        <source>zip didn't exit normally</source>
  64.938 +        <translation>zip wurde nicht richtig beendet</translation>
  64.939 +    </message>
  64.940 +    <message>
  64.941 +        <source>Saving the map as </source>
  64.942 +        <translation type="obsolete">Das Speichern der map als</translation>
  64.943 +    </message>
  64.944 +    <message>
  64.945 +        <source>
  64.946 +will write it uncompressed.
  64.947 +This will also write the directories for images
  64.948 +and flags and thus may overwrite files in the given directory
  64.949 +Do you want to</source>
  64.950 +        <translation type="obsolete">
  64.951 +wird die map unkomprimiert schreiben.
  64.952 +Dabei werden Verzeichnisse für die Bilder und Flags erzeugt
  64.953 +und dabei evtl. andere Daten im Verzeichnis überschrieben</translation>
  64.954 +    </message>
  64.955 +    <message>
  64.956 +        <source>Proceed</source>
  64.957 +        <translation type="obsolete">Weiter</translation>
  64.958 +    </message>
  64.959 +    <message>
  64.960 +        <source>Saved</source>
  64.961 +        <translation>Gespeichert: </translation>
  64.962 +    </message>
  64.963 +    <message>
  64.964 +        <source>VYM -Information:</source>
  64.965 +        <translation>vym-Information:</translation>
  64.966 +    </message>
  64.967 +    <message>
  64.968 +        <source>No matches found for </source>
  64.969 +        <translation>Keine Treffer gefunden für</translation>
  64.970 +    </message>
  64.971 +    <message>
  64.972 +        <source>Export XHTML</source>
  64.973 +        <translation>Exportiere XHTML</translation>
  64.974 +    </message>
  64.975 +    <message>
  64.976 +        <source>
  64.977 +did not use the compressed vym file format.
  64.978 +Writing it uncompressed will also write images 
  64.979 +and flags and thus may overwrite files in the given directory
  64.980 +
  64.981 +Do you want to write the map</source>
  64.982 +        <translation>
  64.983 +verwendet nicht das komprimierte vym Dateiformat.
  64.984 +Wenn die Map unkomprimiert geschrieben werden soll,
  64.985 +dann werden auch die Flags und Bilder im angegebenen 
  64.986 +Verzeichnis geschrieben, was evtl. bestehende Daten
  64.987 +überschreiben kann
  64.988 +
  64.989 +Wollen Sie die Map beim Schreiben</translation>
  64.990 +    </message>
  64.991 +    <message>
  64.992 +        <source>compressed (vym default)</source>
  64.993 +        <translation>komprimieren (vym default)</translation>
  64.994 +    </message>
  64.995 +    <message>
  64.996 +        <source>uncompressed</source>
  64.997 +        <translation>unkomprimiert lassen</translation>
  64.998 +    </message>
  64.999 +    <message>
 64.1000 +        <source>Use for Export</source>
 64.1001 +        <translation>Benutze für Export</translation>
 64.1002 +    </message>
 64.1003 +    <message>
 64.1004 +        <source>Add map at selection</source>
 64.1005 +        <translation>Map an Auswahl anhängen</translation>
 64.1006 +    </message>
 64.1007 +    <message>
 64.1008 +        <source>Import (add)</source>
 64.1009 +        <translation>Import (hinzufügen)</translation>
 64.1010 +    </message>
 64.1011 +    <message>
 64.1012 +        <source>Replace selection with map</source>
 64.1013 +        <translation>Auswahl mit Map ersetzen</translation>
 64.1014 +    </message>
 64.1015 +    <message>
 64.1016 +        <source>Import (replace)</source>
 64.1017 +        <translation>Import (ersetzen)</translation>
 64.1018 +    </message>
 64.1019 +    <message>
 64.1020 +        <source>Save selction</source>
 64.1021 +        <translation>Auswahl speichern</translation>
 64.1022 +    </message>
 64.1023 +    <message>
 64.1024 +        <source>Save selection</source>
 64.1025 +        <translation>Auswahl speichern</translation>
 64.1026 +    </message>
 64.1027 +    <message>
 64.1028 +        <source>Load vym map</source>
 64.1029 +        <translation>Lade vym Map</translation>
 64.1030 +    </message>
 64.1031 +    <message>
 64.1032 +        <source>Import: Add vym map to selection</source>
 64.1033 +        <translation>Import: Füge Map zu Auswahl hinzu</translation>
 64.1034 +    </message>
 64.1035 +    <message>
 64.1036 +        <source>Import: Replace selection with vym map</source>
 64.1037 +        <translation>Import: Ersetze Auswahl mit Map</translation>
 64.1038 +    </message>
 64.1039 +    <message>
 64.1040 +        <source>Save Error</source>
 64.1041 +        <translation>Fehler beim Speichern</translation>
 64.1042 +    </message>
 64.1043 +    <message>
 64.1044 +        <source>
 64.1045 +could not be removed before saving</source>
 64.1046 +        <translation>
 64.1047 +konnte vor dem Speichern nicht gelöscht werden</translation>
 64.1048 +    </message>
 64.1049 +</context>
 64.1050 +<context>
 64.1051 +    <name>MapEditor</name>
 64.1052 +    <message>
 64.1053 +        <source>Note</source>
 64.1054 +        <translation>Notiz</translation>
 64.1055 +    </message>
 64.1056 +    <message>
 64.1057 +        <source>WWW Document (external)</source>
 64.1058 +        <translation>WWW Dokument (extern)</translation>
 64.1059 +    </message>
 64.1060 +    <message>
 64.1061 +        <source>Link to another vym map</source>
 64.1062 +        <translation>Verbindung zu einer anderen Map</translation>
 64.1063 +    </message>
 64.1064 +    <message>
 64.1065 +        <source>subtree is scrolled</source>
 64.1066 +        <translation>Teilbaum ist eingerollt</translation>
 64.1067 +    </message>
 64.1068 +    <message>
 64.1069 +        <source>subtree is temporary scrolled</source>
 64.1070 +        <translation>Teilbaum ist momentan ausgerollt</translation>
 64.1071 +    </message>
 64.1072 +    <message>
 64.1073 +        <source>Take care!</source>
 64.1074 +        <translation>Vorsicht!</translation>
 64.1075 +    </message>
 64.1076 +    <message>
 64.1077 +        <source>Really?</source>
 64.1078 +        <translation>Wirklich?</translation>
 64.1079 +    </message>
 64.1080 +    <message>
 64.1081 +        <source>ok!</source>
 64.1082 +        <translation>ok!</translation>
 64.1083 +    </message>
 64.1084 +    <message>
 64.1085 +        <source>Not ok!</source>
 64.1086 +        <translation>Nicht ok!</translation>
 64.1087 +    </message>
 64.1088 +    <message>
 64.1089 +        <source>This won't work!</source>
 64.1090 +        <translation>Das geht nicht!</translation>
 64.1091 +    </message>
 64.1092 +    <message>
 64.1093 +        <source>Good</source>
 64.1094 +        <translation>Gut</translation>
 64.1095 +    </message>
 64.1096 +    <message>
 64.1097 +        <source>Bad</source>
 64.1098 +        <translation>Schlecht</translation>
 64.1099 +    </message>
 64.1100 +    <message>
 64.1101 +        <source>Time critical</source>
 64.1102 +        <translation>Zeitkritisch</translation>
 64.1103 +    </message>
 64.1104 +    <message>
 64.1105 +        <source>Idea!</source>
 64.1106 +        <translation>Idee!</translation>
 64.1107 +    </message>
 64.1108 +    <message>
 64.1109 +        <source>Important</source>
 64.1110 +        <translation>Wichtig</translation>
 64.1111 +    </message>
 64.1112 +    <message>
 64.1113 +        <source>Unimportant</source>
 64.1114 +        <translation>Unwichtig</translation>
 64.1115 +    </message>
 64.1116 +    <message>
 64.1117 +        <source>I like this</source>
 64.1118 +        <translation>Finde ich gut</translation>
 64.1119 +    </message>
 64.1120 +    <message>
 64.1121 +        <source>I do not like this</source>
 64.1122 +        <translation>Finde ich schlecht</translation>
 64.1123 +    </message>
 64.1124 +    <message>
 64.1125 +        <source>I just love... </source>
 64.1126 +        <translation>Das liebe ich!</translation>
 64.1127 +    </message>
 64.1128 +    <message>
 64.1129 +        <source>Critical error while loading map</source>
 64.1130 +        <translation type="obsolete">Kritischer Fehler beim Laden der Map</translation>
 64.1131 +    </message>
 64.1132 +    <message>
 64.1133 +        <source>Critical Parse Error</source>
 64.1134 +        <translation>Kritischer Fehler beim Verarbeiten</translation>
 64.1135 +    </message>
 64.1136 +    <message>
 64.1137 +        <source>Warning: Old file format</source>
 64.1138 +        <translation type="obsolete">Warnung: Altes Dateiformat</translation>
 64.1139 +    </message>
 64.1140 +    <message>
 64.1141 +        <source><h3>Old file format detected</h3><p>The map you are just loading still uses an old uncompressed file format. Saving it later will overwrite the old format by converting it to version </source>
 64.1142 +        <translation type="obsolete"><h3>Altes Dateiformat gefunden</h3>Die gerade geladene Map verwendet ein unkomprimmiertes Format. Wird sie später gespeichert, so wird sie umgewandelt in das Format von Version</translation>
 64.1143 +    </message>
 64.1144 +    <message>
 64.1145 +        <source>Critical Load Error</source>
 64.1146 +        <translation type="obsolete">Kritischer Fehler beim Laden</translation>
 64.1147 +    </message>
 64.1148 +    <message>
 64.1149 +        <source>Couldn't open map after uncompressing, I tried:
 64.1150 +</source>
 64.1151 +        <translation type="obsolete">Konnte Map nach dem Entpacken nicht öffnen:
 64.1152 +</translation>
 64.1153 +    </message>
 64.1154 +    <message>
 64.1155 +        <source>Critical Save Error</source>
 64.1156 +        <translation>Kritischer Fehler beim Speichern</translation>
 64.1157 +    </message>
 64.1158 +    <message>
 64.1159 +        <source>Couldn't write to </source>
 64.1160 +        <translation>Konnte nicht speichern:</translation>
 64.1161 +    </message>
 64.1162 +    <message>
 64.1163 +        <source>Critcal save error</source>
 64.1164 +        <translation>Kritischer Fehler beim Speichern</translation>
 64.1165 +    </message>
 64.1166 +    <message>
 64.1167 +        <source> doesn't exist</source>
 64.1168 +        <translation type="obsolete">gibt es nicht</translation>
 64.1169 +    </message>
 64.1170 +    <message>
 64.1171 +        <source>VYM - Export (ASCII)</source>
 64.1172 +        <translation>VYM - Export (ASCII)</translation>
 64.1173 +    </message>
 64.1174 +    <message>
 64.1175 +        <source>The file </source>
 64.1176 +        <translation>Die Datei</translation>
 64.1177 +    </message>
 64.1178 +    <message>
 64.1179 +        <source> exists already. Do you want to overwrite it?</source>
 64.1180 +        <translation>gibt es bereits. Wollen Sie sie</translation>
 64.1181 +    </message>
 64.1182 +    <message>
 64.1183 +        <source>Overwrite</source>
 64.1184 +        <translation>Überschreiben</translation>
 64.1185 +    </message>
 64.1186 +    <message>
 64.1187 +        <source>Cancel</source>
 64.1188 +        <translation>Abbrechen</translation>
 64.1189 +    </message>
 64.1190 +    <message>
 64.1191 +        <source>Critical Export Error </source>
 64.1192 +        <translation>Kritischer Fehler beim Exportieren</translation>
 64.1193 +    </message>
 64.1194 +    <message>
 64.1195 +        <source>Couldn't create directory </source>
 64.1196 +        <translation>Konnte Verzeichnis nicht anlegen</translation>
 64.1197 +    </message>
 64.1198 +    <message>
 64.1199 +        <source>VYM - Export to directory</source>
 64.1200 +        <translation type="obsolete">VYM - Export in Verzeichnis</translation>
 64.1201 +    </message>
 64.1202 +    <message>
 64.1203 +        <source>VYM - Export to directory (still experimental)</source>
 64.1204 +        <translation type="obsolete">VYM - Export in Verzeichnis</translation>
 64.1205 +    </message>
 64.1206 +    <message>
 64.1207 +        <source>The directory </source>
 64.1208 +        <translation type="obsolete">Das Verzeichnis</translation>
 64.1209 +    </message>
 64.1210 +    <message>
 64.1211 +        <source> is not empty. Do you risk to overwrite its contents?</source>
 64.1212 +        <translation type="obsolete">ist nicht leer.Riskieren sie es, das Verzeichnis zu überschreiben?</translation>
 64.1213 +    </message>
 64.1214 +    <message>
 64.1215 +        <source>Critical Export Error</source>
 64.1216 +        <translation>Kritischer Fehler beim Exportieren</translation>
 64.1217 +    </message>
 64.1218 +    <message>
 64.1219 +        <source>Critical Error</source>
 64.1220 +        <translation>Kritischer Fehler</translation>
 64.1221 +    </message>
 64.1222 +    <message>
 64.1223 +        <source> used for undo is gone. 
 64.1224 +I will create a new one, but at the moment no undo is available.
 64.1225 +Maybe you want to reload your original data.
 64.1226 +
 64.1227 +Sorry for any inconveniences.</source>
 64.1228 +        <translation>Vielleicht wollen sie die Orginaldaten erneut laden
 64.1229 +Sorry für die Unannehmlichkeiten.</translation>
 64.1230 +    </message>
 64.1231 +    <message>
 64.1232 +        <source>Enter URL:</source>
 64.1233 +        <translation>Neue URL:</translation>
 64.1234 +    </message>
 64.1235 +    <message>
 64.1236 +        <source>VYM - Link to another map</source>
 64.1237 +        <translation>VYM - Verbindung zu einer anderen Map</translation>
 64.1238 +    </message>
 64.1239 +    <message>
 64.1240 +        <source>vym map</source>
 64.1241 +        <translation>vym Map</translation>
 64.1242 +    </message>
 64.1243 +    <message>
 64.1244 +        <source>vym - load image</source>
 64.1245 +        <translation>VYM - Lade Bild</translation>
 64.1246 +    </message>
 64.1247 +    <message>
 64.1248 +        <source>Images</source>
 64.1249 +        <translation>Bilder</translation>
 64.1250 +    </message>
 64.1251 +    <message>
 64.1252 +        <source>vym - Load image</source>
 64.1253 +        <translation>vym - Lade Bild</translation>
 64.1254 +    </message>
 64.1255 +    <message>
 64.1256 +        <source>vym - save image as</source>
 64.1257 +        <translation>vym - Speichere Bild als</translation>
 64.1258 +    </message>
 64.1259 +    <message>
 64.1260 +        <source>vym - Save image as </source>
 64.1261 +        <translation>vym - Speichere Bild als</translation>
 64.1262 +    </message>
 64.1263 +    <message>
 64.1264 +        <source>Critical Import Error</source>
 64.1265 +        <translation>Kritischer Fehler beim Importieren</translation>
 64.1266 +    </message>
 64.1267 +    <message>
 64.1268 +        <source>Cannot find the directory</source>
 64.1269 +        <translation>Kann das Verzeichnis nicht finden</translation>
 64.1270 +    </message>
 64.1271 +    <message>
 64.1272 +        <source>VYM - Choose directory structur to import</source>
 64.1273 +        <translation>vym - Wähle Verzeichnisstruktur für Import</translation>
 64.1274 +    </message>
 64.1275 +    <message>
 64.1276 +        <source>Dangerous</source>
 64.1277 +        <translation>Gefährlich</translation>
 64.1278 +    </message>
 64.1279 +    <message>
 64.1280 +        <source>This will help</source>
 64.1281 +        <translation>Das könnte helfen</translation>
 64.1282 +    </message>
 64.1283 +    <message>
 64.1284 +        <source>New Map</source>
 64.1285 +        <translation>Neue Map</translation>
 64.1286 +    </message>
 64.1287 +    <message>
 64.1288 +        <source>Critical Parse Error by reading backupFile</source>
 64.1289 +        <translation>Kritischer Fehler beim Parsen
 64.1290 +der Sicherungskopie</translation>
 64.1291 +    </message>
 64.1292 +    <message>
 64.1293 +        <source>MapEditor::exportXML couldn't open </source>
 64.1294 +        <translation>MapEditor::exportXML konnte nicht öffnen:</translation>
 64.1295 +    </message>
 64.1296 +</context>
 64.1297 +<context>
 64.1298 +    <name>QMessageBox</name>
 64.1299 +    <message>
 64.1300 +        <source>Critical Error</source>
 64.1301 +        <translation type="obsolete">Kritischer Fehler</translation>
 64.1302 +    </message>
 64.1303 +</context>
 64.1304 +<context>
 64.1305 +    <name>QObject</name>
 64.1306 +    <message>
 64.1307 +        <source>new branch</source>
 64.1308 +        <translation type="obsolete">Neuer Zweig</translation>
 64.1309 +    </message>
 64.1310 +    <message>
 64.1311 +        <source>New Map</source>
 64.1312 +        <translation type="obsolete">Neue Map</translation>
 64.1313 +    </message>
 64.1314 +    <message>
 64.1315 +        <source>This is not an image.</source>
 64.1316 +        <translation>Das ist kein Bild.</translation>
 64.1317 +    </message>
 64.1318 +</context>
 64.1319 +<context>
 64.1320 +    <name>ShowTextDialog</name>
 64.1321 +    <message>
 64.1322 +        <source>VYM - Info</source>
 64.1323 +        <translation>VYM - Info</translation>
 64.1324 +    </message>
 64.1325 +    <message>
 64.1326 +        <source>Close</source>
 64.1327 +        <translation>Schliessen</translation>
 64.1328 +    </message>
 64.1329 +</context>
 64.1330 +<context>
 64.1331 +    <name>TextEditor</name>
 64.1332 +    <message>
 64.1333 +        <source>&File</source>
 64.1334 +        <translation>&Datei</translation>
 64.1335 +    </message>
 64.1336 +    <message>
 64.1337 +        <source>Import</source>
 64.1338 +        <translation>Importiere</translation>
 64.1339 +    </message>
 64.1340 +    <message>
 64.1341 +        <source>&Import...</source>
 64.1342 +        <translation>&Importiere</translation>
 64.1343 +    </message>
 64.1344 +    <message>
 64.1345 +        <source>Export Note</source>
 64.1346 +        <translation type="obsolete">Exportiere Notiz</translation>
 64.1347 +    </message>
 64.1348 +    <message>
 64.1349 +        <source>&Export...</source>
 64.1350 +        <translation>&Export</translation>
 64.1351 +    </message>
 64.1352 +    <message>
 64.1353 +        <source>Export Note As</source>
 64.1354 +        <translation type="obsolete">Exportiere Notiz unter...</translation>
 64.1355 +    </message>
 64.1356 +    <message>
 64.1357 +        <source>Export &As...</source>
 64.1358 +        <translation type="obsolete">Exportiere &unter...</translation>
 64.1359 +    </message>
 64.1360 +    <message>
 64.1361 +        <source>Print Note</source>
 64.1362 +        <translation>Drucke Notiz</translation>
 64.1363 +    </message>
 64.1364 +    <message>
 64.1365 +        <source>&Print...</source>
 64.1366 +        <translation>&Drucken</translation>
 64.1367 +    </message>
 64.1368 +    <message>
 64.1369 +        <source>&Edit</source>
 64.1370 +        <translation>&Bearbeiten</translation>
 64.1371 +    </message>
 64.1372 +    <message>
 64.1373 +        <source>Undo</source>
 64.1374 +        <translation>Rückgängig</translation>
 64.1375 +    </message>
 64.1376 +    <message>
 64.1377 +        <source>&Undo</source>
 64.1378 +        <translation>R&ückgängig</translation>
 64.1379 +    </message>
 64.1380 +    <message>
 64.1381 +        <source>Redo</source>
 64.1382 +        <translation>Wiederherstellen</translation>
 64.1383 +    </message>
 64.1384 +    <message>
 64.1385 +        <source>&Redo</source>
 64.1386 +        <translation>Wieder&herstellen</translation>
 64.1387 +    </message>
 64.1388 +    <message>
 64.1389 +        <source>Select and copy all</source>
 64.1390 +        <translation>Alles auswählen und kopieren</translation>
 64.1391 +    </message>
 64.1392 +    <message>
 64.1393 +        <source>Select and copy &all</source>
 64.1394 +        <translation>&Alles auswählen und kopieren</translation>
 64.1395 +    </message>
 64.1396 +    <message>
 64.1397 +        <source>Copy</source>
 64.1398 +        <translation>Kopieren</translation>
 64.1399 +    </message>
 64.1400 +    <message>
 64.1401 +        <source>&Copy</source>
 64.1402 +        <translation>&Kopieren</translation>
 64.1403 +    </message>
 64.1404 +    <message>
 64.1405 +        <source>Cut</source>
 64.1406 +        <translation>Ausschneiden</translation>
 64.1407 +    </message>
 64.1408 +    <message>
 64.1409 +        <source>Cu&t</source>
 64.1410 +        <translation>&Ausschneiden</translation>
 64.1411 +    </message>
 64.1412 +    <message>
 64.1413 +        <source>Paste</source>
 64.1414 +        <translation>Einfügen</translation>
 64.1415 +    </message>
 64.1416 +    <message>
 64.1417 +        <source>&Paste</source>
 64.1418 +        <translation>Ein&fügen</translation>
 64.1419 +    </message>
 64.1420 +    <message>
 64.1421 +        <source>Delete all</source>
 64.1422 +        <translation>Alles löschen</translation>
 64.1423 +    </message>
 64.1424 +    <message>
 64.1425 +        <source>&Delete All</source>
 64.1426 +        <translation>Alles &löschen</translation>
 64.1427 +    </message>
 64.1428 +    <message>
 64.1429 +        <source>&Format</source>
 64.1430 +        <translation>&Format</translation>
 64.1431 +    </message>
 64.1432 +    <message>
 64.1433 +        <source>Use fixed font</source>
 64.1434 +        <translation type="obsolete">Benutze fixe Zeichenbreite</translation>
 64.1435 +    </message>
 64.1436 +    <message>
 64.1437 +        <source>&Fixed font</source>
 64.1438 +        <translation type="obsolete">&fixe Zeichenbreite</translation>
 64.1439 +    </message>
 64.1440 +    <message>
 64.1441 +        <source>&Settings</source>
 64.1442 +        <translation>&Einstellungen</translation>
 64.1443 +    </message>
 64.1444 +    <message>
 64.1445 +        <source>Set fixed font</source>
 64.1446 +        <translation>Wähle Zeichensatz mit fixer Breite</translation>
 64.1447 +    </message>
 64.1448 +    <message>
 64.1449 +        <source>Set &fixed font</source>
 64.1450 +        <translation>Wähle Zeichensatz mit f&ixer Breite</translation>
 64.1451 +    </message>
 64.1452 +    <message>
 64.1453 +        <source>Set variable font</source>
 64.1454 +        <translation>Wähle Zeichensatz mit variabler Breite</translation>
 64.1455 +    </message>
 64.1456 +    <message>
 64.1457 +        <source>Set &variable font</source>
 64.1458 +        <translation>Wähle Zeichensatz mit v&ariabler Breite</translation>
 64.1459 +    </message>
 64.1460 +    <message>
 64.1461 +        <source>Used fixed font by default</source>
 64.1462 +        <translation>Verwende fixen Zeichensatz per default</translation>
 64.1463 +    </message>
 64.1464 +    <message>
 64.1465 +        <source>&fixed font is default</source>
 64.1466 +        <translation>Verwende fixen Zeichensatz p&er default</translation>
 64.1467 +    </message>
 64.1468 +    <message>
 64.1469 +        <source>Export Note (HTML)</source>
 64.1470 +        <translation>Exportiere Notiz (HTML)</translation>
 64.1471 +    </message>
 64.1472 +    <message>
 64.1473 +        <source>Export Note As (HTML) </source>
 64.1474 +        <translation>Exportiere Notiz als (HTML)</translation>
 64.1475 +    </message>
 64.1476 +    <message>
 64.1477 +        <source>Export &As... (HTML)</source>
 64.1478 +        <translation>Exportiere Notiz &als... (HTML)</translation>
 64.1479 +    </message>
 64.1480 +    <message>
 64.1481 +        <source>Export Note As (ASCII) </source>
 64.1482 +        <translation>Exportiere Notiz als (ASCII)</translation>
 64.1483 +    </message>
 64.1484 +    <message>
 64.1485 +        <source>Export &As...(ASCII)</source>
 64.1486 +        <translation>Exportiere a&ls (ASCII)</translation>
 64.1487 +    </message>
 64.1488 +    <message>
 64.1489 +        <source>Use fixed width font for the whole text</source>
 64.1490 +        <translation type="obsolete">Feste Zeichenbreite für den Text verwenden</translation>
 64.1491 +    </message>
 64.1492 +    <message>
 64.1493 +        <source>&Color...</source>
 64.1494 +        <translation>&Farbe...</translation>
 64.1495 +    </message>
 64.1496 +    <message>
 64.1497 +        <source>&Bold</source>
 64.1498 +        <translation>F&ett</translation>
 64.1499 +    </message>
 64.1500 +    <message>
 64.1501 +        <source>&Italic</source>
 64.1502 +        <translation>K&ursiv</translation>
 64.1503 +    </message>
 64.1504 +    <message>
 64.1505 +        <source>&Underline</source>
 64.1506 +        <translation>&Unterstrichen</translation>
 64.1507 +    </message>
 64.1508 +    <message>
 64.1509 +        <source>&Left</source>
 64.1510 +        <translation>&Linksbündig</translation>
 64.1511 +    </message>
 64.1512 +    <message>
 64.1513 +        <source>C&enter</source>
 64.1514 +        <translation>&Zentriert</translation>
 64.1515 +    </message>
 64.1516 +    <message>
 64.1517 +        <source>&Right</source>
 64.1518 +        <translation>&Rechtsbündig</translation>
 64.1519 +    </message>
 64.1520 +    <message>
 64.1521 +        <source>&Justify</source>
 64.1522 +        <translation>&Blocksatz</translation>
 64.1523 +    </message>
 64.1524 +    <message>
 64.1525 +        <source>Export Note to single file</source>
 64.1526 +        <translation>Notiz in eine einzelne Datei exportieren</translation>
 64.1527 +    </message>
 64.1528 +    <message>
 64.1529 +        <source>The file </source>
 64.1530 +        <translation>Die Datei</translation>
 64.1531 +    </message>
 64.1532 +    <message>
 64.1533 +        <source> exists already. Do you want to overwrite it?</source>
 64.1534 +        <translation>gibt es bereits. Wollen Sie sie</translation>
 64.1535 +    </message>
 64.1536 +    <message>
 64.1537 +        <source>Overwrite</source>
 64.1538 +        <translation>Überschreiben</translation>
 64.1539 +    </message>
 64.1540 +    <message>
 64.1541 +        <source>Cancel</source>
 64.1542 +        <translation>Abbrechen</translation>
 64.1543 +    </message>
 64.1544 +    <message>
 64.1545 +        <source>Couldn't export note </source>
 64.1546 +        <translation>Konnte Notiz nicht exportieren</translation>
 64.1547 +    </message>
 64.1548 +    <message>
 64.1549 +        <source>Export Note to single file (ASCII)</source>
 64.1550 +        <translation>Notiz als ASCII in eine einzelne Datei ausgeben</translation>
 64.1551 +    </message>
 64.1552 +    <message>
 64.1553 +        <source>Convert paragraphs to linebreaks</source>
 64.1554 +        <translation>Absätze in Zeilenbrüche umwandeln</translation>
 64.1555 +    </message>
 64.1556 +    <message>
 64.1557 +        <source>&Convert Paragraphs</source>
 64.1558 +        <translation>&Absätze umwandeln</translation>
 64.1559 +    </message>
 64.1560 +    <message>
 64.1561 +        <source>Join all lines of a paragraph</source>
 64.1562 +        <translation>Alle Zeilenumbrüche eines Absatzes zu vereinen</translation>
 64.1563 +    </message>
 64.1564 +    <message>
 64.1565 +        <source>&Join lines</source>
 64.1566 +        <translation>&Zeilen vereinen</translation>
 64.1567 +    </message>
 64.1568 +    <message>
 64.1569 +        <source>Toggle font hint for the whole text</source>
 64.1570 +        <translation>Zeichensatz für gesamten Text umschalten</translation>
 64.1571 +    </message>
 64.1572 +    <message>
 64.1573 +        <source>&Font hint</source>
 64.1574 +        <translation>Zeichensatz &umschalten</translation>
 64.1575 +    </message>
 64.1576 +</context>
 64.1577 +</TS>
    65.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    65.2 +++ b/xml.cpp	Sun Jan 30 12:58:47 2005 +0000
    65.3 @@ -0,0 +1,519 @@
    65.4 +#include "xml.h"
    65.5 +
    65.6 +#include <qmessagebox.h>
    65.7 +#include <qcolor.h>
    65.8 +#include <qstylesheet.h>
    65.9 +#include <iostream>
   65.10 +
   65.11 +#include "misc.h"
   65.12 +#include "settings.h"
   65.13 +
   65.14 +#include "version.h"
   65.15 +
   65.16 +static BranchObj *lastBranch;
   65.17 +static FloatObj *lastFloat;
   65.18 +
   65.19 +extern Settings settings;
   65.20 +
   65.21 +mapBuilderHandler::mapBuilderHandler() {}
   65.22 +
   65.23 +mapBuilderHandler::~mapBuilderHandler() {}
   65.24 +
   65.25 +QString mapBuilderHandler::errorProtocol() { return errorProt; }
   65.26 +
   65.27 +bool mapBuilderHandler::startDocument()
   65.28 +{
   65.29 +    errorProt = "";
   65.30 +    state = StateInit;
   65.31 +    laststate = StateInit;
   65.32 +    branchDepth=0;
   65.33 +	htmldata="";
   65.34 +	isVymPart=false;
   65.35 +    return true;
   65.36 +}
   65.37 +
   65.38 +
   65.39 +QString mapBuilderHandler::parseHREF(QString href)
   65.40 +{
   65.41 +	QString type=href.section(":",0,0);
   65.42 +	QString path=href.section(":",1,1);
   65.43 +	if (!tmpDir.endsWith("/"))
   65.44 +		return tmpDir + "/" + path;
   65.45 +	else	
   65.46 +		return tmpDir + path;
   65.47 +}
   65.48 +
   65.49 +bool mapBuilderHandler::startElement  ( const QString&, const QString&,
   65.50 +                    const QString& eName, const QXmlAttributes& atts ) 
   65.51 +{
   65.52 +    QColor col;
   65.53 +//	cout << "startElement <"<<eName<<">  state="<<state <<"  laststate="<<laststate<<endl;
   65.54 +    if ( state == StateInit && (eName == "vymmap")  ) 
   65.55 +	{
   65.56 +        state = StateMap;
   65.57 +		if (!atts.value( "version").isEmpty() ) 
   65.58 +		{
   65.59 +			mc->setVersion(atts.value( "version" ));
   65.60 +			if (!mc->checkVersion())
   65.61 +				QMessageBox::warning( 0, "Warning: Version Problem" ,
   65.62 +				   "<h3>Map is newer than VYM</h3>"
   65.63 +				   "<p>The map you are just trying to load was "
   65.64 +				   "saved using vym " +atts.value("version")+". "
   65.65 +				   "The version of this vym is " __VYM_VERSION__
   65.66 +				   ". If you run into problems after pressing "
   65.67 +				   "the ok-button below, updating vym should help.");
   65.68 +
   65.69 +		}
   65.70 +		if (loadMode==NewMap)
   65.71 +		{
   65.72 +			if (!atts.value( "author").isEmpty() )
   65.73 +			{
   65.74 +				mc->setAuthor(atts.value( "author" ) );
   65.75 +			}
   65.76 +			if (!atts.value( "comment").isEmpty() )
   65.77 +			{
   65.78 +				mc->setComment (atts.value( "comment" ) );
   65.79 +			}
   65.80 +			if (!atts.value( "backgroundColor").isEmpty() )
   65.81 +			{
   65.82 +				col.setNamedColor(atts.value("backgroundColor"));
   65.83 +				mc->getCanvas()->setBackgroundColor(col);
   65.84 +			}	    
   65.85 +			if (!atts.value( "linkColorHint").isEmpty() ) 
   65.86 +			{
   65.87 +				if (atts.value("linkColorHint")=="HeadingColor")
   65.88 +					me->setLinkColorHint(HeadingColor);
   65.89 +				else
   65.90 +					me->setLinkColorHint(DefaultColor);
   65.91 +			}
   65.92 +			if (!atts.value( "linkStyle").isEmpty() ) 
   65.93 +			{
   65.94 +				QString s=atts.value("linkStyle");
   65.95 +				if (s=="StyleLine")
   65.96 +					me->setLinkStyle(StyleLine);
   65.97 +				else	
   65.98 +					if (s=="StyleParabel")
   65.99 +						me->setLinkStyle(StyleParabel);
  65.100 +					else	
  65.101 +						if (s=="StylePolyLine")
  65.102 +							me->setLinkStyle(StylePolyLine);
  65.103 +						else	
  65.104 +							me->setLinkStyle(StylePolyParabel);
  65.105 +			}	
  65.106 +			if (!atts.value( "linkColor").isEmpty() ) 
  65.107 +			{
  65.108 +				col.setNamedColor(atts.value("linkColor"));
  65.109 +				me->setLinkColor(col);
  65.110 +			}	
  65.111 +		}	
  65.112 +	} else if ( eName == "select" && state == StateMap ) 
  65.113 +	{
  65.114 +		state=StateMapSelect;
  65.115 +	} else if ( eName == "setting" && state == StateMap ) 
  65.116 +	{
  65.117 +		state=StateMapSetting;
  65.118 +		if (loadMode==NewMap)
  65.119 +			readSettingAttr (atts);
  65.120 +	} else if ( eName == "mapcenter" && state == StateMap ) 
  65.121 +	{
  65.122 +		state=StateMapCenter;
  65.123 +		if (loadMode==NewMap)
  65.124 +		{	
  65.125 +			// Really use the found mapcenter as MCO in a new map
  65.126 +			lastBranch=mc;	// avoid empty pointer
  65.127 +		} else
  65.128 +		{
  65.129 +			// Treat the found mapcenter as a branch 
  65.130 +			// in an existing map
  65.131 +			LinkableMapObj* lmo=me->getSelection();
  65.132 +			if (lmo && (typeid(*lmo) == typeid(BranchObj) ) 
  65.133 +			        || (typeid(*lmo) == typeid(MapCenterObj) ) )
  65.134 +			{
  65.135 +				lastBranch=(BranchObj*)(lmo);
  65.136 +				if (loadMode==ImportAdd)
  65.137 +				{
  65.138 +					lastBranch->addBranch();
  65.139 +					lastBranch=lastBranch->getLastBranch();
  65.140 +				} else
  65.141 +					lastBranch->clear();
  65.142 +			} else
  65.143 +				return false;
  65.144 +		}
  65.145 +		readBranchAttr (atts);
  65.146 +	} else if ( (eName == "standardflag" ||eName == "standardFlag") && state == StateMapCenter) 
  65.147 +	{
  65.148 +		state=StateMapCenterStandardFlag;
  65.149 +	} else if ( eName == "heading" && state == StateMapCenter) 
  65.150 +	{
  65.151 +		state=StateMapCenterHeading;
  65.152 +		if (!atts.value( "textColor").isEmpty() ) 
  65.153 +		{
  65.154 +			col.setNamedColor(atts.value("textColor"));
  65.155 +			lastBranch->setColor(col ,false );
  65.156 +		}	    
  65.157 +	} else if ( eName == "note" && state == StateMapCenter) 
  65.158 +	{	// only for backward compatibility (<1.4.6). Use htmlnote now.
  65.159 +		state=StateMapCenterNote;
  65.160 +		if (!readNoteAttr (atts) ) return false;
  65.161 +	} else if ( eName == "htmlnote" && state == StateMapCenter) 
  65.162 +	{
  65.163 +		laststate=state;
  65.164 +		state=StateHtmlNote;
  65.165 +    } else if ( eName == "floatimage" && state == StateMapCenter ) 
  65.166 +	{
  65.167 +		state=StateMapCenterFloatImage;
  65.168 +        lastBranch->addFloatImage();
  65.169 +		lastFloat=lastBranch->getLastFloatImage();
  65.170 +		if (!readFloatImageAttr(atts)) return false;
  65.171 +	} else if ( eName == "branch" && state == StateMap) 
  65.172 +	{
  65.173 +		// This is used in vymparts, which have no mapcenter!
  65.174 +		isVymPart=true;
  65.175 +		state=StateBranch;
  65.176 +		LinkableMapObj* lmo=me->getSelection();
  65.177 +		if (lmo && (typeid(*lmo) == typeid(BranchObj) ) 
  65.178 +				|| (typeid(*lmo) == typeid(MapCenterObj) ) )
  65.179 +		{
  65.180 +			lastBranch=(BranchObj*)(lmo);
  65.181 +			if (loadMode==ImportAdd)
  65.182 +			{
  65.183 +				lastBranch->addBranch();
  65.184 +				lastBranch=lastBranch->getLastBranch();
  65.185 +			} else
  65.186 +				lastBranch->clear();
  65.187 +		} else
  65.188 +			return false;
  65.189 +		branchDepth=1;
  65.190 +		readBranchAttr (atts);
  65.191 +	} else if ( eName == "branch" && state == StateMapCenter) 
  65.192 +	{
  65.193 +		state=StateBranch;
  65.194 +		branchDepth=1;
  65.195 +		lastBranch->addBranch();
  65.196 +		lastBranch=lastBranch->getLastBranch();
  65.197 +		readBranchAttr (atts);
  65.198 +	} else if ( (eName=="standardflag" ||eName == "standardFlag") && state == StateBranch) 
  65.199 +	{
  65.200 +		state=StateBranchStandardFlag;
  65.201 +	} else if ( eName == "heading" && state == StateBranch) 
  65.202 +	{
  65.203 +		state=StateBranchHeading;
  65.204 +		if (!atts.value( "textColor").isEmpty() ) 
  65.205 +		{
  65.206 +			col.setNamedColor(atts.value("textColor"));
  65.207 +			lastBranch->setColor(col ,false );
  65.208 +		}	    
  65.209 +    } else if ( eName == "note" && state == StateBranch) 
  65.210 +	{
  65.211 +        state=StateBranchNote;
  65.212 +		if (!readNoteAttr (atts) ) return false;
  65.213 +	} else if ( eName == "htmlnote" && state == StateBranch) 
  65.214 +	{
  65.215 +		laststate=state;
  65.216 +		state=StateHtmlNote;
  65.217 +		no.clear();
  65.218 +		if (!atts.value( "fonthint").isEmpty() ) 
  65.219 +			no.setFontHint(atts.value ("fonthint") );
  65.220 +    } else if ( eName == "floatimage" && state == StateBranch ) 
  65.221 +	{
  65.222 +		state=StateBranchFloatImage;
  65.223 +        lastBranch->addFloatImage();
  65.224 +		lastFloat=lastBranch->getLastFloatImage();
  65.225 +		if (!readFloatImageAttr(atts)) return false;
  65.226 +    } else if ( eName == "branch" && state == StateBranch ) 
  65.227 +	{
  65.228 +        lastBranch->addBranch();
  65.229 +		lastBranch=lastBranch->getLastBranch();		
  65.230 +        branchDepth++;
  65.231 +		readBranchAttr (atts);
  65.232 +    } else if ( eName == "html" && state == StateHtmlNote ) 
  65.233 +	{
  65.234 +		state=StateHtml;
  65.235 +		htmldata="<"+eName;
  65.236 +		readHtmlAttr(atts);
  65.237 +		htmldata+=">";
  65.238 +    } else if ( state == StateHtml ) 
  65.239 +	{
  65.240 +		// accept all while in html mode,
  65.241 +		htmldata+="<"+eName;
  65.242 +		readHtmlAttr(atts);
  65.243 +		htmldata+=">";
  65.244 +    } else
  65.245 +        return false;   // Error
  65.246 +    return true;
  65.247 +}
  65.248 +
  65.249 +bool mapBuilderHandler::endElement  ( const QString&, const QString&, const QString &eName)
  65.250 +{
  65.251 +//	cout << "endElement </"<<eName<<">  state="<<state <<"  laststate="<<laststate<<endl;
  65.252 +    switch ( state ) 
  65.253 +	{
  65.254 +        case StateMapSelect: state=StateMap;  return true;
  65.255 +        case StateMapSetting: state=StateMap;  return true;
  65.256 +        case StateMapCenter: state=StateMap;  return true;
  65.257 +        case StateMapCenterStandardFlag: state=StateMapCenter;  return true;
  65.258 +        case StateMapCenterHeading: state=StateMapCenter;  return true;
  65.259 +        case StateMapCenterNote: state=StateMapCenter;  return true;
  65.260 +        case StateMapCenterFloatImage: state=StateMapCenter;  return true;
  65.261 +        case StateBranch: 
  65.262 +            if (branchDepth>1) 
  65.263 +			{
  65.264 +                branchDepth--;
  65.265 +                state=StateBranch;
  65.266 +            } else  
  65.267 +			{
  65.268 +                branchDepth=0;
  65.269 +				if (isVymPart)
  65.270 +					state=StateMap;
  65.271 +				else
  65.272 +					state=StateMapCenter;
  65.273 +            }   
  65.274 +			lastBranch=(BranchObj*)(lastBranch->getParObj());
  65.275 +             return true;
  65.276 +        case StateBranchStandardFlag: state=StateBranch;  return true;
  65.277 +        case StateBranchHeading: state=StateBranch;  return true;
  65.278 +        case StateBranchNote: state=StateBranch; return true;
  65.279 +        case StateBranchFloatImage: state=StateBranch;  return true;
  65.280 +        case StateHtmlNote: state=laststate; return true;
  65.281 +        case StateHtml: 
  65.282 +			htmldata+="</"+eName+">";
  65.283 +			if (eName=="html")
  65.284 +			{
  65.285 +				state=StateHtmlNote;  
  65.286 +				htmldata.replace ("<br></br>","<br />");
  65.287 +				no.setNote (htmldata);
  65.288 +				lastBranch->setNote (no);
  65.289 +				return true;
  65.290 +			}	else
  65.291 +			{
  65.292 +				return true;
  65.293 +			}	
  65.294 +        case StateMap: state=StateInit;  return true;
  65.295 +        default : 
  65.296 +			// even for HTML includes, this should never be reached
  65.297 +			return false;
  65.298 +    }   
  65.299 +}
  65.300 +
  65.301 +bool mapBuilderHandler::characters   ( const QString& ch)
  65.302 +{
  65.303 +	//cout << "characters \""<<ch<<"\"  state="<<state <<"  laststate="<<laststate<<endl;
  65.304 +
  65.305 +	QString ch_org=quotemeta (ch);
  65.306 +    QString ch_simplified=ch.simplifyWhiteSpace();
  65.307 +    if ( ch_simplified.isEmpty() ) return true;
  65.308 +
  65.309 +    switch ( state ) 
  65.310 +    {
  65.311 +        case StateInit: break;
  65.312 +        case StateMap: break; 
  65.313 +		case StateMapSelect:
  65.314 +			me->select(ch_simplified);
  65.315 +			break;
  65.316 +		case StateMapSetting:break;
  65.317 +        case StateMapCenter: break;
  65.318 +        case StateMapCenterStandardFlag: 
  65.319 +            lastBranch->activateStandardFlag(ch_simplified); 
  65.320 +            break;
  65.321 +        case StateMapCenterHeading: 
  65.322 +            lastBranch->setHeading(ch_simplified); 
  65.323 +            break;
  65.324 +        case StateMapCenterNote:
  65.325 +			lastBranch->setNote(ch_simplified);
  65.326 +			break;
  65.327 +        case StateBranch: break;
  65.328 +        case StateBranchStandardFlag: 
  65.329 +            lastBranch->activateStandardFlag(ch_simplified); 
  65.330 +            break;
  65.331 +        case StateBranchHeading: 
  65.332 +            lastBranch->setHeading(ch_simplified);
  65.333 +            break;
  65.334 +        case StateBranchNote: 
  65.335 +			lastBranch->setNote(ch_simplified);
  65.336 +			break;
  65.337 +        case StateBranchFloatImage: break;
  65.338 +        case StateHtmlNote: break;
  65.339 +        case StateHtml:
  65.340 +			htmldata+=ch_org;
  65.341 +			break;
  65.342 +        default: 
  65.343 +			return false;
  65.344 +    }
  65.345 +    return true;
  65.346 +}
  65.347 +
  65.348 +QString mapBuilderHandler::errorString() 
  65.349 +{
  65.350 +    return "the document is not in the VYM file format";
  65.351 +}
  65.352 +
  65.353 +bool mapBuilderHandler::fatalError( const QXmlParseException& exception ) 
  65.354 +{
  65.355 +    errorProt += QString( "fatal parsing error: %1 in line %2, column %3\n")
  65.356 +    .arg( exception.message() )
  65.357 +    .arg( exception.lineNumber() )
  65.358 +    .arg( exception.columnNumber() );
  65.359 +
  65.360 +    return QXmlDefaultHandler::fatalError( exception );
  65.361 +}
  65.362 +
  65.363 +void mapBuilderHandler::setMapEditor (MapEditor* e)
  65.364 +{
  65.365 +    me=e;
  65.366 +	mc=me->getMapCenter();
  65.367 +}
  65.368 +
  65.369 +void mapBuilderHandler::setTmpDir (QString tp)
  65.370 +{
  65.371 +	tmpDir=tp;
  65.372 +}
  65.373 +
  65.374 +void mapBuilderHandler::setLoadMode (const LoadMode &lm)
  65.375 +{
  65.376 +	loadMode=lm;
  65.377 +}
  65.378 +
  65.379 +bool mapBuilderHandler::readBranchAttr (const QXmlAttributes& a)
  65.380 +{
  65.381 +	bool okx,oky;
  65.382 +	int x,y;
  65.383 +	if (!a.value( "absPosX").isEmpty() && loadMode==NewMap && branchDepth<2) 
  65.384 +	{
  65.385 +		if (!a.value( "absPosY").isEmpty() ) 
  65.386 +		{
  65.387 +			x=a.value("absPosX").toInt (&okx, 10);
  65.388 +			y=a.value("absPosY").toInt (&oky, 10);
  65.389 +			if (okx && oky) 
  65.390 +				lastBranch->move(x,y);
  65.391 +			else
  65.392 +				return false;   // Couldn't read absPos
  65.393 +		}           
  65.394 +	}           
  65.395 +	if (!a.value( "scrolled").isEmpty() )
  65.396 +		lastBranch->toggleScroll();
  65.397 +	if (!a.value( "url").isEmpty() ) 
  65.398 +		lastBranch->setURL (a.value ("url"));
  65.399 +	if (!a.value( "vymLink").isEmpty() ) 
  65.400 +		lastBranch->setVymLink (a.value ("vymLink"));
  65.401 +	if (!a.value( "frameType").isEmpty() ) 
  65.402 +		lastBranch->setFrameType (a.value("frameType"));
  65.403 +	return true;	
  65.404 +}
  65.405 +
  65.406 +bool mapBuilderHandler::readNoteAttr (const QXmlAttributes& a)
  65.407 +{	// only for backward compatibility (<1.4.6). Use htmlnote now.
  65.408 +	no.clear();
  65.409 +	QString fn;
  65.410 +	if (!a.value( "href").isEmpty() ) 
  65.411 +	{
  65.412 +		// Load note
  65.413 +		fn=parseHREF(a.value ("href") );
  65.414 +		QFile file (fn);
  65.415 +		QString s;						// Reading a note
  65.416 +
  65.417 +		if ( !file.open( IO_ReadOnly) )
  65.418 +		{
  65.419 +			qWarning ("mapBuilderHandler::readNoteAttr:  Couldn't load "+fn);
  65.420 +			return false;
  65.421 +		}	
  65.422 +		QTextStream stream( &file );
  65.423 +		QString lines;
  65.424 +		while ( !stream.eof() ) {
  65.425 +			lines += stream.readLine()+"\n"; 
  65.426 +		}
  65.427 +		file.close();
  65.428 +		// Convert to richtext
  65.429 +		if ( !QStyleSheet::mightBeRichText( lines ) )
  65.430 +		{
  65.431 +			// Here we are workarounding the QT conversion method:
  65.432 +			// convertFromPlainText does not generate valid xml, needed
  65.433 +			// for the parser, but just <p> and <br> without closing tags.
  65.434 +			// So we have to add those by ourselves
  65.435 +			//lines=quotemeta (lines);
  65.436 +			lines = QStyleSheet::convertFromPlainText( lines, QStyleSheetItem::WhiteSpaceNormal );
  65.437 +			lines.replace ("<br>","<br />");
  65.438 +		}	
  65.439 +
  65.440 +		lines ="<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body>"+lines + "</p></body></html>";
  65.441 +		no.setNote (lines);
  65.442 +	}		
  65.443 +	if (!a.value( "fonthint").isEmpty() ) 
  65.444 +		no.setFontHint(a.value ("fonthint") );
  65.445 +	if (state == StateMapCenterNote) 	
  65.446 +		mc->setNote(no);
  65.447 +	else
  65.448 +		lastBranch->setNote(no);
  65.449 +	return true;
  65.450 +}
  65.451 +
  65.452 +bool mapBuilderHandler::readFloatImageAttr (const QXmlAttributes& a)
  65.453 +{
  65.454 +	if (!a.value( "useOrientation").isEmpty() ) 
  65.455 +	{
  65.456 +		if (a.value ("useOrientation") =="true")
  65.457 +			lastFloat->setUseOrientation (true);
  65.458 +		else	
  65.459 +			lastFloat->setUseOrientation (false);
  65.460 +	}	
  65.461 +	if (!a.value( "href").isEmpty() )
  65.462 +	{
  65.463 +		// Load FloatImage
  65.464 +		if (!lastFloat->load (parseHREF(a.value ("href") ) ))
  65.465 +		{
  65.466 +			QMessageBox::warning( 0, "Warning: " ,
  65.467 +				"Couldn't load float image\n"+parseHREF(a.value ("href") ));
  65.468 +			lastBranch->removeFloatImage(((FloatImageObj*)(lastFloat)));
  65.469 +			lastFloat=NULL;
  65.470 +			return true;
  65.471 +		}
  65.472 +		
  65.473 +	}	
  65.474 +	if (!a.value( "floatExport").isEmpty() ) 
  65.475 +	{
  65.476 +		if (a.value ("floatExpofrt") =="true")
  65.477 +			lastFloat->setFloatExport (true);
  65.478 +		else	
  65.479 +			lastFloat->setFloatExport (false);
  65.480 +	}	
  65.481 +	if (!a.value( "zPlane").isEmpty() ) 
  65.482 +		lastFloat->setZ (a.value("zPlane").toInt ());
  65.483 +    int x,y;
  65.484 +    bool okx,oky;
  65.485 +	if (!a.value( "relPosX").isEmpty() ) 
  65.486 +	{
  65.487 +		if (!a.value( "relPosY").isEmpty() ) 
  65.488 +		{
  65.489 +			// read relPos
  65.490 +			x=a.value("relPosX").toInt (&okx, 10);
  65.491 +			y=a.value("relPosY").toInt (&oky, 10);
  65.492 +			if (okx && oky) 
  65.493 +				lastFloat->setRelPos (QPoint (x,y) );
  65.494 +			else
  65.495 +				// Couldn't read relPos
  65.496 +				return false;  
  65.497 +		}           
  65.498 +	}	
  65.499 +	return true;
  65.500 +}
  65.501 +
  65.502 +bool mapBuilderHandler::readHtmlAttr (const QXmlAttributes& a)
  65.503 +{
  65.504 +	for (int i=1; i<=a.count(); i++)
  65.505 +		htmldata+=" "+a.localName(i-1)+"=\""+a.value(i-1)+"\"";
  65.506 +	return true;
  65.507 +}
  65.508 +
  65.509 +bool mapBuilderHandler::readSettingAttr (const QXmlAttributes& a)
  65.510 +{
  65.511 +	if (!a.value( "key").isEmpty() ) 
  65.512 +	{
  65.513 +		if (!a.value( "value").isEmpty() ) 
  65.514 +			settings.setLocalEntry (me->getDestPath(), a.value ("key"), a.value ("value"));
  65.515 +		else
  65.516 +			return false;
  65.517 +		
  65.518 +	} else
  65.519 +		return false;
  65.520 +	
  65.521 +	return true;
  65.522 +}
    66.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    66.2 +++ b/xml.h	Sun Jan 30 12:58:47 2005 +0000
    66.3 @@ -0,0 +1,62 @@
    66.4 +#ifndef XLM_H
    66.5 +#define XLM_H
    66.6 +
    66.7 +
    66.8 +#include <qstring.h>
    66.9 +#include <qxml.h>
   66.10 +
   66.11 +#include "mapcenterobj.h"
   66.12 +#include "mapeditor.h"
   66.13 +
   66.14 +
   66.15 +class mapBuilderHandler  : public QXmlDefaultHandler
   66.16 +{
   66.17 +public:
   66.18 +	mapBuilderHandler();
   66.19 +	~mapBuilderHandler();
   66.20 +	QString errorProtocol();
   66.21 +	bool startDocument();
   66.22 +	QString mapBuilderHandler::parseHREF(QString);
   66.23 +	bool startElement ( const QString&, const QString&,
   66.24 +                        const QString& eName, const QXmlAttributes& atts ); 
   66.25 +	bool   endElement ( const QString&, const QString&, const QString& ); 
   66.26 +	bool characters   ( const QString&);
   66.27 +	QString errorString();
   66.28 +	bool fatalError( const QXmlParseException&);
   66.29 +	void setMapEditor (MapEditor*);
   66.30 +	void setTmpDir (QString);
   66.31 +	void setLoadMode (const LoadMode &);
   66.32 +	bool readBranchAttr (const QXmlAttributes&);
   66.33 +	bool readNoteAttr (const QXmlAttributes&);
   66.34 +	bool readFloatImageAttr (const QXmlAttributes&);
   66.35 +	bool readHtmlAttr (const QXmlAttributes&);
   66.36 +	bool readSettingAttr (const QXmlAttributes&);
   66.37 +
   66.38 +private:
   66.39 +	QString     errorProt;
   66.40 +	enum State 
   66.41 +	{ 
   66.42 +		StateInit, StateMap, StateMapSelect, 
   66.43 +		StateMapSetting,
   66.44 +		StateMapCenter, StateMapCenterStandardFlag,
   66.45 +		StateMapCenterHeading, StateMapCenterNote, 
   66.46 +		StateMapCenterFloatImage,
   66.47 +		
   66.48 +		StateBranch, StateBranchStandardFlag,
   66.49 +		StateBranchHeading, StateBranchNote, 
   66.50 +		StateBranchFloatImage, 
   66.51 +		StateHtmlNote, StateHtml 
   66.52 +	 };
   66.53 +				 
   66.54 +
   66.55 +	LoadMode loadMode;
   66.56 +	bool isVymPart;
   66.57 +	State state;			 
   66.58 +	State laststate;
   66.59 +	QString htmldata;
   66.60 +	int branchDepth; 
   66.61 +	NoteObj no;
   66.62 +	MapCenterObj* mc;
   66.63 +	MapEditor* me; QString tmpDir; 
   66.64 +}; 
   66.65 +#endif